OpenOffice.org – perfektní editor XHTML?

Pachollini, 29. listopadu 2005, 23:04

Hledali jste někdy kompromis mezi komfortní editací textu se všemi vymoženostmi, které nabízejí současné kancelářské aplikace a snahou produkovat sémantické validní XHTML s minimálním úsilím? Já ano a musím přiznat, že s nepříliš uspokojivými výsledky. Jako nejlepší volba pro tvorbu strukturovaných textů se mi jeví XMLmind XMLeditor, jeho ovládání má však ke snadnosti, s jakou se používá normální textový editor, pořád ještě poměrně daleko.

Zajímavou volbou pro takovou situaci může být OpenOffice.org. Díky tomu, že jeho souborový formát je založen na XML, je principiálně poměrně snadné konvertovat ho do libovolného jiného formátu pomocí XSLT. A v instalaci OpenOffice.org je exportní filtr pro XHTML přibalen, takže zdánlivě nic nebrání napsat text ve Writeru, a převést ho do krásného čistého a validního XHTML. Nebo vzít dokument dodaný autorem ve Wordu, otevřít ho, vyexportovat a rovnou šoupnout na web.

Tak jednoduché to ovšem zase není, protože XHTML filtr OpenOffice má své mouchy. První nevýhodou pro mne je, že se snaží zachovat vzhled dokumentu a tak při exportu vytvoří i styly a přiřadí prvkům na stránce spousty vygenerovaných tříd. Pro začátečníka je to možná pomoc, pro mne balast, kterého se musím zbavovat. (Byť je třeba ocenit, že se všechno formátování děje pomocí stylů s maximálním využitím tříd, které jsou navíc na automatický nástroj poměrně slušně definované.) Druhou nevýhodou je, že OpenOffice občas dokument  zahlcuje prázdnými elementy. Chápu to, autoři OpenOffice nemůžou za to, že spousta lidí odsazuje nadpis od textu třemi entery, ale na webu je lépe se podobných hrůz vyvarovat.

Jak z toho ven? První možností je úprava exportního XSLT. Pokusil jsem se o ni, ale jde o cca. 130 kB kódu, který se mi nechtělo studovat, a tak jsem se vzdal při první chybě. Pokud budete někdo úspěšnější, dejte vědět, ale já jsem zvolil variantu brod. Podobně jako když jsem potřeboval čistit kód tabulky jsem si napsal XSLT, které se u vyexportovaného XHTML postará o odstranění přebytečných tříd a stylopisu, odstraní prázdné elementy atd. Je poměrně jednoduché (tedy až na podmínky, které se starají o to, aby každý řádek zdrojového kódu nebyl v jednom odstavci):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns="http://www.w3.org/1999/xhtml">
 
  <xsl:output doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" method = "xml" version="1.0" encoding="utf-8" omit-xml-declaration="no" indent="yes" />
 
  <!-- vyhází přebytečné spany -->

  <xsl:template match="*[local-name()='span']">
  <xsl:apply-templates select="child::*|text()"/>
  </xsl:template>
 
  <!-- zkopíruje neprázdné elementy -->

  <xsl:template match="*">
  <xsl:if test="child::* or normalize-space(translate(text(),' ',''))"><xsl:copy><xsl:apply-templates select="*|attribute::*|text()"/></xsl:copy></xsl:if>
  </xsl:template>
 
  <!-- zachová prázdné elementy -->

  <xsl:template match="*[local-name()='br']|*[local-name()='hr']|*[local-name()='meta']">
  <xsl:copy><xsl:apply-templates select="attribute::*"/></xsl:copy>
  </xsl:template>
 
  <!-- zkopíruje atributy -->

  <xsl:template match="attribute::*">
  <xsl:copy-of select="."/>
  </xsl:template>
 
  <!-- následující 3 pravidla se sanží o rozumné formátování zdrojových kódů -->

  <xsl:template match="*[contains(@class,'SourceText')]">
  <code>
  <xsl:apply-templates/>
  <xsl:apply-templates select="../following-sibling::*/*[contains(@class,'SourceText')]" mode="add-code"/>
  </code>
  </xsl:template>
 
  <xsl:template match="*" mode="add-code">
  <br/><xsl:apply-templates/>
  </xsl:template>
 
  <xsl:template match="*[ancestor::*[contains(@class,'SourceText')]] | *[child::*[contains(@class,'SourceText')]]">
  <xsl:apply-templates/>
  </xsl:template>
 
  <!-- Vyhází přebytečné elementy a atributy -->

  <xsl:template match="@style|@class|@dir|*[local-name()='style'] | *[contains(@class,'SourceText')][preceding-sibling::*[1][contains(@class,'SourceText')] or ../preceding-sibling::*[1]/descendant::*[contains(@class,'SourceText')]]"/>
 
</xsl:stylesheet>

Tímto XSLT proženu výsledek exportu z OpenOffice a krásný a jednoduchý XHTML kód je na světě. Shrnutí postupu: 

Návod pro transformaci dokumentů ve Wordu do XHTML:

  1. Nainstalujte si OpenOffice.org ve verzi 2.0. (Možná by to šlo i s 1.1.x, ale zkoušel jsem to ve 2.0, která je navíc mnohem lepší.) Je zadarmo a je fajn, MS Office už nepoužívám hodně dlouho a nijak mi nechybí. Při instalaci vyberte ve volitelných součástech „příklady XSLT filtrů“ – alespoň myslím, že XHTML export je mezi nimi.
  2. Otevřete nebo napište normální dokument ve Writeru. OpenOffice sice disponuje čímsi jako editorem HTML, ale kvalita výsledného kódu má k čistotě daleko, navíc to není XHTML, takže se nedá tak snadno vyčistit pomocí XSLT. K formátování používejte HTML styly, které jsou k dispozici ve stylistovi pod poměrně intuitivní hlavičkou „HTML styly“ – odrážky, odkazy, nadpisy a další styly pak fungují podle očekávání, tedy převedou se na odpovídající HTML značky, stejně jako meta informace. Pro definiční seznamy, zkratky a několik dalších značek jsem odpovídající styly nenašel, nikdo holt nejsme dokonalý.
  3. Vyexportujte soubor do XHTML.
  4. Přetransformujte výsledek pomocí čistícího XSLT a dolaďte zbylé chybičky.

XSL transformaci lze provést mnoha způsoby. Pokud pracujete ve Windows, můžete použít XML Cooktop, pokud máte rádi příkazovou řádku, můžete požít třeba XSLT procesor XT, jehož použití vysvětluje Jirka Kosek, pokud jste patrioti, možná vás zaujme český Šablotron.

Toť pro dnešek vše, jdu exportovat a začišťovat ;-) 

Co vy na to?

zobrazit všechny komentáře

Aktuální Seky

.