root/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java @ 61:9503eb8377f1

Revision 61:9503eb8377f1, 7.5 KB (checked in by František Kučera <franta-hg@…>, 12 years ago)

Licence: informace o licenci v každém souboru.

RevLine 
[61]1/**
2 * XML Web generátor – program na generování webových stránek
3 * Copyright © 2012 František Kučera (frantovo.cz)
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
[6]18package cz.frantovo.xmlWebGenerator;
19
20import java.io.File;
[27]21import java.io.IOException;
22import java.io.PrintStream;
[6]23import java.util.Date;
24import java.net.URI;
25import java.net.URISyntaxException;
[38]26import static cz.frantovo.xmlWebGenerator.NástrojeCLI.*;
[6]27
[28]28/**
29 * Knihovna funkcí volaných z XSLT.
30 * 
[36]31 * TODO:
[32]32 *      - rozdělit na více modulů (jmenných prostorů).
33 *      - CLI konektor
[28]34 *
35 * @author fiki
36 */
[6]37public class Funkce {
[27]38
[30]39        private static final String PŘÍKAZ_PYGMENTIZE = "pygmentize";
[32]40        private static final String PŘÍKAZ_DOT = "dot";
[37]41        private static final String PŘÍKAZ_MARKDOWN = "markdown";
[32]42        private static final String ADRESÁŘ_VÝSTUPNÍ = "výstup";
43        private static int počítadloDiagramů = 0;
[30]44
[28]45        /**
46         * Zjištuje, kdy byl naposledy daný soubor změněn.
47         * @param soubor cesta k souboru
48         * @return datum poslední změny
49         * @throws URISyntaxException
50         */
[21]51        public static Date posledníZměna(String soubor) throws URISyntaxException {
[28]52                URI uri = new URI(soubor);
53                File f = new File(uri);
54                return new Date(f.lastModified());
[21]55        }
[27]56
57        /**
58         * Zvýrazňuje syntaxi zdrojového kódu. Používá k tomu externí program/knihovnu pygmentize.
59         * @param zdroják zdrojový kód, který předáme příkazu pygmentize na standardním vstupu
60         * @param jazyk předáme příkazu pygmentize jako parametr -l &lt;lexer&gt;
[28]61         * @return zvýrazněný text nebo null, pokud došlo k chybě.
[31]62         * TODO:
[36]63         *      - vracet místo textu instanci com.icl.saxon.om.NodeInfo http://saxon.sourceforge.net/saxon6.5.3/extensibility.html
[31]64         *  - nebo kontrolovat validitu vygenerovaného kódu (v současnosti se spoléháme na bezchybnost pygmentize)
[27]65         */
66        public static String zvýrazniSyntaxi(String zdroják, String jazyk) throws IOException, InterruptedException {
[28]67                if (jazyk == null || jazyk.length() == 0) {
68                        System.err.println("Není vyplněn atribut „jazyk“ → není jasné, jak se má zvýrazňovat.");
69                        return null;
[36]70                } else if (isPříkazDostupný(PŘÍKAZ_PYGMENTIZE)) {
[27]71                        Runtime r = Runtime.getRuntime();
[30]72                        Process p = r.exec(new String[]{PŘÍKAZ_PYGMENTIZE, "-f", "html", "-l", jazyk});
[27]73
74                        PrintStream vstupProcesu = new PrintStream(p.getOutputStream());
75                        vstupProcesu.print(zdroják);
76                        vstupProcesu.close();
77
78                        String výsledek = načtiProud(p.getInputStream());
79                        String chyby = načtiProud(p.getErrorStream());
80
81                        p.waitFor();
82
83                        if (chyby.length() == 0) {
[28]84                                // Pozor: pygmentize má i při chybě návratový kód 0 → je potřeba kontrolovat chybový výstup.
[27]85                                return výsledek;
86                        } else {
[28]87                                System.err.print("Při zvýrazňování syntaxe došlo k chybě: " + chyby);
88                                return null;
[27]89                        }
90                } else {
[30]91                        System.err.println("Příkaz " + PŘÍKAZ_PYGMENTIZE + " není na vašem systému dostupný → zvýrazňování syntaxe nebude fungovat.");
[28]92                        System.err.println("Můžete ho nainstalovat pomocí:");
93                        System.err.println("\t$ aptitude install python-pygments   # (Debian/Ubuntu)");
94                        System.err.println("\t$ yum install python-pygments        # (Fedora/RedHat)");
95                        return null;
[27]96                }
97        }
98
[28]99        /**
[31]100         * Vygeneruje CSS styl pro zvýrazňování syntaxe.
101         * @return obsah CSS souboru nebo null, pokud generování nebylo možné
102         */
103        public static String generujCssSyntaxe() throws IOException, InterruptedException {
[36]104                if (isPříkazDostupný(PŘÍKAZ_PYGMENTIZE)) {
[31]105                        Runtime r = Runtime.getRuntime();
106                        Process p = r.exec(new String[]{PŘÍKAZ_PYGMENTIZE, "-S", "default", "-f", "html"});
107                        return načtiProud(p.getInputStream());
108                } else {
109                        return null;
110                }
111        }
112
113        /**
[32]114         * Vytvoří obrázek s diagramem.
115         * @param zadání definice diagramu ve formátu dot
[52]116         * @param vodorovně zda má být graf orientovaný vodorovně (funguje jen při <code>kompletní = false</code>)
117         * @param kompletní false, pokud k zadání chceme doplnit <code>digraph d {…}</code>
[32]118         * @return název souboru bez přípony, který byl vytvořen, nebo null, pokud došlo k chybě.
119         */
[52]120        public static String vytvořDiagram(String zadání, boolean vodorovně, boolean kompletní) throws IOException, InterruptedException {
[36]121                if (isPříkazDostupný(PŘÍKAZ_DOT)) {
[32]122                        počítadloDiagramů++;
123                        String soubor = "diagram-" + počítadloDiagramů;
124                        String souborSložka = ADRESÁŘ_VÝSTUPNÍ + File.separator + soubor;
125
[52]126                        String zdroják;
127                        if (kompletní) {
128                                zdroják = zadání;
129                        } else {
130                                StringBuilder b = new StringBuilder(zadání.length() + 200);
131                                b.append("digraph d {\n");
132                                b.append("\tbgcolor=\"transparent\";\n");
133                                if (vodorovně) {
134                                        b.append("\trankdir=LR;");
135                                }
136                                b.append(zadání);
137                                b.append("}\n");
138                                zdroják = b.toString();
[32]139                        }
140
141                        Runtime r = Runtime.getRuntime();
142                        Process p = r.exec(new String[]{PŘÍKAZ_DOT, "-T", "svg", "-o", souborSložka + ".svg"});
143
144                        /**
145                         * TODO: generovat i PNG bitmapu
146                         */
147                        PrintStream vstupProcesu = new PrintStream(p.getOutputStream());
148                        vstupProcesu.print(zdroják.toString());
149                        vstupProcesu.close();
150
151                        String chyby = načtiProud(p.getErrorStream());
152
153                        p.waitFor();
154
155                        if (chyby.length() == 0) {
156                                return soubor;
157                        } else {
158                                System.err.print("Při vytváření diagramu došlo k chybě: " + chyby);
159                                return null;
160                        }
161                } else {
162                        System.err.println("Příkaz " + PŘÍKAZ_DOT + " není na vašem systému dostupný → diagramy nelze vygreslit.");
163                        System.err.println("Můžete ho nainstalovat pomocí:");
164                        System.err.println("\t$ aptitude install graphviz   # (Debian/Ubuntu)");
165                        System.err.println("\t$ yum install graphviz        # (Fedora/RedHat)");
166                        return null;
167                }
168        }
169
170        /**
[37]171         * Převede text ve wiki syntaxi do XHTML.
172         * @param wiki vstupní text v dané wiki syntaxi
173         * @param syntaxe null nebo volitelně syntaxe (markdown, texy)
174         * @return naformátované XHTML
175         */
176        public static String formátujWiki(String wiki, String syntaxe) throws IOException {
177                if (isPříkazDostupný(PŘÍKAZ_MARKDOWN)) {
178                        Runtime r = Runtime.getRuntime();
179                        Process p = r.exec(new String[]{PŘÍKAZ_MARKDOWN});
180
181                        /**
182                         * TODO: oříznout mezery na začátcích řádků, pokud je jich všude stejně?
183                         * (odsazení v XML)
184                         */
185                        PrintStream vstupProcesu = new PrintStream(p.getOutputStream());
186                        vstupProcesu.print(wiki);
187                        vstupProcesu.close();
188
189                        String chyby = načtiProud(p.getErrorStream());
190                        String xhtml = načtiProud(p.getInputStream());
191
192                        if (chyby.length() == 0) {
193                                return xhtml;
194                        } else {
195                                System.err.print("Při zpracování wiki syntaxe došlo k chybě: " + chyby);
196                                return null;
197                        }
198                } else {
199                        System.err.println("Příkaz " + PŘÍKAZ_MARKDOWN + " není na vašem systému dostupný → nelze formátovat texty ve wiki syntaxi.");
200                        System.err.println("Můžete ho nainstalovat pomocí:");
201                        System.err.println("\t$ aptitude install markdown         # (Debian/Ubuntu)");
202                        System.err.println("\t$ yum install perl-Text-Markdown    # (Fedora/RedHat)");
203                        return null;
204                }
205        }
[6]206}
Note: See TracBrowser for help on using the browser.