1.1 --- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java Wed Jul 06 23:42:32 2011 +0200
1.2 +++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java Mon Aug 22 00:23:38 2011 +0200
1.3 @@ -1,13 +1,81 @@
1.4 package cz.frantovo.xmlWebGenerator;
1.5
1.6 +import java.io.BufferedReader;
1.7 import java.io.File;
1.8 +import java.io.IOException;
1.9 +import java.io.InputStream;
1.10 +import java.io.InputStreamReader;
1.11 +import java.io.PrintStream;
1.12 import java.util.Date;
1.13 import java.net.URI;
1.14 import java.net.URISyntaxException;
1.15
1.16 public class Funkce {
1.17 +
1.18 public static Date posledníZměna(String soubor) throws URISyntaxException {
1.19 return new Date(new File(new URI(soubor)).lastModified());
1.20 }
1.21 +
1.22 + /**
1.23 + * Zvýrazňuje syntaxi zdrojového kódu. Používá k tomu externí program/knihovnu pygmentize.
1.24 + * @param zdroják zdrojový kód, který předáme příkazu pygmentize na standardním vstupu
1.25 + * @param jazyk předáme příkazu pygmentize jako parametr -l <lexer>
1.26 + * @return TODO: použít (?) místo textu instanci com.icl.saxon.om.NodeInfo http://saxon.sourceforge.net/saxon6.5.3/extensibility.html
1.27 + */
1.28 + public static String zvýrazniSyntaxi(String zdroják, String jazyk) throws IOException, InterruptedException {
1.29 + String příkaz = "pygmentizexxx";
1.30 +
1.31 + if (isPrikazDostupny(příkaz)) {
1.32 + Runtime r = Runtime.getRuntime();
1.33 + Process p = r.exec(new String[]{příkaz, "-f", "html", "-l", jazyk});
1.34 +
1.35 + PrintStream vstupProcesu = new PrintStream(p.getOutputStream());
1.36 + vstupProcesu.print(zdroják);
1.37 + vstupProcesu.close();
1.38 +
1.39 + String výsledek = načtiProud(p.getInputStream());
1.40 + String chyby = načtiProud(p.getErrorStream());
1.41 +
1.42 + p.waitFor();
1.43 +
1.44 + if (chyby.length() == 0) {
1.45 + return výsledek;
1.46 + } else {
1.47 + System.err.println("Při zvýrazňování syntaxe došlo k chybě: " + chyby);
1.48 + return "______chyba_____";
1.49 + }
1.50 + } else {
1.51 + System.err.println("Příkaz " + příkaz + " není na vašem systému dostupný → zvýrazňování syntaxe nebude fungovat.");
1.52 + System.err.println("Můžete ho nainstalovat pomocí: aptitude install python-pygments");
1.53 + // TODO: příkaz pro Fedoru/RedHat
1.54 + // TODO: vracet escapovaný zdroják v <pre/>
1.55 + return "__xxx____chyba_____";
1.56 + }
1.57 + }
1.58 +
1.59 + private static String načtiProud(InputStream proud) throws IOException {
1.60 + StringBuilder výsledek = new StringBuilder();
1.61 + BufferedReader buf = new BufferedReader(new InputStreamReader(proud));
1.62 + while (true) {
1.63 + String radek = buf.readLine();
1.64 + if (radek == null) {
1.65 + break;
1.66 + } else {
1.67 + výsledek.append(radek);
1.68 + výsledek.append("\n");
1.69 + }
1.70 + }
1.71 + return výsledek.toString();
1.72 + }
1.73 +
1.74 + private static boolean isPrikazDostupny(String příkaz) {
1.75 + try {
1.76 + Runtime r = Runtime.getRuntime();
1.77 + Process p = r.exec(new String[]{"which", příkaz});
1.78 + p.waitFor();
1.79 + return p.exitValue() == 0;
1.80 + } catch (Exception e) {
1.81 + return false;
1.82 + }
1.83 + }
1.84 }
1.85 -