The X(html) marks the spot to dig

“So forget any ideas you’ve got about lost cities,
exotic travel, and digging up the world.
Eve do not follow maps to buried treasure
and “X” never, ever, marks the spot.”
— Indiana Jones

Secondo post nello sviluppo di jLGC, che procede, lo sviluppo non il post, più rapidamente di quanto riesca a scriverne. Il problema che presento l’ho risolto già una decina di giorni fa, e la trasformazione dall’originale RTF (contenuto nei file del vecchio Libro Game Creator) in codice XHTML, necessario a creare le pagine per costruire i file ePub, è ormai testata e consolidata. Gli eBook creati da jLGC passano pure il test di EpubCheck validation, con somma soddisfazione.

Il principale dubbio sulla conversione era come mantenere intatti i link ai paragrafi, senza utilizzare una codifica fissa (ad es. HTML), in modo da poter facilmente identificare i link ed esportarli ogni volta nella maniera corretta (interni a un singolo file HTML, tra più file HTML, tra i file XHTML dell’ePub,…). Per fare questo ho adottato una codifica a TAG personalizzata. Alle funzioni di esportazioni viene dato in pasto questo e un template di sostituzione, adattabile al formato di file che si va a creare.

Quindi il riferimento nel libro del tipo

vai al paragrafo 15.

viene sostituito con

vai al paragrafo [LINK 7 15]15[/link].

Il TAG LINk è codifcato come [LINK indice-interno indice-esterno] dove indice-interno è l’indice della lista di paragrafi del libro, nascosto all’utente, mentre indice-esterno è il nome del paragrafo visto dal lettore. Il primo serve per trovare rapidamente il paragrafo a cui ci si sposta, il secondo per creare facilmente altri tipi di messaggi (come un hint sul link).

Il TAG LINK può venir quindi sostituito alla bisogna, ad esempio se si vuole esportare in un file ePub, il codice di sopra viene sostituito con un TAG HTML sfruttando il template

%chapterid

dove

  • CHAPTERSTRING è la stringa usata come base per i nomi di file XHTML nell’ePub (per ora una costante valorizzata a “capitolo”)
  • %chapterstringid è la variabile che riporta l’indice esterno del capitolo utilizzabile in un nome di file (quindi una stringa del tipo 00001, 00002,…)
  • %chapterid è la variabile che riporta l’indice esterno numerico (1, 2, 3,…)

Il risultato finale è:

vai al paragrafo 15.

Questa codifica è risultata fondamentale, e ha permesso con poche sostituzioni di valori di esportare nei molteplici formati richiesti (nonché eseguire più semplicemente operazioni come il rimescolamento dei paragrafi).

Veniamo ora al procedimento applicato per la conversione dell’RTF.
Sono partito da un file LGC, come indicato dalla figura:

The Chasm of Doom
The Chasm of Doom

Qualcuno avrà riconosciuto il testo. Si tratta del primo capitolo di The Chasm of Doom, quarto libro della serie Lone Wolf (Lupo Solitario), di Joe Dever. Ecco il primo capitolo nel terribile codice RTF.

{\rtf1\ansi\ansicpg0\uc1\deff0\deflang0\deflangfe0{\fonttbl{\f0\fnil\fcharset1 Verdana;}{\f1\fnil\fcharset1 Arial;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}
\uc1
\pard\fi0\li0\ql\ri0\sb0\sa0\itap0 \plain \f0\fs28 For three days you lead your brave company of rangers across the lush plains of southern \plain \f0\b\fs28 Sommerlund\plain \f0\fs28 on the first stage of your urgent mission. The flat, treeless fields surround you with a seemingly endless expanse of wheat, so high that even though you are in the saddle it reaches well above your knees. Your horses seem to be swimming through a vast yellow sea of corn that is only interrupted by an occasional track, or group of isolated farmhouses. The southerners welcome your sudden appearance, but you only make the briefest stops for food and rest, neither wishing to risk becoming a burden, nor alarm these good people with your mission.
\par \pard\fi0\li0\ql\ri0\sb0\sa0\itap0
\par \pard\fi0\li0\ql\ri0\sb0\sa0\itap0 \plain \f0\fs28\cf6 By noon on the fourth day, you reach the Pass of Moytura. Here the plains give way to the broken foothills of the Durncrag Mountains. You soon reach a highway, the surface cracked and full of potholes, heading off towards the south. This is the notorious Ruanon Pike. South of the pass, the Ruanon Pike crosses a hundred miles of open territory known as \'91Raider's Road\'92. Bandit tribes from the Wildlands and Giak war-bands from the mountains of the west frequently ambush those who travel along the Pike, and the regular shipment of gold and gems from the mines at Ruanon have sometimes yielded rich pickings to these merciless robbers.
\par \pard\fi0\li0\ql\ri0\sb0\sa0\itap0 \plain \f0\fs28
\par \pard\fi0\li0\ql\ri0\sb0\sa0\itap0 \plain \f0\i\fs28 Point and flankers\plain \f0\fs28 , you shout, and immediately three groups of rangers peel away from the column and spur their horses to a gallop. You watch with pride as the expert horsemen take up their scouting positions to the front and side of the company. It is late afternoon when a ranger scout approaches the company from the west. He points towards a craggy outcrop where a thin spiral of wood smoke betrays a hut hidden beneath the overhanging rock.
\par \pard\fi0\li0\ql\ri0\sb0\sa0\itap0 If you wish to \plain \f0\b\fs28 investigate the hut\plain \f0\fs28 , turn to .
\par \pard\fi0\li0\ql\ri0\sb0\sa0\itap0 If you wish to \plain \f0\b\fs28 ignore the hut\plain \f0\fs28 and continue on your ride along the \plain \f0\b\fs28 Ruanon Pike\plain \f0\fs28 , turn to .
\par \pard\fi0\li0\ql\ri0\sb0\sa0\itap0 \par}

Pretty messy, avrei detto sul blog in inglese 🙂
Per fortuna ho trovato questa semplice funzione di Arman S. (sul sito CodeProject) che in pochi passaggi trasforma, sfruttando un componente grafico del framework Swing, JEditorPane, il file RTF in uno HTML.

public static String rtfToHtml(StringReader rtf) throws IOException {
	JEditorPane p = new JEditorPane();
	p.setContentType("text/rtf");
	EditorKit kitRtf = p.getEditorKitForContentType("text/rtf");
	try {
		kitRtf.read(rtf, p.getDocument(), 0);
		kitRtf = null;
		EditorKit kitHtml = p.getEditorKitForContentType("text/html");
		StringWriter writer = new StringWriter();
		kitHtml.write(writer, p.getDocument(), 0, p.getDocument().getLength());
		return writer.toString();
	} catch (BadLocationException e) {
		e.printStackTrace();
	}
	return null;
}

Utilizzando quindi la funzione rtfToHtml() dal testo RTF visto prima si ottiene il seguente codice HTML:


 

For three days you lead your brave company of rangers across the lush plains of southern Sommerlund on the first stage of your urgent mission. The flat, treeless fields surround you with a seemingly endless expanse of wheat, so high that even though you are in the saddle it reaches well above your knees. Your horses seem to be swimming through a vast yellow sea of corn that is only interrupted by an occasional track, or group of isolated farmhouses. The southerners welcome your sudden appearance, but you only make the briefest stops for food and rest, neither wishing to risk becoming a burden, nor alarm these good people with your mission.

By noon on the fourth day, you reach the Pass of Moytura. Here the plains give way to the broken foothills of the Durncrag Mountains. You soon reach a highway, the surface cracked and full of potholes, heading off towards the south. This is the notorious Ruanon Pike. South of the pass, the Ruanon Pike crosses a hundred miles of open territory known as Raider’s Road. Bandit tribes from the Wildlands and Giak war-bands from the mountains of the west frequently ambush those who travel along the Pike, and the regular shipment of gold and gems from the mines at Ruanon have sometimes yielded rich pickings to these merciless robbers.

Point and flankers , you shout, and immediately three groups of rangers peel away from the column and spur their horses to a gallop. You watch with pride as the expert horsemen take up their scouting positions to the front and side of the company. It is late afternoon when a ranger scout approaches the company from the west. He points towards a craggy outcrop where a thin spiral of wood smoke betrays a hut hidden beneath the overhanging rock.

If you wish to investigate the hut , turn to [TAG]160[/TAG].

If you wish to ignore the hut and continue on your ride along the Ruanon Pike , turn to [TAG]273[/TAG].

  Ancora piuttosto incasinato, e con la colpa di essere “solamente” HTML, non abbastanza per le pagine di un ePub, che richiedono un codice XHTML. Il passaggio successivo è piuttosto semplice: serve l’indicazione del namespace nel tag html e la corretta codifica del DocType. Inoltre vanno eliminate le righe inutili, come i riferimenti a uno style inutilizzato, e aggiunti i link al file di stile CSS template.css. Questo verrà utilizzato negli ePub così come nei file HTML di esportazione del libro. Per la gestione dell’HTML ho utilizzato un package esterno, Jsoup. Con questo ho sistemato gli elementi di base che non venivano ancora validati: sistemo il titolo della pagina, rimuovo lo style e ne approfitto per inserire un tag personalizzato come titolo interno al testo, che servirà poi in fase di esportazione.

Document doc = Jsoup.parse(HTMLbody);
doc.head().empty();
doc.head().append("");
doc.title(title);
doc.select("style").remove();
doc.body().prepend(inpagetitle);
HTMLbody = doc.html();

Manca solo il passaggio finale, l’aggiunta di namespace e DocType necessari per ottenere l’XHTML valido, il tutto fatto sfruttando la codifica XML con il package javax.xml.

DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
InputSource is = new InputSource(new StringReader(HTMLbody));
is.setEncoding("UTF-8");
org.w3c.dom.Document tocDoc = docBuilder.parse(is);
((Element)tocDoc.getElementsByTagName("html").item(0)).setAttribute("xmlns", "http://www.w3.org/1999/xhtml");
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "-//NISO//DTD ncx 2005-1//EN");
transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd");
DOMSource source = new DOMSource(tocDoc);
StringWriter stw = new StringWriter();
transformer.transform(source, new StreamResult(stw));
return stw.toString();

Siamo all’output finale, la versione XHTML dell’RTF di partenza, che finirà nell’eBook.

Start

1

For three days you lead your brave company of rangers across the lush plains of southern Sommerlund on the first stage of your urgent mission. The flat, treeless fields surround you with a seemingly endless expanse of wheat, so high that even though you are in the saddle it reaches well above your knees. Your horses seem to be swimming through a vast yellow sea of corn that is only interrupted by an occasional track, or group of isolated farmhouses. The southerners welcome your sudden appearance, but you only make the briefest stops for food and rest, neither wishing to risk becoming a burden, nor alarm these good people with your mission.

 

 

By noon on the fourth day, you reach the Pass of Moytura. Here the plains give way to the broken foothills of the Durncrag Mountains. You soon reach a highway, the surface cracked and full of potholes, heading off towards the south. This is the notorious Ruanon Pike. South of the pass, the Ruanon Pike crosses a hundred miles of open territory known as Raider’s Road. Bandit tribes from the Wildlands and Giak war-bands from the mountains of the west frequently ambush those who travel along the Pike, and the regular shipment of gold and gems from the mines at Ruanon have sometimes yielded rich pickings to these merciless robbers.

 

 

Point and flankers , you shout, and immediately three groups of rangers peel away from the column and spur their horses to a gallop. You watch with pride as the expert horsemen take up their scouting positions to the front and side of the company. It is late afternoon when a ranger scout approaches the company from the west. He points towards a craggy outcrop where a thin spiral of wood smoke betrays a hut hidden beneath the overhanging rock.

 

If you wish to investigate the hut , turn to [TAG]160[/TAG].

 

If you wish to ignore the hut and continue on your ride along the Ruanon Pike , turn to [TAG]273[/TAG].

 

A questo punto quello che ho per le mani è più di quanto volevo.
Ho il codice per convertire RTF in XHTML, ma anche per esportare un HTML corretto e ho dovuto strutturare con cura i template di conversione, il che ha permesso come dicevo all’inizio di creare una base solida per le future esportazioni necessari a jLGC.

Print Friendly, PDF & Email

Vuoi rispondere?