1.1 --- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java Sat Jan 07 19:06:18 2012 +0100
1.2 +++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java Wed Jan 11 17:01:59 2012 +0100
1.3 @@ -18,33 +18,17 @@
1.4 package cz.frantovo.xmlWebGenerator;
1.5
1.6 import java.io.File;
1.7 -import java.io.IOException;
1.8 -import java.io.PrintStream;
1.9 import java.util.Date;
1.10 import java.net.URI;
1.11 import java.net.URISyntaxException;
1.12 -import java.net.URLDecoder;
1.13 -import java.nio.charset.Charset;
1.14 -import static cz.frantovo.xmlWebGenerator.NástrojeCLI.*;
1.15
1.16 /**
1.17 - * Knihovna funkcí volaných z XSLT.
1.18 + * Společná knihovna funkcí volaných z XSLT
1.19 *
1.20 - * TODO:
1.21 - * - rozdělit na více modulů (jmenných prostorů).
1.22 - * - CLI konektor
1.23 - *
1.24 - * @author fiki
1.25 + * @author František Kučera (frantovo.cz)
1.26 */
1.27 public class Funkce {
1.28 -
1.29 - private static final String PŘÍKAZ_PYGMENTIZE = "pygmentize";
1.30 - private static final String PŘÍKAZ_DOT = "dot";
1.31 - private static final String PŘÍKAZ_MARKDOWN = "markdown";
1.32 - private static final String ADRESÁŘ_VÝSTUPNÍ = "výstup";
1.33 - private static int počítadloDiagramů = 0;
1.34 - private static String počítadloDiagramůKontext = ""; // aktuálně zpracovávaná stránka, při změně vynulujeme počítadlo
1.35 -
1.36 +
1.37 /**
1.38 * Zjištuje, kdy byl naposledy daný soubor změněn.
1.39 * @param soubor cesta k souboru
1.40 @@ -56,178 +40,4 @@
1.41 File f = new File(uri);
1.42 return new Date(f.lastModified());
1.43 }
1.44 -
1.45 - /**
1.46 - * Zvýrazňuje syntaxi zdrojového kódu. Používá k tomu externí program/knihovnu pygmentize.
1.47 - * @param zdroják zdrojový kód, který předáme příkazu pygmentize na standardním vstupu
1.48 - * @param jazyk předáme příkazu pygmentize jako parametr -l <lexer>
1.49 - * @return zvýrazněný text nebo null, pokud došlo k chybě.
1.50 - * TODO:
1.51 - * - vracet místo textu instanci com.icl.saxon.om.NodeInfo http://saxon.sourceforge.net/saxon6.5.3/extensibility.html
1.52 - * - nebo kontrolovat validitu vygenerovaného kódu (v současnosti se spoléháme na bezchybnost pygmentize)
1.53 - */
1.54 - public static String zvýrazniSyntaxi(String zdroják, String jazyk) throws IOException, InterruptedException {
1.55 - if (jazyk == null || jazyk.length() == 0) {
1.56 - System.err.println("Není vyplněn atribut „jazyk“ → není jasné, jak se má zvýrazňovat.");
1.57 - return null;
1.58 - } else if (isPříkazDostupný(PŘÍKAZ_PYGMENTIZE)) {
1.59 - Runtime r = Runtime.getRuntime();
1.60 - Process p = r.exec(new String[]{PŘÍKAZ_PYGMENTIZE, "-f", "html", "-l", jazyk});
1.61 -
1.62 - PrintStream vstupProcesu = new PrintStream(p.getOutputStream());
1.63 - vstupProcesu.print(zdroják);
1.64 - vstupProcesu.close();
1.65 -
1.66 - String výsledek = načtiProud(p.getInputStream());
1.67 - String chyby = načtiProud(p.getErrorStream());
1.68 -
1.69 - p.waitFor();
1.70 -
1.71 - if (chyby.length() == 0) {
1.72 - // Pozor: pygmentize má i při chybě návratový kód 0 → je potřeba kontrolovat chybový výstup.
1.73 - return výsledek;
1.74 - } else {
1.75 - System.err.print("Při zvýrazňování syntaxe došlo k chybě: " + chyby);
1.76 - return null;
1.77 - }
1.78 - } else {
1.79 - System.err.println("Příkaz " + PŘÍKAZ_PYGMENTIZE + " není na vašem systému dostupný → zvýrazňování syntaxe nebude fungovat.");
1.80 - System.err.println("Můžete ho nainstalovat pomocí:");
1.81 - System.err.println("\t$ aptitude install python-pygments # (Debian/Ubuntu)");
1.82 - System.err.println("\t$ yum install python-pygments # (Fedora/RedHat)");
1.83 - return null;
1.84 - }
1.85 - }
1.86 -
1.87 - /**
1.88 - * Vygeneruje CSS styl pro zvýrazňování syntaxe.
1.89 - * @return obsah CSS souboru nebo null, pokud generování nebylo možné
1.90 - */
1.91 - public static String generujCssSyntaxe() throws IOException, InterruptedException {
1.92 - if (isPříkazDostupný(PŘÍKAZ_PYGMENTIZE)) {
1.93 - Runtime r = Runtime.getRuntime();
1.94 - Process p = r.exec(new String[]{PŘÍKAZ_PYGMENTIZE, "-S", "default", "-f", "html"});
1.95 - return načtiProud(p.getInputStream());
1.96 - } else {
1.97 - return null;
1.98 - }
1.99 - }
1.100 -
1.101 - /**
1.102 - * Vytvoří obrázek s diagramem.
1.103 - * @param zadání definice diagramu ve formátu dot
1.104 - * @param vodorovně zda má být graf orientovaný vodorovně (funguje jen při <code>kompletní = false</code>)
1.105 - * @param kompletní false, pokud k zadání chceme doplnit <code>digraph d {…}</code>
1.106 - * @param kontext kam diagram patří – typicky název stránky, do které je vložen
1.107 - * diagramy se pak budou číslovat v rámci tohoto kontextu
1.108 - * → nebude docházet k přepisování diagramů jiných stránek při částečném přegenerování webu.
1.109 - * @param souborZadání null pokud chceme automatické číslování | nebo zadáme název souboru se zadáním diagramu – vygenerovaný diagram se pak bude jmenovat stejně
1.110 - * @return název souboru bez přípony, který byl vytvořen, nebo null, pokud došlo k chybě.
1.111 - */
1.112 - public static String vytvořDiagram(String zadání, boolean vodorovně, boolean kompletní, String kontext, String souborZadání) throws IOException, InterruptedException {
1.113 - if (isPříkazDostupný(PŘÍKAZ_DOT)) {
1.114 -
1.115 - String soubor;
1.116 - if (souborZadání == null) {
1.117 - if (kontext == null) {
1.118 - počítadloDiagramů++;
1.119 - soubor = "diagram-" + počítadloDiagramů;
1.120 - } else {
1.121 - // TODO: tohle by se mělo udělat v XSLT
1.122 - kontext = URLDecoder.decode(kontext, Charset.defaultCharset().name());
1.123 -
1.124 - // Každá stránka bude mít svoje diagramy číslované od 1
1.125 - if (!počítadloDiagramůKontext.equals(kontext)) {
1.126 - počítadloDiagramůKontext = kontext;
1.127 - počítadloDiagramů = 0;
1.128 - }
1.129 -
1.130 - počítadloDiagramů++;
1.131 - soubor = "diagram-" + kontext + "-" + počítadloDiagramů;
1.132 - }
1.133 - } else {
1.134 - soubor = souborZadání;
1.135 - }
1.136 - String souborSložka = ADRESÁŘ_VÝSTUPNÍ + File.separator + soubor;
1.137 -
1.138 - String zdroják;
1.139 - if (kompletní) {
1.140 - zdroják = zadání;
1.141 - } else {
1.142 - StringBuilder b = new StringBuilder(zadání.length() + 200);
1.143 - b.append("digraph d {\n");
1.144 - b.append("\tbgcolor=\"transparent\";\n");
1.145 - if (vodorovně) {
1.146 - b.append("\trankdir=LR;");
1.147 - }
1.148 - b.append(zadání);
1.149 - b.append("}\n");
1.150 - zdroják = b.toString();
1.151 - }
1.152 -
1.153 - Runtime r = Runtime.getRuntime();
1.154 - Process p = r.exec(new String[]{PŘÍKAZ_DOT, "-T", "svg", "-o", souborSložka + ".svg"});
1.155 -
1.156 - /**
1.157 - * TODO: generovat i PNG bitmapu
1.158 - */
1.159 - PrintStream vstupProcesu = new PrintStream(p.getOutputStream());
1.160 - vstupProcesu.print(zdroják.toString());
1.161 - vstupProcesu.close();
1.162 -
1.163 - String chyby = načtiProud(p.getErrorStream());
1.164 -
1.165 - p.waitFor();
1.166 -
1.167 - if (chyby.length() == 0) {
1.168 - return soubor;
1.169 - } else {
1.170 - System.err.print("Při vytváření diagramu došlo k chybě: " + chyby);
1.171 - return null;
1.172 - }
1.173 - } else {
1.174 - System.err.println("Příkaz " + PŘÍKAZ_DOT + " není na vašem systému dostupný → diagramy nelze vygreslit.");
1.175 - System.err.println("Můžete ho nainstalovat pomocí:");
1.176 - System.err.println("\t$ aptitude install graphviz # (Debian/Ubuntu)");
1.177 - System.err.println("\t$ yum install graphviz # (Fedora/RedHat)");
1.178 - return null;
1.179 - }
1.180 - }
1.181 -
1.182 - /**
1.183 - * Převede text ve wiki syntaxi do XHTML.
1.184 - * @param wiki vstupní text v dané wiki syntaxi
1.185 - * @param syntaxe null nebo volitelně syntaxe (markdown, texy)
1.186 - * @return naformátované XHTML
1.187 - */
1.188 - public static String formátujWiki(String wiki, String syntaxe) throws IOException {
1.189 - if (isPříkazDostupný(PŘÍKAZ_MARKDOWN)) {
1.190 - Runtime r = Runtime.getRuntime();
1.191 - Process p = r.exec(new String[]{PŘÍKAZ_MARKDOWN});
1.192 -
1.193 - /**
1.194 - * TODO: oříznout mezery na začátcích řádků, pokud je jich všude stejně?
1.195 - * (odsazení v XML)
1.196 - */
1.197 - PrintStream vstupProcesu = new PrintStream(p.getOutputStream());
1.198 - vstupProcesu.print(wiki);
1.199 - vstupProcesu.close();
1.200 -
1.201 - String chyby = načtiProud(p.getErrorStream());
1.202 - String xhtml = načtiProud(p.getInputStream());
1.203 -
1.204 - if (chyby.length() == 0) {
1.205 - return xhtml;
1.206 - } else {
1.207 - System.err.print("Při zpracování wiki syntaxe došlo k chybě: " + chyby);
1.208 - return null;
1.209 - }
1.210 - } else {
1.211 - System.err.println("Příkaz " + PŘÍKAZ_MARKDOWN + " není na vašem systému dostupný → nelze formátovat texty ve wiki syntaxi.");
1.212 - System.err.println("Můžete ho nainstalovat pomocí:");
1.213 - System.err.println("\t$ aptitude install markdown # (Debian/Ubuntu)");
1.214 - System.err.println("\t$ yum install perl-Text-Markdown # (Fedora/RedHat)");
1.215 - return null;
1.216 - }
1.217 - }
1.218 }