Diagramy #13 – první verze, celkem funguje.
authorFrantišek Kučera <franta-hg@frantovo.cz>
Tue, 23 Aug 2011 16:45:30 +0200
changeset 32 6bc25517ac4f
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
--- a/vstup/css/styl.css	Mon Aug 22 13:57:20 2011 +0200
+++ b/vstup/css/styl.css	Tue Aug 23 16:45:30 2011 +0200
@@ -60,3 +60,23 @@
 	padding: 6px;
 	border-radius: 4px;
 }
+
+.diagram {
+	background-color: #ddf;
+	padding: 6px;
+	border-radius: 4px;
+	text-align: center;
+	max-width: 100%;
+	overflow: auto;
+}
+
+.diagram .nadpis {
+	font-size: 60%;
+	padding: 4px;
+	margin-top: 6px;
+	margin-bottom: -6px;
+	margin-left: -6px;
+	margin-right: -6px;	
+	background-color: #d0d0f0;
+	border-radius: 0px 0px 4px 4px;
+}
--- a/vstup/kontakt.xml	Mon Aug 22 13:57:20 2011 +0200
+++ b/vstup/kontakt.xml	Tue Aug 23 16:45:30 2011 +0200
@@ -1,4 +1,6 @@
-<stránka xmlns="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/strana">
+<stránka
+	xmlns="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/strana"
+	xmlns:m="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/makro">
 	<nadpis>Kontakt</nadpis>
 	<perex>Kde nás najdete.</perex>
 	<pořadí>60</pořadí>
@@ -12,6 +14,42 @@
 			Tučňákova Lhota<br/>
 			Česká republika
         </p>
+        
+        <h2>Organizační struktura</h2>
+        
+        <p>
+        	Zde je orgranizační struktura naší skvělé firmy:
+        </p>
+        
+        <m:diagram nadpis="Naše organizační struktura">       		
+			tovarnik[label="pan továrník\n(majitel)"];
+			reditel[label="pan ředitel"];
+			sekretarka[label="slečna sekretářka"];
+			root[label="Linuxový guru"];
+			architekt[label="Softwarový architekt"];
+			
+			tovarnik -> reditel;
+			
+			reditel -> sekretarka;
+			reditel -> architekt;
+			reditel -> root;
+        </m:diagram>
+        
+        <h2>Procesy</h2>
+        
+        <p>
+        	Ve firmě máme spoustu procesů. Jeden z nich vypadá takto:
+        </p>
+        
+        <m:diagram orientace="vodorovně">
+			A -> B;
+			B -> C;
+        </m:diagram>
+        
+        <p>
+        	Ale protože je to tajné, tak vám neřekneme, co A, B a C znamenají.
+        </p>
+        
     </text>
 
 </stránka>
--- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java	Mon Aug 22 13:57:20 2011 +0200
+++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java	Tue Aug 23 16:45:30 2011 +0200
@@ -13,14 +13,19 @@
 /**
  * Knihovna funkcí volaných z XSLT.
  *  
- * TODO: časem rozdělit na více modulů (jmenných prostorů).
+ * TODO: 
+ *	- rozdělit na více modulů (jmenných prostorů).
+ *	- CLI konektor
  * 
  * @author fiki
  */
 public class Funkce {
 
 	private static final String PŘÍKAZ_PYGMENTIZE = "pygmentize";
+	private static final String PŘÍKAZ_DOT = "dot";
 	private static final String PŘÍKAZ_WHICH = "which";
+	private static final String ADRESÁŘ_VÝSTUPNÍ = "výstup";
+	private static int počítadloDiagramů = 0;
 
 	/**
 	 * Zjištuje, kdy byl naposledy daný soubor změněn.
@@ -91,6 +96,57 @@
 	}
 
 	/**
+	 * Vytvoří obrázek s diagramem.
+	 * @param zadání definice diagramu ve formátu dot
+	 * @param vodorovně zda má být graf orientovaný vodorovně
+	 * @return název souboru bez přípony, který byl vytvořen, nebo null, pokud došlo k chybě.
+	 */
+	public static String vytvořDiagram(String zadání, boolean vodorovně) throws IOException, InterruptedException {
+		if (isPrikazDostupny(PŘÍKAZ_DOT)) {
+			počítadloDiagramů++;
+			String soubor = "diagram-" + počítadloDiagramů;
+			String souborSložka = ADRESÁŘ_VÝSTUPNÍ + File.separator + soubor;
+
+			StringBuilder zdroják = new StringBuilder(zadání.length() + 200);
+
+			zdroják.append("digraph d {\n");
+			zdroják.append("\tbgcolor=\"transparent\";\n");
+			if (vodorovně) {
+				zdroják.append("\trankdir=LR;");
+			}
+			zdroják.append(zadání);
+			zdroják.append("}\n");
+
+			Runtime r = Runtime.getRuntime();
+			Process p = r.exec(new String[]{PŘÍKAZ_DOT, "-T", "svg", "-o", souborSložka + ".svg"});
+
+			/**
+			 * TODO: generovat i PNG bitmapu
+			 */
+			PrintStream vstupProcesu = new PrintStream(p.getOutputStream());
+			vstupProcesu.print(zdroják.toString());
+			vstupProcesu.close();
+
+			String chyby = načtiProud(p.getErrorStream());
+
+			p.waitFor();
+
+			if (chyby.length() == 0) {
+				return soubor;
+			} else {
+				System.err.print("Při vytváření diagramu došlo k chybě: " + chyby);
+				return null;
+			}
+		} else {
+			System.err.println("Příkaz " + PŘÍKAZ_DOT + " není na vašem systému dostupný → diagramy nelze vygreslit.");
+			System.err.println("Můžete ho nainstalovat pomocí:");
+			System.err.println("\t$ aptitude install graphviz   # (Debian/Ubuntu)");
+			System.err.println("\t$ yum install graphviz        # (Fedora/RedHat)");
+			return null;
+		}
+	}
+
+	/**
 	 * Čte proud dat dokud to jde a výsledek pak vrátí jako text.
 	 * @param proud vstupní proud
 	 * @return obsah proudu jako text
--- a/šablona/stránka.xsl	Mon Aug 22 13:57:20 2011 +0200
+++ b/šablona/stránka.xsl	Tue Aug 23 16:45:30 2011 +0200
@@ -129,6 +129,33 @@
     			<pre><xsl:apply-templates/></pre>
     		</xsl:otherwise>
     	</xsl:choose>
-    </xsl:template>   
+    </xsl:template>
+    
+    <!--
+    	Makro pro diagramy/grafy
+    -->
+    <xsl:template match="m:diagram">
+    	<xsl:variable name="souborDiagramu" select="j:vytvořDiagram(text(), @orientace = 'vodorovně')"/>
+    	<xsl:choose>
+			<xsl:when test="$souborDiagramu">
+				<div class="diagram">
+					<a href="{$souborDiagramu}.svg">
+						<img src="{$souborDiagramu}.svg" alt="Diagram {$souborDiagramu}"/>
+					</a>
+					<!-- TODO: SVG+PNG 
+					<object data="{$souborDiagramu}.svg" type="image/svg+xml">
+						<img src="{$souborDiagramu}.png" alt="Diagram {$souborDiagramu}"/>
+					</object>
+					 -->
+					<xsl:if test="@nadpis">
+						<p class="nadpis"><xsl:value-of select="@nadpis"/></p>
+					</xsl:if>
+				</div>
+			</xsl:when>
+			<xsl:otherwise>
+				<xsl:message terminate="yes">Při vytváření diagramu došlo k chybě.</xsl:message>
+			</xsl:otherwise>
+    	</xsl:choose>
+    </xsl:template>
 
 </xsl:stylesheet>