Diagramy #13 – první verze, celkem funguje.
--- a/vstup/css/styl.css Mon Aug 22 13:57:20 2011 +0200
+++ b/vstup/css/styl.css Tue Aug 23 16:45:30 2011 +0200
@@ -60,3 +60,23 @@
padding: 6px;
border-radius: 4px;
}
+
+.diagram {
+ background-color: #ddf;
+ padding: 6px;
+ border-radius: 4px;
+ text-align: center;
+ max-width: 100%;
+ overflow: auto;
+}
+
+.diagram .nadpis {
+ font-size: 60%;
+ padding: 4px;
+ margin-top: 6px;
+ margin-bottom: -6px;
+ margin-left: -6px;
+ margin-right: -6px;
+ background-color: #d0d0f0;
+ border-radius: 0px 0px 4px 4px;
+}
--- a/vstup/kontakt.xml Mon Aug 22 13:57:20 2011 +0200
+++ b/vstup/kontakt.xml Tue Aug 23 16:45:30 2011 +0200
@@ -1,4 +1,6 @@
-<stránka xmlns="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/strana">
+<stránka
+ xmlns="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/strana"
+ xmlns:m="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/makro">
<nadpis>Kontakt</nadpis>
<perex>Kde nás najdete.</perex>
<pořadí>60</pořadí>
@@ -12,6 +14,42 @@
Tučňákova Lhota<br/>
Česká republika
</p>
+
+ <h2>Organizační struktura</h2>
+
+ <p>
+ Zde je orgranizační struktura naší skvělé firmy:
+ </p>
+
+ <m:diagram nadpis="Naše organizační struktura">
+ tovarnik[label="pan továrník\n(majitel)"];
+ reditel[label="pan ředitel"];
+ sekretarka[label="slečna sekretářka"];
+ root[label="Linuxový guru"];
+ architekt[label="Softwarový architekt"];
+
+ tovarnik -> reditel;
+
+ reditel -> sekretarka;
+ reditel -> architekt;
+ reditel -> root;
+ </m:diagram>
+
+ <h2>Procesy</h2>
+
+ <p>
+ Ve firmě máme spoustu procesů. Jeden z nich vypadá takto:
+ </p>
+
+ <m:diagram orientace="vodorovně">
+ A -> B;
+ B -> C;
+ </m:diagram>
+
+ <p>
+ Ale protože je to tajné, tak vám neřekneme, co A, B a C znamenají.
+ </p>
+
</text>
</stránka>
--- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java Mon Aug 22 13:57:20 2011 +0200
+++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java Tue Aug 23 16:45:30 2011 +0200
@@ -13,14 +13,19 @@
/**
* Knihovna funkcí volaných z XSLT.
*
- * TODO: časem rozdělit na více modulů (jmenných prostorů).
+ * TODO:
+ * - rozdělit na více modulů (jmenných prostorů).
+ * - CLI konektor
*
* @author fiki
*/
public class Funkce {
private static final String PŘÍKAZ_PYGMENTIZE = "pygmentize";
+ private static final String PŘÍKAZ_DOT = "dot";
private static final String PŘÍKAZ_WHICH = "which";
+ private static final String ADRESÁŘ_VÝSTUPNÍ = "výstup";
+ private static int počítadloDiagramů = 0;
/**
* Zjištuje, kdy byl naposledy daný soubor změněn.
@@ -91,6 +96,57 @@
}
/**
+ * Vytvoří obrázek s diagramem.
+ * @param zadání definice diagramu ve formátu dot
+ * @param vodorovně zda má být graf orientovaný vodorovně
+ * @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 {
+ if (isPrikazDostupny(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;");
+ }
+ 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"});
+
+ /**
+ * TODO: generovat i PNG bitmapu
+ */
+ PrintStream vstupProcesu = new PrintStream(p.getOutputStream());
+ vstupProcesu.print(zdroják.toString());
+ vstupProcesu.close();
+
+ String chyby = načtiProud(p.getErrorStream());
+
+ p.waitFor();
+
+ if (chyby.length() == 0) {
+ return soubor;
+ } else {
+ System.err.print("Při vytváření diagramu došlo k chybě: " + chyby);
+ return null;
+ }
+ } else {
+ System.err.println("Příkaz " + PŘÍKAZ_DOT + " není na vašem systému dostupný → diagramy nelze vygreslit.");
+ System.err.println("Můžete ho nainstalovat pomocí:");
+ System.err.println("\t$ aptitude install graphviz # (Debian/Ubuntu)");
+ System.err.println("\t$ yum install graphviz # (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 Mon Aug 22 13:57:20 2011 +0200
+++ b/šablona/stránka.xsl Tue Aug 23 16:45:30 2011 +0200
@@ -129,6 +129,33 @@
<pre><xsl:apply-templates/></pre>
</xsl:otherwise>
</xsl:choose>
- </xsl:template>
+ </xsl:template>
+
+ <!--
+ Makro pro diagramy/grafy
+ -->
+ <xsl:template match="m:diagram">
+ <xsl:variable name="souborDiagramu" select="j:vytvořDiagram(text(), @orientace = 'vodorovně')"/>
+ <xsl:choose>
+ <xsl:when test="$souborDiagramu">
+ <div class="diagram">
+ <a href="{$souborDiagramu}.svg">
+ <img src="{$souborDiagramu}.svg" alt="Diagram {$souborDiagramu}"/>
+ </a>
+ <!-- TODO: SVG+PNG
+ <object data="{$souborDiagramu}.svg" type="image/svg+xml">
+ <img src="{$souborDiagramu}.png" alt="Diagram {$souborDiagramu}"/>
+ </object>
+ -->
+ <xsl:if test="@nadpis">
+ <p class="nadpis"><xsl:value-of select="@nadpis"/></p>
+ </xsl:if>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">Při vytváření diagramu došlo k chybě.</xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
</xsl:stylesheet>