Detectar glifos ausentes no texto

10

Eu escrevi um appindicator Python3 que chama fortunee captura a saída para exibição na notificação na tela.

Algumas fortunas contêm quadrados com um número hexadecimal quando o glifo correspondente não existe na fonte atual. Cada quadrado é a representação do ponto de código hexadecimal Unicode para o glifo ausente.

Quero remover o texto hexadecimal antes de exibir para o usuário. Eu esperava encontrar alguma API Python que me permitisse inspecionar texto, caractere por caractere, para determinar algo parecido char.isValidCodePoint()ou semelhante, mas não consigo encontrá-lo como tal.

Encontrei uma solução possível que queria investigar aqui, mas após a instalação fonttoolspelo terminal, meu programa Python não pôde importar fonttools/fontTools.

Alguma idéia - usando a API Python ou chamando para um terminal?

Atualização # 1: Desde então, percebi que o fonttoolscódigo de exemplo do link acima não funcionará para mim, pois é o Python2. Suponho que, de fonttoolsalguma forma, poderia ser usado, eu poderia chamar um interpretador Python2 do meu script Python3.

Atualização # 2: Depois de muita leitura (veja as referências abaixo), eu encontrei desde então, fc-matchmas nem sempre é possível identificar exclusivamente a fonte em uso. Eu obtenho a fonte atual em Python:

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

resultando em Ubuntu 11. Passando esse resultado para pango-viewjunto com o caractere hexadecimal, recebo uma lista de fontes incluindo Ubuntu. Na minha opinião, se o glifo NÃO foi renderizado pela fonte, a fonte não deve aparecer no resultado de pango-view!

Referências:

Bernmeister
fonte

Respostas:

0

Essa é uma abordagem diferente de onde você estava indo com isso, mas talvez você possa simplesmente usar métodos str.replace()ou python re.sub()para analisar as seqüências hexidecimais do corpo do texto. ou seja:

Se o hexadecimal for previsível:

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

Ou, se você precisar combinar qualquer caractere hexadecimal com uma expressão regular:

import re

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

Mais uma boa discussão dessa estratégia

Christopher Hunter
fonte
Não há problema em oferecer opções alternativas, mas acho que você poderia melhorar muito sua resposta 1) adicionando um código de amostra curto 2) descrevendo possíveis PROs e CONs da solução original proposta e da sua.
Lpanebr 10/11
11
Não estou tentando criticar a solução original, então não sei se uma comparação PRO / CON será útil aqui. No entanto, adicionei exemplos de código para minhas sugestões à resposta.
Christopher Hunter
@ChristopherHunter: O texto que vem da fortuna é texto simples e é somente quando esse texto é renderizado que o hexadecimal aparece (e é muito tarde para eu pegar e processar como você sugere).
Bernmeister 11/11
0

Mecanismo de modelagem Unicode

Use um mecanismo de modelagem Unicode como o Harfbuzz para detectar glifos ausentes. Aqui está um exemplo de trabalho:

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'])

Resultado

registered
.notdef

Aqui a saída no IDLE3 durante a verificação:

>>> 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 o caminho correto da fonte. Acabei de escolher o primeiro que vi na minha máquina atual.

Nota:

  • Tenho certeza de que o Gtk / Pango tem função semelhante, pois o Pango já mudou para usar o Harfbuzz em nível baixo. No entanto, eu não tenho experiência usando essa lib.
user.dz
fonte