Diagramy #13: možnost načítání ze souboru.
--- /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í
# <blee/></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>