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 52a221785fe3ac
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
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/vstup/kočka-a-pes-oop.dot	Fri Jan 06 21:58:52 2012 +0100
     1.3 @@ -0,0 +1,18 @@
     1.4 +digraph G {	
     1.5 +	bgcolor="transparent";
     1.6 +	
     1.7 +	
     1.8 +	// Třídy:
     1.9 +	node	[shape = "record"]
    1.10 +	Pes		[label = "{Pes|+ kouše : boolean\l|+ štěkej() : void\l}"];
    1.11 +	Kočka	[label = "{Kočka|+ spí : boolean\l|+ mňoukej() : void\l}"];
    1.12 +	Zvíře	[label = "{Zvíře|+ jméno : string\l+ věk : int\l|+ běhej() : void\l}"];
    1.13 +	
    1.14 +	
    1.15 +	// Dědičnost:
    1.16 +	edge	[arrowhead = "empty"]
    1.17 +	
    1.18 +	Pes		->	Zvíře
    1.19 +	Kočka	->	Zvíře
    1.20 +}
    1.21 +
     2.1 --- a/vstup/zdrojáky.xml	Fri Jan 06 20:48:42 2012 +0100
     2.2 +++ b/vstup/zdrojáky.xml	Fri Jan 06 21:58:52 2012 +0100
     2.3 @@ -64,7 +64,14 @@
     2.4  		<m:pre>#!/bin/bash
     2.5  # tento kód nebude zvýrazněn, protože atribut „jazyk“ chybí
     2.6  # &lt;blee/&gt;</m:pre>
     2.7 +
     2.8 +		<h2>Objekty</h2>
     2.9  		
    2.10 +		<p>
    2.11 +			Při vývoji softwaru používáme <abbr title="objektově orientované programování">OOP</abbr>.
    2.12 +		</p>
    2.13 +
    2.14 +		<m:diagram src="kočka-a-pes-oop.dot" nadpis="Třídy Kočka a Pes jsou potomkem třídy Zvíře"/>
    2.15  		
    2.16      </text>
    2.17  
     3.1 --- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java	Fri Jan 06 20:48:42 2012 +0100
     3.2 +++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java	Fri Jan 06 21:58:52 2012 +0100
     3.3 @@ -1,7 +1,6 @@
     3.4  package cz.frantovo.xmlWebGenerator;
     3.5  
     3.6  import java.io.File;
     3.7 -import java.io.FileInputStream;
     3.8  import java.io.IOException;
     3.9  import java.io.PrintStream;
    3.10  import java.util.Date;
    3.11 @@ -23,7 +22,6 @@
    3.12  	private static final String PŘÍKAZ_PYGMENTIZE = "pygmentize";
    3.13  	private static final String PŘÍKAZ_DOT = "dot";
    3.14  	private static final String PŘÍKAZ_MARKDOWN = "markdown";
    3.15 -	private static final String ADRESÁŘ_VSTUPNÍ = "vstup";
    3.16  	private static final String ADRESÁŘ_VÝSTUPNÍ = "výstup";
    3.17  	private static int počítadloDiagramů = 0;
    3.18  
    3.19 @@ -98,24 +96,30 @@
    3.20  	/**
    3.21  	 * Vytvoří obrázek s diagramem.
    3.22  	 * @param zadání definice diagramu ve formátu dot
    3.23 -	 * @param vodorovně zda má být graf orientovaný vodorovně
    3.24 +	 * @param vodorovně zda má být graf orientovaný vodorovně (funguje jen při <code>kompletní = false</code>)
    3.25 +	 * @param kompletní false, pokud k zadání chceme doplnit <code>digraph d {…}</code>
    3.26  	 * @return název souboru bez přípony, který byl vytvořen, nebo null, pokud došlo k chybě.
    3.27  	 */
    3.28 -	public static String vytvořDiagram(String zadání, boolean vodorovně) throws IOException, InterruptedException {
    3.29 +	public static String vytvořDiagram(String zadání, boolean vodorovně, boolean kompletní) throws IOException, InterruptedException {
    3.30  		if (isPříkazDostupný(PŘÍKAZ_DOT)) {
    3.31  			počítadloDiagramů++;
    3.32  			String soubor = "diagram-" + počítadloDiagramů;
    3.33  			String souborSložka = ADRESÁŘ_VÝSTUPNÍ + File.separator + soubor;
    3.34  
    3.35 -			StringBuilder zdroják = new StringBuilder(zadání.length() + 200);
    3.36 -
    3.37 -			zdroják.append("digraph d {\n");
    3.38 -			zdroják.append("\tbgcolor=\"transparent\";\n");
    3.39 -			if (vodorovně) {
    3.40 -				zdroják.append("\trankdir=LR;");
    3.41 +			String zdroják;
    3.42 +			if (kompletní) {
    3.43 +				zdroják = zadání;
    3.44 +			} else {
    3.45 +				StringBuilder b = new StringBuilder(zadání.length() + 200);
    3.46 +				b.append("digraph d {\n");
    3.47 +				b.append("\tbgcolor=\"transparent\";\n");
    3.48 +				if (vodorovně) {
    3.49 +					b.append("\trankdir=LR;");
    3.50 +				}
    3.51 +				b.append(zadání);
    3.52 +				b.append("}\n");
    3.53 +				zdroják = b.toString();
    3.54  			}
    3.55 -			zdroják.append(zadání);
    3.56 -			zdroják.append("}\n");
    3.57  
    3.58  			Runtime r = Runtime.getRuntime();
    3.59  			Process p = r.exec(new String[]{PŘÍKAZ_DOT, "-T", "svg", "-o", souborSložka + ".svg"});
     4.1 --- a/šablona/makra/diagramy.xsl	Fri Jan 06 20:48:42 2012 +0100
     4.2 +++ b/šablona/makra/diagramy.xsl	Fri Jan 06 21:58:52 2012 +0100
     4.3 @@ -6,21 +6,36 @@
     4.4  	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     4.5  	exclude-result-prefixes="m j">
     4.6      
     4.7 -    <!--
     4.8 -    	Diagramy/grafy
     4.9 -    	**************
    4.10 -    	Můžeme vložit diagram – obrázek.
    4.11 -    	Pro jejich vykreslování se používá Graphviz – diagramy zadáváme v jeho syntaxi.
    4.12 -    	*
    4.13 -    	@orientace „vodorovně“ nebo „svisle“ (výchozí)
    4.14 -    	@nadpis můžeme uvést název diagramu
    4.15 -    -->
    4.16 -    <xsl:template match="m:diagram">
    4.17 -    	<!-- 
    4.18 -    		TODO: umožnit vkládání diagramů ze souboru (@src) 
    4.19 -    	-->
    4.20 -    	<xsl:variable name="souborDiagramu" select="j:vytvořDiagram(text(), @orientace = 'vodorovně')"/>
    4.21 -    	<xsl:choose>
    4.22 +	<!--
    4.23 +		Diagramy/grafy
    4.24 +		**************
    4.25 +		Můžeme vložit diagram – obrázek.
    4.26 +		Pro jejich vykreslování se používá Graphviz – diagramy zadáváme v jeho syntaxi.
    4.27 +		*
    4.28 +		@orientace „vodorovně“ nebo „svisle“ (výchozí)
    4.29 +		@nadpis můžeme uvést název diagramu
    4.30 +		@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;“.  
    4.31 +		@src zadání diagramu načteme ze souboru (potom je výchozí kompletní = 'ne')
    4.32 +	-->
    4.33 +	<xsl:template match="m:diagram">
    4.34 +		<xsl:call-template name="vložDiagram">
    4.35 +			<xsl:with-param name="zadání" select="text()"/>
    4.36 +			<xsl:with-param name="kompletní" select="@kompletní = 'ano'"/>
    4.37 +		</xsl:call-template>
    4.38 +	</xsl:template>
    4.39 +	
    4.40 +	<xsl:template match="m:diagram[@src]">
    4.41 +		<xsl:call-template name="vložDiagram">
    4.42 +			<xsl:with-param name="zadání" select="unparsed-text(concat('../', $vstup, @src))"/>
    4.43 +			<xsl:with-param name="kompletní" select="not(@kompletní) or @kompletní = 'ano'"/>
    4.44 +		</xsl:call-template>
    4.45 +	</xsl:template>
    4.46 +    
    4.47 +    <xsl:template name="vložDiagram">
    4.48 +		<xsl:param name="zadání"/>
    4.49 +		<xsl:param name="kompletní"/>
    4.50 +		<xsl:variable name="souborDiagramu" select="j:vytvořDiagram($zadání, @orientace = 'vodorovně', $kompletní)"/>
    4.51 +		<xsl:choose>
    4.52  			<xsl:when test="$souborDiagramu">
    4.53  				<div class="diagram">
    4.54  					<a href="{$souborDiagramu}.svg">
    4.55 @@ -33,10 +48,10 @@
    4.56  						TODO: SVG+PNG:
    4.57  						<xsl:variable name="svgDiagramu" select="document(concat($výstup, $souborDiagramu, '.svg'))/svg:svg"/>
    4.58  						<object
    4.59 -							data="{$souborDiagramu}.svg"
    4.60 -							type="image/svg+xml"
    4.61 -							style="width: {$svgDiagramu/@width}; height: {$svgDiagramu/@height}">
    4.62 -								<img src="{$souborDiagramu}.png" alt="Diagram {$souborDiagramu}"/>
    4.63 +						data="{$souborDiagramu}.svg"
    4.64 +						type="image/svg+xml"
    4.65 +						style="width: {$svgDiagramu/@width}; height: {$svgDiagramu/@height}">
    4.66 +						<img src="{$souborDiagramu}.png" alt="Diagram {$souborDiagramu}"/>
    4.67  						</object>
    4.68  					-->
    4.69  					<xsl:if test="@nadpis">
    4.70 @@ -47,7 +62,7 @@
    4.71  			<xsl:otherwise>
    4.72  				<xsl:message terminate="yes">Při vytváření diagramu došlo k chybě.</xsl:message>
    4.73  			</xsl:otherwise>
    4.74 -    	</xsl:choose>
    4.75 -    </xsl:template>
    4.76 +		</xsl:choose>
    4.77 +	</xsl:template>
    4.78  
    4.79  </xsl:stylesheet>