1.1 --- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java Mon Aug 22 13:57:20 2011 +0200
1.2 +++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java Tue Aug 23 18:23:55 2011 +0200
1.3 @@ -13,14 +13,19 @@
1.4 /**
1.5 * Knihovna funkcí volaných z XSLT.
1.6 *
1.7 - * TODO: časem rozdělit na více modulů (jmenných prostorů).
1.8 + * TODO:
1.9 + * - rozdělit na více modulů (jmenných prostorů).
1.10 + * - CLI konektor
1.11 *
1.12 * @author fiki
1.13 */
1.14 public class Funkce {
1.15
1.16 private static final String PŘÍKAZ_PYGMENTIZE = "pygmentize";
1.17 + private static final String PŘÍKAZ_DOT = "dot";
1.18 private static final String PŘÍKAZ_WHICH = "which";
1.19 + private static final String ADRESÁŘ_VÝSTUPNÍ = "výstup";
1.20 + private static int počítadloDiagramů = 0;
1.21
1.22 /**
1.23 * Zjištuje, kdy byl naposledy daný soubor změněn.
1.24 @@ -91,6 +96,57 @@
1.25 }
1.26
1.27 /**
1.28 + * Vytvoří obrázek s diagramem.
1.29 + * @param zadání definice diagramu ve formátu dot
1.30 + * @param vodorovně zda má být graf orientovaný vodorovně
1.31 + * @return název souboru bez přípony, který byl vytvořen, nebo null, pokud došlo k chybě.
1.32 + */
1.33 + public static String vytvořDiagram(String zadání, boolean vodorovně) throws IOException, InterruptedException {
1.34 + if (isPrikazDostupny(PŘÍKAZ_DOT)) {
1.35 + počítadloDiagramů++;
1.36 + String soubor = "diagram-" + počítadloDiagramů;
1.37 + String souborSložka = ADRESÁŘ_VÝSTUPNÍ + File.separator + soubor;
1.38 +
1.39 + StringBuilder zdroják = new StringBuilder(zadání.length() + 200);
1.40 +
1.41 + zdroják.append("digraph d {\n");
1.42 + zdroják.append("\tbgcolor=\"transparent\";\n");
1.43 + if (vodorovně) {
1.44 + zdroják.append("\trankdir=LR;");
1.45 + }
1.46 + zdroják.append(zadání);
1.47 + zdroják.append("}\n");
1.48 +
1.49 + Runtime r = Runtime.getRuntime();
1.50 + Process p = r.exec(new String[]{PŘÍKAZ_DOT, "-T", "svg", "-o", souborSložka + ".svg"});
1.51 +
1.52 + /**
1.53 + * TODO: generovat i PNG bitmapu
1.54 + */
1.55 + PrintStream vstupProcesu = new PrintStream(p.getOutputStream());
1.56 + vstupProcesu.print(zdroják.toString());
1.57 + vstupProcesu.close();
1.58 +
1.59 + String chyby = načtiProud(p.getErrorStream());
1.60 +
1.61 + p.waitFor();
1.62 +
1.63 + if (chyby.length() == 0) {
1.64 + return soubor;
1.65 + } else {
1.66 + System.err.print("Při vytváření diagramu došlo k chybě: " + chyby);
1.67 + return null;
1.68 + }
1.69 + } else {
1.70 + System.err.println("Příkaz " + PŘÍKAZ_DOT + " není na vašem systému dostupný → diagramy nelze vygreslit.");
1.71 + System.err.println("Můžete ho nainstalovat pomocí:");
1.72 + System.err.println("\t$ aptitude install graphviz # (Debian/Ubuntu)");
1.73 + System.err.println("\t$ yum install graphviz # (Fedora/RedHat)");
1.74 + return null;
1.75 + }
1.76 + }
1.77 +
1.78 + /**
1.79 * Čte proud dat dokud to jde a výsledek pak vrátí jako text.
1.80 * @param proud vstupní proud
1.81 * @return obsah proudu jako text