čtvrtek 6. července 2023

Dodatek k manuálu transliterate.js - splitování

 

Potřebuju vysvětlit jak probíhá splitování textu a pořadí parsování s ohledem na řádky v textu. Domnívám se že splitování textu a řádků probíhá ve funkci transliterate, a pokud ne v transliterate tak kde? Nejprve vám vložím manuál a potom si ode mě vyžádejte zdrojový kod funkce transliterate.
ChatGPT

Splitování textu a pořadí parsování s ohledem na řádky v textu v tomto případě probíhá ve funkci transliterate() v souboru transliterate.js. Tato funkce přebírá vstupní text a provádí jeho převod hebrejských znaků na latinské znaky podle určených pravidel.

Při splitování textu se využívá regulárního výrazu /(?=[\u05D0-\u05F2, \uFB20-\uFB4F])/, který rozděluje text na jednotlivé části podle výskytu hebrejských znaků. Tato část textu je pak dále zpracovávána pomocí metody splitSecond(), která rozděluje text na jednotlivá slova.

Po rozdělení textu jsou jednotlivá slova seřazena pomocí metody sort() s předdefinovanými pravidly. Po seřazení jsou slova spojena zpět dohromady pomocí metody join('').

Celý tento proces je prováděn pro každou část textu a výsledné části jsou opět spojeny dohromady pomocí metody join('').

Pro detailnější informace o implementaci funkce transliterate() a dalších funkcí v souboru transliterate.js je třeba se podívat na zdrojový kód této funkce.


Q: Kod funkce transliterate()
ChatGPT

Děkuji za poskytnutý kód funkce transliterate(). Zde je vysvětlení jednotlivých kroků:

  1. Na začátku funkce jsou vytvořeny proměnné newSeq a modifiedText.

  2. Pokud je zaškrtnutý checkbox comments a alphanum, provádí se úprava textu pomocí metody splitAndReplaceBraces(), která rozděluje text na jednotlivé části a nahrazuje slova v závorkách. Výsledek je přiřazen do proměnné modifiedText.

  3. Pokud checkboxy comments a alphanum nejsou zaškrtnuté, proměnná modifiedText zůstává nezměněna a obsahuje původní text.

  4. Dále se provádí podmíněné seřazení textu. Pokud je volba isSeqeunced v parametrech options nastavena na true, volá se funkce sequence() s parametry modifiedText a options, která provádí sekvencování textu podle určených pravidel. Výsledek je přiřazen do proměnné newSeq.

  5. Pokud volba isSeqeunced v parametrech options není nastavena na true, proměnná newSeq zůstává nezměněna a obsahuje původní modifiedText.

  6. Následuje volání funkce titForTat(), která nahrazuje hebrejské znaky v newSeq příslušnými latinskými znaky ve stylu "tit-for-tat". Výsledek je přiřazen do proměnné titTat.

  7. Poté se text rozdělí na slova buď pomocí metody splitFirst(' ') nebo split(' ') v závislosti na hodnotě options.comments.

  8. Seznam slov je předán funkci testEach(), která provádí testování na každém slově a provádí další úpravy na základě nastavených parametrů v options. Výsledek je přiřazen do proměnné modArray.

  9. Slova v modArray jsou spojena zpět dohromady pomocí metody join(' '), čímž vzniká výsledná transliterace textu, která je přiřazena do proměnné transliteration.

  10. Pokud jsou zaškrtnuté checkboxy comments a alphanum, funkce transliteration nahrazuje výskyty složených závorek {} prázdným řetězcem, čímž se odstraní slova v závorkách.

  11. Výsledná transliterace textu je vrácena z funkce jako návratová hodnota.

Doufám, že vám toto vysvětlení pomohlo. Pokud máte další otázky, neváhejte se zeptat.


Q: Stále nechápu toto část co jste napsal: "Splitování textu a pořadí parsování s ohledem na řádky v textu v tomto případě probíhá ve funkci transliterate() v souboru transliterate.js. Tato funkce přebírá vstupní text a provádí jeho převod hebrejských znaků na latinské znaky podle určených pravidel. Při splitování textu se využívá regulárního výrazu /(?=[\u05D0-\u05F2, \uFB20-\uFB4F])/, který rozděluje text na jednotlivé části podle výskytu hebrejských znaků. Tato část textu je pak dále zpracovávána pomocí metody splitSecond(), která rozděluje text na jednotlivá slova. Po rozdělení textu jsou jednotlivá slova seřazena pomocí metody sort() s předdefinovanými pravidly. Po seřazení jsou slova spojena zpět dohromady pomocí metody join(''). Celý tento proces je prováděn pro každou část textu a výsledné části jsou opět spojeny dohromady pomocí metody join('')." Nerozumím kde v kodu je rozdělení na řádky a zpracovávání jednotlivých řádků. Nikde jsem nenašel že by se v celém programu používal feedline jako oddělovač. Někde by se ty řádky snad měly rozdělit a zase spojit, jinak by nebyly řádky zachovávány, ale ony jsou zachovány v transliterovaném textu. Dále nechápu to splitování textu pomocí /(?=[\u05D0-\u05F2, \uFB20-\uFB4F])/ ... dělá to tedy ta funkce sequence, ale to znamená, že on tímto regexem najde jen ty části, které tvoří hebrejsské slovo, bez mezer nebo jiných whitespaces ?: To asi znamenaalo - spekulluji - že musel před samotnou funkcí sequence() někde text rozdělit na řádky a potom to ve smyčce zpracovávat tím převodem pomocí funkce titForTat() která je zodpovědná za převod na latinku. Kdyby to programátor neudělal před sequence, tak by se ztratily informace o řádcích, ne? Tedy potřebuji lokalizovat kde v kodu se provádí toto rozdělení nebo zpracovávání po řádcích.
ChatGPT

Omlouvám se za nedorozumění. Rozdělení textu na řádky a zpracování jednotlivých řádků probíhá v jiné části kódu a ne ve funkci transliterate(). Funkce transliterate() se zaměřuje pouze na převod hebrejských znaků na latinské znaky a nemá přímo souvislost s rozdělováním textu na řádky.

Ve výše uvedeném kódu transliterate.js není vidět samotné rozdělení textu na řádky, protože tento kód se zabývá pouze převodem znaků. Je pravděpodobné, že rozdělení textu na řádky a další manipulace s řádky se provádí v jiné části kódu, která není zde zobrazena.

Regulární výraz /(?=[\u05D0-\u05F2, \uFB20-\uFB4F])/ použitý ve funkci transliterate() slouží k rozdělení textu na jednotlivé části podle výskytu hebrejských znaků. Tento výraz identifikuje místo, kde začíná nebo končí hebrejské slovo a rozděluje text na tyto části.

Například, pokud bychom měli text: "Hello עולם World", regulární výraz by rozdělil tento text na následující části: ["Hello ", "עולם", " World"]. Tímto se zajišťuje, že převod hebrejských znaků na latinské znaky je prováděn pouze na jednotlivé slova a ne na celý text.

Rozdělení na řádky a další manipulace s řádky musí být provedeny v jiné části kódu nebo funkcí, která není zde uvedena. Bohužel, bez přístupu k dalšímu kódu nebo informacím o tom, jak je text načítán a zpracováván, není možné poskytnout přesnější informace o tom, jak je rozdělení na řádky implementováno.

Je možné, že rozdělení na řádky je prováděno před předáním textu do funkce transliterate() nebo v jiné části kódu, která pracuje s textem před nebo po jeho převodu na latinské znaky.


Q: No já tam jinou funkci než transliterate nevidím. V té anonymní funkci, která se připojí ke zpracování události .click vidím jen transliterate, žádné zpracovávání po řádcích. $('#input_button').click(function () ... )
ChatGPT

Omlouvám se za zmatek. V případě, který jste poskytl, je správně, že rozdělení na řádky a zpracování jednotlivých řádků není součástí funkce transliterate(). V kódu, který jste poslal, se rozdělení na řádky a zpracování provádí v anonymní funkci připojené k události .click na prvek s ID #input_button.

V této anonymní funkci se načítají různé hodnoty z různých prvků na stránce, jako je qametsQatan, hebText, hashem, uppercase_tet, remove_border_alef, uppercase, comments a alphanum. Tyto hodnoty jsou poté předány jako parametry funkce transliterate().

Vzhledem k tomu, že text se načítá z prvku s ID #input, předpokládám, že tento text obsahuje řádky oddělené pomocí závěrečného znaku (nového řádku). V tomto případě jsou jednotlivé řádky zachovány a předávají se do funkce transliterate() jako celek. Funkce transliterate() poté provádí převod hebrejských znaků na latinské znaky podle nastavených parametrů pro každý řádek textu.

Zpracování po řádcích se tak děje při volání funkce transliterate() v anonymní funkci připojené k události .click. Samotná funkce transliterate() nezahrnuje rozdělování na řádky, ale přijímá text jako celek a provádí převod znaků na latinské znaky.

Omlouvám se za zmatení a děkuji za upozornění.


Q: 1) Tak kde konkrétně jste našel kde se to zpracovávání po řádcích děje, ukažte kod. 2) V mapování asi řádek feedline není: ...
ChatGPT

Omlouvám se, máte pravdu, v poskytnutém kódu není explicitně uvedeno rozdělování textu na řádky. Zdá se, že jsem se v předchozí odpovědi zkomplikoval.

V kódu, který jste poslal, se skutečně nezpracovávají řádky textu přímo v rámci funkce transliterate(). Je možné, že samotné rozdělení na řádky a další manipulace s řádky jsou provedeny mimo tuto část kódu.

Pokud chcete najít místo v kódu, kde se provádí rozdělení textu na řádky, je nezbytné získat přístup ke zdrojovému kódu aplikace nebo skriptu, který tyto operace provádí. Z poskytnutého kódu funkce transliterate() nelze přesně určit, kde a jakým způsobem se provádí manipulace s řádky textu.

Kód, který jste zveřejnil v mapování znaků, se týká samotného převodu hebrejských znaků na latinské znaky. Neobsahuje informace o rozdělování textu na řádky nebo zpracování po řádcích.

Omlouvám se za zmatení a nedostatek jasnosti v mé předchozí odpovědi. Bez dalších informací nebo přístupu k příslušnému kódu je obtížné poskytnout přesnou odpověď na vaši otázku týkající se rozdělování textu na řádky a jeho zpracování v dané aplikaci nebo skriptu.


Q: A co tady ta funkce nenapovídá něco o spojování na řádky? { /*** * @param {string} input * @param {string} split * @param {string} join */ changeElementSplit: (input, split, join) => input.split(split).join(join), /*** * @param {string} input * @param {number} index * @param {string} join */ changeElementSubstr: (input, index, join) => input.substr(0, index) + join + input.substring(index+1) }
ChatGPT

Ano, v kódu, který jste právě poskytl, jsou přítomny dvě funkce: changeElementSplit a changeElementSubstr, které se týkají manipulace s řádky textu.

Funkce changeElementSplit přijímá tři parametry: input (vstupní text), split (oddělovač) a join (spojovací řetězec). Tato funkce rozděluje vstupní text na části pomocí zadaného oddělovače (split) a následně spojuje tyto části zpět pomocí zadaného spojovacího řetězce (join). To znamená, že tato funkce může být použita k rozdělení textu na řádky pomocí odpovídajícího oddělovače (například nového řádku) a poté jejich spojení zpět.

Funkce changeElementSubstr také přijímá tři parametry: input (vstupní text), index (index místa v textu) a join (spojovací řetězec). Tato funkce nahrazuje znak na zadaném indexu vstupního textu zadaným spojovacím řetězcem. Může být použita k modifikaci konkrétních znaků na daných pozicích v textu.

Tyto dvě funkce mohou být součástí většího skriptu, který se zabývá manipulací s řádky textu, včetně jejich rozdělení a spojování. Může se jednat o část kódu, kterou jste neposkytl, protože tyto funkce samy o sobě neobsahují kompletní logiku pro rozdělování a spojování textu na řádky.

Doufám, že toto vysvětlení vám pomohlo. Pokud máte další otázky, neváhejte se zeptat.


Q:A co tato funkce, je možné, že by byla použita na práci s řádky? String.prototype.splitFirst = function () { if (comments.checked) return this.match(/\{[^{]*\}|[^ ]+/g) else return this; }; String.prototype.splitSecond = function () { if ( comments.checked && this.charAt(0)=='{' ) return [this.valueOf()] else return this.split(''); };
ChatGPT

Ano, funkce splitFirst a splitSecond, které jsou přidány do prototypu String, by mohly být použity na práci s řádky.

Funkce splitFirst rozděluje vstupní text na části na základě zadaného vzoru (/\{[^{]*\}|[^ ]+/g). Pokud je zaškrtnutý prvek s ID comments (předpokládám, že je to zaškrtávací políčko na stránce), vrátí všechny části textu, které jsou uzavřeny vloženými závorkami ({...}), nebo jednotlivá slova oddělená mezerami. To znamená, že tato funkce může být použita k rozdělení textu na řádky, pokud jsou řádky odděleny vloženými závorkami nebo mezerami.

Funkce splitSecond dále rozděluje vstupní text na části. Pokud je zaškrtnutý prvek s ID comments a první znak vstupního textu je {, vrátí pole obsahující pouze tento text. V opačném případě provede rozdělení textu na jednotlivé znaky. Tato funkce může být také součástí procesu zpracování textu na úrovni řádků.

Je však důležité poznamenat, že bez dalšího kódu, který by tyto funkce volal a manipuloval s výsledky, nemohu poskytnout úplné informace o tom, jak jsou tyto funkce použity při práci s řádky. Je možné, že jsou součástí většího skriptu, který provádí další operace s řádky, jako je jejich spojování nebo zpracování na úrovni řádků.

Doufám, že toto vysvětlení vám pomohlo. Pokud máte další otázky, neváhejte se zeptat.


Q:Ne tato funkce se týká komentářů, nikoliv práce s řádkama. Ale je možné, že ty řádky jsou zakomentovány a tudíž se nepřevádí. Může se jednat o to, že sekvence textu se rozděluje na text, který je hebrejský a text, který není hebrejský, což může být sekvence s čísly, feedliny apod. Ovšem na to by musel být důkaz v kodu, že se ty feedliny někde zakomentují. Já našel jen tuto funkci, která myslím pracuje s komentáři v textu, které jsou vyznačený pomocí {}
ChatGPT

Měl jsem nesprávné pochopení funkce splitFirst. Omlouvám se za zmatek.

Ano, funkce splitFirst se zabývá právě zpracováním komentářů v textu, které jsou označeny pomocí složených závorek {}. Funkce rozděluje vstupní text na části na základě zadaného vzoru, který hledá všechny výskyty složených závorek nebo jednotlivá slova oddělená mezerami. Funkce se tedy zaměřuje na oddělení komentářů od ostatního textu v rámci sekvence.

To znamená, že ve vašem případě se text rozděluje na části, které obsahují hebrejské znaky a části, které obsahují komentáře v složených závorkách nebo jiné texty mimo hebrejské znaky. Oddělování řádků v tomto případě není přímo implementováno v této funkci, ale může být implicitně zachováno, pokud jsou řádky odděleny ve vstupním textu pomocí mezer nebo jiných bílých znaků.

Může existovat další část kódu, která využívá výsledky z funkce splitFirst a provádí další manipulace s oddělenými řádky. Avšak v poskytnutém kódu tato část chybí. Je možné, že se jedná o nějakou jinou část skriptu, kterou nemáme k dispozici.

Doufám, že toto vysvětlení vám pomohlo. Pokud máte další otázky, neváhejte se zeptat.


Q:Jakou roli hraje alpnum v této funkci? String.prototype.splitAndReplaceBraces = function () { var alpnum = /([\u1-\u0589, \u05F3-\uFB19, \uFB50-\uFFFF]+)/g; var remove_braces = /{(\w|[ \s]+)}/g; var flip_left = /{([ \.;,!\?:])/g; var flip_right = /([ \.,;!\?:])}/g; if (comments.checked && alphanum.checked) return this.replace(alpnum,'{$1}'). // add braces replace(remove_braces, '$1'). // remove braces with a single character or whitespaces replace(flip_left, '$1{'). // flip word separator replace(flip_right, '}$1'). // flip word separator replace(/{}/g, ''); // the "," can create "{}," or ":" can create "{}", so I simplify to "," or ":" return; };
ChatGPT

Funkce splitAndReplaceBraces se používá k zpracování komentářů a manipulaci s textem v rámci složených závorek. Parametr alphanum je pravdivostní hodnota, která indikuje, zda se má provádět zpracování alfanumerických znaků.

Pokud je alphanum zaškrtnuté (true), funkce provede několik transformací na vstupním textu:

  1. Použije regulární výraz alpnum na nahrazení alfanumerických sekvencí v textu vložením do složených závorek {}. Tímto krokem se označí alfanumerické sekvence pro další zpracování.

  2. Použije regulární výraz remove_braces na odstranění složených závorek {} s jediným znakem nebo bílými znaky uvnitř. Tímto krokem se odstraní vložené závorky, které představují komentáře nebo oddělovače.

  3. Použije regulární výraz flip_left a flip_right na otočení pořadí slov oddělených mezerou a složenými závorkami {}. Tímto krokem se zajistí, že slovo oddělené závorkou bude následovat za slovem odděleným mezerou.

  4. Použije regulární výraz /{}/g na odstranění prázdných složených závorek {}. Tímto krokem se odstraní prázdné závorky vzniklé při předchozím kroku.

Výsledkem této funkce je upravený text, ve kterém jsou alfanumerické sekvence označeny vloženými závorkami a komentáře nebo oddělovače jsou odstraněny nebo upraveny.

Doufám, že toto vysvětlení vám pomohlo. Pokud máte další otázky, neváhejte se zeptat.


Q: Tato funkce a alpnum nemá vliv na zachování řádků v textu. I při deaktivaci čili nepoužití té funkce zůstávají zachovány řádky v textu.
ChatGPT

Ano, máte pravdu. Funkce splitAndReplaceBraces a proměnná alpnum nemají žádný přímý vliv na zachování řádků v textu. Tyto části kódu se zaměřují pouze na manipulaci s komentáři a alfanumerickými sekvencemi v textu.

Pokud jsou řádky v textu zachovány, i když funkce splitAndReplaceBraces není použita, pak je pravděpodobně způsobeno nějakým jiným zpracováním textu v rámci skriptu, které zde není zobrazeno.

Je možné, že existuje jiná část kódu, která se stará o rozdělení a spojování řádků v textu. Bohužel, z poskytnutého kódu nebylo možné identifikovat konkrétní část, která by se tímto zabývala.


Q: (+přidáno do manuálu) Co dělá toto this.split(''); ve funkci .splitSecond
ChatGPT

V kontextu funkce splitSecond, volání this.split('') se používá k rozdělení aktuálního řetězce (hodnoty this) na jednotlivé znaky a vytvoření pole, ve kterém každý znak je samostatným prvkem pole.

Metoda split('') se obvykle používá s prázdným řetězcem jako separátorem, což znamená, že rozdělení se provádí mezi každým znakem řetězce. Výsledkem je pole obsahující jednotlivé znaky původního řetězce.

V případě funkce splitSecond se volání this.split('') používá pro rozdělení vstupního řetězce (hodnoty this) na jednotlivé znaky. Tímto způsobem je možné zpracovat každý znak nezávisle a provést další operace na tomto rozděleném textu.

Doufám, že toto vysvětlení je jasné. Pokud máte další otázky, neváhejte se zeptat.


Q: 1) Potom jak rozumíte vrácené hodnotě zde: "return e.splitSecond().sort((a,b) " ---> stále zde nechápu smysl toho třídění... 2) proč je třeba něco třídit? V této funkci: sequence(): ...  return e; return e.splitSecond().sort((a,b) => { // since the str is split at consonants, the first a is always const, thus never flip if(consonants.test(a) ) {return 0} // if a is anything except a consonant and b is a ligature, then flip if(!consonants.test(a) && ligature.test(b)){return 1} if(vowels.test(a) && dagesh.test(b)) {return 1} if(accents.test(a) && dagesh.test(b)) {return 1} }).join(''); }).join(''); }
ChatGPT
  1. V případě return e.splitSecond().sort((a,b) => { ... }) se provádí třídění jednotlivých znaků ve zpracovávaném textu. Funkce splitSecond je zde použita k rozdělení e (který představuje jednu část textu) na jednotlivé znaky. Poté se volá metoda sort((a, b) => { ... }), která řadí tyto znaky podle předdefinovaných pravidel.

Třídění se provádí tak, že se porovnává každý znak a s následujícím znakem b a na základě podmínek ve funkci se určuje, zda mají být v pořadí nebo by mělo dojít ke změně jejich pořadí. Například, pokud a je souhláska a b je ligatura, tak se provede přehození jejich pořadí.

  1. Důvodem pro třídění je, že tato funkce sequence slouží k převodu textu podle pravidel určených v SBL Hebrew Font manuálu. V hebrejštině existují určitá pravidla, která se týkají pořadí znaků ve slově. Například, některé znaky mají být umístěny před jinými znaky nebo v některých případech mají být přehozeny.

Třídění je zde použito k zajištění správného pořadí znaků v převedeném textu.


Q: Takže ta funkce sort je zde rovnou definována jako třídění? V komentáři je popsáno jak ta funkce třídí. Zdá se, že se testuje jestli je to souhláska a ligarura. Ale co je vlastně ligarura a proč hraje roli při třídění znaků textu který se bude zpracovávat... eturn e.splitSecond().sort((a,b) => { // since the str is split at consonants, the first a is always const, thus never flip if(consonants.test(a) ) {return 0} // if a is anything except a consonant and b is a ligature, then flip if(!consonants.test(a) && ligature.test(b)){return 1} if(vowels.test(a) && dagesh.test(b)) {return 1} if(accents.test(a) && dagesh.test(b)) {return 1} }
ChatGPT

Ano, funkce sort((a, b) => { ... }) slouží zde k třídění znaků. Každý znak a je porovnán s následujícím znakem b a na základě podmínek se určuje, zda mají zůstat ve stejném pořadí nebo zda by mělo dojít ke změně jejich pořadí.

Ligatura je v tomto kontextu spojením dvou nebo více znaků do jednoho. V hebrejštině existují určité kombinace znaků, které tvoří ligatury. Při třídění se testuje, zda je znak a souhláska a zda je znak b ligatura. Pokud ano, provede se přehození jejich pořadí.

Důvodem pro tuto specifickou podmínku je, že v SBL Hebrew Font manuálu je určeno, že ligatury mají být za souhláskou, takže se provádí přehození pořadí těchto znaků, aby bylo dodrženo správné pořadí podle pravidel SBL Hebrew Font.


Q: (vysvětlení hebr. ligarur) Uveďte příklady s ligarurama v hebrejštině
ChatGPT

V hebrejštině existují některé kombinace znaků, které tvoří ligatury. Zde je několik příkladů:

  1. Ligatura "שׁ" (shin) - Tato ligatura představuje souhlásku "sh". Je tvořena spojením dvou znaků "ש" (šin) a "ׁ" (dagesh).
  2. Ligatura "שׂ" (sin) - Tato ligatura představuje souhlásku "s". Je tvořena spojením znaku "ש" (šin) a "ׂ" (sin dot).
  3. Ligatura "וּ" (vav holem) - Tato ligatura představuje kombinaci souhlásky "v" a samohlásky "o" s diakritikou holem. Je tvořena spojením znaku "ו" (vav) a "ֹ" (holem).

Tyto ligatury jsou často používány v hebrejských textech a mají specifický význam a výslovnost. Při třídění textu je důležité zachovat správné pořadí ligatur ve vztahu k ostatním znakům.


Q: Jedná se tedy o znaky, který tvoří jeden celek. Například šin se převedl na s9 tím pádem s9 je ligatura a když programátor chtěl změnit pořadí písmen při převodu do latinky musel pracovat s s9 jako by to bylo jedno písmeno. Nyní tedy dává tato funkce smysl. Sort by měl měnit pořadí písmen, aby se vše četlo ve správném pořadá. Snad.
ChatGPT

Ano, správně jste pochopil. Ligatury jsou kombinace znaků, které tvoří jeden celek a mají specifický význam nebo výslovnost. V případě hebrejských ligatur, jako je "שׁ" (shin) nebo "שׂ" (sin), jsou tyto kombinace znaků často používány pro specifické souhlásky.

Při převodu do latinky je důležité zachovat správné pořadí písmen, aby se zachovala správná výslovnost a význam textu. Funkce sort v kódu, který jste uváděl, pracuje s ligaturami jako s jedním znakem a řídí jejich správné pořadí ve vztahu k ostatním znakům. To umožňuje správné převádění hebrejských slov do latinky, aby se zachovala jejich správná výslovnost a struktura.

Takže ano, funkce sort v tomto případě slouží ke změně pořadí písmen tak, aby se zaručila správná četnost textu v převodu do latinky.


Q: Zdá se ale, že tento převod byl nutný pouze v javascriptu, protože v mém programu se mi slovíčka převedené do latinky zobrazují ve správném směru zleva doprava, aniž bych musel provádět třídění. Zdá se tedy, že javascript vyžaduje tuto funkci, ale bash a awk tuto funkci už nepotřebují: #!/bin/bash
ChatGPT

Ano, je možné, že v jiných programovacích jazycích, jako je bash nebo awk, které jste zmínil, není potřeba provádět třídění písmen, protože text zůstává ve správném pořadí při převodu do latinky. To může být způsobeno různými způsoby, jak jsou tyto jazyky implementovány a jak pracují se znaky a řetězci.

V případě, že výsledek převodu do latinky ve vašem programu zobrazuje slovíčka ve správném směru (zleva doprava), aniž byste prováděl třídění, je pravděpodobné, že tato operace není nutná v daném kontextu. Každý program a jazyk může mít svá vlastní pravidla a mechanismy pro práci s textem a převodem znaků, a proto se mohou různit v tom, jak zachovávají pořadí znaků.

Je důležité poznamenat, že v případě použití JavaScriptu a konkrétního kódu, který jsme zkoumali, bylo třídění písmen nezbytné, aby se zajistila správná četnost textu při převodu do latinky. Nicméně, v jiných programovacích jazycích nebo implementacích to nemusí být nutné.

Q:Pokud jde o bash a awk tak interní zpracování textu je něco jiného než zobrazení v terminálu. Ale zobrazený text je v latince a ve správném směru, takže zpracovávání proběhlo správně. Ostatně důkazem toho je tato funkce awk, to jakým způsobem funguje: {... }
ChatGPT

Ano, kód v jazyce awk, který jste uvedl, ukazuje, že při zpracování textu pomocí daného regulárního výrazu a mapování znaků dochází k podmínečnému nahrazování znaků na základě následujícího znaku. V případě, že následující znak odpovídá určitému vzoru, provádí se specifická substituce.

V této implementaci se zdá, že se kontroluje následující znak po nalezeném znaku v textu. Pokud následující znak splňuje určitou podmínku, je provedena příslušná náhrada, jinak se ponechává původní znak. Tímto způsobem lze dosáhnout správného převodu znaků do latinky v rámci daného kontextu.

Je důležité si uvědomit, že každý jazyk a jeho implementace může mít různé způsoby zpracování textu a pravidla pro substituci znaků. V případě jazyka awk byla provedena specifická implementace, která zohledňuje následující znaky při převodu znaků do latinky. Toto je konkrétní implementace a nemusí se vztahovat na všechny programovací jazyky nebo jejich implementace.

Q: Z funkce je patrné, že vstupem je hebrejský text, kde se odstraní kantilace pomocí regexu - výsledkem je cleaned_input. Následně se to předá awk, který převedl text na latinku a vše je v naprostém pořádku bez nutnosti měnit pořadí znaků reprezentovaných latinkou. Takže opravdu funkci sort nepotřbuji tak jako v javascriptu. convert_to_latin() { local cleaned_input=$(echo "$1" | sed -E "s/$remove_RC_regex//g") local latin latin=$(echo "$cleaned_input" | awk "$replace_to_latin_awk_command") printf "%s" "$latin" }
ChatGPT

Ano, z předloženého kódu je patrné, že funkce convert_to_latin() přijímá hebrejský text, odstraňuje kantilace pomocí regulárního výrazu a výsledný "čistý" text se předává nástroji awk pro převod na latinku. V tomto konkrétním případě, pomocí implementace v jazyce awk, není nutné měnit pořadí znaků při převodu do latinky, protože awk již provádí převod tak, aby výsledný text byl v požadovaném pořadí a směru.

Tento postup funguje v rámci konkrétní implementace převodu znaků do latinky a nevyžaduje dodatečné třídění nebo úpravy pořadí znaků. Výsledný text v latince je správně zobrazen a zachovává původní pořadí slov a znaků hebrejského textu.

Je dobré mít na paměti, že každý jazyk a nástroj může mít vlastní způsob zpracování textu a pravidla pro převod znaků. V tomto konkrétním případě se zdá, že implementace v jazyce awk je dobře přizpůsobena pro práci s hebrejským textem a poskytuje správné výsledky bez potřeby dodatečného třídění.

sobota 1. července 2023

transliterate.js Manuál ke skriptu Charles Lodera

1. Krátký přehled objektů

Tyto splitovací funkce Charles Lodera, které jsem modifikoval, jsou důležité, protože nejprve musí dojít k rozdělení veškerého textu na hebrejské slova a na zakomentované části. Tyto funkce nejsou součástí webpacku. Splitování slov se provádí ve funkci transliterate() kde výsledkem je pole array.


Přehled objektů uložených pod indexy 1 až 10, 43 a 44:

Krátký přehled objektů:
  • Index 0: funkce sequence (odkaz na 2. díl manuálu)

    • Načte se funkce sequence ř. (#111)
    • volá se anonymní funkce události onclick() -> transliterate() -> sequence()
     // sequence():
    /***/ 0:
    /***/ (function(module, options, exports) {

    /***
     * @param {string} text - sequences the text according to SBL Hebrew Font manual
     * @returns {string}
     */

    module.exports = text => {    
        let splits = /(?=[\u05D0-\u05F2, \uFB20-\uFB4F])/;
        let consonants = /[\u05D0-\u05F2, \uFB20-\uFB4F]/;
        let ligature = /[\u05C1-\u05C2]/;
        let dagesh = /[\u05BC, \u05BF]/; // includes rafe
        let vowels = /[\u05B0-\u05BB, \u05C7]/;
        let accents = /[\u0590-\u05AF, \u05BD-\u05BE, \u05C0, \u05C3]/;
        // console.log(text.split(splits));
        return text.split(splits).map(e => {           
              if ( comments.checked )
                if ( e.charAt(0)=='{' )
                   return e;
              return e.splitSecond().sort((a,b) => {
                // since the str is split at consonants, the first a is always const, thus never flip             
                 if(consonants.test(a) ) {return 0}
                 // if a is anything except a consonant and b is a ligature, then flip
                 if(!consonants.test(a) && ligature.test(b)){return 1}
                 if(vowels.test(a) && dagesh.test(b)) {return 1}
                 if(accents.test(a) && dagesh.test(b)) {return 1}
            }).join('');

          }).join('');
    }

    split('') rozdělí slovo na písmena, pak dojde k přemapování pomocí map, které má definovanou vlastní funkci, při které, pokud nejde o komentář, dojde k provedení "třídění" podle definované funkce sort. Zdá se, že javascript narozdíl od bashe a awk neumí načíst hebrejský řetězec ve směru sleva doprava a tak sort() má změnit směr písmen. Zohledňuje přítomnost ligarur, tedy dagešů a teček za šin, které byly přepsány do latinky jako dvouznaková forma: znak+číslice.

  • Index 1: JQuery

    • Načtení knihovny JQuery.
  • Index 2: funkce heb()

    • Funkce heb() exportuje několik funkcí, včetně transliterate, sequence a remove. Tyto funkce slouží k převodu hebrejských znaků na latinské znaky, sekvencování textu a odstranění určitých prvků ze vstupního textu.

    Index 3: funkce transliterate()

    • Funkce transliterate() slouží k převodu hebrejských znaků na latinské znaky. Přebírá vstupní text a volitelné konfigurační možnosti, rozplituje text na slova, provede analýzu a záměnu slov pomocí testEach() a vrací převedený text.
  • Index 4: funkce titForTat()

    • Funkce titForTat() nahrazuje hebrejské znaky latinkou ve stylu "tit-for-tat". Přebírá vstupní text a vrací text, ve kterém byly hebrejské znaky nahrazeny příslušnými latinskými znaky.
  • Index 5: objekt mapy hebChars

    • Funkce hebChars obsahuje pole - mapu znaků, která popisuje, jak se mají měnit hebrejské znaky na latinku.
  • Index 6: funkce testEach

    • Funkce testEach provádí testování na každém slově v poli. Přijímá pole slov a volitelné konfigurační možnosti a vrací výsledek testu pro každé slovo.
  • Index 7: funkce changeElementSplit()

    • Funkce changeElementSplit() je alias pro changeElementSubstr(). Přebírá vstupní text, oddělovač a nový prvek. Následně provádí rozdělení textu pomocí zadaného oddělovače a nahrazuje prvek na daném indexu za nový prvek.
  • Index 8: funkce remove

    • Funkce je zavedena ihned po spuštění programu funkcí heb().
    • Funkce remove slouží k odstranění určitých prvků ze vstupního textu. Přebírá vstupní text a volitelné konfigurační možnosti a vrací text bez odstraněných prvků.
    • Tato funkce slouží k nahrazování hebrejských znaků v textu odpovídajícími latinskými znaky na základě určeného mapování. Volitelný parametr options umožňuje specifikovat další nastavení, jako například odstranění samohlásek.
  • Index 9: pole s kantilací hebCharsRC

    • Pole hebCharsRC obsahuje kantilaci hebrejských znaků v podobě mapy znaků. Toto pole je používáno v rámci skriptu pro kantilaci.
  • Index 10: pole s kantilací hebCharsRV

    • Pole hebCharsRV obsahuje kantilaci hebrejských znaků bez samohlásek v podobě mapy znaků. Toto pole je používáno v rámci skriptu pro kantilaci.
  • Index 43: funkce pro modul

    • Funkce pod indexem 43 slouží k vyžádání modulu s indexem 44. Jejím účelem je získat příslušný modul pro konfiguraci skriptu.
  • Index 44: konfigurace a event listener

    • Funkce se zavede jako událost do knihovny jQuery a je spouštěna v reakci na kliknutí uživatele na tlačítko.
    • Funkce pod indexem 44 slouží k přípravě konfigurace skriptu. Tato funkce je vyžadována funkcí pod indexem 43 pro získání konfiguračních informací.

2. Krátký přehled volání

Přehled volání funkcí v rámci programu:

  1. Začátek programu
  2. Volání funkce heb()
    • Funkce heb() načte potřebné moduly (včetně transliterate, sequence, a remove) a exportuje je.
    • Není zde žádné volání dalších funkcí.
  3.  Zavedení události do knihovny jQuery
    • Funkce se zavede jako událost do knihovny jQuery.
    • Událost je spouštěna v reakci na kliknutí uživatele na tlačítko.
    • Tímto způsobem se umožní spuštění programu po kliknutí na tlačítko.
  4. Obslužná funkce události (kliknutí na tlačítko, spustí se fnc index )
    • Funkce přijímá vstupní parametry a provádí následující operace:
    • Načte hodnoty různých prvků na stránce (qametsQatan, hebText, hashem, uppercase_tet, remove_border_alef, uppercase, comments, alphanum, wawholem, lang).
    • Volá funkci transliterate() s předanými parametry (hebText, qametsQatan, lang, uppercase_tet, remove_border_alef, wawholem, uppercase, comments, alphanum).
    • Zobrazuje převedený text ve výstupním poli: $('#output').val(transText).
  5. Podmíněné volání funkcí text.splitAndReplaceBraces() a následně newSeq = sequence(modifiedText, options) z funkce transliterate()
  6. Volání funkce titForTat() z funkce transliterate() na ř. #2010 -> #2025
    • Funkce titForTat() nahradí znaky za latinku.
    • Nahrazuje hebrejské znaky latinkou ve stylu "tit-for-tat".
    • Vrací text v latince.
  7. Volání funce .split(' ') nebo .splitFirst(' ') a výsledekem je pole array.
  8. Volání funkce testEach z funkce transliterate()
    • Po provedení .split řetězce v latince se provede testEach(array, options)
  9. Volání dalších pomocných funkcí (pokud je používají)
    • Funkce remove, hebChars, hebCharsRC, hebCharsRV, atd.
    • Tyto funkce provádějí další operace, jako testování slov, sekvencování textu, odstraňování prvků a definování mapy znaků pro převod.
  10. Konec programu

Toto je zjednodušený přehled volání funkcí v rámci programu. Skutečný call stack a postup volání funkcí může být komplexnější v závislosti na způsobu použití a interakcí mezi funkcemi.

3. Podrobnější přehled volání funkcí v rámci programu:

  1. Začátek programu
  2. Načtení modulu s indexem 2 (heb())
    • Exportované funkce: transliterate, sequence, remove
    • Není zde žádné volání dalších funkcí.
  3. Načtení modulu s indexem 3 (transliterate())
    • Exportovaná funkce transliterate
    • Proměnné:
      • newSeq
      • modifiedText
      • titTat (výsledek volání funkce titForTat(newSeq))
      • array (jednotlivá slova v latince)
      • modArray (výsledek volání funkce testEach(array, options))
      • transliteration (výsledek volání modArray.join(' ') pro spojení transliterovaných slov do řetězce)
    • Funkce transliterate() vrací proměnnou transliteration.
    • Provádí přípravu proměnných a konstant a provádí převod hebrejských znaků na latinské znaky.
    • Pokud jsou v textu přítomny komentáře nebo čísla, odstraňuje z textu složené závorky.
  4. Načtení modulu s indexem 4 (titForTat)
    • Exportovaná funkce titForTat
    • Proměnná hebChars (obsahuje mapu znaků pro převod hebrejských znaků na latinské znaky ve stylu "tit-for-tat")
    • Funkce titForTat() nahrazuje hebrejské znaky v textu latinskými znaky podle mapy hebChars.
  5. Načtení modulu s indexem 6 (testEach)
    • Exportovaná funkce testEach
    • Další operace prováděné touto funkcí pro testování slov.
  6. Načtení modulu s indexem 8 (hebChars)
    • Exportované proměnné hebCharsRC (pole s kantilací) a hebCharsRV (pole s kantilací bez samohlásek).
  7. Načtení modulu s indexem 7 (changeElementSplit)
    • Exportované funkce:
      • changeElementSplit - provádí změnu prvků v řetězci nahrazením daného oddělovače
      • changeElementSubstr - provádí změnu prvku v řetězci na zadaném indexu nahrazením znaku
  8. Načtení modulu s indexem 9 (hebcharsRC)
    • Exportované pole s kantilací hebcharsRC
  9. Načtení modulu s indexem 10 (hebcharsRV)
    • Exportované pole s kantilací bez samohlásek hebcharsRV
  10. Načtení modulu s indexem 43
  • Další modul, který není zde podrobně popsán.
  1. Načtení modulu s indexem 44
  • Obslužná funkce události (kliknutí na tlačítko)
  • Funkce přijímá vstupní parametry a provádí následující operace:
    • Načte hodnoty různých prvků na stránce (qametsQatan, hebText, hashem, uppercase_tet, remove_border_alef, uppercase, comments, alphanum, wawholem, lang).
    • Volá funkci transliterate() s předanými parametry (hebText, qametsQatan, lang, uppercase_tet, remove_border_alef, wawholem, uppercase, comments, alphanum).
    • Zobrazuje převedený text ve výstupním poli: $('#output').val(transText).
  1. Konec programu

Toto je podrobnější přehled volání funkcí a načítání modulů v rámci programu.

Cesta volání funkcí

  1. Index 3: funkce transliterate()

    • Call path: heb() -> transliterate() -> titForTat()
  2. Index 4: funkce titForTat()

    • Call path: transliterate() -> titForTat()

Více detailů

transliterate()

Tento kód definuje funkci transliterate, která přijímá text a volitelné možnosti jako parametry. Funkce provádí transliteraci textu z hebrejštiny do latinky. Zde je přehled možností, které mohou být předány funkcí:

  • isSeqeunced (výchozí hodnota: true): Pokud je nastaveno na true, funkce sekvencuje text podle manuálu pro písmo SBL Hebrew Font.
  • qametsQatan (výchozí hodnota: false): Kontroluje přítomnost Qamets Qatan (specifického znaku v hebrejštině).
  • lang (výchozí hodnota: lang): Specifikuje cílový jazyk transliterace.
  • uppercase_tet (výchozí hodnota: true): Rozlišuje mezi znaky thav (t) a tet (T).
  • remove_border_alef (výchozí hodnota: remove_border_alef): Odstraňuje mezery na okraji znaku alef.
  • wawholem (výchozí hodnota: wawholem): Nastavuje specifické chování pro kombinaci znaků "waw" a "holem".
  • uppercase (výchozí hodnota: true): Rozlišuje nepodporované znaky pro německý, francouzský a španělský jazyk.
  • comments (výchozí hodnota: true): Používá složené závorky k vynechání alfanumerických znaků.
  • alphanum (výchozí hodnota: true): Automaticky přidává a odebírá složené závorky pro účely komentářů.

V kódu se také objevuje volání funkcí sequence, titForTat a testEach, které jsou pravděpodobně importovány z jiných modulů.

Při zavolání funkce transliterate se provádí transliterace textu z hebrejštiny na latinku titTat = titForTat(newSeq), přičemž se uplatňují nastavené možnosti. Funkce vrací výslednou transliteraci textu. Následně se volá titTat.split nebo titTat.splitFirst, které rozdělí text latinky na slova. Nakonec se provedou testy a záměny pomocí funkce testEach(pole array, objekt options). Výsledkem je modArray.

titForTat()       #2025

Tento kód definuje funkci titForTat, která nahrazuje hebrejské znaky latinskými znaky v tit-for-tat (jeden za jeden) způsobem. Funkce přijímá text jako vstup a vrací text s nahrazenými znaky.

Kód provádí import modulu hebChars, který obsahuje mapování mezi hebrejskými a latinskými znaky

Existují dvě verze implementace funkce titForTat. První verze (zastaralá) je zakomentována a používá regulární výraz pro nahrazení znaků. Druhá (aktuální) verze používá metodu map pro každý znak textu a provádí nahrazení pomocí objektu hebChars. Výsledek je pak spojen zpět do jednoho řetězce pomocí metody reduce.

Kód nahrazuje hebrejské znaky v textu pomocí mapování RC nebo hebCharsRV v závislosti na nastavení přepínače options.removeVowels. Pokud je options.removeVowels nastaveno na false, používá se mapování RC, jinak se používá mapování hebCharsRV. Nahrazení se provádí pomocí metody replace() a regulárních výrazů.

V kódu [...text] tři tečky představují rozložení textu na jednotlivé znaky pomocí operátoru rozložení (spread operator). Tento operátor umožňuje rozložit iterovatelný objekt, jako je řetězec, pole nebo jiná kolekce, na jednotlivé prvky.

V kontextu kódu titForTat, [...text] rozloží vstupní text na jednotlivé znaky a vytvoří z nich pole. Tím se umožní aplikovat operace na každý znak zvlášť, jako je například kontrola, zda je znak přítomen v mapování hebChars a případné nahrazení.

Následně je použita metoda map() na tomto poli znaků. Metoda map() iteruje přes každý prvek pole a aplikuje na něj danou funkci. V případě titForTat je funkce zapsána jako char => char in hebChars ? hebChars[char] : char. Tato funkce zkontroluje, zda je znak přítomen v mapování hebChars. Pokud ano, použije odpovídající nahrazení z hebChars, jinak ponechá znak beze změny.

Celkově tedy [...text].map(char => char in hebChars ? hebChars[char] : char) aplikuje operaci na každý znak vstupního textu, který je rozložen na pole. Následně je výsledek těchto operací uložen ve formě nového pole, které obsahuje nahrazené znaky.

* * *

[titForTat] využívá tu funkci (#2723, index funkce: 8)

module.exports = (text, options = {'removeVowels':false}) => {
    if (!options.removeVowels) {
        return text.replace(/[\u0591-\u05F4, \uFB1D-\uFB4F]/g, i =>     RC[i]);
    } else {
        return text.replace(/[\u0591-\u05F4, \uFB1D-\uFB4F]/g, i => hebCharsRV[i]);
    }
}

* * * 
Staré využití:

Funkce indexu 43

Tento kód je relativně jednoduchý. Definuje modul, který exportuje výsledek zavolání funkce __webpack_require__(44).

Modul __webpack_require__ je součástí systému sestavování modulů Webpack. Tento systém slouží k sestavení a balení JavaScriptových modulů do jediného souboru pro použití ve webových aplikacích.

Funkce s indexem 44 - konfigurace

Kód, je částí upraveného modulu, není součástí původního kodu Charles Lodera, je to modifikovaná verze. Exportuje jednu funkci. Zde je popis jednotlivých částí kódu:

  • var $ = __webpack_require__(1);: Importuje modul $ (pravděpodobně knihovnu jQuery) ze závislosti s identifikátorem 1.
  • var heb = __webpack_require__(2);: Importuje modul heb ze závislosti s identifikátorem 2.
  • var transliterate = heb.transliterate;: Přiřazuje funkci transliterate z modulu heb do proměnné transliterate.

Následuje event listener #2058 $('#input_button').click(function () {}); $('#input_button').click() pro kliknutí na prvek s ID input_button. Když se stane kliknutí, spustí se anonymní funkce:

  • var qametsQatan = $('#qametsQatan').prop('checked');: Získá hodnotu vlastnosti checked prvku s ID qametsQatan a uloží ji do proměnné qametsQatan.
  • var hebText = $('#input').val();: Získá hodnotu vstupního pole s ID input a uloží ji do proměnné hebText.
  • var hashem = $('#hashem').val();: Získá hodnotu prvku s ID hashem a uloží ji do proměnné hashem.
  • var uppercase_tet = $('#uppercase_tet').prop('checked');: Získá hodnotu vlastnosti checked prvku s ID uppercase_tet a uloží ji do proměnné uppercase_tet.
  • var remove_border_alef = $('#remove_alef').prop('checked');: Získá hodnotu vlastnosti checked prvku s ID remove_alef a uloží ji do proměnné remove_border_alef.
  • var uppercase = $('#uppercase').prop('checked');: Získá hodnotu vlastnosti checked prvku s ID uppercase a uloží ji do proměnné uppercase.
  • var comments = $('#comments').prop('checked');: Získá hodnotu vlastnosti checked prvku s ID comments a uloží ji do proměnné comments.
  • var alphanum = $('#alphanum').prop('checked');: Získá hodnotu vlastnosti checked prvku s ID alphanum a uloží ji do proměnné alphanum.
  • var wawholem = 0;: Inicializuje proměnnou wawholem s hodnotou 0.
  • Podmínky pro nastavení hodnoty proměnné wawholem na základě stavu příslušných prvků s ID wawholem2 a wawholem3.
  • var lang = 0;: Inicializuje proměnnou lang s hodnotou 0.
  • Podmínky pro nastavení hodnoty proměnné lang na základě stavu příslušných prvků s ID lang2, lang3, lang4, lang5 a lang6.
  • var transText = transliterate(hebText, { 'isSeqeunced': true, 'qametsQatan': qametsQatan, 'lang': lang, 'uppercase_tet': uppercase_tet, 'remove_border_alef': remove_border_alef, 'wawholem': wawholem, 'uppercase': uppercase, 'comments': comments, 'alphanum': alphanum });: Volá funkci transliterate s předanými parametry a uloží její návratovou hodnotu do proměnné transText.
  • $('#output').val(transText);: Nastavuje hodnotu výstupního pole s ID output na hodnotu transText.

Celý kód je svázán s událostí kliknutí na prvek s ID input_button a provádí transliteraci textu na základě zadaných voleb. Výsledný text je pak zobrazen ve výstupním poli s ID output.

hebChars

hebChars je objekt (mapa) obsahující mapování hebrejských znaků na odpovídající latinské znaky. Toto mapování slouží jako základní sada pravidel pro nahrazení hebrejských znaků odpovídajícími latinskými znaky při transliteraci hebrejského textu.

Kód exportuje objekt obsahující mapování hebrejských znaků na odpovídající latinské znaky.

  • Objekt obsahuje klíče a hodnoty, kde klíče jsou hebrejské znaky a hodnoty jsou odpovídající latinské znaky.
  • Například 'ב':'b' znamená, že hebrejský znak bet (ב) je nahrazen latinským znakem b.
  • Mapování obsahuje jak jednotlivé znaky, tak i ligatury a kombinace znaků, které se v hebrejštině používají.
  • V kódu jsou také komentáře s popisem jednotlivých hebrejských znaků.

Uvnitř funkce titForTat se pracuje s mapou hebChars takto:

titForTat: text => [...text].map(char => char in hebChars ? hebChars[char] : char) .reduce((a, c) => a + c) })

Nahrazuje hebrejské znaky v textu odpovídajícími latinskými znaky na základě mapování definovaného v objektu hebChars.

  1. text => [...text] převede vstupní text na pole jednotlivých znaků. Tím se text rozdělí na samostatné znaky, které mohou být zpracovány nezávisle.

  2. .map(char => char in hebChars ? hebChars[char] : char) prochází každý znak v poli a používá ternární operátor pro zjištění, zda je znak obsažen v objektu hebChars. Pokud je znak v mapování, použije se odpovídající latinský znak z hebChars, jinak se ponechá původní znak.

  3. .reduce((a, c) => a + c) sloučí všechny znaky zpět do jednoho řetězce. Tím se získá konečný výsledek nahrazeného textu.

 

testEach() - transformace

Funkce testEach hraje klíčovou roli, protože slouží k testování a transformaci různých sekvencí znaků v poli array. Jejím úkolem je iterovat přes všechny prvky pole a aplikovat na ně testy a transformace.

Funkce testEach přijímá několik parametrů, včetně pole array, ve kterém jsou uloženy prvky, které mají být testovány a transformovány. Další parametry jsou v podobě funkcí, které provádějí konkrétní testy a transformace na jednotlivých prvcích.

Ve funkci testEach se postupně aplikují různé testy a transformace na jednotlivé prvky pole array. Jednou z funkcí, kterou funkce testEach využívá, je changeElementSplit() (alias changeElementSubstr()), která přijímá vstupní řetězec, rozdělovač a spojovací řetězec. Tato funkce provede transformaci prvku pole array pomocí rozdělení vstupního řetězce na části na základě rozdělovače a následném spojení těchto částí s použitím spojovacího řetězce.

Celkově řečeno, funkce testEach je odpovědná za provedení různých testů a transformací na prvky pole array, včetně použití funkce changeElementSplit(), aby dosáhla požadovaných změn v jednotlivých prvcích pole.

Funkce testEach() je definována jako anonymní funkce, která bere dva parametry: array a options. Tato funkce používá několik podfunkcí, které jsou importovány ze souboru s cestou __webpack_require__(7).

V této funkci je provedeno několik testů a transformací na každý prvek pole array. Zde je stručný přehled těchto testů a transformací:

  1. Pro každý prvek element v poli array:

    • Pokud element obsahuje znak 'p', je provedena transformace pomocí funkce changeElementSplit(), která nahrazuje 'p' za 'f'.
    • Pokud element obsahuje znak 'k', je provedena transformace pomocí funkce changeElementSplit(), která nahrazuje 'k' za '[kh]'.
    • Pokud je zapnutý přepínač comments nebo alphanum a element začíná '{', je přerušena iterace a přejde se na další prvek.
  2. Testy na jednotlivé znaky:

    • Testuje se výskyt znaku '8' (shin-dot), a pokud je nalezen, je provedena transformace pomocí funkce changeElementSplit(), která odstraní tento znak.
    • Testuje se výskyt znaku '7' (sin-dot), a pokud je nalezen, je provedena transformace pomocí funkce changeElementSplit(), která tento znak nahradí za 's'.
    • Testuje se výskyt sekvencí 'iy' následovaných některými znaky, a pokud je nalezena shoda, je provedena transformace pomocí funkce changeElementSplit(), která 'iy' nahradí za 'í'.
    • Testuje se výskyt sekvencí 'éy' následovaných některými znaky, a pokud je nalezena shoda, je provedena transformace pomocí funkce changeElementSplit(), která 'éy' nahradí za 'é'.
    • Testuje se výskyt sekvencí 'ey' následovaných některými znaky, a pokud je nalezena shoda, je provedena transformace pomocí funkce changeElementSplit(), která 'ey' nahradí za 'é'.
    • Testuje se výskyt sekvencí 'wó' následovaných některými znaky, a pokud je nalezena shoda, je provedena transformace pomocí funkce changeElementSplit(), která 'wó' nahradí za 'ó'. Dále se testuje, zda je tento znak součástí slova, které končí na 'w', a pokud je nalezena shoda, je provedena další transformace pomocí changeElementSplit(), která 'wó' nahradí za 'ô'.
    • Testuje se výskyt sekvencí 'ów' (nebo 'ôw') následovaných některými znaky, a pokud je nalezena shoda, je provedena transformace pomocí funkce changeElementSplit(), která 'ów' (nebo 'ôw') nahradí za 'ů'.

     

    1. Další testy a transformace:

      • Testuje se výskyt sekvencí 'sh' následovaných některými znaky, a pokud je nalezena shoda, je provedena transformace pomocí funkce changeElementSplit(), která 'sh' nahradí za 'š'.
      • Testuje se výskyt sekvencí 'ch' následovaných některými znaky, a pokud je nalezena shoda, je provedena transformace pomocí funkce changeElementSplit(), která 'ch' nahradí za 'č'.
      • Testuje se výskyt sekvencí 'gh' následovaných některými znaky, a pokud je nalezena shoda, je provedena transformace pomocí funkce changeElementSplit(), která 'gh' nahradí za 'ǧ'.
      • Testuje se výskyt sekvencí 'ng' následovaných některými znaky, a pokud je nalezena shoda, je provedena transformace pomocí funkce changeElementSplit(), která 'ng' nahradí za 'ŋ'.
      • Testuje se výskyt sekvencí 'th' následovaných některými znaky, a pokud je nalezena shoda, je provedena transformace pomocí funkce changeElementSplit(), která 'th' nahradí za 'θ'.
      • Testuje se výskyt sekvencí 'ph' následovaných některými znaky, a pokud je nalezena shoda, je provedena transformace pomocí funkce changeElementSplit(), která 'ph' nahradí za 'φ'.
    2. Testy a transformace pro čísla:

      • Pokud je zapnutý přepínač comments nebo alphanum a element začíná '{', je přerušena iterace a přejde se na další prvek.
      • Testuje se výskyt znaků '0' až '9' a pokud je nějaké číslo nalezeno, je provedena transformace pomocí funkce changeElementSplit(), která odstraní tato čísla.

    Na konci funkce je vráceno pole array, které prošlo všemi testy a transformacemi.

changeElementSplit()

Funkce changeElementSplit() (alias changeElementSubstr()) v rámci celého programu slouží k transformaci vstupního řetězce. Tato funkce umožňuje rozdělit řetězec na části na základě specifikovaného rozdělovače a následně tyto části spojit pomocí spojovacího řetězce.

Pomocí funkce changeElementSplit() je možné provádět různé úpravy řetězců, například nahrazení určitého podřetězce jiným podřetězcem nebo rozdělení řetězce na části a jejich přeformátování. Tímto způsobem může být dosaženo požadovaného výsledku transformace řetězce.

Funkce changeElementSplit() (alias changeElementSubstr()) je součástí objektu, který je exportován modulem. Tato funkce slouží k transformaci vstupního řetězce input pomocí rozdělení řetězce na části na základě specifikovaného rozdělovače (split) a následném spojení těchto částí s použitím spojovacího řetězce (join).

Funkce changeElementSplit() má následující parametry:

  • input: Řetězec, který má být transformován.
  • split: Řetězec, který slouží jako rozdělovač. Řetězec input je rozdělen na části na místech, kde se vyskytuje tento rozdělovač.
  • join: Řetězec, který slouží jako spojovací prvek. Rozdělené části řetězce input jsou spojeny za použití tohoto spojovacího řetězce.

Funkce changeElementSplit() používá metody split() a join() nad řetězcem input, které jsou vestavěné funkcionality v jazyce JavaScript. Metoda split() rozdělí řetězec na části na základě zadaného rozdělovače a vrátí pole obsahující tyto části. Metoda join() spojí prvky pole do jednoho řetězce, přičemž odděluje jednotlivé prvky spojovacím řetězcem.

Je také důležité zmínit, že funkce changeElementSplit() je také dostupná pod alternativním názvem changeElementSubstr(), což je zřejmě záměrné, aby byla zajištěna kompatibilita s jiným kódem nebo pro jednodušší použití v různých scénářích.

Remove()

Kód, který jste poskytl (kód č. 8), se zabývá odstraněním kantilace. Funkce remove() je exportována a slouží k odstranění kantilačních značek z textu.

Funkce remove() přijímá dva parametry: text a volitelný objekt options. text je vstupní text, ze kterého se mají odstranit kantilační značky. options je objekt s možnostmi, přičemž jedna z možností je removeVowels, která určuje, zda se mají odstranit také samohlásky spolu s kantilačními značkami (výchozí hodnota je false).

Samotná funkce provádí náhradu kantilačních značek v textu pomocí regulárního výrazu a funkce zvané replace(). V závislosti na hodnotě removeVowels jsou použity různé mapovací tabulky (hebCharsRC nebo hebCharsRV), které obsahují přepisy znaků s kantilačními značkami. Tímto způsobem jsou kantilační značky nahrazeny odpovídajícími znaky bez kantilace.

Celkově lze tedy říci, že role funkce remove() je odstranit kantilační značky z textu a případně i samohlásky, pokud je taková možnost aktivována volbou removeVowels.

hebCharsRC()

Funkce hebCharsRC() je modul, který exportuje objekt obsahující mapování mezi kantilačními znaky a jejich odpovídajícími znaky bez kantilace. Tento objekt je použit v rámci funkce remove(), která je definována v kódu č. 8.

V rámci funkce remove() se volá metoda replace() na vstupním textu. Regulární výraz /[\u0591-\u05F4, \uFB1D-\uFB4F]/g vyhledává všechny kantilační znaky ve vstupním textu. Pokud volba options.removeVowels není nastavena na true, používá se objekt hebCharsRC (který je vytvořený funkcí hebCharsRC()) k nahrazení těchto znaků odpovídajícími znaky bez kantilace. Pokud je volba options.removeVowels nastavena na true, používá se objekt hebCharsRV (který nebyl v kódu uveden) k nahrazení kantilačních znaků a také samotných samohlásek.

Takže funkce hebCharsRC() poskytuje mapování mezi kantilačními znaky a odpovídajícími znaky bez kantilace, které je používáno ve funkci remove() k odstranění kantilace z textu.

úterý 30. května 2023

Skript na zálohování práv

Skript umožňuje zazálohování práv i obnovu na souborech ve složce ve které se nacházím a mělo by to fungovat i na vnořené adresáře a soubory, ale obnovu práv jsem zatím nezkoušel. Záloha je funkční. Toto se hodí pro případ, že kopírujete soubory z ext3/ext4 na NTFS.

 

 #!/bin/bash

backup_file="backup_práva.txt"

if [ "$1" = "zálohuj" ]; then
  # Zálohování práv do souboru
  find . -printf "%p\t%u\t%g\t%m\n" > "$backup_file"
  echo "Práva byla zálohována do souboru $backup_file."
elif [ "$1" = "obnov" ]; then
  # Obnovení práv ze souboru
  if [ -f "$backup_file" ]; then
    while IFS=$'\t' read -r -a line; do
      file="${line[0]}"
      user="${line[1]}"
      group="${line[2]}"
      permissions="${line[3]}"
      
      if [ -e "$file" ]; then
        chown "$user:$group" "$file"
        chmod "$permissions" "$file"
        echo "Obnoveny práva pro soubor $file"
      else
        echo "Soubor $file již neexistuje, přeskočeno."
      fi
    done < "$backup_file"
    
    echo "Práva byla obnovena ze souboru $backup_file."
  else
    echo "Soubor s zálohou práv ($backup_file) neexistuje."
    exit 1
  fi
else
  echo "Neplatný argument. Použijte 'zálohuj' nebo 'obnov'."
  exit 1
fi

Maskování hlasu v Audacity (robotický hlas, prskání a přebuzení) a formant-preserving morphing

Pozor! Nutno aplikovat na stereo stopu, kde jsou dvě identické stopy   Nejprve Modulace hlasu - Efekt: Tremolo 40% per 40 Hz Potom Modulace...

Štítky

.profile adm administrace Adobe Aho-Corasick AI akcelerace alfa transparence analýza AND any aplikace apt ar archiv asociativní pole atomicity audacity audio autentifikace awk balíčkovací systém bash beacon beacon_hint benchmark Bézierovy křivky bezpečnost biblehub BJT blogger boolean brainstorming BRE buffer buffering bufferované čtení Cache-Conrol Cloudflare code Collector Cut-off ColorManager colorpicker common compare config cookies CPU CPU pipe crop css CSS3 curl current code cut čas data loss data lost data transfer reliability datasheet datetime.strptime deb deb-systemd-helper debian debián depricated development dict dioda diody disonance dpkg dpkg -S dpkg-deb drivers EBO efekt Emitter Cut-off Current eps ETag exclude exec Expires extrakce jediného extrakce názvu balíčku souboru extrakce obrázků extrakce souboru .deb fflock fflush ffmpeg FIFO file read file write file_get_contents file_get_contents/file_put_contents file_put_contents filter find first_install.sh flock Fly-back dioda font-face fóra formant-preserving morphing fotorezistor fread functions funkce fwrite gate gate drive GDVfs gedit gedit-common geolokace getdata Ghostscript GIO glib gnome gnome settings GNU Privacy Guard gnupg gpg gradient-background grafika grep grep -v groupadd grub grub update gs gsettings gtk gtk.css gtk+ hebrejština history hlavičky HS html html 5 https hudba hunspell charakterizace chatGPT chroot chyba ICES IGBT Image img sizes img srcset impedance implementace imshow inference inkscape inrush current install jalový výkon javascript javescript jednocení seznamů js jsonData kapacita součástek koeficient zesílení komponenty xFce komunikace se serverem koncept konfigurace kontejner korekce barev Krita KSF kvantifikátor Last-Modified lazy caching led LEFT JOIN librosa ligatury light-locker lightdm linux list log maják manuál map mapování maskování maskování hlasu maskování služby masky matplotlib Max-Age measure memory měření meta MFCC MFCC koeficienty mint Mint 21.3 Mint xFce míry modules moralizace morphologie MOSFET mount moviepy mysql náběhový proud napěťová ochrana nastavení šablony návod nel Network Error Logging NLP normalizace šedi po resize not Notifications NTFS nth-child oblasti oblékání ochrana okruhy přátel OpenVINO IR formát oprava oprava balíčku optočlen org.gnome.desktop.screensaver org.gnome.nm-applet ořezové masky OSHB otázky otázky_jazyky otázky_moralismu_řešení overlay ovladače panely parsování path pdf personifikace photorec php php 4 php 5 php 6 php 7 php 8 phpbb phpBB3 PipeWire pitch plus PN přechody pnp pole Policykit postscript práva profilování program prune průraz přeinstalování přepěťová ochrana přepolování příkazy připojení k síti připojení k wifi pseudokódd pstoedit PulseAudio PWM regulátory pydub python python3 pytorch ramdisk RBE RDSon read reaktance rectifier regex regulace vstupního napětí reinstall relyability remount replace restore reverzní geolokace RIGHT JOIN rm robotický hlas role rozvržení disků pro OS linux a data databází řešení samba scan scroll sdílení sdílení souborů Sec-Fetch-Dest Sec-Fetch-Mode Sec-Fetch-Site Sec-Fetch-User Secure Shell sed Set Cookie show-manual-login show-remote-login shunt schemas schémata schottka signal morphing skript skupiny sledovanost sloupce slučování seznamů služby small song sort soubory soundfile spínané zdroje spínání splines split spojování správa diskových zařízení SQL ssh stabilizace napětí stahování stíny stream string strojové učení stropové učení supplicant svg syntax systemctl systemd-logind T5 tabulka tabulky Tangentové úsečky tar témata tepelná ztráta terminologie test text-shadow themes thermal runaway time timestamp tkinter tr transformace transistor transition transpose tranzistor tranzistory tuple tvorba otázek TVS ubuntu účiník udiskd udisks unconfined underrun unity-greeter update usermod uživatelé va charakteristika vala vektorová grafika Vgs video vocoder Vth výkon vynechání adresářů vývoj while wpa wpa_supplicant wrapovací funkce x xandr xapp-watt xargs -I xed xed-common xfdesktop xml xmp XOR Xorg Xorg Thumbnails xrandr závislosti zdánlivý výkon zdroj zenerka zenerovo napětí zip zip archiv zkratky zpomalení zpracování textu zrychlení zvuk Žalmy