diff options
author | 2022-11-14 22:13:26 +0100 | |
---|---|---|
committer | 2022-11-14 22:13:26 +0100 | |
commit | 7c9b8ac178967151a4f921ac26e8c2fe8d23b886 (patch) | |
tree | c608db5b2751bdb6ef6146c9269b09d768f9d63e | |
parent | 5d8f46abf8d5a10cc4650efc87b12a9a6c537fe5 (diff) | |
download | it-tools-7c9b8ac178967151a4f921ac26e8c2fe8d23b886.tar.gz it-tools-7c9b8ac178967151a4f921ac26e8c2fe8d23b886.tar.zst it-tools-7c9b8ac178967151a4f921ac26e8c2fe8d23b886.zip |
feat(new-tool): mime type to extension converter
-rw-r--r-- | src/themes.ts | 5 | ||||
-rw-r--r-- | src/tools/index.ts | 2 | ||||
-rw-r--r-- | src/tools/mime-types/index.ts | 11 | ||||
-rw-r--r-- | src/tools/mime-types/mime-types.vue | 99 |
4 files changed, 117 insertions, 0 deletions
diff --git a/src/themes.ts b/src/themes.ts index 3d8a5fe..73e300d 100644 --- a/src/themes.ts +++ b/src/themes.ts @@ -30,4 +30,9 @@ export const darkThemeOverrides: GlobalThemeOverrides = { color: '#1e1e1e', borderColor: 'transparent', }, + + Table: { + tdColor: '#1e1e1e', + thColor: '#353535', + }, }; diff --git a/src/tools/index.ts b/src/tools/index.ts index e9377e4..bc5192a 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -1,6 +1,7 @@ import { LockOpen } from '@vicons/tabler'; import type { ToolCategory } from './tool'; +import { tool as mimeTypes } from './mime-types'; import { tool as otpCodeGeneratorAndValidator } from './otp-code-generator-and-validator'; import { tool as base64FileConverter } from './base64-file-converter'; import { tool as base64StringConverter } from './base64-string-converter'; @@ -65,6 +66,7 @@ export const toolsByCategory: ToolCategory[] = [ basicAuthGenerator, metaTagGenerator, otpCodeGeneratorAndValidator, + mimeTypes, ], }, { diff --git a/src/tools/mime-types/index.ts b/src/tools/mime-types/index.ts new file mode 100644 index 0000000..25e5640 --- /dev/null +++ b/src/tools/mime-types/index.ts @@ -0,0 +1,11 @@ +import { World } from '@vicons/tabler'; +import { defineTool } from '../tool'; + +export const tool = defineTool({ + name: 'Mime types', + path: '/mime-types', + description: 'Convert mime types to extensions and vice-versa.', + keywords: ['mime', 'types', 'extension', 'content', 'type'], + component: () => import('./mime-types.vue'), + icon: World, +}); diff --git a/src/tools/mime-types/mime-types.vue b/src/tools/mime-types/mime-types.vue new file mode 100644 index 0000000..0c7a5eb --- /dev/null +++ b/src/tools/mime-types/mime-types.vue @@ -0,0 +1,99 @@ +<template> + <n-card> + <n-h2 style="margin-bottom: 0">Mime type to extension</n-h2> + <div style="opacity: 0.8">Now witch file extensions are associated to a mime-type</div> + <n-form-item> + <n-select + v-model:value="selectedMimeType" + filterable + :options="mimeToExtensionsOptions" + size="large" + placeholder="Select your mimetype here... (ex: application/pdf)" + /> + </n-form-item> + + <div v-if="extensionsFound.length > 0"> + Extensions of files with the <n-tag round :bordered="false">{{ selectedMimeType }}</n-tag> mime-type: + <div style="margin-top: 10px"> + <n-tag + v-for="extension of extensionsFound" + :key="extension" + round + :bordered="false" + type="primary" + style="margin-right: 10px" + > + .{{ extension }} + </n-tag> + </div> + </div> + </n-card> + + <n-card> + <n-h2 style="margin-bottom: 0">File extension to mime type</n-h2> + <div style="opacity: 0.8">Now witch mime type is associated to a file extension</div> + <n-form-item> + <n-select + v-model:value="selectedExtension" + filterable + :options="extensionToMimeTypeOptions" + size="large" + placeholder="Select your mimetype here... (ex: application/pdf)" + /> + </n-form-item> + + <div v-if="selectedExtension"> + Mime type associated to the extension <n-tag round :bordered="false">{{ selectedExtension }}</n-tag> file + extension: + <div style="margin-top: 10px"> + <n-tag round :bordered="false" type="primary" style="margin-right: 10px"> + {{ mimeTypeFound }} + </n-tag> + </div> + </div> + </n-card> + + <div> + <n-table> + <thead> + <tr> + <th>Mime types</th> + <th>Extensions</th> + </tr> + </thead> + <tbody> + <tr v-for="{ mimeType, extensions } of mimeInfos" :key="mimeType"> + <td>{{ mimeType }}</td> + <td> + <n-tag v-for="extension of extensions" :key="extension" round :bordered="false" style="margin-right: 10px"> + .{{ extension }} + </n-tag> + </td> + </tr> + </tbody> + </n-table> + </div> +</template> + +<script setup lang="ts"> +import { types as extensionToMimeType, extensions as mimeTypeToExtension } from 'mime-types'; +import { computed, ref } from 'vue'; + +const mimeInfos = Object.entries(mimeTypeToExtension).map(([mimeType, extensions]) => ({ mimeType, extensions })); + +const mimeToExtensionsOptions = Object.keys(mimeTypeToExtension).map((label) => ({ label, value: label })); +const selectedMimeType = ref(undefined); + +const extensionsFound = computed(() => (selectedMimeType.value ? mimeTypeToExtension[selectedMimeType.value] : [])); + +const extensionToMimeTypeOptions = Object.keys(extensionToMimeType).map((label) => { + const extension = `.${label}`; + + return { label: extension, value: label }; +}); +const selectedExtension = ref(undefined); + +const mimeTypeFound = computed(() => (selectedExtension.value ? extensionToMimeType[selectedExtension.value] : [])); +</script> + +<style lang="less" scoped></style> |