Zvýrazňování syntaxe #12 – prakticky hotové.
authorFrantišek Kučera <franta-hg@frantovo.cz>
Mon, 22 Aug 2011 13:57:20 +0200
changeset 31 da6ae32853cb
parent 30 cefd5fe75cb8
child 32 6bc25517ac4f
Zvýrazňování syntaxe #12 – prakticky hotové.
build.xml
vstup/css/styl.css
vstup/produkty.xml
vstup/služby.xml
vstup/web.conf
vstup/zdrojáky.xml
šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java
šablona/syntaxe.xsl
--- a/build.xml	Mon Aug 22 01:26:23 2011 +0200
+++ b/build.xml	Mon Aug 22 13:57:20 2011 +0200
@@ -13,7 +13,7 @@
 	<target	name="generuj" description="Vygeneruje kompletní web." depends="agregace,stránky">
 	</target>
 	
-	<target name="stránky" description="Vygeneruje samotné XHTML webové stránky." depends="statický-obsah,kompiluj-funkce">		
+	<target name="stránky" description="Vygeneruje samotné XHTML webové stránky." depends="statický-obsah,syntaxe,kompiluj-funkce">		
 		<xslt basedir="${vstup}" destdir="${výstup}" includes="*${vstupníPřípona}" extension="${výstupníPřípona}" style="${šablona}/stránka.xsl" processor="org.apache.tools.ant.taskdefs.optional.TraXLiaison">
 			<param name="konfigurák" expression="../${vstup}/"/>		
 			<param name="podporaZaostalýchProhlížečů" expression="false"/>
@@ -27,6 +27,16 @@
 		</xslt>
 	</target>
 	
+	<target name="syntaxe" description="Vygeneruje CSS styl pro zvýrazňování syntaxe" depends="kompiluj-funkce">
+		<xslt in="${vstup}/web.conf" out="${výstup}/css/syntaxe.css" style="${šablona}/syntaxe.xsl" processor="org.apache.tools.ant.taskdefs.optional.TraXLiaison">
+			<classpath location="/usr/share/java/saxonb-9.0.jar"/>
+			<classpath location="${funkce}"/>
+			<factory name="net.sf.saxon.TransformerFactoryImpl">
+				<attribute name="http://saxon.sf.net/feature/allow-external-functions" value="true"/>				
+			</factory>
+		</xslt>
+	</target>
+	
 	<target name="agregace" description="Vytvoří agregované výstupy: RSS, Atom, Sitemap.xml." depends="kompiluj-funkce">
 		<!-- TODO: sloučit, zjednodušit, parametrizovat -->
 	
--- a/vstup/css/styl.css	Mon Aug 22 01:26:23 2011 +0200
+++ b/vstup/css/styl.css	Mon Aug 22 13:57:20 2011 +0200
@@ -55,3 +55,8 @@
 	text-align: center;
 }
 
+pre {
+	background-color: #ddf;
+	padding: 6px;
+	border-radius: 4px;
+}
--- a/vstup/produkty.xml	Mon Aug 22 01:26:23 2011 +0200
+++ b/vstup/produkty.xml	Mon Aug 22 13:57:20 2011 +0200
@@ -20,23 +20,6 @@
 		<p>Vivamus nec dictum dolor. Aliquam et tellus dolor. Curabitur et est sapien. Sed nec neque massa. Integer luctus erat vel arcu molestie ac dapibus dolor pretium. Curabitur eget augue non ipsum pulvinar venenatis eget et lectus. Proin fringilla aliquet sapien, non luctus est lobortis vel. Nunc vehicula volutpat varius. Aliquam suscipit accumsan sollicitudin. Morbi ultricies, mauris id elementum pellentesque, nunc dolor viverra nisl, sit amet consequat velit libero at ligula. Nulla luctus rhoncus tortor nec sollicitudin. Vivamus posuere sodales ipsum, hendrerit cursus felis pharetra sit amet. Nunc interdum facilisis massa ac congue.</p>
 		<p>Aliquam erat volutpat. Quisque vitae libero est. Aliquam erat volutpat. Integer elementum, nisl nec lacinia facilisis, dolor tellus varius eros, sit amet facilisis sem sapien vitae nulla. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer rutrum sodales venenatis. Donec mollis aliquet enim, id venenatis urna faucibus sed. Suspendisse pharetra neque et nibh tincidunt suscipit. Morbi ut justo sit amet lectus faucibus tempor quis non libero. Aenean in dolor sem, in lacinia sem.</p>
 		
-		
-
-		<m:pre jazyk="java">public class Pokus {
-		// komentář
-		// &lt;blee/&gt;
-}</m:pre>
-
-		<m:pre jazyk="xml"><![CDATA[<xmlDokument>
-	<element1>toto je <strong>pěkné</strong> XML!!!</element1>
-</xmlDokument>]]></m:pre>
-
-		<m:pre jazyk="xxxxxxxx">chybný jazyk → syntaxe nebude zvýrazněna</m:pre>
-		
-		<m:pre>#!/bin/bash
-# tento kód nebude zvýrazněn, protože atribut „jazyk“ chybí
-# &lt;blee/&gt;</m:pre>
-		
 		<p>Vhodnost zvířete do domácnosti:</p>
 		<m:měřák hodnota="80"/>
     </text>
--- a/vstup/služby.xml	Mon Aug 22 01:26:23 2011 +0200
+++ b/vstup/služby.xml	Mon Aug 22 13:57:20 2011 +0200
@@ -1,4 +1,6 @@
-<stránka xmlns="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/strana">
+<stránka 
+	xmlns="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/strana"
+	xmlns:m="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/makro">
 	<nadpis>Služby</nadpis>
 	<perex>Co poskytujeme.</perex>
 	<pořadí>30</pořadí>
@@ -6,7 +8,7 @@
 	<text xmlns="http://www.w3.org/1999/xhtml">
 
 		<p>Naše služby jsou ty nejlepší ze všech. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed mi nisl, tincidunt in viverra vitae, pharetra nec urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer gravida gravida convallis. Phasellus erat ligula, vestibulum vel commodo ac, fringilla quis lorem. Morbi a massa a ligula tincidunt mattis et et felis. Vivamus a quam nulla, at vulputate nisi. Duis gravida placerat luctus. Phasellus vehicula lobortis arcu vitae hendrerit. Maecenas ut molestie elit. Aliquam erat volutpat. Curabitur sed euismod nisl. Mauris molestie tristique nulla, eu pellentesque sem tincidunt non.</p>
-		<p>Morbi et magna a ligula pulvinar posuere. Pellentesque sit amet sem sed orci convallis tincidunt sed sed nisl. Aenean id nibh lorem, eget tempor mauris. Duis diam dui, ullamcorper quis iaculis eget, blandit non dolor. Vestibulum pretium lorem aliquet libero tristique vehicula. Quisque sit amet odio risus, sed tincidunt augue. Proin tincidunt eros eu sem sodales sit amet sollicitudin libero vestibulum. Proin sed nunc elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam mollis, nisl ut sodales sodales, quam lacus elementum magna, nec blandit leo enim id odio. Integer risus leo, sagittis vitae vestibulum vitae, elementum eu eros.	</p>
+		<p>Morbi et magna a ligula pulvinar posuere. Podívejte se také na naše <m:a href="zdrojáky">zdrojové kódy</m:a>. Pellentesque sit amet sem sed orci convallis tincidunt sed sed nisl. Aenean id nibh lorem, eget tempor mauris. Duis diam dui, ullamcorper quis iaculis eget, blandit non dolor. Vestibulum pretium lorem aliquet libero tristique vehicula. Quisque sit amet odio risus, sed tincidunt augue. Proin tincidunt eros eu sem sodales sit amet sollicitudin libero vestibulum. Proin sed nunc elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam mollis, nisl ut sodales sodales, quam lacus elementum magna, nec blandit leo enim id odio. Integer risus leo, sagittis vitae vestibulum vitae, elementum eu eros.	</p>
 		
 		<h2>Pravidelné krmení ptáků</h2>
 		<p>Fusce eu libero sit amet mauris molestie suscipit. Integer porttitor euismod luctus. Sed elementum quam et quam pharetra tincidunt. Pellentesque vitae augue quis mi blandit dapibus. Vestibulum iaculis magna sit amet nisl tristique at consectetur odio blandit. Proin aliquam lectus ac arcu condimentum tempus. Suspendisse potenti. Suspendisse porttitor euismod accumsan. Sed nibh lacus, laoreet id consequat gravida, eleifend eget lectus. Curabitur accumsan, nisi at elementum aliquam, nisl nulla volutpat lorem, ac elementum metus lacus eget lectus. Praesent odio nulla, porttitor vitae hendrerit vel, ullamcorper in velit. Sed in est ipsum, iaculis accumsan sem. Integer pretium ultrices justo a mattis. Nullam id lacus in lectus bibendum tempor. Nulla non viverra eros. Praesent scelerisque, nisi et placerat convallis, nisi nulla lobortis mauris, eu ultricies est mi ac orci. Suspendisse ullamcorper dapibus interdum. Curabitur ac metus eros, sed venenatis sapien.</p>
--- a/vstup/web.conf	Mon Aug 22 01:26:23 2011 +0200
+++ b/vstup/web.conf	Mon Aug 22 13:57:20 2011 +0200
@@ -22,6 +22,7 @@
 		Můžeme jich uvést libovolné množství.
 	-->
 	<css>css/styl.css</css>
+	<css>css/syntaxe.css</css>
 	<js>js/skript.js</js>
 	
 </web>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vstup/zdrojáky.xml	Mon Aug 22 13:57:20 2011 +0200
@@ -0,0 +1,85 @@
+<stránka
+	xmlns="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/strana"
+	xmlns:m="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/makro">
+	<nadpis>Zdrojové kódy</nadpis>
+	<perex>Ukázka našich zdrojových kódů.</perex>
+
+	<text xmlns="http://www.w3.org/1999/xhtml">
+		
+		<p>Zde je malá ukázka našich zdrojových kódů. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed mi nisl, tincidunt in viverra vitae, pharetra nec urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer gravida gravida convallis. Phasellus erat ligula, vestibulum vel commodo ac, fringilla quis lorem. Morbi a massa a ligula tincidunt mattis et et felis. Vivamus a quam nulla, at vulputate nisi. Duis gravida placerat luctus. Phasellus vehicula lobortis arcu vitae hendrerit. Maecenas ut molestie elit. Aliquam erat volutpat. Curabitur sed euismod nisl. Mauris molestie tristique nulla, eu pellentesque sem tincidunt non.</p>
+		<p>Morbi et magna a ligula pulvinar posuere. Pellentesque sit amet sem sed orci convallis tincidunt sed sed nisl. Aenean id nibh lorem, eget tempor mauris. Duis diam dui, ullamcorper quis iaculis eget, blandit non dolor. Vestibulum pretium lorem aliquet libero tristique vehicula. Quisque sit amet odio risus, sed tincidunt augue. Proin tincidunt eros eu sem sodales sit amet sollicitudin libero vestibulum. Proin sed nunc elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam mollis, nisl ut sodales sodales, quam lacus elementum magna, nec blandit leo enim id odio. Integer risus leo, sagittis vitae vestibulum vitae, elementum eu eros.	</p>
+		
+		<h2>C++</h2>
+		<p>Ukázka převzatá ze stránky <a href="https://podnik.frantovo.cz/s/zdrojovy-kod">Zdrojový kód</a>:</p>
+		
+		<m:pre jazyk="cpp"><![CDATA[# include <iostream>
+using namespace std;
+
+int main(int argc, char *argv[]) {
+
+	cout << "Chcete slyšet vtip?" << endl;	
+	char odpoved = cin.get();
+	cin.get();
+	
+	if (odpoved == 'a') {
+		cout
+		<< "Lidé se dělí do 10 skupin." << endl
+		<< "Na ty, kteří rozumějí binárnímu kódu, "
+		<< "a na ty ostatní." << endl;
+		return 0;
+	} else if (odpoved == 'n') {
+		cout << "Dobře, tak ne." << endl;
+		return 0;
+	} else {
+		cout
+		<< "Nerozumím odpovědi "
+		<< "– očekávám „ano“ nebo „ne“." << endl;
+		return 1;
+	}
+}]]></m:pre>		
+		
+		<h2>Java</h2>
+		
+		<m:pre jazyk="java">public class Pokus {
+		// komentář
+		// &lt;JavaRulezz/&gt;
+}</m:pre>
+
+		<h2>XML</h2>
+		
+		<m:pre jazyk="xml"><![CDATA[<xmlDokument>
+	<element1>toto je <strong>pěkné</strong> XML!!!</element1>
+</xmlDokument>]]></m:pre>
+
+		<h2>BASH</h2>
+		
+		<m:pre jazyk="bash">#!/bin/bash
+# Matrixový spořič :-)
+
+case "$1" in
+    start)
+        echo -e "\033[22;32m";
+        cat /dev/urandom | hexdump;
+;;
+    stop)
+        echo -e "\033[0m";
+;;
+    *)
+        $0 start;
+;;
+esac</m:pre>
+
+		<h2>Chyby</h2>
+		
+		<p>Následující ukázky kódu nebudou zvýrazněné:</p>
+
+		<m:pre jazyk="xxxxxxxx">Nepodporovaný jazyk → syntaxe nebude zvýrazněna &lt;blee/&gt;</m:pre>
+		
+		<m:pre>#!/bin/bash
+# tento kód nebude zvýrazněn, protože atribut „jazyk“ chybí
+# &lt;blee/&gt;</m:pre>
+		
+		
+    </text>
+
+</stránka>
--- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java	Mon Aug 22 01:26:23 2011 +0200
+++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java	Mon Aug 22 13:57:20 2011 +0200
@@ -39,7 +39,9 @@
 	 * @param zdroják zdrojový kód, který předáme příkazu pygmentize na standardním vstupu
 	 * @param jazyk předáme příkazu pygmentize jako parametr -l &lt;lexer&gt;
 	 * @return zvýrazněný text nebo null, pokud došlo k chybě.
-	 * TODO: použít (?) místo textu instanci com.icl.saxon.om.NodeInfo http://saxon.sourceforge.net/saxon6.5.3/extensibility.html
+	 * TODO: 
+	 *	- použít (?) místo textu instanci com.icl.saxon.om.NodeInfo http://saxon.sourceforge.net/saxon6.5.3/extensibility.html
+	 *  - nebo kontrolovat validitu vygenerovaného kódu (v současnosti se spoléháme na bezchybnost pygmentize)
 	 */
 	public static String zvýrazniSyntaxi(String zdroják, String jazyk) throws IOException, InterruptedException {
 		if (jazyk == null || jazyk.length() == 0) {
@@ -75,6 +77,20 @@
 	}
 
 	/**
+	 * Vygeneruje CSS styl pro zvýrazňování syntaxe.
+	 * @return obsah CSS souboru nebo null, pokud generování nebylo možné
+	 */
+	public static String generujCssSyntaxe() throws IOException, InterruptedException {
+		if (isPrikazDostupny(PŘÍKAZ_PYGMENTIZE)) {
+			Runtime r = Runtime.getRuntime();
+			Process p = r.exec(new String[]{PŘÍKAZ_PYGMENTIZE, "-S", "default", "-f", "html"});
+			return načtiProud(p.getInputStream());
+		} else {
+			return null;
+		}
+	}
+
+	/**
 	 * Čte proud dat dokud to jde a výsledek pak vrátí jako text.
 	 * @param proud vstupní proud
 	 * @return obsah proudu jako text
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/šablona/syntaxe.xsl	Mon Aug 22 13:57:20 2011 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="2.0"
+	xmlns:k="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/konfigurace"
+	xmlns:j="java:cz.frantovo.xmlWebGenerator.Funkce"
+	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+	xmlns:fn="http://www.w3.org/2005/xpath-functions">
+	<xsl:output method="text" encoding="UTF-8"/>
+		
+	<xsl:template match="/">
+		<xsl:if test="k:web/k:css[text() = 'css/syntaxe.css']"><xsl:value-of select="j:generujCssSyntaxe()"/></xsl:if>
+	</xsl:template>
+
+</xsl:stylesheet>