#12 Lepší ošetření chyb – vypíšeme varování a na výstup vložíme původní text bez zvýraznění syntaxe.
1 package cz.frantovo.xmlWebGenerator;
3 import java.io.BufferedReader;
5 import java.io.IOException;
6 import java.io.InputStream;
7 import java.io.InputStreamReader;
8 import java.io.PrintStream;
11 import java.net.URISyntaxException;
14 * Knihovna funkcí volaných z XSLT.
16 * TODO: časem rozdělit na více modulů (jmenných prostorů).
23 * Zjištuje, kdy byl naposledy daný soubor změněn.
24 * @param soubor cesta k souboru
25 * @return datum poslední změny
26 * @throws URISyntaxException
28 public static Date posledníZměna(String soubor) throws URISyntaxException {
29 URI uri = new URI(soubor);
30 File f = new File(uri);
31 return new Date(f.lastModified());
35 * Zvýrazňuje syntaxi zdrojového kódu. Používá k tomu externí program/knihovnu pygmentize.
36 * @param zdroják zdrojový kód, který předáme příkazu pygmentize na standardním vstupu
37 * @param jazyk předáme příkazu pygmentize jako parametr -l <lexer>
38 * @return zvýrazněný text nebo null, pokud došlo k chybě.
39 * TODO: použít (?) místo textu instanci com.icl.saxon.om.NodeInfo http://saxon.sourceforge.net/saxon6.5.3/extensibility.html
41 public static String zvýrazniSyntaxi(String zdroják, String jazyk) throws IOException, InterruptedException {
42 String příkaz = "pygmentize";
44 if (jazyk == null || jazyk.length() == 0) {
45 System.err.println("Není vyplněn atribut „jazyk“ → není jasné, jak se má zvýrazňovat.");
47 } else if (isPrikazDostupny(příkaz)) {
48 Runtime r = Runtime.getRuntime();
49 Process p = r.exec(new String[]{příkaz, "-f", "html", "-l", jazyk});
51 PrintStream vstupProcesu = new PrintStream(p.getOutputStream());
52 vstupProcesu.print(zdroják);
55 String výsledek = načtiProud(p.getInputStream());
56 String chyby = načtiProud(p.getErrorStream());
60 if (chyby.length() == 0) {
61 // Pozor: pygmentize má i při chybě návratový kód 0 → je potřeba kontrolovat chybový výstup.
64 System.err.print("Při zvýrazňování syntaxe došlo k chybě: " + chyby);
68 System.err.println("Příkaz " + příkaz + " není na vašem systému dostupný → zvýrazňování syntaxe nebude fungovat.");
69 System.err.println("Můžete ho nainstalovat pomocí:");
70 System.err.println("\t$ aptitude install python-pygments # (Debian/Ubuntu)");
71 System.err.println("\t$ yum install python-pygments # (Fedora/RedHat)");
77 * Čte proud dat dokud to jde a výsledek pak vrátí jako text.
78 * @param proud vstupní proud
79 * @return obsah proudu jako text
82 private static String načtiProud(InputStream proud) throws IOException {
83 StringBuilder výsledek = new StringBuilder();
84 BufferedReader buf = new BufferedReader(new InputStreamReader(proud));
86 String radek = buf.readLine();
90 výsledek.append(radek);
91 výsledek.append("\n");
94 return výsledek.toString();
98 * Pomocí programu which zjistí, jestli je daný příkaz v systému přítomný.
99 * @param příkaz jehož přítomnost zjišťujeme
100 * @return true pokud příkaz v systému existuje
102 private static boolean isPrikazDostupny(String příkaz) {
104 Runtime r = Runtime.getRuntime();
105 Process p = r.exec(new String[]{"which", příkaz});
107 return p.exitValue() == 0;
108 } catch (Exception e) {