šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java
author František Kučera <franta-hg@frantovo.cz>
Mon, 22 Aug 2011 00:23:38 +0200
changeset 27 037a9f20bf3a
parent 21 2f50f9e10a27
child 28 3298cafa8686
permissions -rw-r--r--
Zvýrazňování syntaxe #12 – začátek.
franta-hg@6
     1
package cz.frantovo.xmlWebGenerator;
franta-hg@6
     2
franta-hg@27
     3
import java.io.BufferedReader;
franta-hg@6
     4
import java.io.File;
franta-hg@27
     5
import java.io.IOException;
franta-hg@27
     6
import java.io.InputStream;
franta-hg@27
     7
import java.io.InputStreamReader;
franta-hg@27
     8
import java.io.PrintStream;
franta-hg@6
     9
import java.util.Date;
franta-hg@6
    10
import java.net.URI;
franta-hg@6
    11
import java.net.URISyntaxException;
franta-hg@6
    12
franta-hg@6
    13
public class Funkce {
franta-hg@27
    14
franta-hg@21
    15
	public static Date posledníZměna(String soubor) throws URISyntaxException {
franta-hg@21
    16
		return new Date(new File(new URI(soubor)).lastModified());
franta-hg@21
    17
	}
franta-hg@27
    18
franta-hg@27
    19
	/**
franta-hg@27
    20
	 * Zvýrazňuje syntaxi zdrojového kódu. Používá k tomu externí program/knihovnu pygmentize.
franta-hg@27
    21
	 * @param zdroják zdrojový kód, který předáme příkazu pygmentize na standardním vstupu
franta-hg@27
    22
	 * @param jazyk předáme příkazu pygmentize jako parametr -l &lt;lexer&gt;
franta-hg@27
    23
	 * @return TODO: použít (?) místo textu instanci com.icl.saxon.om.NodeInfo http://saxon.sourceforge.net/saxon6.5.3/extensibility.html
franta-hg@27
    24
	 */
franta-hg@27
    25
	public static String zvýrazniSyntaxi(String zdroják, String jazyk) throws IOException, InterruptedException {
franta-hg@27
    26
		String příkaz = "pygmentizexxx";
franta-hg@27
    27
franta-hg@27
    28
		if (isPrikazDostupny(příkaz)) {
franta-hg@27
    29
			Runtime r = Runtime.getRuntime();
franta-hg@27
    30
			Process p = r.exec(new String[]{příkaz, "-f", "html", "-l", jazyk});
franta-hg@27
    31
franta-hg@27
    32
			PrintStream vstupProcesu = new PrintStream(p.getOutputStream());
franta-hg@27
    33
			vstupProcesu.print(zdroják);
franta-hg@27
    34
			vstupProcesu.close();
franta-hg@27
    35
franta-hg@27
    36
			String výsledek = načtiProud(p.getInputStream());
franta-hg@27
    37
			String chyby = načtiProud(p.getErrorStream());
franta-hg@27
    38
franta-hg@27
    39
			p.waitFor();
franta-hg@27
    40
franta-hg@27
    41
			if (chyby.length() == 0) {
franta-hg@27
    42
				return výsledek;
franta-hg@27
    43
			} else {
franta-hg@27
    44
				System.err.println("Při zvýrazňování syntaxe došlo k chybě: " + chyby);
franta-hg@27
    45
				return "______chyba_____";
franta-hg@27
    46
			}
franta-hg@27
    47
		} else {
franta-hg@27
    48
			System.err.println("Příkaz " + příkaz + " není na vašem systému dostupný → zvýrazňování syntaxe nebude fungovat.");
franta-hg@27
    49
			System.err.println("Můžete ho nainstalovat pomocí: aptitude install python-pygments");
franta-hg@27
    50
			// TODO: příkaz pro Fedoru/RedHat
franta-hg@27
    51
			// TODO: vracet escapovaný zdroják v <pre/>
franta-hg@27
    52
			return "__xxx____chyba_____";
franta-hg@27
    53
		}
franta-hg@27
    54
	}
franta-hg@27
    55
franta-hg@27
    56
	private static String načtiProud(InputStream proud) throws IOException {
franta-hg@27
    57
		StringBuilder výsledek = new StringBuilder();
franta-hg@27
    58
		BufferedReader buf = new BufferedReader(new InputStreamReader(proud));
franta-hg@27
    59
		while (true) {
franta-hg@27
    60
			String radek = buf.readLine();
franta-hg@27
    61
			if (radek == null) {
franta-hg@27
    62
				break;
franta-hg@27
    63
			} else {
franta-hg@27
    64
				výsledek.append(radek);
franta-hg@27
    65
				výsledek.append("\n");
franta-hg@27
    66
			}
franta-hg@27
    67
		}
franta-hg@27
    68
		return výsledek.toString();
franta-hg@27
    69
	}
franta-hg@27
    70
franta-hg@27
    71
	private static boolean isPrikazDostupny(String příkaz) {
franta-hg@27
    72
		try {
franta-hg@27
    73
			Runtime r = Runtime.getRuntime();
franta-hg@27
    74
			Process p = r.exec(new String[]{"which", příkaz});
franta-hg@27
    75
			p.waitFor();
franta-hg@27
    76
			return p.exitValue() == 0;
franta-hg@27
    77
		} catch (Exception e) {
franta-hg@27
    78
			return false;
franta-hg@27
    79
		}
franta-hg@27
    80
	}
franta-hg@6
    81
}