From 5dcb2ed95c318ea1c4134da207c844672d0fbbd8 Mon Sep 17 00:00:00 2001 From: Corentin Thomasset Date: Thu, 14 Apr 2022 00:00:29 +0200 Subject: [PATCH] feat(tool): lorem ipsum generator --- src/tools/index.ts | 6 + src/tools/lorem-ipsum-generator/index.ts | 11 + .../lorem-ipsum-generator.service.ts | 214 ++++++++++++++++++ .../lorem-ipsum-generator.vue | 55 +++++ 4 files changed, 286 insertions(+) create mode 100644 src/tools/lorem-ipsum-generator/index.ts create mode 100644 src/tools/lorem-ipsum-generator/lorem-ipsum-generator.service.ts create mode 100644 src/tools/lorem-ipsum-generator/lorem-ipsum-generator.vue diff --git a/src/tools/index.ts b/src/tools/index.ts index 7bf13483..649b69d2 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -12,6 +12,7 @@ import { tool as gitMemo } from './git-memo'; import { tool as baseConverter } from './integer-base-converter'; import { tool as urlEncoder } from './url-encoder'; import { tool as randomPortGenerator } from './random-port-generator'; +import { tool as loremIpsumGenerator } from './lorem-ipsum-generator'; export const toolsByCategory: ToolCategory[] = [ { @@ -34,6 +35,11 @@ export const toolsByCategory: ToolCategory[] = [ icon: LockOpen, components: [gitMemo, randomPortGenerator], }, + { + name: 'Text', + icon: LockOpen, + components: [loremIpsumGenerator], + }, ]; export const tools = toolsByCategory.flatMap(({ components }) => components); diff --git a/src/tools/lorem-ipsum-generator/index.ts b/src/tools/lorem-ipsum-generator/index.ts new file mode 100644 index 00000000..78a54064 --- /dev/null +++ b/src/tools/lorem-ipsum-generator/index.ts @@ -0,0 +1,11 @@ +import { AlignJustified } from '@vicons/tabler'; +import type { ITool } from '../Tool'; + +export const tool: ITool = { + name: 'Lorem ipsum generator', + path: '/lorem-ipsum-generator', + description: 'Lorem ipsum is a placeholder text commonly used to demonstrate the visual form of a document or a typeface without relying on meaningful content', + keywords: ['lorem', 'ipsum', 'dolor', 'sit', 'amet', 'placeholder', 'text', 'filler', 'random', 'generator'], + component: () => import('./lorem-ipsum-generator.vue'), + icon: AlignJustified, +}; diff --git a/src/tools/lorem-ipsum-generator/lorem-ipsum-generator.service.ts b/src/tools/lorem-ipsum-generator/lorem-ipsum-generator.service.ts new file mode 100644 index 00000000..a16a37f1 --- /dev/null +++ b/src/tools/lorem-ipsum-generator/lorem-ipsum-generator.service.ts @@ -0,0 +1,214 @@ +import { randFromArray } from '@/utils/random'; + +const vocabulary = [ + 'a', + 'ac', + 'accumsan', + 'ad', + 'adipiscing', + 'aenean', + 'aliquam', + 'aliquet', + 'amet', + 'ante', + 'aptent', + 'arcu', + 'at', + 'auctor', + 'bibendum', + 'blandit', + 'class', + 'commodo', + 'condimentum', + 'congue', + 'consectetur', + 'consequat', + 'conubia', + 'convallis', + 'cras', + 'cubilia', + 'cum', + 'curabitur', + 'curae', + 'dapibus', + 'diam', + 'dictum', + 'dictumst', + 'dignissim', + 'dolor', + 'donec', + 'dui', + 'duis', + 'egestas', + 'eget', + 'eleifend', + 'elementum', + 'elit', + 'enim', + 'erat', + 'eros', + 'est', + 'et', + 'etiam', + 'eu', + 'euismod', + 'facilisi', + 'faucibus', + 'felis', + 'fermentum', + 'feugiat', + 'fringilla', + 'fusce', + 'gravida', + 'habitant', + 'habitasse', + 'hac', + 'hendrerit', + 'himenaeos', + 'iaculis', + 'id', + 'imperdiet', + 'in', + 'inceptos', + 'integer', + 'interdum', + 'ipsum', + 'justo', + 'lacinia', + 'lacus', + 'laoreet', + 'lectus', + 'leo', + 'ligula', + 'litora', + 'lobortis', + 'lorem', + 'luctus', + 'maecenas', + 'magna', + 'magnis', + 'malesuada', + 'massa', + 'mattis', + 'mauris', + 'metus', + 'mi', + 'molestie', + 'mollis', + 'montes', + 'morbi', + 'mus', + 'nam', + 'nascetur', + 'natoque', + 'nec', + 'neque', + 'netus', + 'nisi', + 'nisl', + 'non', + 'nostra', + 'nulla', + 'nullam', + 'nunc', + 'odio', + 'orci', + 'ornare', + 'parturient', + 'pellentesque', + 'penatibus', + 'per', + 'pharetra', + 'phasellus', + 'placerat', + 'platea', + 'porta', + 'porttitor', + 'posuere', + 'potenti', + 'praesent', + 'pretium', + 'primis', + 'proin', + 'pulvinar', + 'purus', + 'quam', + 'quis', + 'quisque', + 'rhoncus', + 'ridiculus', + 'risus', + 'rutrum', + 'sagittis', + 'sapien', + 'scelerisque', + 'sed', + 'sem', + 'semper', + 'senectus', + 'sit', + 'sociis', + 'sociosqu', + 'sodales', + 'sollicitudin', + 'suscipit', + 'suspendisse', + 'taciti', + 'tellus', + 'tempor', + 'tempus', + 'tincidunt', + 'torquent', + 'tortor', + 'turpis', + 'ullamcorper', + 'ultrices', + 'ultricies', + 'urna', + 'varius', + 'vehicula', + 'vel', + 'velit', + 'venenatis', + 'vestibulum', + 'vitae', + 'vivamus', + 'viverra', + 'volutpat', + 'vulputate', +]; +const firstSentence = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'; + +const generateSentence = (length: number) => { + const sentence = Array.from({ length }) + .map(() => randFromArray(vocabulary)) + .join(' '); + + return sentence.charAt(0).toUpperCase() + sentence.slice(1) + '.'; +}; + +export function generateLoremIpsum({ + paragraphCount = 1, + sentencePerParagraph = 3, + wordCount = 10, + startWithLoremIpsum = true, + asHTML = false, +}: { + paragraphCount?: number; + sentencePerParagraph?: number; + wordCount?: number; + startWithLoremIpsum?: boolean; + asHTML?: boolean; +}) { + const paragraphs = Array.from({ length: paragraphCount }).map(() => Array.from({ length: sentencePerParagraph }).map(() => generateSentence(wordCount))); + + if (startWithLoremIpsum) { + paragraphs[0][0] = firstSentence; + } + + if (asHTML) { + return `

${paragraphs.map((s) => s.join(' ')).join('

\n\n

')}

`; + } + + return paragraphs.map((s) => s.join(' ')).join('\n\n'); +} diff --git a/src/tools/lorem-ipsum-generator/lorem-ipsum-generator.vue b/src/tools/lorem-ipsum-generator/lorem-ipsum-generator.vue new file mode 100644 index 00000000..a25e84a4 --- /dev/null +++ b/src/tools/lorem-ipsum-generator/lorem-ipsum-generator.vue @@ -0,0 +1,55 @@ + + + + + \ No newline at end of file