Skip to content

Commit 165ea5a

Browse files
committed
Merge branch 'feat/lorem-enh' into chore/all-my-stuffs
# Conflicts: # components.d.ts # package.json # pnpm-lock.yaml # src/tools/lorem-ipsum-generator/lorem-ipsum-generator.vue
2 parents 74504a0 + 40aad48 commit 165ea5a

File tree

7 files changed

+305
-184
lines changed

7 files changed

+305
-184
lines changed

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
"bcryptjs": "^2.4.3",
8383
"change-case": "^4.1.2",
8484
"chatgpt-prompt-splitter": "^1.0.5",
85+
"chinesegen": "^0.3.3",
8586
"colord": "^2.9.3",
8687
"composerize-ts": "^0.6.2",
8788
"countries-db": "^1.2.0",
@@ -147,6 +148,7 @@
147148
"lodash.defaultsdeep": "^4.6.1",
148149
"lodash.flattendeep": "^4.4.0",
149150
"lodash.last": "^3.0.0",
151+
"lorem-ipsum-japanese": "^1.0.1",
150152
"marked": "^10.0.0",
151153
"mathjs": "^11.9.1",
152154
"mime-types": "^2.1.35",

pnpm-lock.yaml

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
declare module 'chinesegen' {
2+
export default function lorem(config: {
3+
count: number,
4+
}): {
5+
text: string
6+
};
7+
}

src/tools/lorem-ipsum-generator/lorem-ipsum-generator.service.ts

Lines changed: 35 additions & 179 deletions
Original file line numberDiff line numberDiff line change
@@ -1,185 +1,39 @@
1+
import _ from 'lodash';
2+
import loremIpsumJapanese from 'lorem-ipsum-japanese';
3+
import chinesegen from 'chinesegen';
4+
import languageLorems from './lorem-ipsum.i18n.json';
15
import { randFromArray } from '@/utils/random';
26

3-
const vocabulary = [
4-
'a',
5-
'ac',
6-
'accumsan',
7-
'ad',
8-
'adipiscing',
9-
'aenean',
10-
'aliquam',
11-
'aliquet',
12-
'amet',
13-
'ante',
14-
'aptent',
15-
'arcu',
16-
'at',
17-
'auctor',
18-
'bibendum',
19-
'blandit',
20-
'class',
21-
'commodo',
22-
'condimentum',
23-
'congue',
24-
'consectetur',
25-
'consequat',
26-
'conubia',
27-
'convallis',
28-
'cras',
29-
'cubilia',
30-
'cum',
31-
'curabitur',
32-
'curae',
33-
'dapibus',
34-
'diam',
35-
'dictum',
36-
'dictumst',
37-
'dignissim',
38-
'dolor',
39-
'donec',
40-
'dui',
41-
'duis',
42-
'egestas',
43-
'eget',
44-
'eleifend',
45-
'elementum',
46-
'elit',
47-
'enim',
48-
'erat',
49-
'eros',
50-
'est',
51-
'et',
52-
'etiam',
53-
'eu',
54-
'euismod',
55-
'facilisi',
56-
'faucibus',
57-
'felis',
58-
'fermentum',
59-
'feugiat',
60-
'fringilla',
61-
'fusce',
62-
'gravida',
63-
'habitant',
64-
'habitasse',
65-
'hac',
66-
'hendrerit',
67-
'himenaeos',
68-
'iaculis',
69-
'id',
70-
'imperdiet',
71-
'in',
72-
'inceptos',
73-
'integer',
74-
'interdum',
75-
'ipsum',
76-
'justo',
77-
'lacinia',
78-
'lacus',
79-
'laoreet',
80-
'lectus',
81-
'leo',
82-
'ligula',
83-
'litora',
84-
'lobortis',
85-
'lorem',
86-
'luctus',
87-
'maecenas',
88-
'magna',
89-
'magnis',
90-
'malesuada',
91-
'massa',
92-
'mattis',
93-
'mauris',
94-
'metus',
95-
'mi',
96-
'molestie',
97-
'mollis',
98-
'montes',
99-
'morbi',
100-
'mus',
101-
'nam',
102-
'nascetur',
103-
'natoque',
104-
'nec',
105-
'neque',
106-
'netus',
107-
'nisi',
108-
'nisl',
109-
'non',
110-
'nostra',
111-
'nulla',
112-
'nullam',
113-
'nunc',
114-
'odio',
115-
'orci',
116-
'ornare',
117-
'parturient',
118-
'pellentesque',
119-
'penatibus',
120-
'per',
121-
'pharetra',
122-
'phasellus',
123-
'placerat',
124-
'platea',
125-
'porta',
126-
'porttitor',
127-
'posuere',
128-
'potenti',
129-
'praesent',
130-
'pretium',
131-
'primis',
132-
'proin',
133-
'pulvinar',
134-
'purus',
135-
'quam',
136-
'quis',
137-
'quisque',
138-
'rhoncus',
139-
'ridiculus',
140-
'risus',
141-
'rutrum',
142-
'sagittis',
143-
'sapien',
144-
'scelerisque',
145-
'sed',
146-
'sem',
147-
'semper',
148-
'senectus',
149-
'sit',
150-
'sociis',
151-
'sociosqu',
152-
'sodales',
153-
'sollicitudin',
154-
'suscipit',
155-
'suspendisse',
156-
'taciti',
157-
'tellus',
158-
'tempor',
159-
'tempus',
160-
'tincidunt',
161-
'torquent',
162-
'tortor',
163-
'turpis',
164-
'ullamcorper',
165-
'ultrices',
166-
'ultricies',
167-
'urna',
168-
'varius',
169-
'vehicula',
170-
'vel',
171-
'velit',
172-
'venenatis',
173-
'vestibulum',
174-
'vitae',
175-
'vivamus',
176-
'viverra',
177-
'volutpat',
178-
'vulputate',
179-
];
1807
const firstSentence = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.';
1818

182-
function generateSentence(length: number) {
9+
export function getSupportedLanguages() {
10+
return _.union(
11+
_.flatten(_.chain(languageLorems).map(l => l.languages).value()),
12+
['Japanese', 'Chinese'])
13+
.sort();
14+
}
15+
16+
function generateSentence(language: string, length: number) {
17+
if (language === 'Japanese') {
18+
return loremIpsumJapanese({
19+
count: length,
20+
units: 'words',
21+
});
22+
}
23+
if (language === 'Chinese') {
24+
return chinesegen({ count: length }).text;
25+
}
26+
27+
if (language === 'Emoticon') {
28+
const loremIcons = _.find(languageLorems, ({ languages }) => languages.includes(language))?.loremIpsum || '';
29+
const iconsChars = [...loremIcons];
30+
return Array.from({ length })
31+
.map(() => randFromArray(iconsChars))
32+
.join(' ');
33+
}
34+
35+
const vocabulary = _.find(languageLorems, ({ languages }) => languages.includes(language))?.loremIpsum?.split(' ') || [];
36+
18337
const sentence = Array.from({ length })
18438
.map(() => randFromArray(vocabulary))
18539
.join(' ');
@@ -193,15 +47,17 @@ export function generateLoremIpsum({
19347
wordCount = 10,
19448
startWithLoremIpsum = true,
19549
asHTML = false,
50+
language = 'English',
19651
}: {
19752
paragraphCount?: number
19853
sentencePerParagraph?: number
19954
wordCount?: number
20055
startWithLoremIpsum?: boolean
20156
asHTML?: boolean
57+
language?: string
20258
}) {
20359
const paragraphs = Array.from({ length: paragraphCount }).map(() =>
204-
Array.from({ length: sentencePerParagraph }).map(() => generateSentence(wordCount)),
60+
Array.from({ length: sentencePerParagraph }).map(() => generateSentence(language, wordCount)),
20561
);
20662

20763
if (startWithLoremIpsum) {

src/tools/lorem-ipsum-generator/lorem-ipsum-generator.vue

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,26 @@
11
<script setup lang="ts">
2-
import { generateLoremIpsum } from './lorem-ipsum-generator.service';
2+
import { generateLoremIpsum, getSupportedLanguages } from './lorem-ipsum-generator.service';
3+
import { computedRefreshable } from '@/composable/computedRefreshable';
34
import { useCopy } from '@/composable/copy';
5+
import { useQueryParamOrStorage } from '@/composable/queryParams';
46
import { randIntFromInterval } from '@/utils/random';
5-
import { computedRefreshable } from '@/composable/computedRefreshable';
67
7-
const paragraphs = ref(1);
8-
const sentences = ref([3, 8]);
9-
const words = ref([8, 15]);
8+
const paragraphs = useStorage('lorem:paragraphs', 1);
9+
const sentences = useStorage('lorem:sentences', [3, 8]);
10+
const words = useStorage('lorem:words', [8, 15]);
1011
const startWithLoremIpsum = ref(true);
1112
const asHTML = ref(false);
13+
const language = useQueryParamOrStorage({ defaultValue: 'English', storageName: 'lorem:lang', name: 'lang' });
1214
15+
const supportedLanguages = getSupportedLanguages();
1316
const [loremIpsumText, refreshLoremIpsum] = computedRefreshable(() =>
1417
generateLoremIpsum({
1518
paragraphCount: paragraphs.value,
1619
asHTML: asHTML.value,
1720
sentencePerParagraph: randIntFromInterval(sentences.value[0], sentences.value[1]),
1821
wordCount: randIntFromInterval(words.value[0], words.value[1]),
1922
startWithLoremIpsum: startWithLoremIpsum.value,
23+
language: language.value,
2024
}),
2125
);
2226
@@ -25,6 +29,13 @@ const { copy } = useCopy({ source: loremIpsumText, text: 'Lorem ipsum copied to
2529

2630
<template>
2731
<c-card>
32+
<c-select
33+
v-model:value="language"
34+
searchable
35+
label="Language:"
36+
:options="Object.values(supportedLanguages)"
37+
mb-2
38+
/>
2839
<n-form-item label="Paragraphs" :show-feedback="false" label-width="200" label-placement="left">
2940
<n-slider v-model:value="paragraphs" :step="1" :min="1" :max="20" />
3041
</n-form-item>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
declare module 'lorem-ipsum-japanese' {
2+
export default function lorem(config: {
3+
count: number,
4+
units: 'words' | 'sentences' | 'paragraphs',
5+
}): string;
6+
}

0 commit comments

Comments
 (0)