Ciao,

ho un problema veramente fico da risolvere: sto scrivendo un programma per scrivere un libro di canzoni con accordi per il mio gruppo di suonatori principianti di ukulele.

Scrivere una songsheet singolo è un problema che abbiamo già risolto: esiste un formato semi-serio che si chiama chopro con cui scrivere la canzone con gli accordi:

https://github.com/hammeruke/hug-chords/blob/master/chords/hug/valerie.cho

Poi si prende un parser scritto male, variabili globali e tutto il resto, tutto in un solo file:

https://github.com/kaj/chordlab/blob/master/chordlab

e lo si trasforma in qualcosa di un po' meno peggio (parser separato dal rendeder così poi magari ci facciamo l'html, fogli stile, soprattutto un'opzione --ukulele):

https://github.com/hammeruke/chordlab

in grado di generare un songsheet così:

http://hug.spacehobo.com/pdfs/hug/valerie.pdf

Fino a qui tutto facile. Solo che ora vorremmo mettere insieme diversi songsheet per fare un songbook, nell'ordine che vogliamo noi, tipicamente di difficoltà: dalle canzoni con tre accordi a quelle... con cinque? Beh, siamo principianti! Comunque, immagino che in un songbook uno ci voglia mettere anche qualche titolo e qualche parola qua e là, e soprattutto un indice. Ovviamente il punto di partenza è docutils/reStructuredText: è un formato che serve già a rappresentare un documento strutturato, ha una bella toolchain ed è estendibile. In particolare rst2pdf ottiene dei pdf bellini usando reportlab e anche lui lascia estendere bene: ha un'opzione di riga di comando apposta per caricare estensioni e lasciarsi monkeypatchare.

Per cui ho il mio documento che rappresenta un songbook, dove c'è una direttiva che permette di aggiungere delle canzoni al resto del documento:

https://raw.githubusercontent.com/hammeruke/hug-chords/songbook/books/sample.rst

O meglio, per ora questa direttiva non c'è: sto lavorando ad un livello più basso, che è una direttiva che permette di inserire un pdf qualunque in mezzo al documento; la direttiva "songsheet" deriverebbe da "include-pdf" e dietro le quinte lancerebbe chordlab per generare il pdf della canzone e poi includerebbe quello. Quindi si lancia rst2pdf con questa estensione:

https://github.com/hammeruke/hug-chords/blob/songbook/books/songbook.py

che genera un documento dove, in corrispondenza dei documenti esterni, inserisce una entry dell'indice e tante pagine vuote quante quelle del documento inserito. Quando il rendering è finito usa pyPdf per leggere il proprio output e per sostituire le pagine segnaposto con quelle dei documenti inseriti. Questo è stato un po' complicato da mettere insieme perché ci sono tre librerie che lavorano in maniera congiunta: docutils, rst2pdf, reportlab, e c'era da capire il loro modello interno e i passaggi da un modello all'altro, ma è stato un bel pomeriggio domenica scorsa.

Problema! Mi si rompe l'indice! Mannaggia. Se non sostituisco le pagine l'indice funziona. Ma se le rimpiazzo cliccando sull'indice il pdf non va da nessuna parte. Probabilmente nella pagina che rimuovo c'è l'àncora del punto di arrivo: l'indice punta a quella, non genericamente "a pagina 3". La soluzione sarebbe, sempre con pyPdf, quella di ispezionare la pagina da rimuovere, trovare l'ancora e iniettarla nel pdf da inserire...

Beh, qualcuno ha una vaga idea di come si possa fare? :) Qualcuno sa come sono rappresentati i (credo siano) bookmark e outline entry in un pdf (questi sono gli elementi che rst2pdf chiede di generare a reportlab), come estrarli da un pdf esistente e come iniettarli in uno nuovo?

A chi mi sappia suggerire una soluzione, o informazioni utili per risolvere il caso, andrà il privilegio di non sentirmi suonare.


-- Daniele

_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a