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

Diagramy #13 – první verze, celkem funguje.

Files:
1 modified

Legend:

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

    r31 r32  
    1414 * Knihovna funkcí volaných z XSLT. 
    1515 *   
    16  * TODO: časem rozdělit na více modulů (jmenných prostorů). 
     16 * TODO:  
     17 *      - rozdělit na více modulů (jmenných prostorů). 
     18 *      - CLI konektor 
    1719 *  
    1820 * @author fiki 
     
    2123 
    2224        private static final String PŘÍKAZ_PYGMENTIZE = "pygmentize"; 
     25        private static final String PŘÍKAZ_DOT = "dot"; 
    2326        private static final String PŘÍKAZ_WHICH = "which"; 
     27        private static final String ADRESÁŘ_VÝSTUPNÍ = "výstup"; 
     28        private static int počítadloDiagramů = 0; 
    2429 
    2530        /** 
     
    9297 
    9398        /** 
     99         * Vytvoří obrázek s diagramem. 
     100         * @param zadání definice diagramu ve formátu dot 
     101         * @param vodorovně zda má být graf orientovaný vodorovně 
     102         * @return název souboru bez přípony, který byl vytvořen, nebo null, pokud došlo k chybě. 
     103         */ 
     104        public static String vytvořDiagram(String zadání, boolean vodorovně) throws IOException, InterruptedException { 
     105                if (isPrikazDostupny(PŘÍKAZ_DOT)) { 
     106                        počítadloDiagramů++; 
     107                        String soubor = "diagram-" + počítadloDiagramů; 
     108                        String souborSložka = ADRESÁŘ_VÝSTUPNÍ + File.separator + soubor; 
     109 
     110                        StringBuilder zdroják = new StringBuilder(zadání.length() + 200); 
     111 
     112                        zdroják.append("digraph d {\n"); 
     113                        zdroják.append("\tbgcolor=\"transparent\";\n"); 
     114                        if (vodorovně) { 
     115                                zdroják.append("\trankdir=LR;"); 
     116                        } 
     117                        zdroják.append(zadání); 
     118                        zdroják.append("}\n"); 
     119 
     120                        Runtime r = Runtime.getRuntime(); 
     121                        Process p = r.exec(new String[]{PŘÍKAZ_DOT, "-T", "svg", "-o", souborSložka + ".svg"}); 
     122 
     123                        /** 
     124                         * TODO: generovat i PNG bitmapu 
     125                         */ 
     126                        PrintStream vstupProcesu = new PrintStream(p.getOutputStream()); 
     127                        vstupProcesu.print(zdroják.toString()); 
     128                        vstupProcesu.close(); 
     129 
     130                        String chyby = načtiProud(p.getErrorStream()); 
     131 
     132                        p.waitFor(); 
     133 
     134                        if (chyby.length() == 0) { 
     135                                return soubor; 
     136                        } else { 
     137                                System.err.print("Při vytváření diagramu došlo k chybě: " + chyby); 
     138                                return null; 
     139                        } 
     140                } else { 
     141                        System.err.println("Příkaz " + PŘÍKAZ_DOT + " není na vašem systému dostupný → diagramy nelze vygreslit."); 
     142                        System.err.println("Můžete ho nainstalovat pomocí:"); 
     143                        System.err.println("\t$ aptitude install graphviz   # (Debian/Ubuntu)"); 
     144                        System.err.println("\t$ yum install graphviz        # (Fedora/RedHat)"); 
     145                        return null; 
     146                } 
     147        } 
     148 
     149        /** 
    94150         * Čte proud dat dokud to jde a výsledek pak vrátí jako text. 
    95151         * @param proud vstupní proud