L'idea alla base del {{Ns0}}

modifica

Alla base del lavoro in corso su {{Ns0}}, c'è sempre una deviazione da "dilettante dei database": non ripetere mai due volte gli stessi dati, con la variante: e se possibile tenere tutti i dati nello stesso posto.

Ora, i dati di un'opera proofread non sono tutti allo stesso posto:

  1. alcuni sono contenuti nei nsIndice e nel nsPagina (testo vero e proprio, suddivisione delle pagine in section, grossolana suddivisione delle pagine in sezioni nel campo Sommario di Indice, qualità delle singole pagine)
  2. altri invece sono contenuti in ns0 (titoli dei singoli capitoli, nome delle pagine dei capitoli, suddivisione fine del testo che costituisce i singoli capitoli mediante tag pages index, struttura annidata dei capitoli/sottocapitoli)
  3. altri infine (ORRORE!) sono ripetuti due volte o più senza che sia previsto un meccanismo di sincronizzazione automatica (metadati di Indice, infotesto Indice, metadati in Intestazione, infotesto ns0).

Il template Ns0 consente di inserire direttamente in nsPagina: tutti i dati del gruppo 2. Ossia, di poter ottenere l'intero codice del capitolo ns0, e l'intera struttura annidata dei capitoli e sottocapitoli, unicamente dai dati contenuti nelle pagine, in cui siano stati seminati i tl Ns0.

Parametri del template Ns0

modifica

Il tl|Ns0 va immaginato come una bandierina ficcata nel testo, che segnala "Esattamente qui finisce un capitolo e ne comincia un altro". Già dalla posizione di Ns0 si ricavano due dati:

  1. pagina in cui è conficcato
  2. posizione all'interno del testo della pagina

A seconda della presenza, e posizione, di Ns0 si realizzano varie situazioni, alcune delle quali richiedono section, mentre altre non lo richiedono. Analizzando la cosa si può dimostrare (con una seria eccezione) che i casi sono 3:

  1. la pagina non contiene alcun tl|Ns0: non servono section.
  2. nella pagina c'è un unico tl|Ns0 esattamente all'inizio della pagina: non servono section.
  3. nella pagina c'è almeno un tl|Ns0 preceduto da testo: servono section.

Riflettendo sul ruolo di "bandierina" dell'esatto punto di inizio di un nuovo capitolo di tl|Nso, si possono formulare alcune regole:

  1. le uniche pagine in cui vanno applicate section sono comprese fra quelle che contengono tl|Ns0;
  2. nelle pagine che contengono il tl|Ns0, escluse quelle di cui al punto 2 dell'elenco precedente, il punto esatto del testo che precede il tl|Ns0 è quello dove deve terminare una section e dove deve iniziare la successiva.

I parametri di tl|Ns0

modifica

Il tl|Ns0 richiede solo due parametri:

  1. nome completo del capitolo in ns0
  2. titolo del capitolo in ns0.

Esempio

modifica

In questa pagina è contenuto testo che verrà travasato in Scritti vari (Ardigò); precisamente, il testo fa parte della sezione Polemiche, e precisamente vi inizia la seconda polemica, La psicologia positiva e i problemi della filosofia, a sua volta suddivisa in vari Dialoghi.

Vi sono contenuti due Ns0: il primo relativo alla sezione Polemiche (una "sezione indice"), il secondo relativo al Dialogo I:

  1. {{Ns0|Scritti vari (Ardigò)/Polemiche/La psicologia positiva e i problemi della filosofia|La psicologia positiva e i problemi della filosofia}}
  2. {{Ns0|Scritti vari (Ardigò)/Polemiche/La psicologia positiva e i problemi della filosofia/I|Dialogo I. - Il filosofo e un ignorante.}}

Verso la creazione automatica del libro

modifica

Un primo passo della creazione automatica del libro è la sua rappresentazione nel sommario della pagina Indice (un passo molto noioso della procedura proofread).

I dati necessari per costruire il sommario sono:

  1. i titoli delle varie sezioni e sottosezioni;
  2. il nome della pagina Pagina: in cui ogni sezione inizia;
  3. l'organizzazione in livelli annidati;
  4. il numero della pagina originale,come ottenuta dall'allineamento del tag pagelist.

Vedi, ad es., Indice:Ardigo - Scritti vari.djvu e il suo sommario in corso di costruzione.

Tutti i dati necessari sono implicitamente presenti e accessibili, se sono stati apposti correttamente i tl|Ns0. Se tutti i dati sono presenti, deve essere possibile costruire uno script che li organizzi in qualsiasi modo; ed infatti, l'intero codice del sommario viene ottenuto, nell'esperimento in corso, con questo comando python:

  • print sommario(listaNs0("Ardigo - Scritti vari.djvu"))

e il risultato può essere copincollato al punto giusto della pagina (naturalmente, potrebbe anche essere scritto via bot).

I tipi di pagina

modifica

I tipi di pagina Pagina, in relazione alla creazione "automatica" della versione testuale, sono di tre tipi:

 

Questa è una pagina "normale". Contiene unicamente testo, appartenente a un capitolo il cui titolo NON è compreso nella pagina. Non richiede l'uso del tag section.

 

Questa è una pagina in cui inizia un nuovo capitolo, all'inizio della pagina. Contiene un singolo template Ns0 (rappresentato in rosso), che indica il nome completo del capitolo e il titolo del capitolo (il "sottotitolo" così come comparirà in IncludiIntestazione). Non richiede l'uso del tag section.

 

Questa è una pagina nel cui contesto inizia un nuovo capitolo, all'interno del testo. La prima parte del testo appartiene al capitolo precedente, la seconda a quello indicato dal titolo. In questo caso, il template Ns0 (rappresentato in rosso) indica nome e titolo del capitolo a cui appartiene il testo che lo segue. Questo tipo di pagina, come tutti gli altri tipi di pagina più complessi, richiede l'uso di tag section (rappresentati in verde); ogni "segmento" di testo deve essere racchiuso da un section begin e da un section end. .

Da notare che il template Ns0 è compreso all'interno della section che identifica il testo indicato dal template: il template verrà quindi transcuso nella pagina testuale, dove però (al momento) non genererà alcun output.

A questo punto è opportuno predisporre uno script che segmenti il codice della pagina in più parti: header, testo suddiviso nelle sue parti (section, testo, Ns0), e footer.

splittaPagina()

modifica

Lo script seguente accetta il codice di una pagina Pagina e lo segmenta in tre parti: header, testo, footer:

def splittaPagina(pagina):
   header=find_stringa(pagina,"<noinclude><page","</noinclude>",1)
   footer=find_stringa(pagina,"<noinclude>\n<ref","</noinclude>",1)
   testo=pagina.replace(header,"").replace(footer,"")
   testo=splittaTesto(testo)
   return header, testo, footer

La funzione splittaTesto(), appoggiandosi anche a un'altra funzione splittaSegmento(), trasforma il testo di una pagina in una lista di elementi di tre tipi: testo, tag section e template Ns0. Quindi, splittaPagina() restituisce, come testo, una lista di elementi (di numero indeterminato >=1).

def splittaTesto(testo): # new 1 8 2010
    testo=testo.replace("{{ns0","{{Ns0").replace(u"\ufeff","")
    lista=[]
    while "{{Ns0" in testo:
        if testo.startswith("{{Ns0"):
            ns0=find_stringa(testo,"{{Ns0","}}",1)
            lista.append(ns0)
            testo=testo.replace(ns0,"",1)
        else:
            segmento=testo[:testo.find("{{Ns0")]
            
            testo=testo.replace(segmento,"",1)
            segmento=splittaSegmento(segmento)
            lista=lista+segmento
    if len(testo)>0:
        testo=splittaSegmento(testo)
        lista=lista+testo
        testo=""
    return lista

def splittaSegmento(testo):
    lista=[]
    while "<section" in testo:
        if testo.startswith("<section"):
            section=find_stringa(testo,"<section","/>",1)
            lista.append(section)
            testo=testo.replace(section,"",1)
        else:
            segmento=testo[:testo.find("<section")]
            testo=testo.replace(segmento,"",1)
            lista.append(segmento)
    if len(testo)>0:
        lista.append(testo)
    return lista

Questa suddivisione del testo della pagina Pagina: consente ogni tipo di elaborazione del contenuto, compresa l'estrazione diretta del testo suddiviso in capitoli senza passare attraverso la transclusione.

Proprietà dei segmenti

modifica
  1. per costruire completamente la versione di un'opera testuate a partire da un Indice: in cui siano stati apposti tutti i tl|Ns0, non occorre esaminare tutte le pagine, ma solo quelle che contengono un template Ns0. L'elenco di tali pagine si può ottenere:
    1. usando la lista delle pagine che usano Ns0, filtrandole poi sulla base del nome base della pagina;
    2. scorrendo i testi delle pagine collegate a una pagina Indice, selezionando quelle il cui testo contiene il tl Ns0.
  2. avendo un'opera testuale già correttamente transclusa nelle sue sezioni e capitoli, è possibile applicare automaticamente tutti i tl|Ns0 nel nsPagina.
  3. una volta applicati correttamente i Ns0 nel nsPagina: è possibile costruire il testo completo in chiaro dell'opera correttamente suddivisa nei capitoli e sottocapitoli (il che è interessante per la realizzazione degli eBook).
  4. il misterioso carattere u"\ufeff" che viene apposto all'inizio del testo non ha una chiara funzione e sembra una novità: chiedere a ThomasV.

Aggiunta automatica delle sezioni

modifica

Lo script python per l'aggiunta dei tag section, ove richiesti, è stato testato via Alebot su Indice:Ardigo - Scritti vari.djvu e ha funzionato correttamente (4.8.10: vedi ad es. Pagina:Ardigo - Scritti vari.djvu/131). Lo script si appoggia sulla segmentazione del testo discussa nelle sezioni precedenti. Da adesso, in teoria, l'aggiunta dei tag section, ove richiesti per la transclusione, potrebbe essere automatizzata, quando vengano usati i template Ns0 per indicare il punto di inizio dei capitoli.

Il punto al 10.8.2010

modifica
  • la procedura completa di "creazione delle pagine Ns0" con i nuovi script funziona: vedi Scritti vari (Ardigò), in cui tutti i capitoli sono stati creati via script.
  • tranne un paio di bughetti, funziona anche la procedura inversa: "data un'opera già transclusa, aggiungere nelle pagine i template Ns0 o correggerli se errati". Vedi Indice:Canti di Castelvecchio.djvu. Il bug si manifestava nei casi in cui una pagina Pagina: contiene più di un template Ns0 da aggiungere. Risolto tale bug, è emerso un conseguente contro-bug da risolvere. Il problema si è manifestato in Indice:Fiaschi.djvu; il combattimento è in corso.
  • L'aggiunta dei tl Ns0 al nsPagina, eseguita ad es. su Indice:Canti di Castelvecchio.djvu, permette di costruire on the fly il sommario per la pagina Indice, compresa la raffinatezza di visualizzare, come link alla pagina, il valore prodotto da pagelist: vedi ad es. il campo sommario di Indice:Canti di Castelvecchio.djvu, creato da uno script che esegue la ricerca dei template Ns0 nelle pagine e "aggiusta" i link basandosi sul codice html della pagina Indice.