Show
Ignore:
Timestamp:
08/22/11 00:23:38 (13 years ago)
Author:
František Kučera <franta-hg@…>
Branch:
default
Message:

Zvýrazňování syntaxe #12 – začátek.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java

    r21 r27  
    11package cz.frantovo.xmlWebGenerator; 
    22 
     3import java.io.BufferedReader; 
    34import java.io.File; 
     5import java.io.IOException; 
     6import java.io.InputStream; 
     7import java.io.InputStreamReader; 
     8import java.io.PrintStream; 
    49import java.util.Date; 
    510import java.net.URI; 
     
    712 
    813public class Funkce { 
     14 
    915        public static Date posledníZměna(String soubor) throws URISyntaxException { 
    1016                return new Date(new File(new URI(soubor)).lastModified()); 
    1117        } 
     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        } 
    1281} 
    13