šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java
changeset 28 3298cafa8686
parent 27 037a9f20bf3a
child 30 cefd5fe75cb8
equal deleted inserted replaced
27:037a9f20bf3a 28:3298cafa8686
     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();