Come spogliare un testo ebraico di vocali e punteggiatura in AppleScript?

3

Prendi i primi versetti di Genesi, in ebraico, ad esempio:

בְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ׃

וְהָאָ֗רֶץ הָיְתָ֥ה תֹ֙הוּ֙ וָבֹ֔הוּ וְחֹ֖שֶׁךְ עַל־פְּנֵ֣י תְה֑וֹם וְר֣וּחַ אֱלֹהִ֔ים מְרַחֶ֖פֶת עַל־פְּנֵ֥י הַמָּֽיִם׃

וַיֹּ֥אמֶר אֱלֹהִ֖ים יְהִ֣י א֑וֹר וַֽיְהִי־אֽוֹר׃

וַיַּ֧רְא אֱלֹהִ֛ים אֶת־הָא֖וֹר כִּי־ט֑וֹב וַיַּבְדֵּ֣ל אֱלֹהִ֔ים בֵּ֥ין הָא֖וֹר וּבֵ֥ין הַחֹֽשֶׁךְ׃

וַיִּקְרָ֨א אֱלֹהִ֤ים ׀ לָאוֹר֙ י֔וֹם וְלַחֹ֖שֶׁךְ קָ֣רָא לָ֑יְלָה וַֽיְהִי־עֶ֥רֶב וַֽיְהִי־בֹ֖קֶר י֥וֹם אֶחָֽד׃ (פ)

(That (פ) per qualche motivo non è formattato correttamente nel blockquote, ma lo fa nel mio file di testo.)

Ora vorrei spogliare questo testo di tutti i caratteri tranne l'alfabeto ebraico standard di 27 lettere אבגדהוזחטיכךלמםנןסעפףצץקרשת , più le interruzioni di riga (che Script Editor analizza automaticamente come \n ) e le interruzioni di riga e paragrafo ( : e (פ) o (ס) ). Noterai su più righe che ci sono trattini - quelli dovrebbero essere sostituiti con uno spazio. Alcune linee contengono anche | - quelle dovrebbero essere sostituite con un singolo . Al termine, dovrebbe essere simile a:

בראשית ברא אלהים את השמים ואת הארץ׃

והארץ היתה תהו ובהו וחשך על פני תהום ורוח אלהים מרחפת על פני המים׃

ויאמר אלהים יהי אור ויהי אור׃

וירא אלהים את האור כי טוב ויבדל אלהים בין האור ובין החשך׃

ויקרא אלהים לאור יום ולחשך קרא לילה ויהי ערב ויהי בקר יום אחד׃ (פ)

Ho provato qualcosa di semplice all'inizio - imposta l'alfabeto ebraico più , ( e ) a un elenco, imposta x sulla lunghezza della stringa immessa, quindi esegui una ripetizione per ogni carattere della stringa: se è presente nell'elenco, quindi aggiungerla all'output; se è un - , aggiungi all'output; se è un \ e il prossimo è un n , aggiungi \n all'output; e se ci sono due spazi in una riga, cancella il secondo.

Ho registrato l'output e ottenuto alcune parole senza senso:

(*אאית   א    ים  ת     ם   ת    ץץץץץץץץ    ה  הה   הה       ללללי    ם         ים     ת  ללללי    םםםםםאאר    ים   י   ר    ייייררררררא    ים  תתתתתר  ייייב     ל    ים  ין    ר   ין           א    ים    אאא   ם         א    ה    ייייב    ייייר   ם   דד (פ)*)

che sembra essere ogni lettera nel passaggio senza una vocale, duplicata nel caso in cui la seguente lettera (s) fa. (Il mio errore nelle ripetizioni - ha scritto il ciclo ripetuto male.) Ma salta le consonanti che hanno anche vocali è ciò che mi ha lasciato a chiedermi.

Quindi ho fatto un test:

set charNum to ASCII number "בְּ"
log charNum
set charNum to ASCII number "ב"
log charNum
-->result: (*63*) (*63*)

Sebbene nell'editor di testo, le vocali e simili siano caratteri separati sovrapposti a quelli precedenti, Script Editor non la vede in questo modo e vede בְּ e ב come la stessa lettera. Eppure, confrontandolo con la mia lista, non riconosce il personaggio e lo salta.

Quindi, come posso togliere le vocali e le espressioni simili dalle lettere senza fare un ciclo if per qualsiasi combinazione di lettere e vocali possibile?

    
posta DonielF 04.08.2017 - 03:29
fonte

1 risposta

2

ASCII number è deprecato e non funziona correttamente con testo unicode, usa id of someCharacter :

set charNum to id of "בְּ" -- this return id of 3 characters because "בְּ" is a composed character
log charNum
set charNum to id of "ב"
log charNum
-->result: 
(*1489, 1456, 1468*)
(*1489*)

Quindi, non so come farlo in puro AppleScript.

Tuttavia, puoi utilizzare un comando perl in do shell script :

-- The text look not good in this code block, but it will be correct after the compilation of the script
set theString to "בְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ׃

וְהָאָ֗רֶץ הָיְתָ֥ה תֹ֙הוּ֙ וָבֹ֔הוּ וְחֹ֖שֶׁךְ עַל־פְּנֵ֣י תְה֑וֹם וְר֣וּחַ אֱלֹהִ֔ים מְרַחֶ֖פֶת עַל־פְּנֵ֥י הַמָּֽיִם׃

וַיֹּ֥אמֶר אֱלֹהִ֖ים יְהִ֣י א֑וֹר וַֽיְהִי־אֽוֹר׃

וַיַּ֧רְא אֱלֹהִ֛ים אֶת־הָא֖וֹר כִּי־ט֑וֹב וַיַּבְדֵּ֣ל אֱלֹהִ֔ים בֵּ֥ין הָא֖וֹר וּבֵ֥ין הַחֹֽשֶׁךְ׃

וַיִּקְרָ֨א אֱלֹהִ֤ים ׀ לָאוֹר֙ י֔וֹם וְלַחֹ֖שֶׁךְ קָ֣רָא לָ֑יְלָה וַֽיְהִי־עֶ֥רֶב וַֽיְהִי־בֹ֖קֶר י֥וֹם אֶחָֽד׃ (פ)"


return do shell script "perl -CSD -pe  'use utf8; s~\p{NonspacingMark}~~og; s~־|׀~ ~g;  s~ +~ ~g;' <<< " & quoted form of theString

Ecco una breve spiegazione dello script perl

  • l'opzione -CSD : l'output e l'errore saranno in UTF-8, il si presume che l'input sia in UTF-8
  • s~\p{NonspacingMark}~~og : rimuovi i segni di spaziatura
  • s~־|׀~ ~g : sostituisci tutto ־ e ׀ con uno spazio
  • s~ +~ ~g : sostituisci più spazi in una riga di uno spazio

Se AppleScript legge il testo da un file, puoi utilizzare perl per leggere il file:

do shell script "perl -CSD -pe  'use utf8; s~\p{NonspacingMark}~~og; s~־|׀~ ~g;  s~ +~ ~g;' < " & quoted form of posix path of pathOfTheTextFile

La codifica del file deve essere utf8.

Un'altra soluzione è utilizzare Cocoa-AppleScript :

        use framework "Foundation"
        use scripting additions
        -- The text look not good in this code block, but it will be correct after the compilation of the script
        set theString to "בְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ׃

וְהָאָ֗רֶץ הָיְתָ֥ה תֹ֙הוּ֙ וָבֹ֔הוּ וְחֹ֖שֶׁךְ עַל־פְּנֵ֣י תְה֑וֹם וְר֣וּחַ אֱלֹהִ֔ים מְרַחֶ֖פֶת עַל־פְּנֵ֥י הַמָּֽיִם׃

וַיֹּ֥אמֶר אֱלֹהִ֖ים יְהִ֣י א֑וֹר וַֽיְהִי־אֽוֹר׃

וַיַּ֧רְא אֱלֹהִ֛ים אֶת־הָא֖וֹר כִּי־ט֑וֹב וַיַּבְדֵּ֣ל אֱלֹהִ֔ים בֵּ֥ין הָא֖וֹר וּבֵ֥ין הַחֹֽשֶׁךְ׃

וַיִּקְרָ֨א אֱלֹהִ֤ים ׀ לָאוֹר֙ י֔וֹם וְלַחֹ֖שֶׁךְ קָ֣רָא לָ֑יְלָה וַֽיְהִי־עֶ֥רֶב וַֽיְהִי־בֹ֖קֶר י֥וֹם אֶחָֽד׃ (פ)"

        return stripString(theString)

        on stripString(t)
            set sourceString to current application's NSMutableString's stringWithString:t
            set myOpt to current application's NSRegularExpressionSearch
            set theSuccess to sourceString's applyTransform:(current application's NSStringTransformStripCombiningMarks) |reverse|:false range:(current application's NSMakeRange(0, (sourceString's |length|))) updatedRange:(missing value)
            if theSuccess then
                -- *** Replace all "־" and "׀" by a space, each character must be separated by a vertical bar character, e.g. "a|d|z"
                sourceString's replaceOccurrencesOfString:"־|׀" withString:" " options:myOpt range:(current application's NSMakeRange(0, (sourceString's |length|)))

                -- **** Replace multiple spaces in a row by one space
                sourceString's replaceOccurrencesOfString:" +" withString:" " options:myOpt range:(current application's NSMakeRange(0, (sourceString's |length|)))
                return sourceString as string -- convert the NSString object to an AppleScript's string
            end if
            return "" -- else, the transform was not applied
        end stripString

Secondo il commento:

Per un droplet, lo script richiede un on open handler , come questo:

on open theseFiles
    repeat with f in theseFiles
        set cleanText to do shell script "perl -CSD -pe  'use utf8; s~\p{NonspacingMark}~~og; s~־|׀~ ~g;  s~ +~ ~g;' " & quoted form of POSIX path of f
        -- do something with that cleanText
    end repeat
end open

Se vuoi fare una modifica sul posto (lo script perl richiede l'opzione -i + '.some name extension' ):

Questo creerà il backup di ogni file (aggiunge " .bak " dopo il    nome)

on open theseFiles
    repeat with f in theseFiles -- ***  create a backup and edit the file in-place ***
        do shell script "perl -i'.bak' -CSD -pe  'use utf8; s~\p{NonspacingMark}~~og; s~־|׀~ ~g;  s~ +~ ~g;' " & quoted form of POSIX path of f
    end repeat
end open

Se non vuoi un backup di ogni file (lo script perl ha bisogno dell'opzione -i + '' ), in questo modo:

-- ***  edit the file in-place without backup***
do shell script "perl -i'' -CSD -pe  'use utf8; s~\p{NonspacingMark}~~og; s~־|׀~ ~g;  s~ +~ ~g;' " & quoted form of POSIX path of f
    
risposta data 04.08.2017 - 21:33
fonte

Leggi altre domande sui tag