šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java
changeset 34 12a1d54a5fe6
parent 31 da6ae32853cb
child 36 5be21d1ef5f8
     1.1 --- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java	Mon Aug 22 13:57:20 2011 +0200
     1.2 +++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java	Tue Aug 23 18:23:55 2011 +0200
     1.3 @@ -13,14 +13,19 @@
     1.4  /**
     1.5   * Knihovna funkcí volaných z XSLT.
     1.6   *  
     1.7 - * TODO: časem rozdělit na více modulů (jmenných prostorů).
     1.8 + * TODO: 
     1.9 + *	- rozdělit na více modulů (jmenných prostorů).
    1.10 + *	- CLI konektor
    1.11   * 
    1.12   * @author fiki
    1.13   */
    1.14  public class Funkce {
    1.15  
    1.16  	private static final String PŘÍKAZ_PYGMENTIZE = "pygmentize";
    1.17 +	private static final String PŘÍKAZ_DOT = "dot";
    1.18  	private static final String PŘÍKAZ_WHICH = "which";
    1.19 +	private static final String ADRESÁŘ_VÝSTUPNÍ = "výstup";
    1.20 +	private static int počítadloDiagramů = 0;
    1.21  
    1.22  	/**
    1.23  	 * Zjištuje, kdy byl naposledy daný soubor změněn.
    1.24 @@ -91,6 +96,57 @@
    1.25  	}
    1.26  
    1.27  	/**
    1.28 +	 * Vytvoří obrázek s diagramem.
    1.29 +	 * @param zadání definice diagramu ve formátu dot
    1.30 +	 * @param vodorovně zda má být graf orientovaný vodorovně
    1.31 +	 * @return název souboru bez přípony, který byl vytvořen, nebo null, pokud došlo k chybě.
    1.32 +	 */
    1.33 +	public static String vytvořDiagram(String zadání, boolean vodorovně) throws IOException, InterruptedException {
    1.34 +		if (isPrikazDostupny(PŘÍKAZ_DOT)) {
    1.35 +			počítadloDiagramů++;
    1.36 +			String soubor = "diagram-" + počítadloDiagramů;
    1.37 +			String souborSložka = ADRESÁŘ_VÝSTUPNÍ + File.separator + soubor;
    1.38 +
    1.39 +			StringBuilder zdroják = new StringBuilder(zadání.length() + 200);
    1.40 +
    1.41 +			zdroják.append("digraph d {\n");
    1.42 +			zdroják.append("\tbgcolor=\"transparent\";\n");
    1.43 +			if (vodorovně) {
    1.44 +				zdroják.append("\trankdir=LR;");
    1.45 +			}
    1.46 +			zdroják.append(zadání);
    1.47 +			zdroják.append("}\n");
    1.48 +
    1.49 +			Runtime r = Runtime.getRuntime();
    1.50 +			Process p = r.exec(new String[]{PŘÍKAZ_DOT, "-T", "svg", "-o", souborSložka + ".svg"});
    1.51 +
    1.52 +			/**
    1.53 +			 * TODO: generovat i PNG bitmapu
    1.54 +			 */
    1.55 +			PrintStream vstupProcesu = new PrintStream(p.getOutputStream());
    1.56 +			vstupProcesu.print(zdroják.toString());
    1.57 +			vstupProcesu.close();
    1.58 +
    1.59 +			String chyby = načtiProud(p.getErrorStream());
    1.60 +
    1.61 +			p.waitFor();
    1.62 +
    1.63 +			if (chyby.length() == 0) {
    1.64 +				return soubor;
    1.65 +			} else {
    1.66 +				System.err.print("Při vytváření diagramu došlo k chybě: " + chyby);
    1.67 +				return null;
    1.68 +			}
    1.69 +		} else {
    1.70 +			System.err.println("Příkaz " + PŘÍKAZ_DOT + " není na vašem systému dostupný → diagramy nelze vygreslit.");
    1.71 +			System.err.println("Můžete ho nainstalovat pomocí:");
    1.72 +			System.err.println("\t$ aptitude install graphviz   # (Debian/Ubuntu)");
    1.73 +			System.err.println("\t$ yum install graphviz        # (Fedora/RedHat)");
    1.74 +			return null;
    1.75 +		}
    1.76 +	}
    1.77 +
    1.78 +	/**
    1.79  	 * Čte proud dat dokud to jde a výsledek pak vrátí jako text.
    1.80  	 * @param proud vstupní proud
    1.81  	 * @return obsah proudu jako text