Forum >> Programmazione Python >> Files e Directory >> Individuare files dei fonts

Pagina: 1

I miei saluti.
A scopo meramente ludico mi sto studiando la libreria fpdf2, finalizzando alla produzione di moduli tabellari con font e stili scelti dall'utente, la scelta dei fonts avviene per "famiglie" di font selezionate in ambiente tkinter.
Nell'approccio con fpdf2 ho constatato che, necessariamente, deve essere fornito "il file" da utilizzare per la composizione dei testi, specifico per lo stile di testo applicato, essendo la libreria non in grado di operare con la generica fornitura di font-family e style.
Ho, pertanto, iniziato a studiarmi una metodologia per identificare files di font soddisfacenti le scelte utente tra quelli registrati nel sistema, correntemente nel solo linux ma che spero, in seguito, di ampliare anche al mondo windows. Al momento provvedo ad estrarre l'intero set di font rilevati nel sistema tramite fc-list (ho trovato scoraggianti fc-match e fcpatterformat non conoscendo i parametri da applicare di volta in volta) in un subprocess e, quindi, utilizzando il modulo python "fontmeta" per estrarne i metadati e selezionare i file tramite i campi "font_family" e "subfamily"
... certamente l'utilizzo di "fontmeta" non è il massimo, limitando i caratteri gestibili ai soli TrueType ed OpenType ma bene o male può andare, in genere i caratteri di altra codifica (p.e. i Type1) hanno corrispondenze in una delle due tipologie, anche se alcuni, tipo il "Gargi" in esempio sotto
...
font_family            : गार्गी
subfamily              : गार्गी
unique_font_identifier : FontForge : Gargi_1.10v : 12-3-2012
full_font_name         : Gargi
version                : Version 2.0 
postscript_name        : Gargi
...
non so proprio come intercettarli, dato i caratteri "esotici" utilizzati nel compilare a detti campi.

Comunque, pur ritenendo tutto sommato veniali le problematiche sopra esposte, mi sono imbattuto in alcune casistiche che mi lasciano perplesso circa le metodologie che sto implementando.

La prima : le "famiglie" di font solitamente sono definite con file specifici per i caratteri "normale", "grassetto", "corsivo" e "grassetto-corsivo", detti stili son definiti nel campo "subfamily" MA NON HANNO una indicazione uniforme, tanto meno mi è riuscito di trovare una specifica delle definizioni.
Al momento, ho definito un insieme di variabili globali
NORMAL = ['Regular', 'Normal', 'Roman', 'Book']
BOLD = ['Bold','Gras']
ITALIC = ['Italic', 'Italique', 'Oblique']

di appoggio che però non sono esaustive, alcune delle definizioni trovate non ho neanche saputo ove porle.
Qui viene la prima domanda: qualcuno di Voi conosce e saprebbe indicarmi una specifica esaustiva per gli stili di testo? ... o almeno suggerire delle integrazioni?

Altra problematica è data dai file stessi, sul mio sistema (ubuntu con aggiornamenti dalla versione 16 alla 22) coesistono versioni multiple di file con della stessa "famiglia" e stile, sparsi in varie directory, di sistema o locali all'user, rispondenti ad una ricerca ... certo, posso applicare il primo trovato od anche utilizzare le directory di sistema, anche se in esse sono presenti più file soddisfacenti contemporaneamente i requisiti (tipo i fonts Microsoft)
La seconda domanda è : qualcuno conosce l'argomento e saprebbe indicarmi la documentaione da consultare (sperando non sia troppo "laboriosa") e/o suggerimenti?
Per eventuali interessati, il modulo di lavoro sviluppato al momento (work.py) è il seguente:
# -*- coding: utf-8 -*-

import subprocess
from fontmeta import FontMeta

NORMAL = ['Regular', 'Normal', 'Roman', 'Book']
BOLD = ['Bold','Gras']
ITALIC = ['Italic', 'Italique', 'Oblique']

def get_fonts_linux_system() -> list:
    ''' Estrae i fonts registrati in un sistema linux '''
    p = subprocess.check_output('fc-list', stderr=subprocess.STDOUT)
    fonts_data = p.decode('UTF-8').splitlines()
    fonts = []
    for f in fonts_data:
        f_name = f.split(':')[0]
        fonts.append(f_name)
    fonts.sort()
    return fonts

def get_data_file(fname: str) -> dict:
    ''' Estrae i metadati di un file TrueType o OpenType '''
    data = None
    try:
        fm_i = FontMeta(fname)
        data = fm_i.get_data()
    except:
        pass
    return data

def get_from_family(fam: str, style: bool=False,
                    bold: bool=False, italic: bool=False) -> list:
    ''' Estrae i font registrati con famiglia e stile selezionati '''
    fonts = get_fonts_linux_system()
    founds = []
    for f in fonts:
        fname = f.rstrip('\n')
        try:
            fm_i = FontMeta(fname)
            data = fm_i.get_data()
            if data['font_family'] == fam:
                passed = False
                if style:
                    stl = data['subfamily']
                    if not bold and not italic:
                        if stl in NORMAL: passed = True
                    elif bold and italic:
                        st = stl.split()
                        if (len(st) == 2 and (st[0] in BOLD or st[0] in ITALIC)
                            and (st[1] in BOLD or st[1] in ITALIC)):
                            passed = True
                    else:
                        if bold:
                            if stl in BOLD: passed = True
                        elif italic:
                            if stl in ITALIC: passed = True
                else:
                    passed = True
                if passed: founds.append(f)                        
        except:
            pass
    return founds
e funziona con la funzione "get_from_family" che richiede l'elenco dei file a "get_fonts_linux_system" per poi processarli singolarmente richiedendo, per ciascuno di essi, i metadati a "get_data_file" per poi valutarne i metadati in base alle opzioni passate quali parametri.

... se qualcuno è interessato alla finestra (tkinter) di test lo faccia sapere che la posto, sono circa 280 righe di codice e non ho ritenuto fosse al momento necessaria.

Grazie dell'attenzione
Fatti non foste a viver come bruti...
Ciao caro, anche se non ne so niente, trovo tutto molto interessante.

Penserai perché ti ho risposto se non so nulla sull'argomento? Eh niente, solo per dirti del mio apprezzamento e per ricordarti che se non risponde nessuno ci sono comunque altri canali nella nostra comunità.

Cya

Daniele aka Palmux said @ 2024-02-15 13:01:23:
... Eh niente, solo per dirti del mio apprezzamento e per ricordarti che se non risponde nessuno ci sono comunque altri canali nella nostra comunità.

Sono lusingato dell'apprezzamento di un pythonista di lunga data quale Tu sei, riguardo gli altri canali, avevo già visto della mailing-list e del canale telegram. Non ne ho ancora approfittato.

Riguardo le mailing-list, che conosco bene avendo fatto parte di diverse linux verso la metà degli anni '90, un po' perché in genere l'utenza è di un livello medio più alto di quanto io possa aspirare, non tedierei con le mie misere problematiche, un po' perché impegnative e non ho, strutturalmente e fisicamente, mezzi adeguati per starci dietro.

Riguardo ai canali telegram ... sono patologicamente (e probabilmente ingiustamente) ostile a tutti i "social", ambito in cui classifico telegram, frequento internet da quando e nata e non mi è piaciuta la sua "evoluzione" ... forse perché rimasto shoccato nell'antico "C6" della ora TIM, unica esperienza del genere avuta.

... Per ora, mi accontenterò dei Forum, se qualcuno saprà/vorrà intervenire bene, altrimenti mi accontenterò ugualmente.




Ciao :)

Fatti non foste a viver come bruti...
Messaggio nascosto da Daniele aka Palmux :
SPAM
Nice information.


Pagina: 1



Esegui il login per scrivere una risposta.