8 import java.io.PrintStream; |
8 import java.io.PrintStream; |
9 import java.util.Date; |
9 import java.util.Date; |
10 import java.net.URI; |
10 import java.net.URI; |
11 import java.net.URISyntaxException; |
11 import java.net.URISyntaxException; |
12 |
12 |
|
13 /** |
|
14 * Knihovna funkcí volaných z XSLT. |
|
15 * |
|
16 * TODO: časem rozdělit na více modulů (jmenných prostorů). |
|
17 * |
|
18 * @author fiki |
|
19 */ |
13 public class Funkce { |
20 public class Funkce { |
14 |
21 |
|
22 /** |
|
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 |
|
27 */ |
15 public static Date posledníZměna(String soubor) throws URISyntaxException { |
28 public static Date posledníZměna(String soubor) throws URISyntaxException { |
16 return new Date(new File(new URI(soubor)).lastModified()); |
29 URI uri = new URI(soubor); |
|
30 File f = new File(uri); |
|
31 return new Date(f.lastModified()); |
17 } |
32 } |
18 |
33 |
19 /** |
34 /** |
20 * Zvýrazňuje syntaxi zdrojového kódu. Používá k tomu externí program/knihovnu pygmentize. |
35 * Zvýrazňuje syntaxi zdrojového kódu. Používá k tomu externí program/knihovnu pygmentize. |
21 * @param zdroják zdrojový kód, který předáme příkazu pygmentize na standardním vstupu |
36 * @param zdroják zdrojový kód, který předáme příkazu pygmentize na standardním vstupu |
22 * @param jazyk předáme příkazu pygmentize jako parametr -l <lexer> |
37 * @param jazyk předáme příkazu pygmentize jako parametr -l <lexer> |
23 * @return TODO: použít (?) místo textu instanci com.icl.saxon.om.NodeInfo http://saxon.sourceforge.net/saxon6.5.3/extensibility.html |
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 |
24 */ |
40 */ |
25 public static String zvýrazniSyntaxi(String zdroják, String jazyk) throws IOException, InterruptedException { |
41 public static String zvýrazniSyntaxi(String zdroják, String jazyk) throws IOException, InterruptedException { |
26 String příkaz = "pygmentizexxx"; |
42 String příkaz = "pygmentize"; |
27 |
43 |
28 if (isPrikazDostupny(příkaz)) { |
44 if (jazyk == null || jazyk.length() == 0) { |
|
45 System.err.println("Není vyplněn atribut „jazyk“ → není jasné, jak se má zvýrazňovat."); |
|
46 return null; |
|
47 } else if (isPrikazDostupny(příkaz)) { |
29 Runtime r = Runtime.getRuntime(); |
48 Runtime r = Runtime.getRuntime(); |
30 Process p = r.exec(new String[]{příkaz, "-f", "html", "-l", jazyk}); |
49 Process p = r.exec(new String[]{příkaz, "-f", "html", "-l", jazyk}); |
31 |
50 |
32 PrintStream vstupProcesu = new PrintStream(p.getOutputStream()); |
51 PrintStream vstupProcesu = new PrintStream(p.getOutputStream()); |
33 vstupProcesu.print(zdroják); |
52 vstupProcesu.print(zdroják); |
37 String chyby = načtiProud(p.getErrorStream()); |
56 String chyby = načtiProud(p.getErrorStream()); |
38 |
57 |
39 p.waitFor(); |
58 p.waitFor(); |
40 |
59 |
41 if (chyby.length() == 0) { |
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. |
42 return výsledek; |
62 return výsledek; |
43 } else { |
63 } else { |
44 System.err.println("Při zvýrazňování syntaxe došlo k chybě: " + chyby); |
64 System.err.print("Při zvýrazňování syntaxe došlo k chybě: " + chyby); |
45 return "______chyba_____"; |
65 return null; |
46 } |
66 } |
47 } else { |
67 } else { |
48 System.err.println("Příkaz " + příkaz + " není na vašem systému dostupný → zvýrazňování syntaxe nebude fungovat."); |
68 System.err.println("Příkaz " + příkaz + " není na vašem systému dostupný → zvýrazňování syntaxe nebude fungovat."); |
49 System.err.println("Můžete ho nainstalovat pomocí: aptitude install python-pygments"); |
69 System.err.println("Můžete ho nainstalovat pomocí:"); |
50 // TODO: příkaz pro Fedoru/RedHat |
70 System.err.println("\t$ aptitude install python-pygments # (Debian/Ubuntu)"); |
51 // TODO: vracet escapovaný zdroják v <pre/> |
71 System.err.println("\t$ yum install python-pygments # (Fedora/RedHat)"); |
52 return "__xxx____chyba_____"; |
72 return null; |
53 } |
73 } |
54 } |
74 } |
55 |
75 |
|
76 /** |
|
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 |
|
80 * @throws IOException |
|
81 */ |
56 private static String načtiProud(InputStream proud) throws IOException { |
82 private static String načtiProud(InputStream proud) throws IOException { |
57 StringBuilder výsledek = new StringBuilder(); |
83 StringBuilder výsledek = new StringBuilder(); |
58 BufferedReader buf = new BufferedReader(new InputStreamReader(proud)); |
84 BufferedReader buf = new BufferedReader(new InputStreamReader(proud)); |
59 while (true) { |
85 while (true) { |
60 String radek = buf.readLine(); |
86 String radek = buf.readLine(); |
66 } |
92 } |
67 } |
93 } |
68 return výsledek.toString(); |
94 return výsledek.toString(); |
69 } |
95 } |
70 |
96 |
|
97 /** |
|
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 |
|
101 */ |
71 private static boolean isPrikazDostupny(String příkaz) { |
102 private static boolean isPrikazDostupny(String příkaz) { |
72 try { |
103 try { |
73 Runtime r = Runtime.getRuntime(); |
104 Runtime r = Runtime.getRuntime(); |
74 Process p = r.exec(new String[]{"which", příkaz}); |
105 Process p = r.exec(new String[]{"which", příkaz}); |
75 p.waitFor(); |
106 p.waitFor(); |