+ About
+
+ This wonderful website, made with ❤ by
+
+ Corentin Thomasset
+ ,
+ aggregates useful tools for developer and people working in IT. If you find it useful, please feel free to share
+ it to people you think may find it useful too and don't forget to bookmark it in your shortcut bar!
+
+
+ IT Tools is open-source (under the MIT license) and free, and will always be, but it costs me money to host and
+ renew the domain name. If you want to support my work, and encourage me to add more tools, please consider
+ supporting by
+ tracker.trackEvent({ eventName: 'Support button clicked' })"
+ >
+ sponsoring me
+ .
+
+
+ Technologies
+
+ IT Tools is made in Vue.js (Vue 3) with the the Naive UI component library and is hosted and continuously deployed
+ by Vercel. Third-party open-source libraries are used in some tools, you may find the complete list in the
+
+ package.json
+
+ file of the repository.
+
+
+ Found a bug? A tool is missing?
+
+ If you need a tool that is currently not present here, and you think can be useful, you are welcome to submit a
+ feature request in the
+
+ issues section
+
+ in the GitHub repository.
+
+
+ And if you found a bug, or something doesn't work as expected, please file a bug report in the
+
+ issues section
+
+ in the GitHub repository.
+
+
+
+
diff --git a/src/tools/crontab-generator/index.ts b/src/tools/crontab-generator/index.ts
index 429d6e14..49b28389 100644
--- a/src/tools/crontab-generator/index.ts
+++ b/src/tools/crontab-generator/index.ts
@@ -1,11 +1,10 @@
import { Alarm } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.crontab-generator.title'),
+ name: 'Crontab generator',
path: '/crontab-generator',
- description: translate('tools.crontab-generator.description'),
+ description: 'Validate and generate crontab and get the human readable description of the cron schedule.',
keywords: [
'crontab',
'generator',
diff --git a/src/tools/date-time-converter/date-time-converter.e2e.spec.ts b/src/tools/date-time-converter/date-time-converter.e2e.spec.ts
index 249dd754..34ee7495 100644
--- a/src/tools/date-time-converter/date-time-converter.e2e.spec.ts
+++ b/src/tools/date-time-converter/date-time-converter.e2e.spec.ts
@@ -29,6 +29,5 @@ test.describe('Date time converter - json to yaml', () => {
expect((await page.getByTestId('Timestamp').inputValue()).trim()).toEqual('1681333824000');
expect((await page.getByTestId('UTC format').inputValue()).trim()).toEqual('Wed, 12 Apr 2023 21:10:24 GMT');
expect((await page.getByTestId('Mongo ObjectID').inputValue()).trim()).toEqual('64371e400000000000000000');
- expect((await page.getByTestId('Excel date/time').inputValue()).trim()).toEqual('45028.88222222222');
});
});
diff --git a/src/tools/date-time-converter/date-time-converter.models.test.ts b/src/tools/date-time-converter/date-time-converter.models.test.ts
index c2c7bee9..502cdc67 100644
--- a/src/tools/date-time-converter/date-time-converter.models.test.ts
+++ b/src/tools/date-time-converter/date-time-converter.models.test.ts
@@ -1,8 +1,5 @@
import { describe, expect, test } from 'vitest';
import {
- dateToExcelFormat,
- excelFormatToDate,
- isExcelFormat,
isISO8601DateTimeString,
isISO9075DateString,
isMongoObjectId,
@@ -142,39 +139,4 @@ describe('date-time-converter models', () => {
expect(isMongoObjectId('')).toBe(false);
});
});
-
- describe('isExcelFormat', () => {
- test('an Excel format string is a floating number that can be negative', () => {
- expect(isExcelFormat('0')).toBe(true);
- expect(isExcelFormat('1')).toBe(true);
- expect(isExcelFormat('1.1')).toBe(true);
- expect(isExcelFormat('-1.1')).toBe(true);
- expect(isExcelFormat('-1')).toBe(true);
-
- expect(isExcelFormat('')).toBe(false);
- expect(isExcelFormat('foo')).toBe(false);
- expect(isExcelFormat('1.1.1')).toBe(false);
- });
- });
-
- describe('dateToExcelFormat', () => {
- test('a date in Excel format is the number of days since 01/01/1900', () => {
- expect(dateToExcelFormat(new Date('2016-05-20T00:00:00.000Z'))).toBe('42510');
- expect(dateToExcelFormat(new Date('2016-05-20T12:00:00.000Z'))).toBe('42510.5');
- expect(dateToExcelFormat(new Date('2023-10-31T09:26:06.421Z'))).toBe('45230.39312987268');
- expect(dateToExcelFormat(new Date('1970-01-01T00:00:00.000Z'))).toBe('25569');
- expect(dateToExcelFormat(new Date('1800-01-01T00:00:00.000Z'))).toBe('-36522');
- });
- });
-
- describe('excelFormatToDate', () => {
- test('a date in Excel format is the number of days since 01/01/1900', () => {
- expect(excelFormatToDate('0')).toEqual(new Date('1899-12-30T00:00:00.000Z'));
- expect(excelFormatToDate('1')).toEqual(new Date('1899-12-31T00:00:00.000Z'));
- expect(excelFormatToDate('2')).toEqual(new Date('1900-01-01T00:00:00.000Z'));
- expect(excelFormatToDate('4242.4242')).toEqual(new Date('1911-08-12T10:10:50.880Z'));
- expect(excelFormatToDate('42738.22626859954')).toEqual(new Date('2017-01-03T05:25:49.607Z'));
- expect(excelFormatToDate('-1000')).toEqual(new Date('1897-04-04T00:00:00.000Z'));
- });
- });
});
diff --git a/src/tools/date-time-converter/date-time-converter.models.ts b/src/tools/date-time-converter/date-time-converter.models.ts
index f5eedbfa..173b8a87 100644
--- a/src/tools/date-time-converter/date-time-converter.models.ts
+++ b/src/tools/date-time-converter/date-time-converter.models.ts
@@ -9,9 +9,6 @@ export {
isTimestamp,
isUTCDateString,
isMongoObjectId,
- dateToExcelFormat,
- excelFormatToDate,
- isExcelFormat,
};
const ISO8601_REGEX
@@ -24,8 +21,6 @@ const RFC3339_REGEX
const RFC7231_REGEX = /^[A-Za-z]{3},\s[0-9]{2}\s[A-Za-z]{3}\s[0-9]{4}\s[0-9]{2}:[0-9]{2}:[0-9]{2}\sGMT$/;
-const EXCEL_FORMAT_REGEX = /^-?\d+(\.\d+)?$/;
-
function createRegexMatcher(regex: RegExp) {
return (date?: string) => !_.isNil(date) && regex.test(date);
}
@@ -38,8 +33,6 @@ const isUnixTimestamp = createRegexMatcher(/^[0-9]{1,10}$/);
const isTimestamp = createRegexMatcher(/^[0-9]{1,13}$/);
const isMongoObjectId = createRegexMatcher(/^[0-9a-fA-F]{24}$/);
-const isExcelFormat = createRegexMatcher(EXCEL_FORMAT_REGEX);
-
function isUTCDateString(date?: string) {
if (_.isNil(date)) {
return false;
@@ -52,11 +45,3 @@ function isUTCDateString(date?: string) {
return false;
}
}
-
-function dateToExcelFormat(date: Date) {
- return String(((date.getTime()) / (1000 * 60 * 60 * 24)) + 25569);
-}
-
-function excelFormatToDate(excelFormat: string | number) {
- return new Date((Number(excelFormat) - 25569) * 86400 * 1000);
-}
diff --git a/src/tools/date-time-converter/date-time-converter.vue b/src/tools/date-time-converter/date-time-converter.vue
index 5636ed46..88fa6012 100644
--- a/src/tools/date-time-converter/date-time-converter.vue
+++ b/src/tools/date-time-converter/date-time-converter.vue
@@ -14,9 +14,6 @@ import {
} from 'date-fns';
import type { DateFormat, ToDateMapper } from './date-time-converter.types';
import {
- dateToExcelFormat,
- excelFormatToDate,
- isExcelFormat,
isISO8601DateTimeString,
isISO9075DateString,
isMongoObjectId,
@@ -88,12 +85,6 @@ const formats: DateFormat[] = [
toDate: objectId => new Date(Number.parseInt(objectId.substring(0, 8), 16) * 1000),
formatMatcher: date => isMongoObjectId(date),
},
- {
- name: 'Excel date/time',
- fromDate: date => dateToExcelFormat(date),
- toDate: excelFormatToDate,
- formatMatcher: isExcelFormat,
- },
];
const formatIndex = ref(6);
@@ -155,7 +146,7 @@ function formatDateUsingFormatter(formatter: (date: Date) => string, date?: Date
import('./date-time-converter.vue'),
icon: Calendar,
diff --git a/src/tools/device-information/index.ts b/src/tools/device-information/index.ts
index 44d91598..e55ae28c 100644
--- a/src/tools/device-information/index.ts
+++ b/src/tools/device-information/index.ts
@@ -1,11 +1,10 @@
import { DeviceDesktop } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.device-information.title'),
+ name: 'Device information',
path: '/device-information',
- description: translate('tools.device-information.description'),
+ description: 'Get information about your current device (screen size, pixel-ratio, user agent, ...)',
keywords: [
'device',
'information',
diff --git a/src/tools/docker-run-to-docker-compose-converter/index.ts b/src/tools/docker-run-to-docker-compose-converter/index.ts
index 0ecc4b0b..d9c1437f 100644
--- a/src/tools/docker-run-to-docker-compose-converter/index.ts
+++ b/src/tools/docker-run-to-docker-compose-converter/index.ts
@@ -1,11 +1,10 @@
import { BrandDocker } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.docker-run-to-docker-compose-converter.title'),
+ name: 'Docker run to Docker compose converter',
path: '/docker-run-to-docker-compose-converter',
- description: translate('tools.docker-run-to-docker-compose-converter.description'),
+ description: 'Turns docker run commands into docker-compose files!',
keywords: ['docker', 'run', 'compose', 'yaml', 'yml', 'convert', 'deamon'],
component: () => import('./docker-run-to-docker-compose-converter.vue'),
icon: BrandDocker,
diff --git a/src/tools/email-normalizer/email-normalizer.vue b/src/tools/email-normalizer/email-normalizer.vue
deleted file mode 100644
index eae97c4e..00000000
--- a/src/tools/email-normalizer/email-normalizer.vue
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
-
-
- Raw emails to normalize:
-
-
-
-
- Normalized emails:
-
-
-
-
- Clear emails
-
-
- Copy normalized emails
-
-
-
-
diff --git a/src/tools/email-normalizer/index.ts b/src/tools/email-normalizer/index.ts
deleted file mode 100644
index 299a30f7..00000000
--- a/src/tools/email-normalizer/index.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Mail } from '@vicons/tabler';
-import { defineTool } from '../tool';
-
-export const tool = defineTool({
- name: 'Email normalizer',
- path: '/email-normalizer',
- description: 'Normalize email addresses to a standard format for easier comparison. Useful for deduplication and data cleaning.',
- keywords: ['email', 'normalizer'],
- component: () => import('./email-normalizer.vue'),
- icon: Mail,
- createdAt: new Date('2024-08-15'),
-});
diff --git a/src/tools/emoji-picker/emoji-picker.vue b/src/tools/emoji-picker/emoji-picker.vue
index a12b10c2..750695f5 100644
--- a/src/tools/emoji-picker/emoji-picker.vue
+++ b/src/tools/emoji-picker/emoji-picker.vue
@@ -4,7 +4,6 @@ import emojiKeywords from 'emojilib';
import _ from 'lodash';
import type { EmojiInfo } from './emoji.types';
import { useFuzzySearch } from '@/composable/fuzzySearch';
-import useDebouncedRef from '@/composable/debouncedref';
const escapeUnicode = ({ emoji }: { emoji: string }) => emoji.split('').map(unit => `\\u${unit.charCodeAt(0).toString(16).padStart(4, '0')}`).join('');
const getEmojiCodePoints = ({ emoji }: { emoji: string }) => emoji.codePointAt(0) ? `0x${emoji.codePointAt(0)?.toString(16)}` : undefined;
@@ -24,7 +23,7 @@ const emojisGroups: { emojiInfos: EmojiInfo[]; group: string }[] = _
.map((emojiInfos, group) => ({ group, emojiInfos }))
.value();
-const searchQuery = useDebouncedRef('', 500);
+const searchQuery = ref('');
const { searchResult } = useFuzzySearch({
search: searchQuery,
diff --git a/src/tools/emoji-picker/index.ts b/src/tools/emoji-picker/index.ts
index 3a28cf0f..ef01b2de 100644
--- a/src/tools/emoji-picker/index.ts
+++ b/src/tools/emoji-picker/index.ts
@@ -1,11 +1,10 @@
import { MoodSmile } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.emoji-picker.title'),
+ name: 'Emoji picker',
path: '/emoji-picker',
- description: translate('tools.emoji-picker.description'),
+ description: 'Copy and paste emojis easily and get the unicode and code points value of each emoji.',
keywords: ['emoji', 'picker', 'unicode', 'copy', 'paste'],
component: () => import('./emoji-picker.vue'),
icon: MoodSmile,
diff --git a/src/tools/encryption/encryption.vue b/src/tools/encryption/encryption.vue
index 2ad47b51..4a348f85 100644
--- a/src/tools/encryption/encryption.vue
+++ b/src/tools/encryption/encryption.vue
@@ -1,6 +1,5 @@
@@ -65,11 +63,7 @@ const [decryptOutput, decryptError] = computedCatch(() => algos[decryptAlgo.valu
/>
-
- {{ decryptError }}
- import('./encryption.vue'),
icon: Lock,
diff --git a/src/tools/eta-calculator/eta-calculator.vue b/src/tools/eta-calculator/eta-calculator.vue
index e1c36a62..a81a77de 100644
--- a/src/tools/eta-calculator/eta-calculator.vue
+++ b/src/tools/eta-calculator/eta-calculator.vue
@@ -26,8 +26,8 @@ const endAt = computed(() =>
- With a concrete example, if you wash 5 plates in 3 minutes and you have 500 plates to wash, it will take you 5
- hours to wash them all.
+ With a concrete example, if you wash 3 plates in 5 minutes and you have 500 plates to wash, it will take you 5
+ hours and 10 minutes to wash them all.
diff --git a/src/tools/eta-calculator/index.ts b/src/tools/eta-calculator/index.ts
index 5016ab66..abda2870 100644
--- a/src/tools/eta-calculator/index.ts
+++ b/src/tools/eta-calculator/index.ts
@@ -1,11 +1,11 @@
import { Hourglass } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.eta-calculator.title'),
+ name: 'ETA calculator',
path: '/eta-calculator',
- description: translate('tools.eta-calculator.description'),
+ description:
+ 'An ETA (Estimated Time of Arrival) calculator to know the approximate end time of a task, for example the moment of ending of a download.',
keywords: ['eta', 'calculator', 'estimated', 'time', 'arrival', 'average'],
component: () => import('./eta-calculator.vue'),
icon: Hourglass,
diff --git a/src/tools/git-memo/index.ts b/src/tools/git-memo/index.ts
index f65ffe07..c91ee813 100644
--- a/src/tools/git-memo/index.ts
+++ b/src/tools/git-memo/index.ts
@@ -1,11 +1,11 @@
import { BrandGit } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.git-memo.title'),
+ name: 'Git cheatsheet',
path: '/git-memo',
- description: translate('tools.git-memo.description'),
+ description:
+ 'Git is a decentralized version management software. With this cheatsheet you will have a quick access to the most common git commands.',
keywords: ['git', 'push', 'force', 'pull', 'commit', 'amend', 'rebase', 'merge', 'reset', 'soft', 'hard', 'lease'],
component: () => import('./git-memo.vue'),
icon: BrandGit,
diff --git a/src/tools/hash-text/index.ts b/src/tools/hash-text/index.ts
index 2070e41d..3012747c 100644
--- a/src/tools/hash-text/index.ts
+++ b/src/tools/hash-text/index.ts
@@ -1,11 +1,11 @@
import { EyeOff } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.hash-text.title'),
+ name: 'Hash text',
path: '/hash-text',
- description: translate('tools.hash-text.description'),
+ description:
+ 'Hash a text string using the function you need : MD5, SHA1, SHA256, SHA224, SHA512, SHA384, SHA3 or RIPEMD160',
keywords: [
'hash',
'digest',
diff --git a/src/tools/hmac-generator/index.ts b/src/tools/hmac-generator/index.ts
index 3500684e..c0ca7da4 100644
--- a/src/tools/hmac-generator/index.ts
+++ b/src/tools/hmac-generator/index.ts
@@ -1,11 +1,11 @@
import { ShortTextRound } from '@vicons/material';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.hmac-generator.title'),
+ name: 'Hmac generator',
path: '/hmac-generator',
- description: translate('tools.hmac-generator.description'),
+ description:
+ 'Computes a hash-based message authentication code (HMAC) using a secret key and your favorite hashing function.',
keywords: ['hmac', 'generator', 'MD5', 'SHA1', 'SHA256', 'SHA224', 'SHA512', 'SHA384', 'SHA3', 'RIPEMD160'],
component: () => import('./hmac-generator.vue'),
icon: ShortTextRound,
diff --git a/src/tools/html-entities/index.ts b/src/tools/html-entities/index.ts
index e292f087..4907dc68 100644
--- a/src/tools/html-entities/index.ts
+++ b/src/tools/html-entities/index.ts
@@ -1,11 +1,10 @@
import { Code } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.html-entities.title'),
+ name: 'Escape html entities',
path: '/html-entities',
- description: translate('tools.html-entities.description'),
+ description: 'Escape or unescape html entities (replace <,>, &, " and \' to their html version)',
keywords: ['html', 'entities', 'escape', 'unescape', 'special', 'characters', 'tags'],
component: () => import('./html-entities.vue'),
icon: Code,
diff --git a/src/tools/html-wysiwyg-editor/editor/menu-bar-item.vue b/src/tools/html-wysiwyg-editor/editor/menu-bar-item.vue
index 5be23292..9a4cf1bd 100644
--- a/src/tools/html-wysiwyg-editor/editor/menu-bar-item.vue
+++ b/src/tools/html-wysiwyg-editor/editor/menu-bar-item.vue
@@ -6,9 +6,13 @@ const { icon, title, action, isActive } = toRefs(props);
-
-
-
-
-
+
+
+
+
+
+
+
+ {{ title }}
+
diff --git a/src/tools/html-wysiwyg-editor/editor/menu-bar.vue b/src/tools/html-wysiwyg-editor/editor/menu-bar.vue
index 9069673c..d3ad3168 100644
--- a/src/tools/html-wysiwyg-editor/editor/menu-bar.vue
+++ b/src/tools/html-wysiwyg-editor/editor/menu-bar.vue
@@ -84,8 +84,8 @@ const items: MenuItem[] = [
type: 'button',
icon: H3,
title: 'Heading 3',
- action: () => editor.value.chain().focus().toggleHeading({ level: 3 }).run(),
- isActive: () => editor.value.isActive('heading', { level: 3 }),
+ action: () => editor.value.chain().focus().toggleHeading({ level: 4 }).run(),
+ isActive: () => editor.value.isActive('heading', { level: 4 }),
},
{
type: 'button',
diff --git a/src/tools/html-wysiwyg-editor/index.ts b/src/tools/html-wysiwyg-editor/index.ts
index 3a2ab007..461ad235 100644
--- a/src/tools/html-wysiwyg-editor/index.ts
+++ b/src/tools/html-wysiwyg-editor/index.ts
@@ -1,11 +1,10 @@
import { Edit } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.html-wysiwyg-editor.title'),
+ name: 'HTML WYSIWYG editor',
path: '/html-wysiwyg-editor',
- description: translate('tools.html-wysiwyg-editor.description'),
+ description: 'Online HTML editor with feature-rich WYSIWYG editor, get the source code of the content immediately.',
keywords: ['html', 'wysiwyg', 'editor', 'p', 'ul', 'ol', 'converter', 'live'],
component: () => import('./html-wysiwyg-editor.vue'),
icon: Edit,
diff --git a/src/tools/http-status-codes/index.ts b/src/tools/http-status-codes/index.ts
index b3138943..43afae83 100644
--- a/src/tools/http-status-codes/index.ts
+++ b/src/tools/http-status-codes/index.ts
@@ -2,12 +2,11 @@ import { HttpRound } from '@vicons/material';
import { defineTool } from '../tool';
import { codesByCategories } from './http-status-codes.constants';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.http-status-codes.title'),
+ name: 'HTTP status codes',
path: '/http-status-codes',
- description: translate('tools.http-status-codes.description'),
+ description: 'The list of all HTTP status codes their name and their meaning.',
keywords: [
'http',
'status',
diff --git a/src/tools/iban-validator-and-parser/iban-validator-and-parser.e2e.spec.ts b/src/tools/iban-validator-and-parser/iban-validator-and-parser.e2e.spec.ts
deleted file mode 100644
index c4a99860..00000000
--- a/src/tools/iban-validator-and-parser/iban-validator-and-parser.e2e.spec.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { type Page, expect, test } from '@playwright/test';
-
-async function extractIbanInfo({ page }: { page: Page }) {
- const itemsLines = await page
- .locator('.c-key-value-list__item').all();
-
- return await Promise.all(
- itemsLines.map(async item => [
- (await item.locator('.c-key-value-list__key').textContent() ?? '').trim(),
- (await item.locator('.c-key-value-list__value').textContent() ?? '').trim(),
- ]),
- );
-}
-
-test.describe('Tool - Iban validator and parser', () => {
- test.beforeEach(async ({ page }) => {
- await page.goto('/iban-validator-and-parser');
- });
-
- test('Has correct title', async ({ page }) => {
- await expect(page).toHaveTitle('IBAN validator and parser - IT Tools');
- });
-
- test('iban info are extracted from a valid iban', async ({ page }) => {
- await page.getByTestId('iban-input').fill('DE89370400440532013000');
-
- const ibanInfo = await extractIbanInfo({ page });
-
- expect(ibanInfo).toEqual([
- ['Is IBAN valid ?', 'Yes'],
- ['Is IBAN a QR-IBAN ?', 'No'],
- ['Country code', 'DE'],
- ['BBAN', '370400440532013000'],
- ['IBAN friendly format', 'DE89 3704 0044 0532 0130 00'],
- ]);
- });
-
- test('invalid iban errors are displayed', async ({ page }) => {
- await page.getByTestId('iban-input').fill('FR7630006060011234567890189');
-
- const ibanInfo = await extractIbanInfo({ page });
-
- expect(ibanInfo).toEqual([
- ['Is IBAN valid ?', 'No'],
- ['IBAN errors', 'Wrong account bank branch checksum Wrong IBAN checksum'],
- ['Is IBAN a QR-IBAN ?', 'No'],
- ['Country code', 'N/A'],
- ['BBAN', 'N/A'],
- ['IBAN friendly format', 'FR76 3000 6060 0112 3456 7890 189'],
- ]);
- });
-});
diff --git a/src/tools/iban-validator-and-parser/iban-validator-and-parser.service.ts b/src/tools/iban-validator-and-parser/iban-validator-and-parser.service.ts
deleted file mode 100644
index bde71dba..00000000
--- a/src/tools/iban-validator-and-parser/iban-validator-and-parser.service.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { ValidationErrorsIBAN } from 'ibantools';
-
-export { getFriendlyErrors };
-
-const ibanErrorToMessage = {
- [ValidationErrorsIBAN.NoIBANProvided]: 'No IBAN provided',
- [ValidationErrorsIBAN.NoIBANCountry]: 'No IBAN country',
- [ValidationErrorsIBAN.WrongBBANLength]: 'Wrong BBAN length',
- [ValidationErrorsIBAN.WrongBBANFormat]: 'Wrong BBAN format',
- [ValidationErrorsIBAN.ChecksumNotNumber]: 'Checksum is not a number',
- [ValidationErrorsIBAN.WrongIBANChecksum]: 'Wrong IBAN checksum',
- [ValidationErrorsIBAN.WrongAccountBankBranchChecksum]: 'Wrong account bank branch checksum',
- [ValidationErrorsIBAN.QRIBANNotAllowed]: 'QR-IBAN not allowed',
-};
-
-function getFriendlyErrors(errorCodes: ValidationErrorsIBAN[]) {
- return errorCodes.map(errorCode => ibanErrorToMessage[errorCode]).filter(Boolean);
-}
diff --git a/src/tools/iban-validator-and-parser/iban-validator-and-parser.vue b/src/tools/iban-validator-and-parser/iban-validator-and-parser.vue
deleted file mode 100644
index 6844dc5a..00000000
--- a/src/tools/iban-validator-and-parser/iban-validator-and-parser.vue
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/tools/iban-validator-and-parser/index.ts b/src/tools/iban-validator-and-parser/index.ts
deleted file mode 100644
index ff7ff135..00000000
--- a/src/tools/iban-validator-and-parser/index.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
-import Bank from '~icons/mdi/bank';
-
-export const tool = defineTool({
- name: translate('tools.iban-validator-and-parser.title'),
- path: '/iban-validator-and-parser',
- description: translate('tools.iban-validator-and-parser.description'),
- keywords: ['iban', 'validator', 'and', 'parser', 'bic', 'bank'],
- component: () => import('./iban-validator-and-parser.vue'),
- icon: Bank,
- createdAt: new Date('2023-08-26'),
-});
diff --git a/src/tools/index.ts b/src/tools/index.ts
index 388cfaf4..c5686a48 100644
--- a/src/tools/index.ts
+++ b/src/tools/index.ts
@@ -1,25 +1,7 @@
import { tool as base64FileConverter } from './base64-file-converter';
import { tool as base64StringConverter } from './base64-string-converter';
import { tool as basicAuthGenerator } from './basic-auth-generator';
-import { tool as emailNormalizer } from './email-normalizer';
-
-import { tool as asciiTextDrawer } from './ascii-text-drawer';
-
-import { tool as textToUnicode } from './text-to-unicode';
-import { tool as safelinkDecoder } from './safelink-decoder';
-import { tool as xmlToJson } from './xml-to-json';
-import { tool as jsonToXml } from './json-to-xml';
-import { tool as regexTester } from './regex-tester';
-import { tool as regexMemo } from './regex-memo';
-import { tool as markdownToHtml } from './markdown-to-html';
-import { tool as pdfSignatureChecker } from './pdf-signature-checker';
-import { tool as numeronymGenerator } from './numeronym-generator';
-import { tool as macAddressGenerator } from './mac-address-generator';
-import { tool as textToBinary } from './text-to-binary';
-import { tool as ulidGenerator } from './ulid-generator';
-import { tool as ibanValidatorAndParser } from './iban-validator-and-parser';
import { tool as stringObfuscator } from './string-obfuscator';
-import { tool as textDiff } from './text-diff';
import { tool as emojiPicker } from './emoji-picker';
import { tool as passwordStrengthAnalyser } from './password-strength-analyser';
import { tool as yamlToToml } from './yaml-to-toml';
@@ -72,7 +54,6 @@ import { tool as metaTagGenerator } from './meta-tag-generator';
import { tool as mimeTypes } from './mime-types';
import { tool as otpCodeGeneratorAndValidator } from './otp-code-generator-and-validator';
import { tool as qrCodeGenerator } from './qr-code-generator';
-import { tool as wifiQrCodeGenerator } from './wifi-qr-code-generator';
import { tool as randomPortGenerator } from './random-port-generator';
import { tool as romanNumeralConverter } from './roman-numeral-converter';
import { tool as sqlPrettify } from './sql-prettify';
@@ -86,12 +67,11 @@ import { tool as urlParser } from './url-parser';
import { tool as uuidGenerator } from './uuid-generator';
import { tool as macAddressLookup } from './mac-address-lookup';
import { tool as xmlFormatter } from './xml-formatter';
-import { tool as yamlViewer } from './yaml-viewer';
export const toolsByCategory: ToolCategory[] = [
{
name: 'Crypto',
- components: [tokenGenerator, hashText, bcrypt, uuidGenerator, ulidGenerator, cypher, bip39, hmacGenerator, rsaKeyPairGenerator, passwordStrengthAnalyser, pdfSignatureChecker],
+ components: [tokenGenerator, hashText, bcrypt, uuidGenerator, cypher, bip39, hmacGenerator, rsaKeyPairGenerator, passwordStrengthAnalyser],
},
{
name: 'Converter',
@@ -104,8 +84,6 @@ export const toolsByCategory: ToolCategory[] = [
colorConverter,
caseConverter,
textToNatoAlphabet,
- textToBinary,
- textToUnicode,
yamlToJson,
yamlToToml,
jsonToYaml,
@@ -113,9 +91,6 @@ export const toolsByCategory: ToolCategory[] = [
listConverter,
tomlToJson,
tomlToYaml,
- xmlToJson,
- jsonToXml,
- markdownToHtml,
],
},
{
@@ -136,12 +111,11 @@ export const toolsByCategory: ToolCategory[] = [
userAgentParser,
httpStatusCodes,
jsonDiff,
- safelinkDecoder,
],
},
{
name: 'Images and videos',
- components: [qrCodeGenerator, wifiQrCodeGenerator, svgPlaceholderGenerator, cameraRecorder],
+ components: [qrCodeGenerator, svgPlaceholderGenerator, cameraRecorder],
},
{
name: 'Development',
@@ -156,15 +130,11 @@ export const toolsByCategory: ToolCategory[] = [
chmodCalculator,
dockerRunToDockerComposeConverter,
xmlFormatter,
- yamlViewer,
- emailNormalizer,
- regexTester,
- regexMemo,
],
},
{
name: 'Network',
- components: [ipv4SubnetCalculator, ipv4AddressConverter, ipv4RangeExpander, macAddressLookup, macAddressGenerator, ipv6UlaGenerator],
+ components: [ipv4SubnetCalculator, ipv4AddressConverter, ipv4RangeExpander, macAddressLookup, ipv6UlaGenerator],
},
{
name: 'Math',
@@ -176,19 +146,11 @@ export const toolsByCategory: ToolCategory[] = [
},
{
name: 'Text',
- components: [
- loremIpsumGenerator,
- textStatistics,
- emojiPicker,
- stringObfuscator,
- textDiff,
- numeronymGenerator,
- asciiTextDrawer,
- ],
+ components: [loremIpsumGenerator, textStatistics, emojiPicker, stringObfuscator],
},
{
name: 'Data',
- components: [phoneParserAndFormatter, ibanValidatorAndParser],
+ components: [phoneParserAndFormatter],
},
];
diff --git a/src/tools/integer-base-converter/index.ts b/src/tools/integer-base-converter/index.ts
index f60d996d..0008568c 100644
--- a/src/tools/integer-base-converter/index.ts
+++ b/src/tools/integer-base-converter/index.ts
@@ -1,11 +1,10 @@
import { ArrowsLeftRight } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.base-converter.title'),
+ name: 'Integer base converter',
path: '/base-converter',
- description: translate('tools.base-converter.description'),
+ description: 'Convert number between different bases (decimal, hexadecimal, binary, octal, base64, ...)',
keywords: ['integer', 'number', 'base', 'conversion', 'decimal', 'hexadecimal', 'binary', 'octal', 'base64'],
component: () => import('./integer-base-converter.vue'),
icon: ArrowsLeftRight,
diff --git a/src/tools/integer-base-converter/integer-base-converter.model.test.ts b/src/tools/integer-base-converter/integer-base-converter.model.test.ts
index c7d7db79..d0387b64 100644
--- a/src/tools/integer-base-converter/integer-base-converter.model.test.ts
+++ b/src/tools/integer-base-converter/integer-base-converter.model.test.ts
@@ -11,9 +11,6 @@ describe('integer-base-converter', () => {
expect(convertBase({ value: '10100101', fromBase: 2, toBase: 16 })).toEqual('a5');
expect(convertBase({ value: '192654', fromBase: 10, toBase: 8 })).toEqual('570216');
expect(convertBase({ value: 'zz', fromBase: 64, toBase: 10 })).toEqual('2275');
- expect(convertBase({ value: '42540766411283223938465490632011909384', fromBase: 10, toBase: 10 })).toEqual('42540766411283223938465490632011909384');
- expect(convertBase({ value: '42540766411283223938465490632011909384', fromBase: 10, toBase: 16 })).toEqual('20010db8000085a300000000ac1f8908');
- expect(convertBase({ value: '20010db8000085a300000000ac1f8908', fromBase: 16, toBase: 10 })).toEqual('42540766411283223938465490632011909384');
});
});
});
diff --git a/src/tools/integer-base-converter/integer-base-converter.model.ts b/src/tools/integer-base-converter/integer-base-converter.model.ts
index da0fe77f..b4470e57 100644
--- a/src/tools/integer-base-converter/integer-base-converter.model.ts
+++ b/src/tools/integer-base-converter/integer-base-converter.model.ts
@@ -5,16 +5,16 @@ export function convertBase({ value, fromBase, toBase }: { value: string; fromBa
let decValue = value
.split('')
.reverse()
- .reduce((carry: bigint, digit: string, index: number) => {
+ .reduce((carry: number, digit: string, index: number) => {
if (!fromRange.includes(digit)) {
throw new Error(`Invalid digit "${digit}" for base ${fromBase}.`);
}
- return (carry += BigInt(fromRange.indexOf(digit)) * BigInt(fromBase) ** BigInt(index));
- }, 0n);
+ return (carry += fromRange.indexOf(digit) * fromBase ** index);
+ }, 0);
let newValue = '';
while (decValue > 0) {
- newValue = toRange[Number(decValue % BigInt(toBase))] + newValue;
- decValue = (decValue - (decValue % BigInt(toBase))) / BigInt(toBase);
+ newValue = toRange[decValue % toBase] + newValue;
+ decValue = (decValue - (decValue % toBase)) / toBase;
}
return newValue || '0';
}
diff --git a/src/tools/ipv4-address-converter/index.ts b/src/tools/ipv4-address-converter/index.ts
index 66ae03a3..62d2daf1 100644
--- a/src/tools/ipv4-address-converter/index.ts
+++ b/src/tools/ipv4-address-converter/index.ts
@@ -1,11 +1,10 @@
import { Binary } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.ipv4-address-converter.title'),
+ name: 'Ipv4 address converter',
path: '/ipv4-address-converter',
- description: translate('tools.ipv4-address-converter.description'),
+ description: 'Convert an ip address into decimal, binary, hexadecimal or event in ipv6',
keywords: ['ipv4', 'address', 'converter', 'decimal', 'hexadecimal', 'binary', 'ipv6'],
component: () => import('./ipv4-address-converter.vue'),
icon: Binary,
diff --git a/src/tools/ipv4-range-expander/index.ts b/src/tools/ipv4-range-expander/index.ts
index 49dfae95..233f7cc4 100644
--- a/src/tools/ipv4-range-expander/index.ts
+++ b/src/tools/ipv4-range-expander/index.ts
@@ -1,11 +1,11 @@
import { UnfoldMoreOutlined } from '@vicons/material';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.ipv4-range-expander.title'),
+ name: 'IPv4 range expander',
path: '/ipv4-range-expander',
- description: translate('tools.ipv4-range-expander.description'),
+ description:
+ 'Given a start and an end IPv4 address this tool calculates a valid IPv4 network with its CIDR notation.',
keywords: ['ipv4', 'range', 'expander', 'subnet', 'creator', 'cidr'],
component: () => import('./ipv4-range-expander.vue'),
icon: UnfoldMoreOutlined,
diff --git a/src/tools/ipv4-subnet-calculator/index.ts b/src/tools/ipv4-subnet-calculator/index.ts
index 1bae7282..fb4bfb43 100644
--- a/src/tools/ipv4-subnet-calculator/index.ts
+++ b/src/tools/ipv4-subnet-calculator/index.ts
@@ -1,11 +1,10 @@
import { RouterOutlined } from '@vicons/material';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.ipv4-subnet-calculator.title'),
+ name: 'IPv4 subnet calculator',
path: '/ipv4-subnet-calculator',
- description: translate('tools.ipv4-subnet-calculator.description'),
+ description: 'Parse your IPv4 CIDR blocks and get all the info you need about your sub network.',
keywords: ['ipv4', 'subnet', 'calculator', 'mask', 'network', 'cidr', 'netmask', 'bitmask', 'broadcast', 'address'],
component: () => import('./ipv4-subnet-calculator.vue'),
icon: RouterOutlined,
diff --git a/src/tools/ipv6-ula-generator/index.ts b/src/tools/ipv6-ula-generator/index.ts
index 51bfd6fc..24efaeba 100644
--- a/src/tools/ipv6-ula-generator/index.ts
+++ b/src/tools/ipv6-ula-generator/index.ts
@@ -1,11 +1,10 @@
import { BuildingFactory } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.ipv6-ula-generator.title'),
+ name: 'IPv6 ULA generator',
path: '/ipv6-ula-generator',
- description: translate('tools.ipv6-ula-generator.description'),
+ description: 'Generate your own local, non-routable IP addresses on your network according to RFC4193.',
keywords: ['ipv6', 'ula', 'generator', 'rfc4193', 'network', 'private'],
component: () => import('./ipv6-ula-generator.vue'),
icon: BuildingFactory,
diff --git a/src/tools/json-diff/index.ts b/src/tools/json-diff/index.ts
index a4c0319c..7c4c1eee 100644
--- a/src/tools/json-diff/index.ts
+++ b/src/tools/json-diff/index.ts
@@ -1,11 +1,10 @@
import { CompareArrowsRound } from '@vicons/material';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.json-diff.title'),
+ name: 'JSON diff',
path: '/json-diff',
- description: translate('tools.json-diff.description'),
+ description: 'Compare two JSON objects and get the differences between them.',
keywords: ['json', 'diff', 'compare', 'difference', 'object', 'data'],
component: () => import('./json-diff.vue'),
icon: CompareArrowsRound,
diff --git a/src/tools/json-minify/index.ts b/src/tools/json-minify/index.ts
index fbe5831b..e6a02dbe 100644
--- a/src/tools/json-minify/index.ts
+++ b/src/tools/json-minify/index.ts
@@ -1,11 +1,10 @@
import { Braces } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.json-minify.title'),
+ name: 'JSON minify',
path: '/json-minify',
- description: translate('tools.json-minify.description'),
+ description: 'Minify and compress your JSON by removing unnecessary white spaces.',
keywords: ['json', 'minify', 'format'],
component: () => import('./json-minify.vue'),
icon: Braces,
diff --git a/src/tools/json-to-csv/index.ts b/src/tools/json-to-csv/index.ts
index 9f38b82f..acfef02f 100644
--- a/src/tools/json-to-csv/index.ts
+++ b/src/tools/json-to-csv/index.ts
@@ -1,11 +1,10 @@
import { List } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.json-to-csv.title'),
+ name: 'JSON to CSV',
path: '/json-to-csv',
- description: translate('tools.json-to-csv.description'),
+ description: 'Convert JSON to CSV with automatic header detection.',
keywords: ['json', 'to', 'csv', 'convert'],
component: () => import('./json-to-csv.vue'),
icon: List,
diff --git a/src/tools/json-to-toml/index.ts b/src/tools/json-to-toml/index.ts
index da42c18d..13e45eaf 100644
--- a/src/tools/json-to-toml/index.ts
+++ b/src/tools/json-to-toml/index.ts
@@ -1,11 +1,10 @@
import { Braces } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.json-to-toml.title'),
+ name: 'JSON to TOML',
path: '/json-to-toml',
- description: translate('tools.json-to-toml.description'),
+ description: 'Parse and convert JSON to TOML.',
keywords: ['json', 'parse', 'toml', 'convert', 'transform'],
component: () => import('./json-to-toml.vue'),
icon: Braces,
diff --git a/src/tools/json-to-xml/index.ts b/src/tools/json-to-xml/index.ts
deleted file mode 100644
index c35ace2b..00000000
--- a/src/tools/json-to-xml/index.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Braces } from '@vicons/tabler';
-import { defineTool } from '../tool';
-
-export const tool = defineTool({
- name: 'JSON to XML',
- path: '/json-to-xml',
- description: 'Convert JSON to XML',
- keywords: ['json', 'xml'],
- component: () => import('./json-to-xml.vue'),
- icon: Braces,
- createdAt: new Date('2024-08-09'),
-});
diff --git a/src/tools/json-to-xml/json-to-xml.vue b/src/tools/json-to-xml/json-to-xml.vue
deleted file mode 100644
index 96a7cf16..00000000
--- a/src/tools/json-to-xml/json-to-xml.vue
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
diff --git a/src/tools/json-to-yaml-converter/index.ts b/src/tools/json-to-yaml-converter/index.ts
index c01e3ec0..9db09d3e 100644
--- a/src/tools/json-to-yaml-converter/index.ts
+++ b/src/tools/json-to-yaml-converter/index.ts
@@ -1,11 +1,10 @@
import { Braces } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.json-to-yaml-converter.title'),
+ name: 'JSON to YAML converter',
path: '/json-to-yaml-converter',
- description: translate('tools.json-to-yaml-converter.description'),
+ description: 'Simply convert JSON to YAML with this live online converter.',
keywords: ['yaml', 'to', 'json'],
component: () => import('./json-to-yaml.vue'),
icon: Braces,
diff --git a/src/tools/json-viewer/index.ts b/src/tools/json-viewer/index.ts
index bc488245..6b5b8812 100644
--- a/src/tools/json-viewer/index.ts
+++ b/src/tools/json-viewer/index.ts
@@ -1,11 +1,10 @@
import { Braces } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.json-prettify.title'),
+ name: 'JSON prettify and format',
path: '/json-prettify',
- description: translate('tools.json-prettify.description'),
+ description: 'Prettify your JSON string to a human friendly readable format.',
keywords: ['json', 'viewer', 'prettify', 'format'],
component: () => import('./json-viewer.vue'),
icon: Braces,
diff --git a/src/tools/jwt-parser/index.ts b/src/tools/jwt-parser/index.ts
index 939b4b34..7249ace0 100644
--- a/src/tools/jwt-parser/index.ts
+++ b/src/tools/jwt-parser/index.ts
@@ -1,11 +1,10 @@
import { Key } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.jwt-parser.title'),
+ name: 'JWT parser',
path: '/jwt-parser',
- description: translate('tools.jwt-parser.description'),
+ description: 'Parse and decode your JSON Web Token (jwt) and display its content.',
keywords: [
'jwt',
'parser',
diff --git a/src/tools/jwt-parser/jwt-parser.service.ts b/src/tools/jwt-parser/jwt-parser.service.ts
index 543f4c8b..cc39145a 100644
--- a/src/tools/jwt-parser/jwt-parser.service.ts
+++ b/src/tools/jwt-parser/jwt-parser.service.ts
@@ -19,7 +19,7 @@ function decodeJwt({ jwt }: { jwt: string }) {
function parseClaims({ claim, value }: { claim: string; value: unknown }) {
const claimDescription = CLAIM_DESCRIPTIONS[claim];
- const formattedValue = _.isPlainObject(value) || _.isArray(value) ? JSON.stringify(value, null, 3) : _.toString(value);
+ const formattedValue = _.isPlainObject(value) ? JSON.stringify(value, null, 3) : _.toString(value);
const friendlyValue = getFriendlyValue({ claim, value });
return {
diff --git a/src/tools/jwt-parser/jwt-parser.vue b/src/tools/jwt-parser/jwt-parser.vue
index a26064d7..6b30fc0c 100644
--- a/src/tools/jwt-parser/jwt-parser.vue
+++ b/src/tools/jwt-parser/jwt-parser.vue
@@ -39,7 +39,7 @@ const validation = useValidation({
{{ section.title }}
-
diff --git a/src/tools/percentage-calculator/index.ts b/src/tools/percentage-calculator/index.ts
index 33c5b2f1..736f5706 100644
--- a/src/tools/percentage-calculator/index.ts
+++ b/src/tools/percentage-calculator/index.ts
@@ -1,11 +1,10 @@
import { Percentage } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.percentage-calculator.title'),
+ name: 'Percentage calculator',
path: '/percentage-calculator',
- description: translate('tools.percentage-calculator.description'),
+ description: 'Easily calculate percentages from a value to another value, or from a percentage to a value.',
keywords: ['percentage', 'calculator', 'calculate', 'value', 'number', '%'],
component: () => import('./percentage-calculator.vue'),
icon: Percentage,
diff --git a/src/tools/phone-parser-and-formatter/index.ts b/src/tools/phone-parser-and-formatter/index.ts
index 094b21e8..5b19ae61 100644
--- a/src/tools/phone-parser-and-formatter/index.ts
+++ b/src/tools/phone-parser-and-formatter/index.ts
@@ -1,11 +1,11 @@
import { Phone } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.phone-parser-and-formatter.title'),
+ name: 'Phone parser and formatter',
path: '/phone-parser-and-formatter',
- description: translate('tools.phone-parser-and-formatter.description'),
+ description:
+ 'Parse, validate and format phone numbers. Get information about the phone number, like the country code, type, etc.',
keywords: [
'phone',
'parser',
diff --git a/src/tools/qr-code-generator/index.ts b/src/tools/qr-code-generator/index.ts
index b97b4cbc..4c2f86bb 100644
--- a/src/tools/qr-code-generator/index.ts
+++ b/src/tools/qr-code-generator/index.ts
@@ -1,11 +1,11 @@
import { Qrcode } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.qrcode-generator.title'),
+ name: 'QR Code generator',
path: '/qrcode-generator',
- description: translate('tools.qrcode-generator.description'),
+ description:
+ 'Generate and download QR-code for an url or just a text and customize the background and foreground colors.',
keywords: ['qr', 'code', 'generator', 'square', 'color', 'link', 'low', 'medium', 'quartile', 'high', 'transparent'],
component: () => import('./qr-code-generator.vue'),
icon: Qrcode,
diff --git a/src/tools/random-port-generator/index.ts b/src/tools/random-port-generator/index.ts
index e300b8f0..febdc2a4 100644
--- a/src/tools/random-port-generator/index.ts
+++ b/src/tools/random-port-generator/index.ts
@@ -1,11 +1,10 @@
import { Server } from '@vicons/tabler';
import { defineTool } from '../tool';
-import { translate } from '@/plugins/i18n.plugin';
export const tool = defineTool({
- name: translate('tools.random-port-generator.title'),
+ name: 'Random port generator',
path: '/random-port-generator',
- description: translate('tools.random-port-generator.description'),
+ description: 'Generate random port numbers outside of the range of "known" ports (0-1023).',
keywords: ['system', 'port', 'lan', 'generator', 'random', 'development', 'computer'],
component: () => import('./random-port-generator.vue'),
icon: Server,
diff --git a/src/tools/regex-memo/index.ts b/src/tools/regex-memo/index.ts
deleted file mode 100644
index f1f56489..00000000
--- a/src/tools/regex-memo/index.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { BrandJavascript } from '@vicons/tabler';
-import { defineTool } from '../tool';
-
-export const tool = defineTool({
- name: 'Regex cheatsheet',
- path: '/regex-memo',
- description: 'Javascript Regex/Regular Expression cheatsheet',
- keywords: ['regex', 'regular', 'expression', 'javascript', 'memo', 'cheatsheet'],
- component: () => import('./regex-memo.vue'),
- icon: BrandJavascript,
- createdAt: new Date('2024-09-20'),
-});
diff --git a/src/tools/regex-memo/regex-memo.content.md b/src/tools/regex-memo/regex-memo.content.md
deleted file mode 100644
index 0f779401..00000000
--- a/src/tools/regex-memo/regex-memo.content.md
+++ /dev/null
@@ -1,121 +0,0 @@
-### Normal characters
-
-Expression | Description
-:--|:--
-`.` or `[^\n\r]` | any character *excluding* a newline or carriage return
-`[A-Za-z]` | alphabet
-`[a-z]` | lowercase alphabet
-`[A-Z]` | uppercase alphabet
-`\d` or `[0-9]` | digit
-`\D` or `[^0-9]` | non-digit
-`_` | underscore
-`\w` or `[A-Za-z0-9_]` | alphabet, digit or underscore
-`\W` or `[^A-Za-z0-9_]` | inverse of `\w`
-`\S` | inverse of `\s`
-
-### Whitespace characters
-
-Expression | Description
-:--|:--
-` ` | space
-`\t` | tab
-`\n` | newline
-`\r` | carriage return
-`\s` | space, tab, newline or carriage return
-
-### Character set
-
-Expression | Description
-:--|:--
-`[xyz]` | either `x`, `y` or `z`
-`[^xyz]` | neither `x`, `y` nor `z`
-`[1-3]` | either `1`, `2` or `3`
-`[^1-3]` | neither `1`, `2` nor `3`
-
-- Think of a character set as an `OR` operation on the single characters that are enclosed between the square brackets.
-- Use `^` after the opening `[` to “negate” the character set.
-- Within a character set, `.` means a literal period.
-
-### Characters that require escaping
-
-#### Outside a character set
-
-Expression | Description
-:--|:--
-`\.` | period
-`\^` | caret
-`\$` | dollar sign
-`\|` | pipe
-`\\` | back slash
-`\/` | forward slash
-`\(` | opening bracket
-`\)` | closing bracket
-`\[` | opening square bracket
-`\]` | closing square bracket
-`\{` | opening curly bracket
-`\}` | closing curly bracket
-
-#### Inside a character set
-
-Expression | Description
-:--|:--
-`\\` | back slash
-`\]` | closing square bracket
-
-- A `^` must be escaped only if it occurs immediately after the opening `[` of the character set.
-- A `-` must be escaped only if it occurs between two alphabets or two digits.
-
-### Quantifiers
-
-Expression | Description
-:--|:--
-`{2}` | exactly 2
-`{2,}` | at least 2
-`{2,7}` | at least 2 but no more than 7
-`*` | 0 or more
-`+` | 1 or more
-`?` | exactly 0 or 1
-
-- The quantifier goes *after* the expression to be quantified.
-
-### Boundaries
-
-Expression | Description
-:--|:--
-`^` | start of string
-`$` | end of string
-`\b` | word boundary
-
-- How word boundary matching works:
- - At the beginning of the string if the first character is `\w`.
- - Between two adjacent characters within the string, if the first character is `\w` and the second character is `\W`.
- - At the end of the string if the last character is `\w`.
-
-### Matching
-
-Expression | Description
-:--|:--
-`foo\|bar` | match either `foo` or `bar`
-`foo(?=bar)` | match `foo` if it’s before `bar`
-`foo(?!bar)` | match `foo` if it’s *not* before `bar`
-`(?<=bar)foo` | match `foo` if it’s after `bar`
-`(?
-import { useThemeVars } from 'naive-ui';
-import Memo from './regex-memo.content.md';
-
-const themeVars = useThemeVars();
-
-
-
-
Lorem ipsum dolor sit amet consectetur adipisicing elit. Magni reprehenderit itaque enim? Suscipit magni optio velit
quia, eveniet repellat pariatur quaerat laudantium dignissimos natus, beatae deleniti adipisci, atque necessitatibus
odio!
-
-
- Lorem ipsum dolor sit amet consectetur adipisicing elit.
- Molestias, quisquam vitae saepe dolores quas debitis ab r
- ecusandae suscipit ex dignissimos minus quam repellat sunt.
- Molestiae culpa blanditiis totam sapiente dignissimos.
-