šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java
changeset 27 037a9f20bf3a
parent 21 2f50f9e10a27
child 28 3298cafa8686
     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 -