3 votos

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

Tomemos como ejemplo los primeros versos del Génesis, en hebreo:

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

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

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

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

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

(Que (פ) por alguna razón no está formateando correctamente en el blockquote, pero lo hace en mi archivo de texto).

Ahora, me gustaría despojar a este texto de todos los caracteres excepto el alfabeto hebreo estándar de 27 letras אבגדהוזחטיכךלמםנןסעפףצץקרשת más los saltos de línea (que el editor de script interpreta automáticamente como \n ) y los saltos de línea y de párrafo ( : y (פ) o (ס) ). Observará que en varias líneas hay guiones, que deben sustituirse por un espacio. Algunas líneas también contienen | - deben ser sustituidos por un único . Cuando esté hecho, debería tener el aspecto siguiente:

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

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

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

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

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

Al principio intenté algo sencillo: poner el alfabeto hebreo más , ( y ) a una lista, establezca x a la longitud de la cadena introducida, y luego hacer una repetición para cada carácter de la cadena: si está en la lista, entonces añadirlo a la salida; si es un - , añadir a la salida; si se trata de un \ y el siguiente es un n , añadir \n a la salida; y si hay dos espacios seguidos, se elimina el segundo.

Registré la salida y obtuve un galimatías:

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

que parece ser cada letra del pasaje sin vocal, duplicada en caso de que la(s) siguiente(s) la(s) tenga(n). (Mi error en las repeticiones - escribí mal el bucle de repetición.) Pero que se salte las consonantes que también tienen vocales es lo que me dejó pensando.

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, el editor de script no lo ve así, y ve בְּ y ב como la misma letra. Y sin embargo, al compararlo con mi lista, no reconoce el carácter y lo omite.

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

2voto

Baczek Puntos 150

ASCII number está obsoleto y no funciona correctamente con texto unicode, utilice 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 hacer esto en puro AppleScript.


Pero, puede utilizar un 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

He aquí una breve explicación del perl script

  • el -CSD opción : la salida y el error estarán en UTF-8, la entrada se supone que está en UTF-8
  • s~\\p{NonspacingMark}~~og : Eliminar las marcas no espaciadoras
  • s~־|׀~ ~g : Sustituir todo ־ y ׀ por un espacio
  • s~ +~ ~g : Sustituir varios espacios en una fila por un espacio

Si su AppleScript lee el texto de un archivo, puede utilizar 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 un droplet, el script necesita un on open handler así:

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 quieres hacer una edición in situ (el perl script necesita el -i opción + '.some name extension' ):

Esto creará una copia de seguridad de cada archivo (añade " .bak " después del 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 quiere una copia de seguridad de cada archivo (el perl script necesita el -i opción + '' ), así:

-- ***  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

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X