Progetto:Trascrizioni/Ns0
Questa pagina è inutilizzata o comunque obsoleta ed è mantenuta per scopi storici e di archivio.
O non ha più senso ed è superata, oppure il consenso è diventato poco chiaro. Se vuoi riaprire la discussione sull'argomento, puoi cercare di allargare la partecipazione della comunità con una segnalazione al bar. |
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:
- 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)
- 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)
- 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
modificaIl 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:
- pagina in cui è conficcato
- 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:
- la pagina non contiene alcun tl|Ns0: non servono section.
- nella pagina c'è un unico tl|Ns0 esattamente all'inizio della pagina: non servono section.
- 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:
- le uniche pagine in cui vanno applicate section sono comprese fra quelle che contengono tl|Ns0;
- 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
modificaIl tl|Ns0 richiede solo due parametri:
- nome completo del capitolo in ns0
- titolo del capitolo in ns0.
Esempio
modificaIn 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:
- {{Ns0|Scritti vari (Ardigò)/Polemiche/La psicologia positiva e i problemi della filosofia|La psicologia positiva e i problemi della filosofia}}
- {{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
modificaUn 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:
- i titoli delle varie sezioni e sottosezioni;
- il nome della pagina Pagina: in cui ogni sezione inizia;
- l'organizzazione in livelli annidati;
- 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
modificaI 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()
modificaLo 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- 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:
- usando la lista delle pagine che usano Ns0, filtrandole poi sulla base del nome base della pagina;
- scorrendo i testi delle pagine collegate a una pagina Indice, selezionando quelle il cui testo contiene il tl Ns0.
- avendo un'opera testuale già correttamente transclusa nelle sue sezioni e capitoli, è possibile applicare automaticamente tutti i tl|Ns0 nel nsPagina.
- 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).
- 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
modificaLo 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.