Skip to content

Commit c0f7f8f

Browse files
committed
feat(new tool): ascii art generator
Fix CorentinTh#829 ; Text ASCII Art Generator (using figlet)
1 parent 80e46c9 commit c0f7f8f

File tree

6 files changed

+133
-33
lines changed

6 files changed

+133
-33
lines changed

components.d.ts

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ declare module '@vue/runtime-core' {
1212
'404.page': typeof import('./src/pages/404.page.vue')['default']
1313
About: typeof import('./src/pages/About.vue')['default']
1414
App: typeof import('./src/App.vue')['default']
15+
AsciiTextDrawer: typeof import('./src/tools/ascii-text-drawer/ascii-text-drawer.vue')['default']
1516
'Base.layout': typeof import('./src/layouts/base.layout.vue')['default']
1617
Base64FileConverter: typeof import('./src/tools/base64-file-converter/base64-file-converter.vue')['default']
1718
Base64StringConverter: typeof import('./src/tools/base64-string-converter/base64-string-converter.vue')['default']
@@ -88,29 +89,17 @@ declare module '@vue/runtime-core' {
8889
HttpStatusCodes: typeof import('./src/tools/http-status-codes/http-status-codes.vue')['default']
8990
IbanValidatorAndParser: typeof import('./src/tools/iban-validator-and-parser/iban-validator-and-parser.vue')['default']
9091
'IconMdi:brushVariant': typeof import('~icons/mdi/brush-variant')['default']
91-
'IconMdi:contentCopy': typeof import('~icons/mdi/content-copy')['default']
9292
'IconMdi:kettleSteamOutline': typeof import('~icons/mdi/kettle-steam-outline')['default']
93-
IconMdiArrowDown: typeof import('~icons/mdi/arrow-down')['default']
94-
IconMdiArrowRight: typeof import('~icons/mdi/arrow-right')['default']
95-
IconMdiArrowRightBottom: typeof import('~icons/mdi/arrow-right-bottom')['default']
96-
IconMdiCamera: typeof import('~icons/mdi/camera')['default']
9793
IconMdiChevronDown: typeof import('~icons/mdi/chevron-down')['default']
9894
IconMdiChevronRight: typeof import('~icons/mdi/chevron-right')['default']
9995
IconMdiClose: typeof import('~icons/mdi/close')['default']
10096
IconMdiContentCopy: typeof import('~icons/mdi/content-copy')['default']
101-
IconMdiDeleteOutline: typeof import('~icons/mdi/delete-outline')['default']
102-
IconMdiDownload: typeof import('~icons/mdi/download')['default']
10397
IconMdiEye: typeof import('~icons/mdi/eye')['default']
10498
IconMdiEyeOff: typeof import('~icons/mdi/eye-off')['default']
10599
IconMdiHeart: typeof import('~icons/mdi/heart')['default']
106-
IconMdiPause: typeof import('~icons/mdi/pause')['default']
107-
IconMdiPlay: typeof import('~icons/mdi/play')['default']
108-
IconMdiRecord: typeof import('~icons/mdi/record')['default']
109-
IconMdiRefresh: typeof import('~icons/mdi/refresh')['default']
110100
IconMdiSearch: typeof import('~icons/mdi/search')['default']
111101
IconMdiTranslate: typeof import('~icons/mdi/translate')['default']
112102
IconMdiTriangleDown: typeof import('~icons/mdi/triangle-down')['default']
113-
IconMdiVideo: typeof import('~icons/mdi/video')['default']
114103
InputCopyable: typeof import('./src/components/InputCopyable.vue')['default']
115104
IntegerBaseConverter: typeof import('./src/tools/integer-base-converter/integer-base-converter.vue')['default']
116105
Ipv4AddressConverter: typeof import('./src/tools/ipv4-address-converter/ipv4-address-converter.vue')['default']
@@ -137,42 +126,26 @@ declare module '@vue/runtime-core' {
137126
MenuLayout: typeof import('./src/components/MenuLayout.vue')['default']
138127
MetaTagGenerator: typeof import('./src/tools/meta-tag-generator/meta-tag-generator.vue')['default']
139128
MimeTypes: typeof import('./src/tools/mime-types/mime-types.vue')['default']
140-
NAlert: typeof import('naive-ui')['NAlert']
141129
NavbarButtons: typeof import('./src/components/NavbarButtons.vue')['default']
142-
NCheckbox: typeof import('naive-ui')['NCheckbox']
143130
NCode: typeof import('naive-ui')['NCode']
144131
NCollapseTransition: typeof import('naive-ui')['NCollapseTransition']
145-
NColorPicker: typeof import('naive-ui')['NColorPicker']
146132
NConfigProvider: typeof import('naive-ui')['NConfigProvider']
147-
NDatePicker: typeof import('naive-ui')['NDatePicker']
148133
NDivider: typeof import('naive-ui')['NDivider']
149-
NDynamicInput: typeof import('naive-ui')['NDynamicInput']
150134
NEllipsis: typeof import('naive-ui')['NEllipsis']
151-
NForm: typeof import('naive-ui')['NForm']
152135
NFormItem: typeof import('naive-ui')['NFormItem']
153136
NGi: typeof import('naive-ui')['NGi']
154137
NGrid: typeof import('naive-ui')['NGrid']
155138
NH1: typeof import('naive-ui')['NH1']
156-
NH2: typeof import('naive-ui')['NH2']
157139
NH3: typeof import('naive-ui')['NH3']
158140
NIcon: typeof import('naive-ui')['NIcon']
159-
NImage: typeof import('naive-ui')['NImage']
160-
NInputGroup: typeof import('naive-ui')['NInputGroup']
161-
NInputGroupLabel: typeof import('naive-ui')['NInputGroupLabel']
162141
NInputNumber: typeof import('naive-ui')['NInputNumber']
163142
NLayout: typeof import('naive-ui')['NLayout']
164143
NLayoutSider: typeof import('naive-ui')['NLayoutSider']
165144
NMenu: typeof import('naive-ui')['NMenu']
166-
NProgress: typeof import('naive-ui')['NProgress']
167145
NScrollbar: typeof import('naive-ui')['NScrollbar']
168-
NSlider: typeof import('naive-ui')['NSlider']
169-
NStatistic: typeof import('naive-ui')['NStatistic']
170-
NSwitch: typeof import('naive-ui')['NSwitch']
171-
NTable: typeof import('naive-ui')['NTable']
146+
NSpin: typeof import('naive-ui')['NSpin']
172147
NTag: typeof import('naive-ui')['NTag']
173148
NumeronymGenerator: typeof import('./src/tools/numeronym-generator/numeronym-generator.vue')['default']
174-
NUpload: typeof import('naive-ui')['NUpload']
175-
NUploadDragger: typeof import('naive-ui')['NUploadDragger']
176149
OtpCodeGeneratorAndValidator: typeof import('./src/tools/otp-code-generator-and-validator/otp-code-generator-and-validator.vue')['default']
177150
PasswordStrengthAnalyser: typeof import('./src/tools/password-strength-analyser/password-strength-analyser.vue')['default']
178151
PdfSignatureChecker: typeof import('./src/tools/pdf-signature-checker/pdf-signature-checker.vue')['default']

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
"@tiptap/pm": "2.1.6",
4242
"@tiptap/starter-kit": "2.1.6",
4343
"@tiptap/vue-3": "2.0.3",
44+
"@types/figlet": "^1.5.8",
4445
"@vicons/material": "^0.12.0",
4546
"@vicons/tabler": "^0.12.0",
4647
"@vueuse/core": "^10.3.0",
@@ -57,6 +58,7 @@
5758
"date-fns": "^2.29.3",
5859
"dompurify": "^3.0.6",
5960
"emojilib": "^3.0.10",
61+
"figlet": "^1.7.0",
6062
"figue": "^1.2.0",
6163
"fuse.js": "^6.6.2",
6264
"highlight.js": "^11.7.0",

pnpm-lock.yaml

Lines changed: 19 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
<script setup lang="ts">
2+
import figlet from 'figlet';
3+
import TextareaCopyable from '@/components/TextareaCopyable.vue';
4+
5+
const input = ref('Ascii ART');
6+
const font = useStorage('ascii-text-drawer:font', 'Standard');
7+
const width = useStorage('ascii-text-drawer:width', 80);
8+
const output = ref('');
9+
const errored = ref(false);
10+
const processing = ref(false);
11+
figlet.defaults({ fontPath: '//unpkg.com/[email protected]/fonts/' });
12+
13+
watchEffect(async () => {
14+
processing.value = true;
15+
try {
16+
const options: figlet.Options = {
17+
font: font.value as figlet.Fonts,
18+
width: width.value,
19+
whitespaceBreak: true,
20+
};
21+
output.value = await (new Promise<string>((resolve, reject) =>
22+
figlet.text(input.value, options,
23+
(err, text) => {
24+
if (err) {
25+
reject(err);
26+
return;
27+
}
28+
29+
resolve(text ?? '');
30+
})));
31+
errored.value = false;
32+
}
33+
catch (e: any) {
34+
errored.value = true;
35+
}
36+
processing.value = false;
37+
});
38+
39+
const fonts = ['1Row', '3-D', '3D Diagonal', '3D-ASCII', '3x5', '4Max', '5 Line Oblique', 'AMC 3 Line', 'AMC 3 Liv1', 'AMC AAA01', 'AMC Neko', 'AMC Razor', 'AMC Razor2', 'AMC Slash', 'AMC Slider', 'AMC Thin', 'AMC Tubes', 'AMC Untitled', 'ANSI Shadow', 'ASCII New Roman', 'Acrobatic', 'Alligator', 'Alligator2', 'Alpha', 'Alphabet', 'Arrows', 'Avatar', 'B1FF', 'B1FF', 'Banner', 'Banner3-D', 'Banner3', 'Banner4', 'Barbwire', 'Basic', 'Bear', 'Bell', 'Benjamin', 'Big Chief', 'Big Money-ne', 'Big Money-nw', 'Big Money-se', 'Big Money-sw', 'Big', 'Bigfig', 'Binary', 'Block', 'Blocks', 'Bloody', 'Bolger', 'Braced', 'Bright', 'Broadway KB', 'Broadway', 'Bubble', 'Bulbhead', 'Caligraphy', 'Caligraphy2', 'Calvin S', 'Cards', 'Catwalk', 'Chiseled', 'Chunky', 'Coinstak', 'Cola', 'Colossal', 'Computer', 'Contessa', 'Contrast', 'Cosmike', 'Crawford', 'Crawford2', 'Crazy', 'Cricket', 'Cursive', 'Cyberlarge', 'Cybermedium', 'Cybersmall', 'Cygnet', 'DANC4', 'DOS Rebel', 'DWhistled', 'Dancing Font', 'Decimal', 'Def Leppard', 'Delta Corps Priest 1', 'Diamond', 'Diet Cola', 'Digital', 'Doh', 'Doom', 'Dot Matrix', 'Double Shorts', 'Double', 'Dr Pepper', 'Efti Chess', 'Efti Font', 'Efti Italic', 'Efti Piti', 'Efti Robot', 'Efti Wall', 'Efti Water', 'Electronic', 'Elite', 'Epic', 'Fender', 'Filter', 'Fire Font-k', 'Fire Font-s', 'Flipped', 'Flower Power', 'Four Tops', 'Fraktur', 'Fun Face', 'Fun Faces', 'Fuzzy', 'Georgi16', 'Georgia11', 'Ghost', 'Ghoulish', 'Glenyn', 'Goofy', 'Gothic', 'Graceful', 'Gradient', 'Graffiti', 'Greek', 'Heart Left', 'Heart Right', 'Henry 3D', 'Hex', 'Hieroglyphs', 'Hollywood', 'Horizontal Left', 'Horizontal Right', 'ICL-1900', 'Impossible', 'Invita', 'Isometric1', 'Isometric2', 'Isometric3', 'Isometric4', 'Italic', 'Ivrit', 'JS Block Letters', 'JS Bracket Letters', 'JS Capital Curves', 'JS Cursive', 'JS Stick Letters', 'Jacky', 'Jazmine', 'Jerusalem', 'Katakana', 'Kban', 'Keyboard', 'Knob', 'Konto Slant', 'Konto', 'LCD', 'Larry 3D 2', 'Larry 3D', 'Lean', 'Letters', 'Lil Devil', 'Line Blocks', 'Linux', 'Lockergnome', 'Madrid', 'Marquee', 'Maxfour', 'Merlin1', 'Merlin2', 'Mike', 'Mini', 'Mirror', 'Mnemonic', 'Modular', 'Morse', 'Morse2', 'Moscow', 'Mshebrew210', 'Muzzle', 'NScript', 'NT Greek', 'NV Script', 'Nancyj-Fancy', 'Nancyj-Improved', 'Nancyj-Underlined', 'Nancyj', 'Nipples', 'O8', 'OS2', 'Octal', 'Ogre', 'Old Banner', 'Patorjk\'s Cheese', 'Patorjk-HeX', 'Pawp', 'Peaks Slant', 'Peaks', 'Pebbles', 'Pepper', 'Poison', 'Puffy', 'Puzzle', 'Pyramid', 'Rammstein', 'Rectangles', 'Red Phoenix', 'Relief', 'Relief2', 'Reverse', 'Roman', 'Rot13', 'Rot13', 'Rotated', 'Rounded', 'Rowan Cap', 'Rozzo', 'Runic', 'Runyc', 'S Blood', 'SL Script', 'Santa Clara', 'Script', 'Serifcap', 'Shadow', 'Shimrod', 'Short', 'Slant Relief', 'Slant', 'Slide', 'Small Caps', 'Small Isometric1', 'Small Keyboard', 'Small Poison', 'Small Script', 'Small Shadow', 'Small Slant', 'Small Tengwar', 'Small', 'Soft', 'Speed', 'Spliff', 'Stacey', 'Stampate', 'Stampatello', 'Standard', 'Star Strips', 'Star Wars', 'Stellar', 'Stforek', 'Stick Letters', 'Stop', 'Straight', 'Stronger Than All', 'Sub-Zero', 'Swamp Land', 'Swan', 'Sweet', 'THIS', 'Tanja', 'Tengwar', 'Term', 'Test1', 'The Edge', 'Thick', 'Thin', 'Thorned', 'Three Point', 'Ticks Slant', 'Ticks', 'Tiles', 'Tinker-Toy', 'Tombstone', 'Train', 'Trek', 'Tsalagi', 'Tubular', 'Twisted', 'Two Point', 'USA Flag', 'Univers', 'Varsity', 'Wavy', 'Weird', 'Wet Letter', 'Whimsy', 'Wow'];
40+
</script>
41+
42+
<template>
43+
<c-card>
44+
<c-input-text
45+
v-model:value="input"
46+
label="Your text:"
47+
placeholder="Your text to draw"
48+
raw-text
49+
/>
50+
51+
<n-divider />
52+
53+
<n-grid cols="4" x-gap="12" w-full>
54+
<n-gi span="2">
55+
<c-select
56+
v-model:value="font"
57+
label-position="top"
58+
label="Font:"
59+
:options="fonts"
60+
placeholder="Select font to use"
61+
/>
62+
</n-gi>
63+
<n-gi span="2">
64+
<n-form-item label="Width:" label-placement="top" label-width="100" :show-feedback="false">
65+
<n-input-number v-model:value="width" min="0" max="10000" w-100px />
66+
</n-form-item>
67+
</n-gi>
68+
</n-grid>
69+
70+
<n-divider />
71+
72+
<div v-if="processing" flex items-center justify-center>
73+
<n-spin size="medium" />
74+
</div>
75+
76+
<c-alert v-if="errored" mt-1 text-center type="error">
77+
Current settings resulted in error.
78+
</c-alert>
79+
80+
<TextareaCopyable
81+
v-if="!processing && !errored"
82+
:value="output"
83+
label="Ascii Art text:"
84+
mb-1 mt-1
85+
copy-placement="outside"
86+
/>
87+
</c-card>
88+
</template>

src/tools/ascii-text-drawer/index.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { Artboard } from '@vicons/tabler';
2+
import { defineTool } from '../tool';
3+
4+
export const tool = defineTool({
5+
name: 'ASCII Art Text Drawer',
6+
path: '/ascii-text-drawer',
7+
description: 'Draw a text using Ascii Art',
8+
keywords: ['ascii', "asciiart", 'text', 'drawer'],
9+
component: () => import('./ascii-text-drawer.vue'),
10+
icon: Artboard,
11+
createdAt: new Date('2024-02-17'),
12+
});

src/tools/index.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { tool as base64FileConverter } from './base64-file-converter';
22
import { tool as base64StringConverter } from './base64-string-converter';
33
import { tool as basicAuthGenerator } from './basic-auth-generator';
4+
import { tool as asciiTextDrawer } from './ascii-text-drawer';
45
import { tool as pdfSignatureChecker } from './pdf-signature-checker';
56
import { tool as numeronymGenerator } from './numeronym-generator';
67
import { tool as macAddressGenerator } from './mac-address-generator';
@@ -155,7 +156,15 @@ export const toolsByCategory: ToolCategory[] = [
155156
},
156157
{
157158
name: 'Text',
158-
components: [loremIpsumGenerator, textStatistics, emojiPicker, stringObfuscator, textDiff, numeronymGenerator],
159+
components: [
160+
loremIpsumGenerator,
161+
textStatistics,
162+
emojiPicker,
163+
stringObfuscator,
164+
textDiff,
165+
numeronymGenerator,
166+
asciiTextDrawer,
167+
],
159168
},
160169
{
161170
name: 'Data',

0 commit comments

Comments
 (0)