Detectar glifos faltantes en el texto

10

He escrito un indicador de aplicación Python3 que llama fortuney captura la salida para mostrarla en la notificación en pantalla.

Algunas fortunas contienen cuadrados con un número hexadecimal cuando el glifo correspondiente no existe en la fuente actual. Cada cuadrado es la representación del punto de código hexadecimal Unicode para el glifo faltante.

Quiero eliminar el texto hexadecimal antes de mostrarlo al usuario. Esperaba encontrar alguna API de Python que me permitiera inspeccionar texto, carácter por carácter, para determinar algo similar char.isValidCodePoint()o similar, pero no puedo encontrarlo como tal.

Encontré una posible solución que quería investigar aquí, pero después de instalar a fonttoolstravés del terminal, mi programa Python no pudo importar fonttools/fontTools.

¿Alguna idea, ya sea utilizando la API de Python o llamando a una terminal?

Actualización n. ° 1: desde entonces me di cuenta de que el fonttoolscódigo de muestra del enlace anterior no funcionará para mí, ya que es Python2. Supongo que si de fonttoolsalguna manera pudiera usarse, podría invocar un intérprete de Python2 desde mi script Python3.

Actualización n. ° 2: Después de mucha lectura (ver referencias a continuación), he encontrado desde entonces, fc-matchpero no siempre puede identificar de forma única la fuente en uso. Obtengo la fuente actual en Python:

from gi.repository import Gio
fontName = Gio.Settings( "org.gnome.desktop.interface" ).get_string( "font-name" )

resultando en Ubuntu 11. Al pasar este resultado pango-viewjunto con el carácter hexadecimal, obtengo una lista de fuentes incluidas Ubuntu. A mi parecer, si el glifo NO fue representado por la fuente, ¡la fuente no debería aparecer en el resultado de pango-view!

Referencias

Bernmeister
fuente

Respuestas:

0

Este es un enfoque diferente del que usaba con esto, pero quizás podría usar los métodos str.replace()o de Python re.sub()para analizar las cadenas hexadecimales de su cuerpo de texto. es decir:

Si el hex es predecible:

originalText = "\xc3\xa5Test"
filteredText = originalText.replace("\xc3\xa5", "")

O si necesita unir caracteres hexadecimales con una expresión regular:

import re

originalText = "\xc3\xa5Test"
filteredText = re.sub(r'[^\x00-\x7f]', r'', originalText)

Más buena discusión de esta estrategia

Christopher Hunter
fuente
Está bien dar opciones alternativas, pero creo que podría mejorar mucho su respuesta 1) agregando un código de muestra breve 2) describiendo posibles PRO y CON a partir de la solución original post propuesta y la suya.
lpanebr
1
No estoy tratando de criticar la solución original, así que no sé si una comparación PRO / CON será útil aquí. Sin embargo, he agregado ejemplos de código para mis sugerencias a la respuesta.
Christopher Hunter
@ChristopherHunter: El texto que proviene de la fortuna es texto sin formato y solo cuando se representa ese texto aparece el hexadecimal (y eso es demasiado tarde para que pueda atraparlo y procesarlo como usted sugiere).
Bernmeister el
0

Motor de conformación Unicode

Use un motor de modelado Unicode como Harfbuzz para detectar el glifo faltante. Aquí hay un ejemplo de trabajo:

from pyharfbuzz import shape
f = "/usr/local/lib/python3.6/site-packages/werkzeug/debug/shared/ubuntu.ttf"
t = "®"
s = shape(f, t)
print(s[1]['glyph_name'])
t = "რ"
s = shape(f, t)
print(s[1]['glyph_name'])

Salida

registered
.notdef

Aquí la salida en IDLE3 mientras se verifica:

>>> t = "®"
>>> s = shape(f, t)
>>> s
[{'cluster': 0, 'glyph_name': 'registered', 'x_advance': 29.453125, 'y_advance': 0.0, 'x_offset': 0.0, 'y_offset': 0.0}]
>>> t = "რ"
>>> s = shape(f, t)
>>> s
[{'cluster': 0, 'glyph_name': '.notdef', 'x_advance': 36.0, 'y_advance': 0.0, 'x_offset': 0.0, 'y_offset': 0.0}]

Verifique la ruta de fuente correcta, acabo de elegir la primera que vi en mi máquina actual.

Nota:

  • Estoy seguro de que Gtk / Pango tienen una función similar, Pango ya cambió para usar Harfbuzz a bajo nivel. Sin embargo, no tengo experiencia usando tal lib.
user.dz
fuente