Zvýrazňování syntaxe #12 – začátek.
authorFrantišek Kučera <franta-hg@frantovo.cz>
Mon, 22 Aug 2011 00:23:38 +0200
changeset 27 037a9f20bf3a
parent 26 32e192fb934a
child 28 3298cafa8686
Zvýrazňování syntaxe #12 – začátek.
vstup/produkty.xml
šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java
šablona/stránka.xsl
--- a/vstup/produkty.xml	Wed Jul 06 23:42:32 2011 +0200
+++ b/vstup/produkty.xml	Mon Aug 22 00:23:38 2011 +0200
@@ -20,6 +20,20 @@
 		<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>#!/bin/bash
+# tento kód nebude zvýrazněn
+# &lt;blee/&gt;</m:pre>
+
+		<m:pre jazyk="java">public class Pokus {
+		// komentář
+		// &lt;blee/&gt;
+}</m:pre>
+
+	<m:pre jazyk="grrrrrrr">public class Pokus {
+		// komentář
+		// &lt;blee/&gt;
+}</m:pre>
+		
 		<p>Vhodnost zvířete do domácnosti:</p>
 		<m:měřák hodnota="80"/>
     </text>
--- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java	Wed Jul 06 23:42:32 2011 +0200
+++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java	Mon Aug 22 00:23:38 2011 +0200
@@ -1,13 +1,81 @@
 package cz.frantovo.xmlWebGenerator;
 
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.PrintStream;
 import java.util.Date;
 import java.net.URI;
 import java.net.URISyntaxException;
 
 public class Funkce {
+
 	public static Date posledníZměna(String soubor) throws URISyntaxException {
 		return new Date(new File(new URI(soubor)).lastModified());
 	}
+
+	/**
+	 * Zvýrazňuje syntaxi zdrojového kódu. Používá k tomu externí program/knihovnu pygmentize.
+	 * @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 TODO: použít (?) místo textu instanci com.icl.saxon.om.NodeInfo http://saxon.sourceforge.net/saxon6.5.3/extensibility.html
+	 */
+	public static String zvýrazniSyntaxi(String zdroják, String jazyk) throws IOException, InterruptedException {
+		String příkaz = "pygmentizexxx";
+
+		if (isPrikazDostupny(příkaz)) {
+			Runtime r = Runtime.getRuntime();
+			Process p = r.exec(new String[]{příkaz, "-f", "html", "-l", jazyk});
+
+			PrintStream vstupProcesu = new PrintStream(p.getOutputStream());
+			vstupProcesu.print(zdroják);
+			vstupProcesu.close();
+
+			String výsledek = načtiProud(p.getInputStream());
+			String chyby = načtiProud(p.getErrorStream());
+
+			p.waitFor();
+
+			if (chyby.length() == 0) {
+				return výsledek;
+			} else {
+				System.err.println("Při zvýrazňování syntaxe došlo k chybě: " + chyby);
+				return "______chyba_____";
+			}
+		} else {
+			System.err.println("Příkaz " + příkaz + " není na vašem systému dostupný → zvýrazňování syntaxe nebude fungovat.");
+			System.err.println("Můžete ho nainstalovat pomocí: aptitude install python-pygments");
+			// TODO: příkaz pro Fedoru/RedHat
+			// TODO: vracet escapovaný zdroják v <pre/>
+			return "__xxx____chyba_____";
+		}
+	}
+
+	private static String načtiProud(InputStream proud) throws IOException {
+		StringBuilder výsledek = new StringBuilder();
+		BufferedReader buf = new BufferedReader(new InputStreamReader(proud));
+		while (true) {
+			String radek = buf.readLine();
+			if (radek == null) {
+				break;
+			} else {
+				výsledek.append(radek);
+				výsledek.append("\n");
+			}
+		}
+		return výsledek.toString();
+	}
+
+	private static boolean isPrikazDostupny(String příkaz) {
+		try {
+			Runtime r = Runtime.getRuntime();
+			Process p = r.exec(new String[]{"which", příkaz});
+			p.waitFor();
+			return p.exitValue() == 0;
+		} catch (Exception e) {
+			return false;
+		}
+	}
 }
-
--- a/šablona/stránka.xsl	Wed Jul 06 23:42:32 2011 +0200
+++ b/šablona/stránka.xsl	Mon Aug 22 00:23:38 2011 +0200
@@ -5,11 +5,12 @@
 	xmlns:s="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/strana"
 	xmlns:k="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/konfigurace"
 	xmlns:m="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/makro"
+	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"
 	xmlns:svg="http://www.w3.org/2000/svg"
 	xmlns:xs="http://www.w3.org/2001/XMLSchema"
-	exclude-result-prefixes="fn h s k m xs">
+	exclude-result-prefixes="fn h s k m j xs">
 	<xsl:output 
 		method="xml" 
 		indent="yes" 
@@ -112,5 +113,17 @@
     		<xsl:apply-templates/>
     	</a>
     </xsl:template>
+    
+    <!--
+    	Makro pro zvýraznění syntaxe:
+    -->    
+    <xsl:template match="m:pre[@jazyk]">
+    	<xsl:value-of disable-output-escaping="yes" select="j:zvýrazniSyntaxi(text(), @jazyk)"/>
+    </xsl:template>
+    <xsl:template match="m:pre">
+    	<!-- Pokud jazyk uveden není, nic nezvýrazňujeme. -->
+    	<pre><xsl:apply-templates/></pre>    	
+    </xsl:template>
+    
 
 </xsl:stylesheet>