Wiki syntaxe #7 – základ, podpora Markdown syntaxe.
authorFrantišek Kučera <franta-hg@frantovo.cz>
Tue, 13 Sep 2011 18:06:07 +0200
changeset 37 2e4e7891a2f7
parent 36 5be21d1ef5f8
child 38 43505795334d
Wiki syntaxe #7 – základ, podpora Markdown syntaxe.
vstup/služby.xml
šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java
šablona/stránka.xsl
--- a/vstup/služby.xml	Tue Aug 23 20:05:56 2011 +0200
+++ b/vstup/služby.xml	Tue Sep 13 18:06:07 2011 +0200
@@ -14,11 +14,18 @@
 		<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>
 		<p>Účtováno měsíčním paušálem.</p>
 		
+		<m:wiki>
+Pravidelné krmení savců
+-----------------------
+
+Tato služba je určena především pro pakoně a slony, vhodná je ale i pro jednorožce. _Vivamus nec dictum dolor_. Aliquam et tellus dolor. Curabitur et est sapien. Sed nec neque massa. Markdown 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.
+
+Aliquam erat volutpat. Quisque vitae libero est. Aliquam erat volutpat. [Integer](http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html) 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.
+
+Účtováno měsíčním paušálem.
+		</m:wiki>
 		
-		<h2>Pravidelné krmení savců</h2>
-		<p>Tato služba je určena především pro pakoně a slony, vhodná je ale i pro jednorožce. 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>
-		<p>Účtováno měsíčním paušálem.</p>
+		
 		
 		<h2>Jednorázová výměna podestýlky</h2>
 		<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>
--- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java	Tue Aug 23 20:05:56 2011 +0200
+++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java	Tue Sep 13 18:06:07 2011 +0200
@@ -23,6 +23,7 @@
 
 	private static final String PŘÍKAZ_PYGMENTIZE = "pygmentize";
 	private static final String PŘÍKAZ_DOT = "dot";
+	private static final String PŘÍKAZ_MARKDOWN = "markdown";
 	private static final String PŘÍKAZ_WHICH = "which";
 	private static final String ADRESÁŘ_VÝSTUPNÍ = "výstup";
 	private static int počítadloDiagramů = 0;
@@ -147,6 +148,43 @@
 	}
 
 	/**
+	 * Převede text ve wiki syntaxi do XHTML.
+	 * @param wiki vstupní text v dané wiki syntaxi
+	 * @param syntaxe null nebo volitelně syntaxe (markdown, texy)
+	 * @return naformátované XHTML
+	 */
+	public static String formátujWiki(String wiki, String syntaxe) throws IOException {
+		if (isPříkazDostupný(PŘÍKAZ_MARKDOWN)) {
+			Runtime r = Runtime.getRuntime();
+			Process p = r.exec(new String[]{PŘÍKAZ_MARKDOWN});
+
+			/**
+			 * TODO: oříznout mezery na začátcích řádků, pokud je jich všude stejně?
+			 * (odsazení v XML)
+			 */
+			PrintStream vstupProcesu = new PrintStream(p.getOutputStream());
+			vstupProcesu.print(wiki);
+			vstupProcesu.close();
+
+			String chyby = načtiProud(p.getErrorStream());
+			String xhtml = načtiProud(p.getInputStream());
+
+			if (chyby.length() == 0) {
+				return xhtml;
+			} else {
+				System.err.print("Při zpracování wiki syntaxe došlo k chybě: " + chyby);
+				return null;
+			}
+		} else {
+			System.err.println("Příkaz " + PŘÍKAZ_MARKDOWN + " není na vašem systému dostupný → nelze formátovat texty ve wiki syntaxi.");
+			System.err.println("Můžete ho nainstalovat pomocí:");
+			System.err.println("\t$ aptitude install markdown         # (Debian/Ubuntu)");
+			System.err.println("\t$ yum install perl-Text-Markdown    # (Fedora/RedHat)");
+			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
--- a/šablona/stránka.xsl	Tue Aug 23 20:05:56 2011 +0200
+++ b/šablona/stránka.xsl	Tue Sep 13 18:06:07 2011 +0200
@@ -169,5 +169,20 @@
 			</xsl:otherwise>
     	</xsl:choose>
     </xsl:template>
+    
+    <!--
+    	Makro pro Wiki syntaxi
+    -->
+    <xsl:template match="m:wiki">
+    	<xsl:variable name="wikiXHTML" select="j:formátujWiki(text(), @syntaxe)"/>
+    	<xsl:choose>
+			<xsl:when test="$wikiXHTML">
+				<xsl:value-of select="$wikiXHTML" disable-output-escaping="yes"/>
+			</xsl:when>
+			<xsl:otherwise>
+				<xsl:message terminate="yes">Při zpracování wiki syntaxe došlo k chybě.</xsl:message>
+			</xsl:otherwise>
+		</xsl:choose>
+    </xsl:template>
 
 </xsl:stylesheet>