¿Cómo eliminar un texto hebreo de las vocales y la puntuación en AppleScript?

3

Tome los primeros versos de Génesis, en hebreo, por ejemplo:

  

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

     

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

     

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

     

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

     

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

(Por alguna razón, ese (פ) no se está formateando correctamente en el blockquote, pero sí en mi archivo de texto)

Ahora, me gustaría quitar este texto de todos los caracteres excepto el alfabeto hebreo estándar de 27 letras אבגדהוזחטיכךלמםנןסעפףצץקרשת , más saltos de línea (que el Editor de secuencias de comandos analiza automáticamente como \n ) y saltos de línea y párrafo ( : y (פ) o (ס) ). Notará en varias líneas que hay guiones, que deben reemplazarse con un espacio. Algunas líneas también contienen | , que deben reemplazarse con un solo . Cuando haya terminado, debería verse como:

  

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

     

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

     

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

     

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

     

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

Al principio intenté algo simple: establecer el alfabeto hebreo más , ( y ) en una lista, establecer x en la longitud de la cadena ingresada, luego hacer una repetición para cada carácter de la cadena: si está en la lista, añádala a la salida; si es un - , agregue a la salida; si es un \ y el siguiente es un n , agregue \n a la salida; y si hay dos espacios en una fila, elimine el segundo.

Registré la salida y obtuve algo de galimatías:

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

que parece ser cada letra en el pasaje sin una vocal, duplicada en el caso de que las siguientes letras lo hagan. (Mi error en las repeticiones: escribí mal el bucle de repetición). Pero el hecho de que salte sobre las consonantes que también tienen vocales es lo que me hizo preguntarme.

Así que hice una prueba:

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

Aunque en el editor de texto, las vocales y similares son caracteres separados superpuestos a los anteriores, Script Editor no lo ve de esa manera, y ve בְּ y ב como la misma letra. Y, sin embargo, al compararlo con mi lista, no reconoce al personaje y lo omite.

Entonces, ¿cómo puedo eliminar las vocales y similares de las letras sin hacer un bucle if para cualquier posible combinación de letras y vocales?

    
pregunta DonielF 04.08.2017 - 03:29

1 respuesta

2

ASCII number está en desuso y no funciona correctamente con texto Unicode, use 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*)

Por lo tanto, no sé cómo hacerlo en AppleScript puro.

Pero, puedes usar un comando perl en un 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

Aquí hay una breve explicación del script perl

  • la opción -CSD : la salida y el error estarán en UTF-8, la se asume que la entrada está en UTF-8
  • s~\p{NonspacingMark}~~og : eliminar marcas sin espacios
  • s~־|׀~ ~g : Reemplace todos los ־ y ׀ por un espacio
  • s~ +~ ~g : Reemplace los espacios múltiples en una fila por un espacio

Si tu AppleScript lee el texto de un archivo, puedes usar perl para leer el archivo:

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

La codificación del archivo debe ser utf8.

Otra solución es utilizar un 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

Según el comentario:

Para una gota, la secuencia de comandos necesita un on open handler , como este:

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

Si desea realizar una edición en contexto (el script perl necesita la opción -i + '.some name extension' ):

Esto creará una copia de seguridad de cada archivo (agregará " .bak " después de la    nombre)

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

Si no desea una copia de seguridad de cada archivo (la secuencia de comandos perl necesita la opción -i + '' ), de esta manera:

-- ***  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
    
respondido por el jackjr300 04.08.2017 - 21:33

Lea otras preguntas en las etiquetas