Diagramy #13 – první verze, celkem funguje.
authorFrantišek Kučera <franta-hg@frantovo.cz>
Tue, 23 Aug 2011 16:45:30 +0200
changeset 326bc25517ac4f
parent 31 da6ae32853cb
child 33 848da31dd379
Diagramy #13 – první verze, celkem funguje.
vstup/css/styl.css
vstup/kontakt.xml
šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java
šablona/stránka.xsl
     1.1 --- a/vstup/css/styl.css	Mon Aug 22 13:57:20 2011 +0200
     1.2 +++ b/vstup/css/styl.css	Tue Aug 23 16:45:30 2011 +0200
     1.3 @@ -60,3 +60,23 @@
     1.4  	padding: 6px;
     1.5  	border-radius: 4px;
     1.6  }
     1.7 +
     1.8 +.diagram {
     1.9 +	background-color: #ddf;
    1.10 +	padding: 6px;
    1.11 +	border-radius: 4px;
    1.12 +	text-align: center;
    1.13 +	max-width: 100%;
    1.14 +	overflow: auto;
    1.15 +}
    1.16 +
    1.17 +.diagram .nadpis {
    1.18 +	font-size: 60%;
    1.19 +	padding: 4px;
    1.20 +	margin-top: 6px;
    1.21 +	margin-bottom: -6px;
    1.22 +	margin-left: -6px;
    1.23 +	margin-right: -6px;	
    1.24 +	background-color: #d0d0f0;
    1.25 +	border-radius: 0px 0px 4px 4px;
    1.26 +}
     2.1 --- a/vstup/kontakt.xml	Mon Aug 22 13:57:20 2011 +0200
     2.2 +++ b/vstup/kontakt.xml	Tue Aug 23 16:45:30 2011 +0200
     2.3 @@ -1,4 +1,6 @@
     2.4 -<stránka xmlns="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/strana">
     2.5 +<stránka
     2.6 +	xmlns="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/strana"
     2.7 +	xmlns:m="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/makro">
     2.8  	<nadpis>Kontakt</nadpis>
     2.9  	<perex>Kde nás najdete.</perex>
    2.10  	<pořadí>60</pořadí>
    2.11 @@ -12,6 +14,42 @@
    2.12  			Tučňákova Lhota<br/>
    2.13  			Česká republika
    2.14          </p>
    2.15 +        
    2.16 +        <h2>Organizační struktura</h2>
    2.17 +        
    2.18 +        <p>
    2.19 +        	Zde je orgranizační struktura naší skvělé firmy:
    2.20 +        </p>
    2.21 +        
    2.22 +        <m:diagram nadpis="Naše organizační struktura">       		
    2.23 +			tovarnik[label="pan továrník\n(majitel)"];
    2.24 +			reditel[label="pan ředitel"];
    2.25 +			sekretarka[label="slečna sekretářka"];
    2.26 +			root[label="Linuxový guru"];
    2.27 +			architekt[label="Softwarový architekt"];
    2.28 +			
    2.29 +			tovarnik -> reditel;
    2.30 +			
    2.31 +			reditel -> sekretarka;
    2.32 +			reditel -> architekt;
    2.33 +			reditel -> root;
    2.34 +        </m:diagram>
    2.35 +        
    2.36 +        <h2>Procesy</h2>
    2.37 +        
    2.38 +        <p>
    2.39 +        	Ve firmě máme spoustu procesů. Jeden z nich vypadá takto:
    2.40 +        </p>
    2.41 +        
    2.42 +        <m:diagram orientace="vodorovně">
    2.43 +			A -> B;
    2.44 +			B -> C;
    2.45 +        </m:diagram>
    2.46 +        
    2.47 +        <p>
    2.48 +        	Ale protože je to tajné, tak vám neřekneme, co A, B a C znamenají.
    2.49 +        </p>
    2.50 +        
    2.51      </text>
    2.52  
    2.53  </stránka>
     3.1 --- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java	Mon Aug 22 13:57:20 2011 +0200
     3.2 +++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java	Tue Aug 23 16:45:30 2011 +0200
     3.3 @@ -13,14 +13,19 @@
     3.4  /**
     3.5   * Knihovna funkcí volaných z XSLT.
     3.6   *  
     3.7 - * TODO: časem rozdělit na více modulů (jmenných prostorů).
     3.8 + * TODO: 
     3.9 + *	- rozdělit na více modulů (jmenných prostorů).
    3.10 + *	- CLI konektor
    3.11   * 
    3.12   * @author fiki
    3.13   */
    3.14  public class Funkce {
    3.15  
    3.16  	private static final String PŘÍKAZ_PYGMENTIZE = "pygmentize";
    3.17 +	private static final String PŘÍKAZ_DOT = "dot";
    3.18  	private static final String PŘÍKAZ_WHICH = "which";
    3.19 +	private static final String ADRESÁŘ_VÝSTUPNÍ = "výstup";
    3.20 +	private static int počítadloDiagramů = 0;
    3.21  
    3.22  	/**
    3.23  	 * Zjištuje, kdy byl naposledy daný soubor změněn.
    3.24 @@ -91,6 +96,57 @@
    3.25  	}
    3.26  
    3.27  	/**
    3.28 +	 * Vytvoří obrázek s diagramem.
    3.29 +	 * @param zadání definice diagramu ve formátu dot
    3.30 +	 * @param vodorovně zda má být graf orientovaný vodorovně
    3.31 +	 * @return název souboru bez přípony, který byl vytvořen, nebo null, pokud došlo k chybě.
    3.32 +	 */
    3.33 +	public static String vytvořDiagram(String zadání, boolean vodorovně) throws IOException, InterruptedException {
    3.34 +		if (isPrikazDostupny(PŘÍKAZ_DOT)) {
    3.35 +			počítadloDiagramů++;
    3.36 +			String soubor = "diagram-" + počítadloDiagramů;
    3.37 +			String souborSložka = ADRESÁŘ_VÝSTUPNÍ + File.separator + soubor;
    3.38 +
    3.39 +			StringBuilder zdroják = new StringBuilder(zadání.length() + 200);
    3.40 +
    3.41 +			zdroják.append("digraph d {\n");
    3.42 +			zdroják.append("\tbgcolor=\"transparent\";\n");
    3.43 +			if (vodorovně) {
    3.44 +				zdroják.append("\trankdir=LR;");
    3.45 +			}
    3.46 +			zdroják.append(zadání);
    3.47 +			zdroják.append("}\n");
    3.48 +
    3.49 +			Runtime r = Runtime.getRuntime();
    3.50 +			Process p = r.exec(new String[]{PŘÍKAZ_DOT, "-T", "svg", "-o", souborSložka + ".svg"});
    3.51 +
    3.52 +			/**
    3.53 +			 * TODO: generovat i PNG bitmapu
    3.54 +			 */
    3.55 +			PrintStream vstupProcesu = new PrintStream(p.getOutputStream());
    3.56 +			vstupProcesu.print(zdroják.toString());
    3.57 +			vstupProcesu.close();
    3.58 +
    3.59 +			String chyby = načtiProud(p.getErrorStream());
    3.60 +
    3.61 +			p.waitFor();
    3.62 +
    3.63 +			if (chyby.length() == 0) {
    3.64 +				return soubor;
    3.65 +			} else {
    3.66 +				System.err.print("Při vytváření diagramu došlo k chybě: " + chyby);
    3.67 +				return null;
    3.68 +			}
    3.69 +		} else {
    3.70 +			System.err.println("Příkaz " + PŘÍKAZ_DOT + " není na vašem systému dostupný → diagramy nelze vygreslit.");
    3.71 +			System.err.println("Můžete ho nainstalovat pomocí:");
    3.72 +			System.err.println("\t$ aptitude install graphviz   # (Debian/Ubuntu)");
    3.73 +			System.err.println("\t$ yum install graphviz        # (Fedora/RedHat)");
    3.74 +			return null;
    3.75 +		}
    3.76 +	}
    3.77 +
    3.78 +	/**
    3.79  	 * Čte proud dat dokud to jde a výsledek pak vrátí jako text.
    3.80  	 * @param proud vstupní proud
    3.81  	 * @return obsah proudu jako text
     4.1 --- a/šablona/stránka.xsl	Mon Aug 22 13:57:20 2011 +0200
     4.2 +++ b/šablona/stránka.xsl	Tue Aug 23 16:45:30 2011 +0200
     4.3 @@ -129,6 +129,33 @@
     4.4      			<pre><xsl:apply-templates/></pre>
     4.5      		</xsl:otherwise>
     4.6      	</xsl:choose>
     4.7 -    </xsl:template>   
     4.8 +    </xsl:template>
     4.9 +    
    4.10 +    <!--
    4.11 +    	Makro pro diagramy/grafy
    4.12 +    -->
    4.13 +    <xsl:template match="m:diagram">
    4.14 +    	<xsl:variable name="souborDiagramu" select="j:vytvořDiagram(text(), @orientace = 'vodorovně')"/>
    4.15 +    	<xsl:choose>
    4.16 +			<xsl:when test="$souborDiagramu">
    4.17 +				<div class="diagram">
    4.18 +					<a href="{$souborDiagramu}.svg">
    4.19 +						<img src="{$souborDiagramu}.svg" alt="Diagram {$souborDiagramu}"/>
    4.20 +					</a>
    4.21 +					<!-- TODO: SVG+PNG 
    4.22 +					<object data="{$souborDiagramu}.svg" type="image/svg+xml">
    4.23 +						<img src="{$souborDiagramu}.png" alt="Diagram {$souborDiagramu}"/>
    4.24 +					</object>
    4.25 +					 -->
    4.26 +					<xsl:if test="@nadpis">
    4.27 +						<p class="nadpis"><xsl:value-of select="@nadpis"/></p>
    4.28 +					</xsl:if>
    4.29 +				</div>
    4.30 +			</xsl:when>
    4.31 +			<xsl:otherwise>
    4.32 +				<xsl:message terminate="yes">Při vytváření diagramu došlo k chybě.</xsl:message>
    4.33 +			</xsl:otherwise>
    4.34 +    	</xsl:choose>
    4.35 +    </xsl:template>
    4.36  
    4.37  </xsl:stylesheet>