diff -r da6ae32853cb -r 848da31dd379 š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 18:13:56 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