Skip to content
Snippets Groups Projects
Commit cddd1d65 authored by Millicent Billette's avatar Millicent Billette
Browse files

FEAT: advensed digBuilder near finished

parent 3424adbd
No related branches found
No related tags found
No related merge requests found
......@@ -21,3 +21,148 @@ En sécurité informatique ce que des outils tel que Gsper font est appellé [at
[3006 Ǧ1 (6h)](https://cesium.ǧ1.money/api/#/v1/payment/22TTh6fD8uEC9CYq5sB8QpqjyXEHH5QnAiEdy68D2Y7S?name=Financement%20de%20Gsper&amount=3006&comment=REFERENCE)
Le temps entre parentèse est l'équivalent temps de dev au tarifs indiqué sur le site du développeur : https://1forma-tic.fr
## Guide d'utilisation
1. Indiquer la clef publique de votre compte (si vous ne la connaissez pas, chercher votre profil sur [cesium](https://cesium.ǧ1.money/#/app/wot/lg) via la fonction recherche de l'annuaire)
2. Indiquer les variantes d'identifiant secret que vous souhaitez tester. (Il est possible de générer plus de variantes automatiquement. [La documentation](#Documentation) ci dessous explique comment.)
3. Indiquer les variantes de mot de passe que vous souhaitez tester.
4. Cliquer sur le bouton `Gsper !` pour lancer la tentative de récupération des accès au compte.
5. Patienter jusqu'à l'apparition du message de fin de recherche (avec ou sans succès).
## Documentation
Gsper met à votre disposition plusieurs boutons pour générer des variantes à tester à partir de celles que vous avez indiqué.
Voici comment les utiliser.
### Bouton `MaJusculeS`
Génère des variantes des combinaisons à tester :
- entièrement en majuscule
- entièrement en minuscule
- avec le premier caractère en majuscule uniquement
- tel quel, sans modifier les majuscule et minuscule
**Exemple :**
```
moT
```
sera remplacé par :
```
mot
MOT
Mot
moT
```
### Bouton `désaccentué`
Génère la variante désaccentué des combinaisons à tester.
**Exemple :**
```
Gavé de Ǧ1
```
sera remplacé par :
```
Gavé de Ǧ1
Gave de G1
```
### Bouton `<({[Avancé]})>`
Génère des variantes avancées selon un syntaxe spécifique.
<!-- **/!\ Attention /!\\** Générer un trop grand nombre de combinaison à tester peut faire planter le navigateur, et mettre des année à tester de toute façon. -->
Détail de la syntaxe :
###### `<référence>` remplace `<référence>` par les lignes commançant par `référence::`
**Exemple :**
```
&lt;pre&gt; de passe
pre::mot
pre::phrase
```
sera remplacé par :
```
mot de passe
phrase de passe
```
###### `(variante|autre variante)` décline les séquences listées comme des combinaisons différentes.
**Exemple :**
```
(mot|phrase) de passe
```
sera remplacé par :
```
mot de passe
phrase de passe
```
###### `[a-z§¤]` décline les caractères listés comme des combinaisons différentes.
**Exemple :**
```
J'ai oublié la suite[!.]
```
sera remplacé par :
```
J'ai oublié la suite!
J'ai oublié la suite.
```
**Exemple :**
```
Spam [0-3]
```
sera remplacé par :
```
Spam 0
Spam 1
Spam 2
Spam 3
```
###### `A{0,2}` décline l'élément précédent selon les quantités définies.
**Exemple :**
```
c'est (mat|tic){0,3}
```
sera remplacé par :
```
c'est
c'est mat
c'est matmat
c'est matmatmat
c'est matmattic
c'est mattic
c'est matticmat
c'est mattictic
c'est tic
c'est ticmat
c'est ticmatmat
c'est ticmattic
c'est tictic
c'est ticticmat
c'est tictictic
```
###### `\ ` permet de banaliser le caractère suivant
**/!\ Pas encore implémenté**
**Exemple :**
```
un (am\||\|nconu)
```
sera remplacé par :
```
un am|
un |nconu
```
**Contre exemple :**
```
un (am|||nconu)
```
sera remplacé par :
```
un am
un
un
un nconu
```
export {dedup,noAccentVariant,casesVariants,regLikeVariants}
function dedup(array) {
const res = {};
array.forEach(v=>res[v]=v);
return Object.keys(res);
}
function noAccentVariant(string) {
const conversionMap = {'Á':'A','Ă':'A','':'A','':'A','':'A','':'A','':'A','Ǎ':'A','Â':'A','':'A','':'A','':'A','':'A','':'A','Ä':'A','Ǟ':'A','Ȧ':'A','Ǡ':'A','':'A','Ȁ':'A','À':'A','':'A','Ȃ':'A','Ā':'A','Ą':'A','Å':'A','Ǻ':'A','':'A','Ⱥ':'A','Ã':'A','':'AA','Æ':'AE','Ǽ':'AE','Ǣ':'AE','':'AO','':'AU','':'AV','':'AV','':'AY','':'B','':'B','Ɓ':'B','':'B','Ƀ':'B','Ƃ':'B','Ć':'C','Č':'C','Ç':'C','':'C','Ĉ':'C','Ċ':'C','Ƈ':'C','Ȼ':'C','Ď':'D','':'D','':'D','':'D','':'D','Ɗ':'D','':'D','Dz':'D','Dž':'D','Đ':'D','Ƌ':'D','DZ':'DZ','DŽ':'DZ','É':'E','Ĕ':'E','Ě':'E','Ȩ':'E','':'E','Ê':'E','':'E','':'E','':'E','':'E','':'E','':'E','Ë':'E','Ė':'E','':'E','Ȅ':'E','È':'E','':'E','Ȇ':'E','Ē':'E','':'E','':'E','Ę':'E','Ɇ':'E','':'E','':'E','':'ET','':'F','Ƒ':'F','Ǵ':'G','Ğ':'G','Ǧ':'G','Ģ':'G','Ĝ':'G','Ġ':'G','Ɠ':'G','':'G','Ǥ':'G','':'H','Ȟ':'H','':'H','Ĥ':'H','':'H','':'H','':'H','':'H','Ħ':'H','Í':'I','Ĭ':'I','Ǐ':'I','Î':'I','Ï':'I','':'I','İ':'I','':'I','Ȉ':'I','Ì':'I','':'I','Ȋ':'I','Ī':'I','Į':'I','Ɨ':'I','Ĩ':'I','':'I','':'D','':'F','':'G','':'R','':'S','':'T','':'IS','Ĵ':'J','Ɉ':'J','':'K','Ǩ':'K','Ķ':'K','':'K','':'K','':'K','Ƙ':'K','':'K','':'K','':'K','Ĺ':'L','Ƚ':'L','Ľ':'L','Ļ':'L','':'L','':'L','':'L','':'L','':'L','':'L','Ŀ':'L','':'L','Lj':'L','Ł':'L','LJ':'LJ','':'M','':'M','':'M','':'M','Ń':'N','Ň':'N','Ņ':'N','':'N','':'N','':'N','Ǹ':'N','Ɲ':'N','':'N','Ƞ':'N','Nj':'N','Ñ':'N','NJ':'NJ','Ó':'O','Ŏ':'O','Ǒ':'O','Ô':'O','':'O','':'O','':'O','':'O','':'O','Ö':'O','Ȫ':'O','Ȯ':'O','Ȱ':'O','':'O','Ő':'O','Ȍ':'O','Ò':'O','':'O','Ơ':'O','':'O','':'O','':'O','':'O','':'O','Ȏ':'O','':'O','':'O','Ō':'O','':'O','':'O','Ɵ':'O','Ǫ':'O','Ǭ':'O','Ø':'O','Ǿ':'O','Õ':'O','':'O','':'O','Ȭ':'O','Ƣ':'OI','':'OO','Ɛ':'E','Ɔ':'O','Ȣ':'OU','':'P','':'P','':'P','Ƥ':'P','':'P','':'P','':'P','':'Q','':'Q','Ŕ':'R','Ř':'R','Ŗ':'R','':'R','':'R','':'R','Ȑ':'R','Ȓ':'R','':'R','Ɍ':'R','':'R','':'C','Ǝ':'E','Ś':'S','':'S','Š':'S','':'S','Ş':'S','Ŝ':'S','Ș':'S','':'S','':'S','':'S','Ť':'T','Ţ':'T','':'T','Ț':'T','Ⱦ':'T','':'T','':'T','Ƭ':'T','':'T','Ʈ':'T','Ŧ':'T','':'A','':'L','Ɯ':'M','Ʌ':'V','':'TZ','Ú':'U','Ŭ':'U','Ǔ':'U','Û':'U','':'U','Ü':'U','Ǘ':'U','Ǚ':'U','Ǜ':'U','Ǖ':'U','':'U','':'U','Ű':'U','Ȕ':'U','Ù':'U','':'U','Ư':'U','':'U','':'U','':'U','':'U','':'U','Ȗ':'U','Ū':'U','':'U','Ų':'U','Ů':'U','Ũ':'U','':'U','':'U','':'V','':'V','Ʋ':'V','':'V','':'VY','':'W','Ŵ':'W','':'W','':'W','':'W','':'W','':'W','':'X','':'X','Ý':'Y','Ŷ':'Y','Ÿ':'Y','':'Y','':'Y','':'Y','Ƴ':'Y','':'Y','':'Y','Ȳ':'Y','Ɏ':'Y','':'Y','Ź':'Z','Ž':'Z','':'Z','':'Z','Ż':'Z','':'Z','Ȥ':'Z','':'Z','Ƶ':'Z','IJ':'IJ','Œ':'OE','':'A','':'AE','ʙ':'B','':'B','':'C','':'D','':'E','':'F','ɢ':'G','ʛ':'G','ʜ':'H','ɪ':'I','ʁ':'R','':'J','':'K','ʟ':'L','':'L','':'M','ɴ':'N','':'O','ɶ':'OE','':'O','':'OU','':'P','ʀ':'R','':'N','':'R','':'S','':'T','':'E','':'R','':'U','':'V','':'W','ʏ':'Y','':'Z','á':'a','ă':'a','':'a','':'a','':'a','':'a','':'a','ǎ':'a','â':'a','':'a','':'a','':'a','':'a','':'a','ä':'a','ǟ':'a','ȧ':'a','ǡ':'a','':'a','ȁ':'a','à':'a','':'a','ȃ':'a','ā':'a','ą':'a','':'a','':'a','å':'a','ǻ':'a','':'a','':'a','ã':'a','':'aa','æ':'ae','ǽ':'ae','ǣ':'ae','':'ao','':'au','':'av','':'av','':'ay','':'b','':'b','ɓ':'b','':'b','':'b','':'b','ƀ':'b','ƃ':'b','ɵ':'o','ć':'c','č':'c','ç':'c','':'c','ĉ':'c','ɕ':'c','ċ':'c','ƈ':'c','ȼ':'c','ď':'d','':'d','':'d','ȡ':'d','':'d','':'d','ɗ':'d','':'d','':'d','':'d','':'d','đ':'d','ɖ':'d','ƌ':'d','ı':'i','ȷ':'j','ɟ':'j','ʄ':'j','dz':'dz','dž':'dz','é':'e','ĕ':'e','ě':'e','ȩ':'e','':'e','ê':'e','ế':'e','':'e','':'e','':'e','':'e','':'e','ë':'e','ė':'e','':'e','ȅ':'e','è':'e','':'e','ȇ':'e','ē':'e','':'e','':'e','':'e','ę':'e','':'e','ɇ':'e','':'e','':'e','':'et','':'f','ƒ':'f','':'f','':'f','ǵ':'g','ğ':'g','ǧ':'g','ģ':'g','ĝ':'g','ġ':'g','ɠ':'g','':'g','':'g','ǥ':'g','':'h','ȟ':'h','':'h','ĥ':'h','':'h','':'h','':'h','':'h','ɦ':'h','':'h','ħ':'h','ƕ':'hv','í':'i','ĭ':'i','ǐ':'i','î':'i','ï':'i','':'i','':'i','ȉ':'i','ì':'i','':'i','ȋ':'i','ī':'i','į':'i','':'i','ɨ':'i','ĩ':'i','':'i','':'d','':'f','':'g','':'r','':'s','':'t','':'is','ǰ':'j','ĵ':'j','ʝ':'j','ɉ':'j','':'k','ǩ':'k','ķ':'k','':'k','':'k','':'k','ƙ':'k','':'k','':'k','':'k','':'k','ĺ':'l','ƚ':'l','ɬ':'l','ľ':'l','ļ':'l','':'l','ȴ':'l','':'l','':'l','':'l','':'l','':'l','ŀ':'l','ɫ':'l','':'l','ɭ':'l','ł':'l','lj':'lj','ſ':'s','':'s','':'s','':'s','ḿ':'m','':'m','':'m','ɱ':'m','':'m','':'m','ń':'n','ň':'n','ņ':'n','':'n','ȵ':'n','':'n','':'n','ǹ':'n','ɲ':'n','':'n','ƞ':'n','':'n','':'n','ɳ':'n','ñ':'n','nj':'nj','ó':'o','ŏ':'o','ǒ':'o','ô':'o','':'o','':'o','':'o','':'o','':'o','ö':'o','ȫ':'o','ȯ':'o','ȱ':'o','':'o','ő':'o','ȍ':'o','ò':'o','':'o','ơ':'o','':'o','':'o','':'o','':'o','':'o','ȏ':'o','':'o','':'o','':'o','ō':'o','':'o','':'o','ǫ':'o','ǭ':'o','ø':'o','ǿ':'o','õ':'o','':'o','':'o','ȭ':'o','ƣ':'oi','':'oo','ɛ':'e','':'e','ɔ':'o','':'o','ȣ':'ou','':'p','':'p','':'p','ƥ':'p','':'p','':'p','':'p','':'p','':'p','':'q','ʠ':'q','ɋ':'q','':'q','ŕ':'r','ř':'r','ŗ':'r','':'r','':'r','':'r','ȑ':'r','ɾ':'r','':'r','ȓ':'r','':'r','ɼ':'r','':'r','':'r','ɍ':'r','ɽ':'r','':'c','':'c','ɘ':'e','ɿ':'r','ś':'s','':'s','š':'s','':'s','ş':'s','ŝ':'s','ș':'s','':'s','':'s','':'s','ʂ':'s','':'s','':'s','ȿ':'s','ɡ':'g','':'o','':'o','':'u','ť':'t','ţ':'t','':'t','ț':'t','ȶ':'t','':'t','':'t','':'t','':'t','ƭ':'t','':'t','':'t','ƫ':'t','ʈ':'t','ŧ':'t','':'th','ɐ':'a','':'ae','ǝ':'e','':'g','ɥ':'h','ʮ':'h','ʯ':'h','':'i','ʞ':'k','':'l','ɯ':'m','ɰ':'m','':'oe','ɹ':'r','ɻ':'r','ɺ':'r','':'r','ʇ':'t','ʌ':'v','ʍ':'w','ʎ':'y','':'tz','ú':'u','ŭ':'u','ǔ':'u','û':'u','':'u','ü':'u','ǘ':'u','ǚ':'u','ǜ':'u','ǖ':'u','':'u','':'u','ű':'u','ȕ':'u','ù':'u','':'u','ư':'u','':'u','':'u','':'u','':'u','':'u','ȗ':'u','ū':'u','':'u','ų':'u','':'u','ů':'u','ũ':'u','':'u','':'u','':'ue','':'um','':'v','':'v','ṿ':'v','ʋ':'v','':'v','':'v','':'v','':'vy','':'w','ŵ':'w','':'w','':'w','':'w','':'w','':'w','':'w','':'x','':'x','':'x','ý':'y','ŷ':'y','ÿ':'y','':'y','':'y','':'y','ƴ':'y','':'y','ỿ':'y','ȳ':'y','':'y','ɏ':'y','':'y','ź':'z','ž':'z','':'z','ʑ':'z','':'z','ż':'z','':'z','ȥ':'z','':'z','':'z','':'z','ʐ':'z','ƶ':'z','ɀ':'z','':'ff','':'ffi','':'ffl','':'fi','':'fl','ij':'ij','œ':'oe','':'st','':'a','':'e','':'i','':'j','':'o','':'r','':'u','':'v','':'x'};
return dedup([
string,
string.replace( /[^A-Za-z0-9]/g, (a) => conversionMap[a]||a )
]);
}
function casesVariants(string) {
return dedup([
string,
string.toLowerCase(),
string.split(" ").map(str=>str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()).join(" "),
string.toUpperCase()
]);
}
function regLikeVariants(theString,allStrings) {
//TODO: allStringsPreRenderCache
// handle []
const lower = "abcdefghijklmnopqrstuvwxyz";
const upper = lower.toUpperCase();
const number= "0123456789";
theString = theString.replace(/(\[[^\]]*)([a-z]-[a-z])([^\]]*\])/g,(osef,before,chrs,after)=> before+lower.slice(lower.indexOf(chrs.split('-')[0]),lower.indexOf(chrs.split('-')[1])+1)+after );
theString = theString.replace(/(\[[^\]]*)([A-Z]-[A-Z])([^\]]*\])/g,(osef,before,chrs,after)=> before+upper.slice(upper.indexOf(chrs.split('-')[0]),upper.indexOf(chrs.split('-')[1])+1)+after );
theString = theString.replace(/(\[[^\]]*)([0-9]-[0-9])([^\]]*\])/g,(osef,before,chrs,after)=> before+number.slice(number.indexOf(chrs.split('-')[0]),number.indexOf(chrs.split('-')[1])+1)+after );
theString = theString.replace(/\[([^\]]+)\]/g,(osef,chrs)=> `(${chrs.split('').join('|')})` );
// handle <ref>
if(theString.indexOf('::')>0) return [];
theString = theString.replace(/<([^>]+)>/g,(osef,ref)=> `(${allStrings.filter(str=>str.indexOf(`${ref}::`)!== -1).map(str=>`(${regLikeVariants(str.slice(`${ref}::`.length),allStrings).join('|')})`).join('|')})` );
// handle {qty} and {min,max}
const qtyApply = (all,chr,qty)=> {
const mm = qty.split(",").map(n=>n.trim()*1);
const min = mm[0];
const max = (mm.length === 2)?mm[1]:min;
const res = [];
for (let i = min; i<=max; i++) res.push( new Array(i + 1).join(chr) )
return `(${res.join('|')})`;
};
theString = theString.replace(/([^\)]){([^}]+)}/g,qtyApply);
// handle (|)
let multiString = theString.replace(/^(.*)\(([^)]*)\)(.*)$/,(all,before,choices,after)=>choices.split('|').map(c=>{
if(after.indexOf('{')!==0) return before+c+after;
else {
console.log(c);
const end = after.slice(1).split('}');
const qty = end.shift();
const afterQty = end.join('}');
return before+qtyApply('',c,qty)+afterQty;
}
}).join('=$##$=') ).split('=$##$=');
console.log(multiString);
multiString = [].concat(...multiString.map(str => (str.indexOf('(')!== -1)?regLikeVariants(str,allStrings):str));
return multiString;
}
import * as app from "./dictionaryBuilder.js";
describe('dictionaryBuilder', () => {
it('add no accents variant', () => {
expect(app.noAccentVariant("Ǧ1")).toEqual(["Ǧ1","G1"]);
});
it('add case variants', () => {
expect(app.casesVariants("moT")).toEqual(["moT","mot","Mot","MOT"]);
});
it('add multi word case variants', () => {
expect(app.casesVariants("autre mot")).toEqual(["autre mot","Autre Mot","AUTRE MOT"]);
});
it('regLikeVariants remove ref:: lines', () => {
expect(app.regLikeVariants("ref::truc")).toEqual([]);
});
it('regLikeVariants handle <ref>', () => {
expect(app.regLikeVariants("<ref> <ref>",["ref::truc","ref::bidule","<ref> <ref>"])).toEqual(["truc truc","bidule truc", "truc bidule", "bidule bidule"]);
});
it('regLikeVariants handle (this|that)', () => {
expect(app.regLikeVariants("(this|that)")).toEqual(["this","that"]);
});
it('regLikeVariants handle [ -_]', () => {
expect(app.regLikeVariants("[ -_]")).toEqual([" ","-","_"]);
});
it('regLikeVariants handle [a-f]', () => {
expect(app.regLikeVariants("[a-f]")).toEqual(["a","b","c","d","e","f"]);
expect(app.regLikeVariants("[7-9]")).toEqual(["7","8","9"]);
expect(app.regLikeVariants("[C-F]")).toEqual(["C","D","E","F"]);
});
it('regLikeVariants handle [a-c-]', () => {
expect(app.regLikeVariants("[a-c-]")).toEqual(["a","b","c","-"]);
});
it('regLikeVariants handle {qty}', () => {
expect(app.regLikeVariants("a{5}")).toEqual(["aaaaa"]);
});
it('regLikeVariants handle {min,max}', () => {
expect(app.regLikeVariants("b{3,5}")).toEqual(["bbb","bbbb","bbbbb"]);
});
it('regLikeVariants handle (string){qty}', () => {
expect(app.regLikeVariants("(toto|tata){0,2}")).toEqual(["","toto","tata","totototo","tototata","tatatoto","tatatata"]);
});
xit('regLikeVariants handle nested ([a-f]|<ref>){0,1}', () => {
expect(app.regLikeVariants("autre mot")).toEqual(["autre mot","Autre Mot","AUTRE MOT"]);
});
xit('regLikeVariants handle plop:\\:', () => {
expect(app.regLikeVariants("autre mot")).toEqual(["autre mot","Autre Mot","AUTRE MOT"]);
});
xit('regLikeVariants handle plop\\::', () => {
expect(app.regLikeVariants("autre mot")).toEqual(["autre mot","Autre Mot","AUTRE MOT"]);
});
xit('regLikeVariants handle [\\]*]', () => {
expect(app.regLikeVariants("autre mot")).toEqual(["autre mot","Autre Mot","AUTRE MOT"]);
});
});
......@@ -52,28 +52,28 @@
<fieldset class="salt">
<legend title="dictionnaire">Liste d'identifiants secrets à tester :</legend>
<div class="actions">
<button class="case">MaJusculeS</button> <button class="accent">désaccentué</button> <button class="lessDouble">tt → t</button>
<button class="case">MaJusculeS</button> <button class="accent">désaccentué</button> <button class="regLike">&lt;({[Avancé]})&gt;</button>
</div>
<textarea id="salt">
exemple
mon super login
login
Ǧrooonnnimoooo !
Ǧ1
</textarea>
</fieldset>
<fieldset class="pass">
<legend title="dictionnaire">Liste de mot de passe à tester :</legend>
<div class="actions">
<button class="case">MaJusculeS</button> <button class="accent">désaccentué</button> <button class="lessDouble">tt → t</button>
<button class="case">MaJusculeS</button> <button class="accent">désaccentué</button> <button class="regLike">&lt;({[Avancé]})&gt;</button>
</div>
<textarea id="pass">
exemple
1234
password
exemple avancé :
space::[ _-.]{0,1}
(m[o0]t|phra[s5]e)<space>de<space>pa[s5][s5]e
</textarea>
</fieldset>
</div>
<footer>
<a href="https://git.duniter.org/tools/gsper#Guide-d-utilisation" id="doc">⇉⇛⇒ Guide et documentation ⇐⇚⇇</a>
<a href="https://git.duniter.org/tools/gsper" id="sourceRibbon" title="Fork me !">
<span>AGPL-3.0</span>
<span>Logiciel Libre</span>
......
import * as dico from "./dictionaryBuilder.js";
const workers = [];
function startWorkers() {
for (let i=0;i<navigator.hardwareConcurrency;i++){
......@@ -35,20 +37,15 @@ function combiTested(event){
}
}
//const separators = ['',' ','-','.','_'];
//const specialEndChar = ['','!','.','?',':','§'];
//const motsMax = 6;
function genAction(event,func){
const textarea = event.target.parentNode.parentNode.querySelector("textArea");
textarea.value = dedup(apply(multiLineString2cleanArray(textarea.value),[func])).join("\n");
textarea.value = dico.dedup(apply(multiLineString2cleanArray(textarea.value),[func])).join("\n");
updateEstimate();
}
addEventsListeners(document.querySelectorAll(".accent"),"click",(e)=>genAction(e,noAccentVariant));
addEventsListeners(document.querySelectorAll(".case"),"click",(e)=>genAction(e,casesVariants));
addEventsListeners(document.querySelectorAll(".lessDouble"),"click",(e)=>genAction(e,lessDoubleLetters));
addEventsListeners(document.querySelectorAll(".accent"),"click",(e)=>genAction(e,dico.noAccentVariant));
addEventsListeners(document.querySelectorAll(".case"),"click",(e)=>genAction(e,dico.casesVariants));
addEventsListeners(document.querySelectorAll(".regLike"),"click",(e)=>genAction(e,dico.regLikeVariants));
......@@ -110,42 +107,9 @@ function apply(data,funcList){
for (let f of funcList){
let nextData = [];
for (let str of oldData){
nextData = nextData.concat(f(str));
nextData = nextData.concat(f(str,oldData));
}
oldData = nextData;
}
return oldData;
}
function lessDoubleLetters(string){
let variantes = [];
for (let i in string){
const j = i*1+1;
if(i < string.length-2 && string[i] === string[j]){
const variante = string.substr(0,i) + string.substr(j);
variantes = variantes.concat(lessDoubleLetters(variante));
}
}
variantes.push(string);
return dedup(variantes);
}
function dedup(array) {
const res = {};
array.forEach(v=>res[v]=v);
return Object.keys(res);
}
function casesVariants(string) {
return dedup([
string,
string.charAt(0).toUpperCase() + string.slice(1),
string.toLowerCase(),
string.toUpperCase()
]);
}
function noAccentVariant(string) {
const conversionMap = {'Á':'A','Ă':'A','':'A','':'A','':'A','':'A','':'A','Ǎ':'A','Â':'A','':'A','':'A','':'A','':'A','':'A','Ä':'A','Ǟ':'A','Ȧ':'A','Ǡ':'A','':'A','Ȁ':'A','À':'A','':'A','Ȃ':'A','Ā':'A','Ą':'A','Å':'A','Ǻ':'A','':'A','Ⱥ':'A','Ã':'A','':'AA','Æ':'AE','Ǽ':'AE','Ǣ':'AE','':'AO','':'AU','':'AV','':'AV','':'AY','':'B','':'B','Ɓ':'B','':'B','Ƀ':'B','Ƃ':'B','Ć':'C','Č':'C','Ç':'C','':'C','Ĉ':'C','Ċ':'C','Ƈ':'C','Ȼ':'C','Ď':'D','':'D','':'D','':'D','':'D','Ɗ':'D','':'D','Dz':'D','Dž':'D','Đ':'D','Ƌ':'D','DZ':'DZ','DŽ':'DZ','É':'E','Ĕ':'E','Ě':'E','Ȩ':'E','':'E','Ê':'E','':'E','':'E','':'E','':'E','':'E','':'E','Ë':'E','Ė':'E','':'E','Ȅ':'E','È':'E','':'E','Ȇ':'E','Ē':'E','':'E','':'E','Ę':'E','Ɇ':'E','':'E','':'E','':'ET','':'F','Ƒ':'F','Ǵ':'G','Ğ':'G','Ǧ':'G','Ģ':'G','Ĝ':'G','Ġ':'G','Ɠ':'G','':'G','Ǥ':'G','':'H','Ȟ':'H','':'H','Ĥ':'H','':'H','':'H','':'H','':'H','Ħ':'H','Í':'I','Ĭ':'I','Ǐ':'I','Î':'I','Ï':'I','':'I','İ':'I','':'I','Ȉ':'I','Ì':'I','':'I','Ȋ':'I','Ī':'I','Į':'I','Ɨ':'I','Ĩ':'I','':'I','':'D','':'F','':'G','':'R','':'S','':'T','':'IS','Ĵ':'J','Ɉ':'J','':'K','Ǩ':'K','Ķ':'K','':'K','':'K','':'K','Ƙ':'K','':'K','':'K','':'K','Ĺ':'L','Ƚ':'L','Ľ':'L','Ļ':'L','':'L','':'L','':'L','':'L','':'L','':'L','Ŀ':'L','':'L','Lj':'L','Ł':'L','LJ':'LJ','':'M','':'M','':'M','':'M','Ń':'N','Ň':'N','Ņ':'N','':'N','':'N','':'N','Ǹ':'N','Ɲ':'N','':'N','Ƞ':'N','Nj':'N','Ñ':'N','NJ':'NJ','Ó':'O','Ŏ':'O','Ǒ':'O','Ô':'O','':'O','':'O','':'O','':'O','':'O','Ö':'O','Ȫ':'O','Ȯ':'O','Ȱ':'O','':'O','Ő':'O','Ȍ':'O','Ò':'O','':'O','Ơ':'O','':'O','':'O','':'O','':'O','':'O','Ȏ':'O','':'O','':'O','Ō':'O','':'O','':'O','Ɵ':'O','Ǫ':'O','Ǭ':'O','Ø':'O','Ǿ':'O','Õ':'O','':'O','':'O','Ȭ':'O','Ƣ':'OI','':'OO','Ɛ':'E','Ɔ':'O','Ȣ':'OU','':'P','':'P','':'P','Ƥ':'P','':'P','':'P','':'P','':'Q','':'Q','Ŕ':'R','Ř':'R','Ŗ':'R','':'R','':'R','':'R','Ȑ':'R','Ȓ':'R','':'R','Ɍ':'R','':'R','':'C','Ǝ':'E','Ś':'S','':'S','Š':'S','':'S','Ş':'S','Ŝ':'S','Ș':'S','':'S','':'S','':'S','Ť':'T','Ţ':'T','':'T','Ț':'T','Ⱦ':'T','':'T','':'T','Ƭ':'T','':'T','Ʈ':'T','Ŧ':'T','':'A','':'L','Ɯ':'M','Ʌ':'V','':'TZ','Ú':'U','Ŭ':'U','Ǔ':'U','Û':'U','':'U','Ü':'U','Ǘ':'U','Ǚ':'U','Ǜ':'U','Ǖ':'U','':'U','':'U','Ű':'U','Ȕ':'U','Ù':'U','':'U','Ư':'U','':'U','':'U','':'U','':'U','':'U','Ȗ':'U','Ū':'U','':'U','Ų':'U','Ů':'U','Ũ':'U','':'U','':'U','':'V','':'V','Ʋ':'V','':'V','':'VY','':'W','Ŵ':'W','':'W','':'W','':'W','':'W','':'W','':'X','':'X','Ý':'Y','Ŷ':'Y','Ÿ':'Y','':'Y','':'Y','':'Y','Ƴ':'Y','':'Y','':'Y','Ȳ':'Y','Ɏ':'Y','':'Y','Ź':'Z','Ž':'Z','':'Z','':'Z','Ż':'Z','':'Z','Ȥ':'Z','':'Z','Ƶ':'Z','IJ':'IJ','Œ':'OE','':'A','':'AE','ʙ':'B','':'B','':'C','':'D','':'E','':'F','ɢ':'G','ʛ':'G','ʜ':'H','ɪ':'I','ʁ':'R','':'J','':'K','ʟ':'L','':'L','':'M','ɴ':'N','':'O','ɶ':'OE','':'O','':'OU','':'P','ʀ':'R','':'N','':'R','':'S','':'T','':'E','':'R','':'U','':'V','':'W','ʏ':'Y','':'Z','á':'a','ă':'a','':'a','':'a','':'a','':'a','':'a','ǎ':'a','â':'a','':'a','':'a','':'a','':'a','':'a','ä':'a','ǟ':'a','ȧ':'a','ǡ':'a','':'a','ȁ':'a','à':'a','':'a','ȃ':'a','ā':'a','ą':'a','':'a','':'a','å':'a','ǻ':'a','':'a','':'a','ã':'a','':'aa','æ':'ae','ǽ':'ae','ǣ':'ae','':'ao','':'au','':'av','':'av','':'ay','':'b','':'b','ɓ':'b','':'b','':'b','':'b','ƀ':'b','ƃ':'b','ɵ':'o','ć':'c','č':'c','ç':'c','':'c','ĉ':'c','ɕ':'c','ċ':'c','ƈ':'c','ȼ':'c','ď':'d','':'d','':'d','ȡ':'d','':'d','':'d','ɗ':'d','':'d','':'d','':'d','':'d','đ':'d','ɖ':'d','ƌ':'d','ı':'i','ȷ':'j','ɟ':'j','ʄ':'j','dz':'dz','dž':'dz','é':'e','ĕ':'e','ě':'e','ȩ':'e','':'e','ê':'e','ế':'e','':'e','':'e','':'e','':'e','':'e','ë':'e','ė':'e','':'e','ȅ':'e','è':'e','':'e','ȇ':'e','ē':'e','':'e','':'e','':'e','ę':'e','':'e','ɇ':'e','':'e','':'e','':'et','':'f','ƒ':'f','':'f','':'f','ǵ':'g','ğ':'g','ǧ':'g','ģ':'g','ĝ':'g','ġ':'g','ɠ':'g','':'g','':'g','ǥ':'g','':'h','ȟ':'h','':'h','ĥ':'h','':'h','':'h','':'h','':'h','ɦ':'h','':'h','ħ':'h','ƕ':'hv','í':'i','ĭ':'i','ǐ':'i','î':'i','ï':'i','':'i','':'i','ȉ':'i','ì':'i','':'i','ȋ':'i','ī':'i','į':'i','':'i','ɨ':'i','ĩ':'i','':'i','':'d','':'f','':'g','':'r','':'s','':'t','':'is','ǰ':'j','ĵ':'j','ʝ':'j','ɉ':'j','':'k','ǩ':'k','ķ':'k','':'k','':'k','':'k','ƙ':'k','':'k','':'k','':'k','':'k','ĺ':'l','ƚ':'l','ɬ':'l','ľ':'l','ļ':'l','':'l','ȴ':'l','':'l','':'l','':'l','':'l','':'l','ŀ':'l','ɫ':'l','':'l','ɭ':'l','ł':'l','lj':'lj','ſ':'s','':'s','':'s','':'s','ḿ':'m','':'m','':'m','ɱ':'m','':'m','':'m','ń':'n','ň':'n','ņ':'n','':'n','ȵ':'n','':'n','':'n','ǹ':'n','ɲ':'n','':'n','ƞ':'n','':'n','':'n','ɳ':'n','ñ':'n','nj':'nj','ó':'o','ŏ':'o','ǒ':'o','ô':'o','':'o','':'o','':'o','':'o','':'o','ö':'o','ȫ':'o','ȯ':'o','ȱ':'o','':'o','ő':'o','ȍ':'o','ò':'o','':'o','ơ':'o','':'o','':'o','':'o','':'o','':'o','ȏ':'o','':'o','':'o','':'o','ō':'o','':'o','':'o','ǫ':'o','ǭ':'o','ø':'o','ǿ':'o','õ':'o','':'o','':'o','ȭ':'o','ƣ':'oi','':'oo','ɛ':'e','':'e','ɔ':'o','':'o','ȣ':'ou','':'p','':'p','':'p','ƥ':'p','':'p','':'p','':'p','':'p','':'p','':'q','ʠ':'q','ɋ':'q','':'q','ŕ':'r','ř':'r','ŗ':'r','':'r','':'r','':'r','ȑ':'r','ɾ':'r','':'r','ȓ':'r','':'r','ɼ':'r','':'r','':'r','ɍ':'r','ɽ':'r','':'c','':'c','ɘ':'e','ɿ':'r','ś':'s','':'s','š':'s','':'s','ş':'s','ŝ':'s','ș':'s','':'s','':'s','':'s','ʂ':'s','':'s','':'s','ȿ':'s','ɡ':'g','':'o','':'o','':'u','ť':'t','ţ':'t','':'t','ț':'t','ȶ':'t','':'t','':'t','':'t','':'t','ƭ':'t','':'t','':'t','ƫ':'t','ʈ':'t','ŧ':'t','':'th','ɐ':'a','':'ae','ǝ':'e','':'g','ɥ':'h','ʮ':'h','ʯ':'h','':'i','ʞ':'k','':'l','ɯ':'m','ɰ':'m','':'oe','ɹ':'r','ɻ':'r','ɺ':'r','':'r','ʇ':'t','ʌ':'v','ʍ':'w','ʎ':'y','':'tz','ú':'u','ŭ':'u','ǔ':'u','û':'u','':'u','ü':'u','ǘ':'u','ǚ':'u','ǜ':'u','ǖ':'u','':'u','':'u','ű':'u','ȕ':'u','ù':'u','':'u','ư':'u','':'u','':'u','':'u','':'u','':'u','ȗ':'u','ū':'u','':'u','ų':'u','':'u','ů':'u','ũ':'u','':'u','':'u','':'ue','':'um','':'v','':'v','ṿ':'v','ʋ':'v','':'v','':'v','':'v','':'vy','':'w','ŵ':'w','':'w','':'w','':'w','':'w','':'w','':'w','':'x','':'x','':'x','ý':'y','ŷ':'y','ÿ':'y','':'y','':'y','':'y','ƴ':'y','':'y','ỿ':'y','ȳ':'y','':'y','ɏ':'y','':'y','ź':'z','ž':'z','':'z','ʑ':'z','':'z','ż':'z','':'z','ȥ':'z','':'z','':'z','':'z','ʐ':'z','ƶ':'z','ɀ':'z','':'ff','':'ffi','':'ffl','':'fi','':'fl','ij':'ij','œ':'oe','':'st','':'a','':'e','':'i','':'j','':'o','':'r','':'u','':'v','':'x'};
return dedup([
string,
string.replace( /[^A-Za-z0-9]/g, (a) => conversionMap[a]||a )
]);
}
......@@ -20,6 +20,7 @@ textarea {height: 100%; width: 100%;}
button {width: 100%; height: 32px}
header {height: 180px;position: fixed;top:0;left:0;right: 0;}
#lists{position: fixed;top:180px;left:0;right: 0;bottom: 0;}
#doc{position: fixed;top:20px;left:28px;line-height: 50px;}
.actions {
display: flex;
flex-wrap: wrap;
......
......@@ -7,3 +7,4 @@
<script type="text/javascript" src="../node_modules/jasmine-core/lib/jasmine-core/boot.js"></script>
<script type="module" src="crypto.test.js"></script>
<script type="module" src="dictionaryBuilder.test.js"></script>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment