Skip to content

Commit 8c65ad8

Browse files
authored
Merge branch 'main' into feat/hex-file-converter
2 parents 0c63eb7 + f5c4ab1 commit 8c65ad8

21 files changed

+758
-7
lines changed

.github/logo-dark.png

39.5 KB
Loading

.github/logo-white.png

38.7 KB
Loading

.github/logo.png

-7.81 KB
Binary file not shown.

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
![logo](.github/logo.png)
1+
<picture>
2+
<source srcset="./.github/logo-dark.png" media="(prefers-color-scheme: light)">
3+
<source srcset="./.github/logo-white.png" media="(prefers-color-scheme: dark)">
4+
<img src="./.github/logo-dark.png" alt="logo">
5+
</picture>
26

37
Useful tools for developer and people working in IT. [Have a look !](https://it-tools.tech).
48

components.d.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ declare module '@vue/runtime-core' {
122122
LoremIpsumGenerator: typeof import('./src/tools/lorem-ipsum-generator/lorem-ipsum-generator.vue')['default']
123123
MacAddressGenerator: typeof import('./src/tools/mac-address-generator/mac-address-generator.vue')['default']
124124
MacAddressLookup: typeof import('./src/tools/mac-address-lookup/mac-address-lookup.vue')['default']
125+
MarkdownToHtml: typeof import('./src/tools/markdown-to-html/markdown-to-html.vue')['default']
125126
MathEvaluator: typeof import('./src/tools/math-evaluator/math-evaluator.vue')['default']
126127
MenuBar: typeof import('./src/tools/html-wysiwyg-editor/editor/menu-bar.vue')['default']
127128
MenuBarItem: typeof import('./src/tools/html-wysiwyg-editor/editor/menu-bar-item.vue')['default']
@@ -130,7 +131,7 @@ declare module '@vue/runtime-core' {
130131
MetaTagGenerator: typeof import('./src/tools/meta-tag-generator/meta-tag-generator.vue')['default']
131132
MimeTypes: typeof import('./src/tools/mime-types/mime-types.vue')['default']
132133
NavbarButtons: typeof import('./src/components/NavbarButtons.vue')['default']
133-
NCode: typeof import('naive-ui')['NCode']
134+
NCheckbox: typeof import('naive-ui')['NCheckbox']
134135
NCollapseTransition: typeof import('naive-ui')['NCollapseTransition']
135136
NConfigProvider: typeof import('naive-ui')['NConfigProvider']
136137
NDivider: typeof import('naive-ui')['NDivider']
@@ -154,6 +155,9 @@ declare module '@vue/runtime-core' {
154155
PhoneParserAndFormatter: typeof import('./src/tools/phone-parser-and-formatter/phone-parser-and-formatter.vue')['default']
155156
QrCodeGenerator: typeof import('./src/tools/qr-code-generator/qr-code-generator.vue')['default']
156157
RandomPortGenerator: typeof import('./src/tools/random-port-generator/random-port-generator.vue')['default']
158+
RegexMemo: typeof import('./src/tools/regex-memo/regex-memo.vue')['default']
159+
'RegexMemo.content': typeof import('./src/tools/regex-memo/regex-memo.content.md')['default']
160+
RegexTester: typeof import('./src/tools/regex-tester/regex-tester.vue')['default']
157161
ResultRow: typeof import('./src/tools/ipv4-range-expander/result-row.vue')['default']
158162
RomanNumeralConverter: typeof import('./src/tools/roman-numeral-converter/roman-numeral-converter.vue')['default']
159163
RouterLink: typeof import('vue-router')['RouterLink']

package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,13 @@
3737
"dependencies": {
3838
"@it-tools/bip39": "^0.0.4",
3939
"@it-tools/oggen": "^1.3.0",
40+
"@regexper/render": "^1.0.0",
4041
"@sindresorhus/slugify": "^2.2.1",
4142
"@tiptap/pm": "2.1.6",
4243
"@tiptap/starter-kit": "2.1.6",
4344
"@tiptap/vue-3": "2.0.3",
4445
"@types/figlet": "^1.5.8",
46+
"@types/markdown-it": "^13.0.7",
4547
"@vicons/material": "^0.12.0",
4648
"@vicons/tabler": "^0.12.0",
4749
"@vueuse/core": "^10.3.0",
@@ -70,6 +72,7 @@
7072
"jwt-decode": "^3.1.2",
7173
"libphonenumber-js": "^1.10.28",
7274
"lodash": "^4.17.21",
75+
"markdown-it": "^14.0.0",
7376
"marked": "^10.0.0",
7477
"mathjs": "^11.9.1",
7578
"mime-types": "^2.1.35",
@@ -82,6 +85,7 @@
8285
"pinia": "^2.0.34",
8386
"plausible-tracker": "^0.3.8",
8487
"qrcode": "^1.5.1",
88+
"randexp": "^0.5.3",
8589
"sql-formatter": "^13.0.0",
8690
"ua-parser-js": "^1.0.35",
8791
"ulid": "^2.3.0",
@@ -91,6 +95,7 @@
9195
"vue": "^3.3.4",
9296
"vue-i18n": "^9.9.1",
9397
"vue-router": "^4.1.6",
98+
"vue-shadow-dom": "^4.2.0",
9499
"vue-tsc": "^1.8.1",
95100
"xml-formatter": "^3.3.2",
96101
"xml-js": "^1.6.11",

pnpm-lock.yaml

Lines changed: 90 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/TextareaCopyable.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import sqlHljs from 'highlight.js/lib/languages/sql';
77
import xmlHljs from 'highlight.js/lib/languages/xml';
88
import yamlHljs from 'highlight.js/lib/languages/yaml';
99
import iniHljs from 'highlight.js/lib/languages/ini';
10+
import markdownHljs from 'highlight.js/lib/languages/markdown';
1011
import { useCopy } from '@/composable/copy';
1112
1213
const props = withDefaults(
@@ -30,6 +31,7 @@ hljs.registerLanguage('html', xmlHljs);
3031
hljs.registerLanguage('xml', xmlHljs);
3132
hljs.registerLanguage('yaml', yamlHljs);
3233
hljs.registerLanguage('toml', iniHljs);
34+
hljs.registerLanguage('markdown', markdownHljs);
3335
3436
const { value, language, followHeightOf, copyPlacement, copyMessage } = toRefs(props);
3537
const { height } = followHeightOf.value ? useElementSize(followHeightOf) : { height: ref(null) };

src/composable/queryParams.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { useRouteQuery } from '@vueuse/router';
22
import { computed } from 'vue';
3+
import { useStorage } from '@vueuse/core';
34

4-
export { useQueryParam };
5+
export { useQueryParam, useQueryParamOrStorage };
56

67
const transformers = {
78
number: {
@@ -16,6 +17,12 @@ const transformers = {
1617
fromQuery: (value: string) => value.toLowerCase() === 'true',
1718
toQuery: (value: boolean) => (value ? 'true' : 'false'),
1819
},
20+
object: {
21+
fromQuery: (value: string) => {
22+
return JSON.parse(value);
23+
},
24+
toQuery: (value: object) => JSON.stringify(value),
25+
},
1926
};
2027

2128
function useQueryParam<T>({ name, defaultValue }: { name: string; defaultValue: T }) {
@@ -33,3 +40,27 @@ function useQueryParam<T>({ name, defaultValue }: { name: string; defaultValue:
3340
},
3441
});
3542
}
43+
44+
function useQueryParamOrStorage<T>({ name, storageName, defaultValue }: { name: string; storageName: string; defaultValue: T }) {
45+
const type = typeof defaultValue;
46+
const transformer = transformers[type as keyof typeof transformers] ?? transformers.string;
47+
48+
const storageRef = useStorage(storageName, defaultValue);
49+
const proxyDefaultValue = transformer.toQuery(defaultValue as never);
50+
const proxy = useRouteQuery(name, proxyDefaultValue);
51+
52+
const r = ref(defaultValue);
53+
54+
watch(r,
55+
(value) => {
56+
proxy.value = transformer.toQuery(value as never);
57+
storageRef.value = value as never;
58+
},
59+
{ deep: true });
60+
61+
r.value = (proxy.value && proxy.value !== proxyDefaultValue
62+
? transformer.fromQuery(proxy.value) as unknown as T
63+
: storageRef.value as T) as never;
64+
65+
return r;
66+
}

0 commit comments

Comments
 (0)