Diagramy #13: možnost načítání ze souboru.
authorFrantišek Kučera <franta-hg@frantovo.cz>
Fri, 06 Jan 2012 21:58:52 +0100
changeset 52 a221785fe3ac
parent 51 df1f942f7b69
child 53 7403128a8e0a
Diagramy #13: možnost načítání ze souboru.
vstup/kočka-a-pes-oop.dot
vstup/zdrojáky.xml
šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java
šablona/makra/diagramy.xsl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vstup/kočka-a-pes-oop.dot	Fri Jan 06 21:58:52 2012 +0100
@@ -0,0 +1,18 @@
+digraph G {	
+	bgcolor="transparent";
+	
+	
+	// Třídy:
+	node	[shape = "record"]
+	Pes		[label = "{Pes|+ kouše : boolean\l|+ štěkej() : void\l}"];
+	Kočka	[label = "{Kočka|+ spí : boolean\l|+ mňoukej() : void\l}"];
+	Zvíře	[label = "{Zvíře|+ jméno : string\l+ věk : int\l|+ běhej() : void\l}"];
+	
+	
+	// Dědičnost:
+	edge	[arrowhead = "empty"]
+	
+	Pes		->	Zvíře
+	Kočka	->	Zvíře
+}
+
--- a/vstup/zdrojáky.xml	Fri Jan 06 20:48:42 2012 +0100
+++ b/vstup/zdrojáky.xml	Fri Jan 06 21:58:52 2012 +0100
@@ -64,7 +64,14 @@
 		<m:pre>#!/bin/bash
 # tento kód nebude zvýrazněn, protože atribut „jazyk“ chybí
 # &lt;blee/&gt;</m:pre>
+
+		<h2>Objekty</h2>
 		
+		<p>
+			Při vývoji softwaru používáme <abbr title="objektově orientované programování">OOP</abbr>.
+		</p>
+
+		<m:diagram src="kočka-a-pes-oop.dot" nadpis="Třídy Kočka a Pes jsou potomkem třídy Zvíře"/>
 		
     </text>
 
--- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java	Fri Jan 06 20:48:42 2012 +0100
+++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java	Fri Jan 06 21:58:52 2012 +0100
@@ -1,7 +1,6 @@
 package cz.frantovo.xmlWebGenerator;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.PrintStream;
 import java.util.Date;
@@ -23,7 +22,6 @@
 	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 ADRESÁŘ_VSTUPNÍ = "vstup";
 	private static final String ADRESÁŘ_VÝSTUPNÍ = "výstup";
 	private static int počítadloDiagramů = 0;
 
@@ -98,24 +96,30 @@
 	/**
 	 * Vytvoří obrázek s diagramem.
 	 * @param zadání definice diagramu ve formátu dot
-	 * @param vodorovně zda má být graf orientovaný vodorovně
+	 * @param vodorovně zda má být graf orientovaný vodorovně (funguje jen při <code>kompletní = false</code>)
+	 * @param kompletní false, pokud k zadání chceme doplnit <code>digraph d {…}</code>
 	 * @return název souboru bez přípony, který byl vytvořen, nebo null, pokud došlo k chybě.
 	 */
-	public static String vytvořDiagram(String zadání, boolean vodorovně) throws IOException, InterruptedException {
+	public static String vytvořDiagram(String zadání, boolean vodorovně, boolean kompletní) throws IOException, InterruptedException {
 		if (isPříkazDostupný(PŘÍKAZ_DOT)) {
 			počítadloDiagramů++;
 			String soubor = "diagram-" + počítadloDiagramů;
 			String souborSložka = ADRESÁŘ_VÝSTUPNÍ + File.separator + soubor;
 
-			StringBuilder zdroják = new StringBuilder(zadání.length() + 200);
-
-			zdroják.append("digraph d {\n");
-			zdroják.append("\tbgcolor=\"transparent\";\n");
-			if (vodorovně) {
-				zdroják.append("\trankdir=LR;");
+			String zdroják;
+			if (kompletní) {
+				zdroják = zadání;
+			} else {
+				StringBuilder b = new StringBuilder(zadání.length() + 200);
+				b.append("digraph d {\n");
+				b.append("\tbgcolor=\"transparent\";\n");
+				if (vodorovně) {
+					b.append("\trankdir=LR;");
+				}
+				b.append(zadání);
+				b.append("}\n");
+				zdroják = b.toString();
 			}
-			zdroják.append(zadání);
-			zdroják.append("}\n");
 
 			Runtime r = Runtime.getRuntime();
 			Process p = r.exec(new String[]{PŘÍKAZ_DOT, "-T", "svg", "-o", souborSložka + ".svg"});
--- a/šablona/makra/diagramy.xsl	Fri Jan 06 20:48:42 2012 +0100
+++ b/šablona/makra/diagramy.xsl	Fri Jan 06 21:58:52 2012 +0100
@@ -6,21 +6,36 @@
 	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 	exclude-result-prefixes="m j">
     
-    <!--
-    	Diagramy/grafy
-    	**************
-    	Můžeme vložit diagram – obrázek.
-    	Pro jejich vykreslování se používá Graphviz – diagramy zadáváme v jeho syntaxi.
-    	*
-    	@orientace „vodorovně“ nebo „svisle“ (výchozí)
-    	@nadpis můžeme uvést název diagramu
-    -->
-    <xsl:template match="m:diagram">
-    	<!-- 
-    		TODO: umožnit vkládání diagramů ze souboru (@src) 
-    	-->
-    	<xsl:variable name="souborDiagramu" select="j:vytvořDiagram(text(), @orientace = 'vodorovně')"/>
-    	<xsl:choose>
+	<!--
+		Diagramy/grafy
+		**************
+		Můžeme vložit diagram – obrázek.
+		Pro jejich vykreslování se používá Graphviz – diagramy zadáváme v jeho syntaxi.
+		*
+		@orientace „vodorovně“ nebo „svisle“ (výchozí)
+		@nadpis můžeme uvést název diagramu
+		@kompletní „ano“ → předpokládáme kompletní zdroják v GraphViz syntaxi (pak nemá smysl uvádět orientaci). Výchozí je však „ne“ → uživatel zadává jen „vnitřek“ grafu – např. „A -> B; B -> C;“.  
+		@src zadání diagramu načteme ze souboru (potom je výchozí kompletní = 'ne')
+	-->
+	<xsl:template match="m:diagram">
+		<xsl:call-template name="vložDiagram">
+			<xsl:with-param name="zadání" select="text()"/>
+			<xsl:with-param name="kompletní" select="@kompletní = 'ano'"/>
+		</xsl:call-template>
+	</xsl:template>
+	
+	<xsl:template match="m:diagram[@src]">
+		<xsl:call-template name="vložDiagram">
+			<xsl:with-param name="zadání" select="unparsed-text(concat('../', $vstup, @src))"/>
+			<xsl:with-param name="kompletní" select="not(@kompletní) or @kompletní = 'ano'"/>
+		</xsl:call-template>
+	</xsl:template>
+    
+    <xsl:template name="vložDiagram">
+		<xsl:param name="zadání"/>
+		<xsl:param name="kompletní"/>
+		<xsl:variable name="souborDiagramu" select="j:vytvořDiagram($zadání, @orientace = 'vodorovně', $kompletní)"/>
+		<xsl:choose>
 			<xsl:when test="$souborDiagramu">
 				<div class="diagram">
 					<a href="{$souborDiagramu}.svg">
@@ -33,10 +48,10 @@
 						TODO: SVG+PNG:
 						<xsl:variable name="svgDiagramu" select="document(concat($výstup, $souborDiagramu, '.svg'))/svg:svg"/>
 						<object
-							data="{$souborDiagramu}.svg"
-							type="image/svg+xml"
-							style="width: {$svgDiagramu/@width}; height: {$svgDiagramu/@height}">
-								<img src="{$souborDiagramu}.png" alt="Diagram {$souborDiagramu}"/>
+						data="{$souborDiagramu}.svg"
+						type="image/svg+xml"
+						style="width: {$svgDiagramu/@width}; height: {$svgDiagramu/@height}">
+						<img src="{$souborDiagramu}.png" alt="Diagram {$souborDiagramu}"/>
 						</object>
 					-->
 					<xsl:if test="@nadpis">
@@ -47,7 +62,7 @@
 			<xsl:otherwise>
 				<xsl:message terminate="yes">Při vytváření diagramu došlo k chybě.</xsl:message>
 			</xsl:otherwise>
-    	</xsl:choose>
-    </xsl:template>
+		</xsl:choose>
+	</xsl:template>
 
 </xsl:stylesheet>