šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java
changeset 29 7bd7aaa9874a
parent 27 037a9f20bf3a
child 30 cefd5fe75cb8
     1.1 --- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java	Mon Aug 22 00:23:38 2011 +0200
     1.2 +++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java	Mon Aug 22 01:17:12 2011 +0200
     1.3 @@ -10,22 +10,41 @@
     1.4  import java.net.URI;
     1.5  import java.net.URISyntaxException;
     1.6  
     1.7 +/**
     1.8 + * Knihovna funkcí volaných z XSLT.
     1.9 + *  
    1.10 + * TODO: časem rozdělit na více modulů (jmenných prostorů).
    1.11 + * 
    1.12 + * @author fiki
    1.13 + */
    1.14  public class Funkce {
    1.15  
    1.16 +	/**
    1.17 +	 * Zjištuje, kdy byl naposledy daný soubor změněn.
    1.18 +	 * @param soubor cesta k souboru
    1.19 +	 * @return datum poslední změny
    1.20 +	 * @throws URISyntaxException
    1.21 +	 */
    1.22  	public static Date posledníZměna(String soubor) throws URISyntaxException {
    1.23 -		return new Date(new File(new URI(soubor)).lastModified());
    1.24 +		URI uri = new URI(soubor);
    1.25 +		File f = new File(uri);
    1.26 +		return new Date(f.lastModified());
    1.27  	}
    1.28  
    1.29  	/**
    1.30  	 * Zvýrazňuje syntaxi zdrojového kódu. Používá k tomu externí program/knihovnu pygmentize.
    1.31  	 * @param zdroják zdrojový kód, který předáme příkazu pygmentize na standardním vstupu
    1.32  	 * @param jazyk předáme příkazu pygmentize jako parametr -l <lexer>
    1.33 -	 * @return TODO: použít (?) místo textu instanci com.icl.saxon.om.NodeInfo http://saxon.sourceforge.net/saxon6.5.3/extensibility.html
    1.34 +	 * @return zvýrazněný text nebo null, pokud došlo k chybě.
    1.35 +	 * TODO: použít (?) místo textu instanci com.icl.saxon.om.NodeInfo http://saxon.sourceforge.net/saxon6.5.3/extensibility.html
    1.36  	 */
    1.37  	public static String zvýrazniSyntaxi(String zdroják, String jazyk) throws IOException, InterruptedException {
    1.38 -		String příkaz = "pygmentizexxx";
    1.39 +		String příkaz = "pygmentize";
    1.40  
    1.41 -		if (isPrikazDostupny(příkaz)) {
    1.42 +		if (jazyk == null || jazyk.length() == 0) {
    1.43 +			System.err.println("Není vyplněn atribut „jazyk“ → není jasné, jak se má zvýrazňovat.");
    1.44 +			return null;
    1.45 +		} else if (isPrikazDostupny(příkaz)) {
    1.46  			Runtime r = Runtime.getRuntime();
    1.47  			Process p = r.exec(new String[]{příkaz, "-f", "html", "-l", jazyk});
    1.48  
    1.49 @@ -39,20 +58,27 @@
    1.50  			p.waitFor();
    1.51  
    1.52  			if (chyby.length() == 0) {
    1.53 +				// Pozor: pygmentize má i při chybě návratový kód 0 → je potřeba kontrolovat chybový výstup.
    1.54  				return výsledek;
    1.55  			} else {
    1.56 -				System.err.println("Při zvýrazňování syntaxe došlo k chybě: " + chyby);
    1.57 -				return "______chyba_____";
    1.58 +				System.err.print("Při zvýrazňování syntaxe došlo k chybě: " + chyby);
    1.59 +				return null;
    1.60  			}
    1.61  		} else {
    1.62  			System.err.println("Příkaz " + příkaz + " není na vašem systému dostupný → zvýrazňování syntaxe nebude fungovat.");
    1.63 -			System.err.println("Můžete ho nainstalovat pomocí: aptitude install python-pygments");
    1.64 -			// TODO: příkaz pro Fedoru/RedHat
    1.65 -			// TODO: vracet escapovaný zdroják v <pre/>
    1.66 -			return "__xxx____chyba_____";
    1.67 +			System.err.println("Můžete ho nainstalovat pomocí:");
    1.68 +			System.err.println("\t$ aptitude install python-pygments   # (Debian/Ubuntu)");
    1.69 +			System.err.println("\t$ yum install python-pygments        # (Fedora/RedHat)");
    1.70 +			return null;
    1.71  		}
    1.72  	}
    1.73  
    1.74 +	/**
    1.75 +	 * Čte proud dat dokud to jde a výsledek pak vrátí jako text.
    1.76 +	 * @param proud vstupní proud
    1.77 +	 * @return obsah proudu jako text
    1.78 +	 * @throws IOException 
    1.79 +	 */
    1.80  	private static String načtiProud(InputStream proud) throws IOException {
    1.81  		StringBuilder výsledek = new StringBuilder();
    1.82  		BufferedReader buf = new BufferedReader(new InputStreamReader(proud));
    1.83 @@ -68,6 +94,11 @@
    1.84  		return výsledek.toString();
    1.85  	}
    1.86  
    1.87 +	/**
    1.88 +	 * Pomocí programu which zjistí, jestli je daný příkaz v systému přítomný.
    1.89 +	 * @param příkaz jehož přítomnost zjišťujeme
    1.90 +	 * @return true pokud příkaz v systému existuje
    1.91 +	 */
    1.92  	private static boolean isPrikazDostupny(String příkaz) {
    1.93  		try {
    1.94  			Runtime r = Runtime.getRuntime();