# HG changeset patch # User František Kučera <franta-hg@frantovo.cz> # Date 1314110730 -7200 # Node ID 6bc25517ac4f241c5b2315fd10337e58c37dce68 # Parent da6ae32853cb837f74bac70de45de13f8bf35c83 Diagramy #13 – první verze, celkem funguje. diff -r da6ae32853cb -r 6bc25517ac4f vstup/css/styl.css --- 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; +} diff -r da6ae32853cb -r 6bc25517ac4f vstup/kontakt.xml --- 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> diff -r da6ae32853cb -r 6bc25517ac4f šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java --- 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 diff -r da6ae32853cb -r 6bc25517ac4f šablona/stránka.xsl --- 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>