@jjlmoya/utils-social 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/package.json +60 -0
  2. package/src/category/i18n/en.ts +23 -0
  3. package/src/category/i18n/es.ts +23 -0
  4. package/src/category/i18n/fr.ts +23 -0
  5. package/src/category/index.ts +13 -0
  6. package/src/category/seo.astro +15 -0
  7. package/src/components/PreviewNavSidebar.astro +116 -0
  8. package/src/components/PreviewToolbar.astro +143 -0
  9. package/src/data.ts +11 -0
  10. package/src/env.d.ts +5 -0
  11. package/src/index.ts +27 -0
  12. package/src/layouts/PreviewLayout.astro +117 -0
  13. package/src/pages/[locale]/[slug].astro +146 -0
  14. package/src/pages/[locale].astro +251 -0
  15. package/src/pages/index.astro +4 -0
  16. package/src/tests/faq_count.test.ts +19 -0
  17. package/src/tests/locale_completeness.test.ts +42 -0
  18. package/src/tests/mocks/astro_mock.js +2 -0
  19. package/src/tests/no_h1_in_components.test.ts +48 -0
  20. package/src/tests/seo_length.test.ts +22 -0
  21. package/src/tests/tool_validation.test.ts +17 -0
  22. package/src/tool/redditFormatter/bibliography.astro +14 -0
  23. package/src/tool/redditFormatter/component.astro +246 -0
  24. package/src/tool/redditFormatter/i18n/en.ts +193 -0
  25. package/src/tool/redditFormatter/i18n/es.ts +193 -0
  26. package/src/tool/redditFormatter/i18n/fr.ts +193 -0
  27. package/src/tool/redditFormatter/index.ts +34 -0
  28. package/src/tool/redditFormatter/logic.ts +24 -0
  29. package/src/tool/redditFormatter/seo.astro +14 -0
  30. package/src/tool/redditFormatter/ui.ts +13 -0
  31. package/src/tool/safeZones/bibliography.astro +14 -0
  32. package/src/tool/safeZones/component.astro +857 -0
  33. package/src/tool/safeZones/i18n/en.ts +244 -0
  34. package/src/tool/safeZones/i18n/es.ts +244 -0
  35. package/src/tool/safeZones/i18n/fr.ts +244 -0
  36. package/src/tool/safeZones/index.ts +34 -0
  37. package/src/tool/safeZones/logic.ts +137 -0
  38. package/src/tool/safeZones/seo.astro +14 -0
  39. package/src/tool/safeZones/ui.ts +34 -0
  40. package/src/tool/socialImageResizer/bibliography.astro +14 -0
  41. package/src/tool/socialImageResizer/component.astro +498 -0
  42. package/src/tool/socialImageResizer/i18n/en.ts +211 -0
  43. package/src/tool/socialImageResizer/i18n/es.ts +211 -0
  44. package/src/tool/socialImageResizer/i18n/fr.ts +211 -0
  45. package/src/tool/socialImageResizer/index.ts +34 -0
  46. package/src/tool/socialImageResizer/logic.ts +133 -0
  47. package/src/tool/socialImageResizer/seo.astro +14 -0
  48. package/src/tool/socialImageResizer/ui.ts +7 -0
  49. package/src/tool/socialValueCalculator/bibliography.astro +14 -0
  50. package/src/tool/socialValueCalculator/component.astro +829 -0
  51. package/src/tool/socialValueCalculator/i18n/en.ts +310 -0
  52. package/src/tool/socialValueCalculator/i18n/es.ts +310 -0
  53. package/src/tool/socialValueCalculator/i18n/fr.ts +310 -0
  54. package/src/tool/socialValueCalculator/index.ts +34 -0
  55. package/src/tool/socialValueCalculator/logic.ts +60 -0
  56. package/src/tool/socialValueCalculator/seo.astro +14 -0
  57. package/src/tool/socialValueCalculator/ui.ts +31 -0
  58. package/src/tool/tinderPhotoOptimizer/bibliography.astro +14 -0
  59. package/src/tool/tinderPhotoOptimizer/component.astro +1514 -0
  60. package/src/tool/tinderPhotoOptimizer/i18n/en.ts +248 -0
  61. package/src/tool/tinderPhotoOptimizer/i18n/es.ts +248 -0
  62. package/src/tool/tinderPhotoOptimizer/i18n/fr.ts +248 -0
  63. package/src/tool/tinderPhotoOptimizer/index.ts +34 -0
  64. package/src/tool/tinderPhotoOptimizer/logic.ts +199 -0
  65. package/src/tool/tinderPhotoOptimizer/seo.astro +14 -0
  66. package/src/tool/tinderPhotoOptimizer/ui.ts +37 -0
  67. package/src/tool/youtubeThumbnail/bibliography.astro +14 -0
  68. package/src/tool/youtubeThumbnail/component.astro +419 -0
  69. package/src/tool/youtubeThumbnail/i18n/en.ts +207 -0
  70. package/src/tool/youtubeThumbnail/i18n/es.ts +207 -0
  71. package/src/tool/youtubeThumbnail/i18n/fr.ts +207 -0
  72. package/src/tool/youtubeThumbnail/index.ts +34 -0
  73. package/src/tool/youtubeThumbnail/logic.ts +7 -0
  74. package/src/tool/youtubeThumbnail/seo.astro +14 -0
  75. package/src/tool/youtubeThumbnail/ui.ts +13 -0
  76. package/src/tool/youtubeThumbnailPreviewer/bibliography.astro +14 -0
  77. package/src/tool/youtubeThumbnailPreviewer/component.astro +791 -0
  78. package/src/tool/youtubeThumbnailPreviewer/i18n/en.ts +321 -0
  79. package/src/tool/youtubeThumbnailPreviewer/i18n/es.ts +321 -0
  80. package/src/tool/youtubeThumbnailPreviewer/i18n/fr.ts +321 -0
  81. package/src/tool/youtubeThumbnailPreviewer/index.ts +34 -0
  82. package/src/tool/youtubeThumbnailPreviewer/seo.astro +14 -0
  83. package/src/tool/youtubeThumbnailPreviewer/ui.ts +19 -0
  84. package/src/tools.ts +10 -0
  85. package/src/types.ts +72 -0
@@ -0,0 +1,193 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { RedditFormatterUI } from '../ui';
4
+
5
+ const slug = 'formateur-reddit';
6
+ const title = "Formateur Reddit - Nettoyeur et Adaptateur de Texte";
7
+ const description =
8
+ "Nettoyeur avancé de texte pour publier sur Reddit. Corrige les sauts de ligne manquants, supprime les espaces multiples et les caractères cachés qui cassent le Markdown.";
9
+
10
+ const faqData = [
11
+ {
12
+ question: "Pourquoi mon texte sur Reddit perd-il ses sauts de ligne ?",
13
+ answer:
14
+ "Reddit utilise Markdown, qui requiert d'appuyer deux fois sur Espace en fin de ligne avant d'appuyer sur Entrée pour un saut normal, ou d'appuyer deux fois sur Entrée pour créer un nouveau paragraphe. Notre outil gère cela automatiquement en insérant des doubles sauts de ligne.",
15
+ },
16
+ {
17
+ question: "Que sont les caractères cachés ou invisibles ?",
18
+ answer:
19
+ "Lors d'une copie depuis des traitements de texte complexes, des marqueurs de format de largeur nulle s'attachent souvent au texte. Ces éléments sont invisibles sur le web normal mais peuvent casser l'écosystème Markdown.",
20
+ },
21
+ {
22
+ question: "Est-il sûr d'utiliser ce nettoyeur de texte ?",
23
+ answer:
24
+ "Complètement sûr. Le script s'exécute entièrement côté client (dans votre propre navigateur). Vos textes ne sont jamais envoyés à un serveur et personne d'autre n'aura accès à ce que vous collez ici.",
25
+ },
26
+ {
27
+ question: "Puis-je l'utiliser pour Twitter ou d'autres réseaux ?",
28
+ answer:
29
+ "Oui, en plus de corriger les publications Reddit, supprimer les espaces multiples et les caractères étranges est utile pour toute publication sur des blogs, Twitter, d'anciens forums phpBB ou toute autre plateforme sociale où vous avez besoin d'un texte neutre et très propre.",
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ {
35
+ name: "Collez votre texte",
36
+ text: "Copiez votre texte depuis Word, Google Docs ou toute autre source et collez-le dans le champ de saisie.",
37
+ },
38
+ {
39
+ name: "Choisissez les options",
40
+ text: "Activez ou désactivez les options selon vos besoins : corriger les paragraphes, supprimer les espaces ou nettoyer les caractères cachés.",
41
+ },
42
+ {
43
+ name: "Vérifiez le résultat",
44
+ text: "Le texte propre apparaît en temps réel dans le champ de sortie, prêt à être publié.",
45
+ },
46
+ {
47
+ name: "Copiez et publiez",
48
+ text: 'Cliquez sur "Copier le Texte" et collez-le directement sur Reddit ou dans n\'importe quel forum.',
49
+ },
50
+ ];
51
+
52
+ const faqSchema: WithContext<FAQPage> = {
53
+ '@context': 'https://schema.org',
54
+ '@type': 'FAQPage',
55
+ mainEntity: faqData.map((item) => ({
56
+ '@type': 'Question',
57
+ name: item.question,
58
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
59
+ })),
60
+ };
61
+
62
+ const howToSchema: WithContext<HowToThing> = {
63
+ '@context': 'https://schema.org',
64
+ '@type': 'HowTo',
65
+ name: title,
66
+ description,
67
+ step: howToData.map((step, i) => ({
68
+ '@type': 'HowToStep',
69
+ position: i + 1,
70
+ name: step.name,
71
+ text: step.text,
72
+ })),
73
+ };
74
+
75
+ const appSchema: WithContext<SoftwareApplication> = {
76
+ '@context': 'https://schema.org',
77
+ '@type': 'SoftwareApplication',
78
+ name: title,
79
+ description,
80
+ applicationCategory: 'UtilityApplication',
81
+ operatingSystem: 'All',
82
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
83
+ inLanguage: 'fr',
84
+ };
85
+
86
+ export const content: ToolLocaleContent<RedditFormatterUI> = {
87
+ slug,
88
+ title,
89
+ description,
90
+ faqTitle: 'Questions Fréquentes',
91
+ faq: faqData,
92
+ bibliographyTitle: 'Références',
93
+ bibliography: [
94
+ {
95
+ name: 'Reddit Help: Formatting text in posts and comments',
96
+ url: 'https://support.reddithelp.com/hc/en-us/articles/360043033952-Formatting-text-in-posts-and-comments',
97
+ },
98
+ {
99
+ name: 'Reddit Markdown guide',
100
+ url: 'https://www.reddit.com/wiki/markdown/',
101
+ },
102
+ ],
103
+ howTo: howToData,
104
+ schemas: [faqSchema, howToSchema, appSchema],
105
+ seo: [
106
+ {
107
+ type: 'title',
108
+ text: "L'Outil de Mise en Forme Ultime pour Reddit et les Forums Web",
109
+ level: 2,
110
+ },
111
+ {
112
+ type: 'paragraph',
113
+ html: "Créer des publications sur Reddit ou sur toute plateforme qui repose sur Markdown peut être frustrant. Un problème courant lors du copier-coller de texte depuis des traitements de texte complexes ou des pages web est l'altération des sauts de ligne. Lors de l'envoi du contenu, il devient souvent un bloc solide difficile à lire, ignorant la structure originale des paragraphes. Notre outil de mise en forme résout ce problème à la racine.",
114
+ },
115
+ {
116
+ type: 'title',
117
+ text: 'Comment fonctionne le nettoyeur de texte Reddit',
118
+ level: 3,
119
+ },
120
+ {
121
+ type: 'paragraph',
122
+ html: "Le moteur de traitement applique plusieurs filtres sur votre texte en temps réel. Premièrement, il s'occupe des sauts de ligne. Reddit requiert un format spécifique où un saut de paragraphe nécessite deux nouvelles lignes dans le code source Markdown. Le nettoyeur analyse votre texte et convertit automatiquement les sauts de ligne simples en doubles sauts, en conservant intacts les paragraphes existants pour éviter les espaces excessifs.",
123
+ },
124
+ {
125
+ type: 'paragraph',
126
+ html: "Deuxièmement, l'outil supprime les caractères invisibles et les espaces multiples. Lors de la copie de texte depuis des sites web, il est courant d'entraîner des caractères sans largeur qui cassent le formatage ou provoquent des comportements étranges dans les forums. Le nettoyeur purge ces éléments web intrusifs et normalise les espaces répétés en un seul espace propre. En option, vous pouvez extraire et supprimer tous les hyperliens bruts de votre contenu pour publier un texte complètement neutre.",
127
+ },
128
+ {
129
+ type: 'title',
130
+ text: "Avantages d'utiliser un nettoyeur de texte spécialisé",
131
+ level: 3,
132
+ },
133
+ {
134
+ type: 'list',
135
+ items: [
136
+ "<strong>Lisibilité Optimisée :</strong> Garantit que vos lecteurs sur Reddit voient un texte correctement structuré plutôt qu'un bloc intimidant.",
137
+ "<strong>Gain de Temps :</strong> Oubliez d'appuyer sur Entrée des centaines de fois pour corriger un formatage cassé. Collez votre contenu et copiez-le prêt en moins d'une seconde.",
138
+ '<strong>Suppression des Métadonnées et Parasites Web :</strong> Protège votre publication des styles étranges ou des ruptures causées par les espaces sans largeur.',
139
+ "<strong>Haute Confidentialité :</strong> Tout le traitement est côté client. Le texte ne quitte jamais votre navigateur ni n'est stocké sur des serveurs externes.",
140
+ ],
141
+ },
142
+ {
143
+ type: 'title',
144
+ text: 'Le Problème avec les Traitements de Texte et Reddit',
145
+ level: 3,
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: "Des applications comme Microsoft Word ou Google Docs ajoutent une couche invisible de formatage riche sur leur texte. Lorsque vous copiez et collez ce contenu directement dans l'éditeur basique ou le mode Markdown de Reddit, le formatage riche disparaît et ce qui reste est souvent une amalgame sans structure. Reddit utilise une variante de Markdown assez stricte. Si vous n'êtes pas familier avec la syntaxe Reddit ou si vous souhaitez simplement un processus plus fluide pour transférer des essais ou des histoires vers le forum, nettoyer le texte ici en premier empêche votre publication de recevoir des votes négatifs simplement parce qu'elle est impossible à lire confortablement.",
150
+ },
151
+ {
152
+ type: 'title',
153
+ text: 'Bonnes Pratiques pour Publier dans les Forums',
154
+ level: 3,
155
+ },
156
+ {
157
+ type: 'paragraph',
158
+ html: "Un formatage correct est vital pour générer du débat et maintenir l'attention de la communauté. Les publications avec des lignes très longues ou des paragraphes inexistants sont souvent abandonnées après les premières phrases. Utilisez cet outil de nettoyage pour établir les bases structurelles. Ensuite, ajoutez du formatage comme le gras et l'italique de manière stratégique dans l'éditeur Reddit lui-même pour mettre en valeur les idées clés. Pensez toujours à vérifier l'aperçu et à profiter des listes structurées pour énumérer les points importants ou les guides détaillés.",
159
+ },
160
+ {
161
+ type: 'title',
162
+ text: 'Exemple de Transformation',
163
+ level: 3,
164
+ },
165
+ {
166
+ type: 'tip',
167
+ title: 'Avant et après le formateur',
168
+ html: "<p><strong>Texte original collé :</strong></p><pre>Bonjour c'est la première ligne\net celle-ci était censée être la deuxième\nmais sur Reddit tout s'affiche ensemble si vous le collez.</pre><p><strong>Texte formaté :</strong></p><pre>Bonjour c'est la première ligne\n\net celle-ci était censée être la deuxième\n\nmais sur Reddit tout s'affiche ensemble si vous le collez.</pre>",
169
+ },
170
+ {
171
+ type: 'title',
172
+ text: 'Questions Fréquentes sur le Formateur de Texte Reddit',
173
+ level: 3,
174
+ },
175
+ {
176
+ type: 'paragraph',
177
+ html: "Trouver les bonnes réponses sur la façon d'interagir avec les règles éditoriales de Reddit n'est pas toujours évident. Consultez la section FAQ où nous répondons aux principales questions sur les formats valides et comment éviter d'être pénalisé pour des blocs de texte massifs.",
178
+ },
179
+ ],
180
+ ui: {
181
+ labelInput: 'Texte Original',
182
+ placeholderInput: 'Collez votre texte original ici...',
183
+ labelOptions: 'Options de Formatage',
184
+ optionParagraphs: 'Corriger les paragraphes style Reddit',
185
+ optionSpaces: 'Supprimer les espaces multiples',
186
+ optionInvisible: 'Nettoyer les caractères web cachés',
187
+ optionLinks: 'Extraire les URLs (Texte uniquement)',
188
+ labelOutput: 'Texte Propre',
189
+ placeholderOutput: 'Le résultat du nettoyage apparaîtra ici...',
190
+ btnCopy: 'Copier le Texte',
191
+ btnCopied: 'Copié',
192
+ },
193
+ };
@@ -0,0 +1,34 @@
1
+ import type { SocialToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
2
+
3
+ import RedditFormatterComponent from './component.astro';
4
+ import RedditFormatterSEO from './seo.astro';
5
+ import RedditFormatterBibliography from './bibliography.astro';
6
+
7
+ import type { RedditFormatterUI } from './ui';
8
+ export type RedditFormatterLocaleContent = ToolLocaleContent<RedditFormatterUI>;
9
+
10
+ import { content as es } from './i18n/es';
11
+ import { content as en } from './i18n/en';
12
+ import { content as fr } from './i18n/fr';
13
+
14
+ export const redditFormatter: SocialToolEntry<RedditFormatterUI> = {
15
+ id: 'reddit-formatter',
16
+ icons: {
17
+ bg: 'mdi:reddit',
18
+ fg: 'mdi:format-text-rotation-none',
19
+ },
20
+ i18n: {
21
+ es: async () => es,
22
+ en: async () => en,
23
+ fr: async () => fr,
24
+ },
25
+ };
26
+
27
+ export { RedditFormatterComponent, RedditFormatterSEO, RedditFormatterBibliography };
28
+
29
+ export const REDDIT_FORMATTER_TOOL: ToolDefinition = {
30
+ entry: redditFormatter,
31
+ Component: RedditFormatterComponent,
32
+ SEOComponent: RedditFormatterSEO,
33
+ BibliographyComponent: RedditFormatterBibliography,
34
+ };
@@ -0,0 +1,24 @@
1
+ export interface FormatterOptions {
2
+ fixParagraphs: boolean;
3
+ removeSpaces: boolean;
4
+ removeInvisible: boolean;
5
+ removeLinks: boolean;
6
+ }
7
+
8
+ export function processText(text: string, options: FormatterOptions): string {
9
+ let result = text;
10
+ if (options.removeInvisible) {
11
+ result = result.replace(/[\u200B-\u200D\uFEFF]/g, '');
12
+ }
13
+ if (options.removeSpaces) {
14
+ result = result.replace(/ {2,}/g, ' ');
15
+ }
16
+ if (options.removeLinks) {
17
+ result = result.replace(/https?:\/\/[^\s]+/g, '');
18
+ }
19
+ if (options.fixParagraphs) {
20
+ result = result.replace(/\n{2,}/g, '\n');
21
+ result = result.replace(/\n/g, '\n\n');
22
+ }
23
+ return result.trim();
24
+ }
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { redditFormatter } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await redditFormatter.i18n[locale]?.();
12
+ if (!content) return null;
13
+ ---
14
+ <SEORenderer content={{ locale: locale as string, sections: content.seo }} />
@@ -0,0 +1,13 @@
1
+ export interface RedditFormatterUI extends Record<string, string> {
2
+ labelInput: string;
3
+ placeholderInput: string;
4
+ labelOptions: string;
5
+ optionParagraphs: string;
6
+ optionSpaces: string;
7
+ optionInvisible: string;
8
+ optionLinks: string;
9
+ labelOutput: string;
10
+ placeholderOutput: string;
11
+ btnCopy: string;
12
+ btnCopied: string;
13
+ }
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import { safeZones } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await safeZones.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && <SharedBibliography links={content.bibliography} />}