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.

Line 
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 */
18package cz.frantovo.xmlWebGenerator;
19
20import java.io.File;
21import java.io.IOException;
22import java.io.PrintStream;
23import java.util.Date;
24import java.net.URI;
25import java.net.URISyntaxException;
26import static cz.frantovo.xmlWebGenerator.NástrojeCLI.*;
27
28/**
29 * Knihovna funkcí volaných z XSLT.
30 * 
31 * TODO:
32 *      - rozdělit na více modulů (jmenných prostorů).
33 *      - CLI konektor
34 *
35 * @author fiki
36 */
37public class Funkce {
38
39        private static final String PŘÍKAZ_PYGMENTIZE = "pygmentize";
40        private static final String PŘÍKAZ_DOT = "dot";
41        private static final String PŘÍKAZ_MARKDOWN = "markdown";
42        private static final String ADRESÁŘ_VÝSTUPNÍ = "výstup";
43        private static int počítadloDiagramů = 0;
44
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         */
51        public static Date posledníZměna(String soubor) throws URISyntaxException {
52                URI uri = new URI(soubor);
53                File f = new File(uri);
54                return new Date(f.lastModified());
55        }
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;
61         * @return zvýrazněný text nebo null, pokud došlo k chybě.
62         * TODO:
63         *      - vracet místo textu instanci com.icl.saxon.om.NodeInfo http://saxon.sourceforge.net/saxon6.5.3/extensibility.html
64         *  - nebo kontrolovat validitu vygenerovaného kódu (v současnosti se spoléháme na bezchybnost pygmentize)
65         */
66        public static String zvýrazniSyntaxi(String zdroják, String jazyk) throws IOException, InterruptedException {
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;
70                } else if (isPříkazDostupný(PŘÍKAZ_PYGMENTIZE)) {
71                        Runtime r = Runtime.getRuntime();
72                        Process p = r.exec(new String[]{PŘÍKAZ_PYGMENTIZE, "-f", "html", "-l", jazyk});
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) {
84                                // Pozor: pygmentize má i při chybě návratový kód 0 → je potřeba kontrolovat chybový výstup.
85                                return výsledek;
86                        } else {
87                                System.err.print("Při zvýrazňování syntaxe došlo k chybě: " + chyby);
88                                return null;
89                        }
90                } else {
91                        System.err.println("Příkaz " + PŘÍKAZ_PYGMENTIZE + " není na vašem systému dostupný → zvýrazňování syntaxe nebude fungovat.");
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;
96                }
97        }
98
99        /**
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 {
104                if (isPříkazDostupný(PŘÍKAZ_PYGMENTIZE)) {
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        /**
114         * Vytvoří obrázek s diagramem.
115         * @param zadání definice diagramu ve formátu dot
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>
118         * @return název souboru bez přípony, který byl vytvořen, nebo null, pokud došlo k chybě.
119         */
120        public static String vytvořDiagram(String zadání, boolean vodorovně, boolean kompletní) throws IOException, InterruptedException {
121                if (isPříkazDostupný(PŘÍKAZ_DOT)) {
122                        počítadloDiagramů++;
123                        String soubor = "diagram-" + počítadloDiagramů;
124                        String souborSložka = ADRESÁŘ_VÝSTUPNÍ + File.separator + soubor;
125
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();
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        /**
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        }
206}
Note: See TracBrowser for help on using the browser.