root/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Diagram.java @ 81:8014586c97da

Revision 76:c7746d95283d, 4.4 KB (checked in by František Kučera <franta-hg@…>, 13 years ago)

Rozdělení knihovny funkcí podle maker, ve kterých se funkce používají. #8

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.makra;
19
20import java.io.File;
21import java.io.IOException;
22import java.io.PrintStream;
23import java.net.URLDecoder;
24import java.nio.charset.Charset;
25import static cz.frantovo.xmlWebGenerator.NástrojeCLI.*;
26
27/**
28 * Diagramy
29 *
30 * @author František Kučera (frantovo.cz)
31 */
32public class Diagram {
33
34        private static final String ADRESÁŘ_VÝSTUPNÍ = "výstup";
35        private static final String PŘÍKAZ_DOT = "dot";
36        private static int počítadloDiagramů = 0;
37        private static String počítadloDiagramůKontext = ""; // aktuálně zpracovávaná stránka, při změně vynulujeme počítadlo
38
39        /**
40         * Vytvoří obrázek s diagramem.
41         * @param zadání definice diagramu ve formátu dot
42         * @param vodorovně zda má být graf orientovaný vodorovně (funguje jen při <code>kompletní = false</code>)
43         * @param kompletní false, pokud k zadání chceme doplnit <code>digraph d {…}</code>
44         * @param kontext kam diagram patří – typicky název stránky, do které je vložen
45         * diagramy se pak budou číslovat v rámci tohoto kontextu
46         * → nebude docházet k přepisování diagramů jiných stránek při částečném přegenerování webu.
47         * @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ě
48         * @return název souboru bez přípony, který byl vytvořen, nebo null, pokud došlo k chybě.
49         */
50        public static String vytvořDiagram(String zadání, boolean vodorovně, boolean kompletní, String kontext, String souborZadání) throws IOException, InterruptedException {
51                if (isPříkazDostupný(PŘÍKAZ_DOT)) {
52
53                        String soubor;
54                        if (souborZadání == null) {
55                                if (kontext == null) {
56                                        počítadloDiagramů++;
57                                        soubor = "diagram-" + počítadloDiagramů;
58                                } else {
59                                        // TODO: tohle by se mělo udělat v XSLT
60                                        kontext = URLDecoder.decode(kontext, Charset.defaultCharset().name());
61
62                                        // Každá stránka bude mít svoje diagramy číslované od 1
63                                        if (!počítadloDiagramůKontext.equals(kontext)) {
64                                                počítadloDiagramůKontext = kontext;
65                                                počítadloDiagramů = 0;
66                                        }
67
68                                        počítadloDiagramů++;
69                                        soubor = "diagram-" + kontext + "-" + počítadloDiagramů;
70                                }
71                        } else {
72                                soubor = souborZadání;
73                        }
74                        String souborSložka = ADRESÁŘ_VÝSTUPNÍ + File.separator + soubor;
75
76                        String zdroják;
77                        if (kompletní) {
78                                zdroják = zadání;
79                        } else {
80                                StringBuilder b = new StringBuilder(zadání.length() + 200);
81                                b.append("digraph d {\n");
82                                b.append("\tbgcolor=\"transparent\";\n");
83                                if (vodorovně) {
84                                        b.append("\trankdir=LR;");
85                                }
86                                b.append(zadání);
87                                b.append("}\n");
88                                zdroják = b.toString();
89                        }
90
91                        Runtime r = Runtime.getRuntime();
92                        Process p = r.exec(new String[]{PŘÍKAZ_DOT, "-T", "svg", "-o", souborSložka + ".svg"});
93
94                        /**
95                         * TODO: generovat i PNG bitmapu
96                         */
97                        PrintStream vstupProcesu = new PrintStream(p.getOutputStream());
98                        vstupProcesu.print(zdroják.toString());
99                        vstupProcesu.close();
100
101                        String chyby = načtiProud(p.getErrorStream());
102
103                        p.waitFor();
104
105                        if (chyby.length() == 0) {
106                                return soubor;
107                        } else {
108                                System.err.print("Při vytváření diagramu došlo k chybě: " + chyby);
109                                return null;
110                        }
111                } else {
112                        System.err.println("Příkaz " + PŘÍKAZ_DOT + " není na vašem systému dostupný → diagramy nelze vygreslit.");
113                        System.err.println("Můžete ho nainstalovat pomocí:");
114                        System.err.println("\t$ aptitude install graphviz   # (Debian/Ubuntu)");
115                        System.err.println("\t$ yum install graphviz        # (Fedora/RedHat)");
116                        return null;
117                }
118        }
119}
Note: See TracBrowser for help on using the browser.