šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java
author František Kučera <franta-hg@frantovo.cz>
Mon Aug 22 00:23:38 2011 +0200 (2011-08-22)
changeset 27 037a9f20bf3a
parent 21 2f50f9e10a27
child 28 3298cafa8686
permissions -rw-r--r--
Zvýrazňování syntaxe #12 – začátek.
     1 package cz.frantovo.xmlWebGenerator;
     2 
     3 import java.io.BufferedReader;
     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;
     9 import java.util.Date;
    10 import java.net.URI;
    11 import java.net.URISyntaxException;
    12 
    13 public class Funkce {
    14 
    15 	public static Date posledníZměna(String soubor) throws URISyntaxException {
    16 		return new Date(new File(new URI(soubor)).lastModified());
    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 &lt;lexer&gt;
    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 	}
    81 }