šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java
changeset 27 037a9f20bf3a
parent 21 2f50f9e10a27
child 28 3298cafa8686
equal deleted inserted replaced
26:32e192fb934a 27:037a9f20bf3a
     1 package cz.frantovo.xmlWebGenerator;
     1 package cz.frantovo.xmlWebGenerator;
     2 
     2 
       
     3 import java.io.BufferedReader;
     3 import java.io.File;
     4 import java.io.File;
       
     5 import java.io.IOException;
       
     6 import java.io.InputStream;
       
     7 import java.io.InputStreamReader;
       
     8 import java.io.PrintStream;
     4 import java.util.Date;
     9 import java.util.Date;
     5 import java.net.URI;
    10 import java.net.URI;
     6 import java.net.URISyntaxException;
    11 import java.net.URISyntaxException;
     7 
    12 
     8 public class Funkce {
    13 public class Funkce {
       
    14 
     9 	public static Date posledníZměna(String soubor) throws URISyntaxException {
    15 	public static Date posledníZměna(String soubor) throws URISyntaxException {
    10 		return new Date(new File(new URI(soubor)).lastModified());
    16 		return new Date(new File(new URI(soubor)).lastModified());
    11 	}
    17 	}
       
    18 
       
    19 	/**
       
    20 	 * 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
       
    22 	 * @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
       
    24 	 */
       
    25 	public static String zvýrazniSyntaxi(String zdroják, String jazyk) throws IOException, InterruptedException {
       
    26 		String příkaz = "pygmentizexxx";
       
    27 
       
    28 		if (isPrikazDostupny(příkaz)) {
       
    29 			Runtime r = Runtime.getRuntime();
       
    30 			Process p = r.exec(new String[]{příkaz, "-f", "html", "-l", jazyk});
       
    31 
       
    32 			PrintStream vstupProcesu = new PrintStream(p.getOutputStream());
       
    33 			vstupProcesu.print(zdroják);
       
    34 			vstupProcesu.close();
       
    35 
       
    36 			String výsledek = načtiProud(p.getInputStream());
       
    37 			String chyby = načtiProud(p.getErrorStream());
       
    38 
       
    39 			p.waitFor();
       
    40 
       
    41 			if (chyby.length() == 0) {
       
    42 				return výsledek;
       
    43 			} else {
       
    44 				System.err.println("Při zvýrazňování syntaxe došlo k chybě: " + chyby);
       
    45 				return "______chyba_____";
       
    46 			}
       
    47 		} else {
       
    48 			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");
       
    50 			// TODO: příkaz pro Fedoru/RedHat
       
    51 			// TODO: vracet escapovaný zdroják v <pre/>
       
    52 			return "__xxx____chyba_____";
       
    53 		}
       
    54 	}
       
    55 
       
    56 	private static String načtiProud(InputStream proud) throws IOException {
       
    57 		StringBuilder výsledek = new StringBuilder();
       
    58 		BufferedReader buf = new BufferedReader(new InputStreamReader(proud));
       
    59 		while (true) {
       
    60 			String radek = buf.readLine();
       
    61 			if (radek == null) {
       
    62 				break;
       
    63 			} else {
       
    64 				výsledek.append(radek);
       
    65 				výsledek.append("\n");
       
    66 			}
       
    67 		}
       
    68 		return výsledek.toString();
       
    69 	}
       
    70 
       
    71 	private static boolean isPrikazDostupny(String příkaz) {
       
    72 		try {
       
    73 			Runtime r = Runtime.getRuntime();
       
    74 			Process p = r.exec(new String[]{"which", příkaz});
       
    75 			p.waitFor();
       
    76 			return p.exitValue() == 0;
       
    77 		} catch (Exception e) {
       
    78 			return false;
       
    79 		}
       
    80 	}
    12 }
    81 }
    13