11 import java.net.URISyntaxException; |
11 import java.net.URISyntaxException; |
12 |
12 |
13 /** |
13 /** |
14 * Knihovna funkcí volaných z XSLT. |
14 * Knihovna funkcí volaných z XSLT. |
15 * |
15 * |
16 * TODO: časem rozdělit na více modulů (jmenných prostorů). |
16 * TODO: |
|
17 * - rozdělit na více modulů (jmenných prostorů). |
|
18 * - CLI konektor |
17 * |
19 * |
18 * @author fiki |
20 * @author fiki |
19 */ |
21 */ |
20 public class Funkce { |
22 public class Funkce { |
21 |
23 |
22 private static final String PŘÍKAZ_PYGMENTIZE = "pygmentize"; |
24 private static final String PŘÍKAZ_PYGMENTIZE = "pygmentize"; |
|
25 private static final String PŘÍKAZ_DOT = "dot"; |
23 private static final String PŘÍKAZ_WHICH = "which"; |
26 private static final String PŘÍKAZ_WHICH = "which"; |
|
27 private static final String ADRESÁŘ_VÝSTUPNÍ = "výstup"; |
|
28 private static int počítadloDiagramů = 0; |
24 |
29 |
25 /** |
30 /** |
26 * Zjištuje, kdy byl naposledy daný soubor změněn. |
31 * Zjištuje, kdy byl naposledy daný soubor změněn. |
27 * @param soubor cesta k souboru |
32 * @param soubor cesta k souboru |
28 * @return datum poslední změny |
33 * @return datum poslední změny |
89 return null; |
94 return null; |
90 } |
95 } |
91 } |
96 } |
92 |
97 |
93 /** |
98 /** |
|
99 * Vytvoří obrázek s diagramem. |
|
100 * @param zadání definice diagramu ve formátu dot |
|
101 * @param vodorovně zda má být graf orientovaný vodorovně |
|
102 * @return název souboru bez přípony, který byl vytvořen, nebo null, pokud došlo k chybě. |
|
103 */ |
|
104 public static String vytvořDiagram(String zadání, boolean vodorovně) throws IOException, InterruptedException { |
|
105 if (isPrikazDostupny(PŘÍKAZ_DOT)) { |
|
106 počítadloDiagramů++; |
|
107 String soubor = "diagram-" + počítadloDiagramů; |
|
108 String souborSložka = ADRESÁŘ_VÝSTUPNÍ + File.separator + soubor; |
|
109 |
|
110 StringBuilder zdroják = new StringBuilder(zadání.length() + 200); |
|
111 |
|
112 zdroják.append("digraph d {\n"); |
|
113 zdroják.append("\tbgcolor=\"transparent\";\n"); |
|
114 if (vodorovně) { |
|
115 zdroják.append("\trankdir=LR;"); |
|
116 } |
|
117 zdroják.append(zadání); |
|
118 zdroják.append("}\n"); |
|
119 |
|
120 Runtime r = Runtime.getRuntime(); |
|
121 Process p = r.exec(new String[]{PŘÍKAZ_DOT, "-T", "svg", "-o", souborSložka + ".svg"}); |
|
122 |
|
123 /** |
|
124 * TODO: generovat i PNG bitmapu |
|
125 */ |
|
126 PrintStream vstupProcesu = new PrintStream(p.getOutputStream()); |
|
127 vstupProcesu.print(zdroják.toString()); |
|
128 vstupProcesu.close(); |
|
129 |
|
130 String chyby = načtiProud(p.getErrorStream()); |
|
131 |
|
132 p.waitFor(); |
|
133 |
|
134 if (chyby.length() == 0) { |
|
135 return soubor; |
|
136 } else { |
|
137 System.err.print("Při vytváření diagramu došlo k chybě: " + chyby); |
|
138 return null; |
|
139 } |
|
140 } else { |
|
141 System.err.println("Příkaz " + PŘÍKAZ_DOT + " není na vašem systému dostupný → diagramy nelze vygreslit."); |
|
142 System.err.println("Můžete ho nainstalovat pomocí:"); |
|
143 System.err.println("\t$ aptitude install graphviz # (Debian/Ubuntu)"); |
|
144 System.err.println("\t$ yum install graphviz # (Fedora/RedHat)"); |
|
145 return null; |
|
146 } |
|
147 } |
|
148 |
|
149 /** |
94 * Čte proud dat dokud to jde a výsledek pak vrátí jako text. |
150 * Čte proud dat dokud to jde a výsledek pak vrátí jako text. |
95 * @param proud vstupní proud |
151 * @param proud vstupní proud |
96 * @return obsah proudu jako text |
152 * @return obsah proudu jako text |
97 * @throws IOException |
153 * @throws IOException |
98 */ |
154 */ |