diff -r ae484a54d7fb -r 379a2a893fd1 šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java --- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java Thu Jul 05 14:27:01 2012 +0200 +++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java Thu Jul 05 19:10:42 2012 +0200 @@ -18,6 +18,7 @@ package cz.frantovo.xmlWebGenerator.makra; import static cz.frantovo.xmlWebGenerator.NástrojeCLI.načtiProud; +import static cz.frantovo.xmlWebGenerator.Xmlns.*; import java.io.ByteArrayInputStream; import java.io.File; import java.io.PrintStream; @@ -27,7 +28,10 @@ import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.Source; +import javax.xml.transform.dom.DOMSource; import org.w3c.dom.Document; +import org.w3c.dom.Node; /** * Provedeme skript a do stránky vložíme jeho výstup. @@ -62,9 +66,15 @@ * @param uriStránky URI aktuálně generované stránky → proměnná prostředí * @param nadpisStránky nadpis stránky → proměnná prostředí * @param perexStránky perex stránky → proměnná prostředí - * @return výstup příkazu + * @return výstup příkazu buď jako textový řetězec nebo jako XML (DOMSource) */ - public static String interpretuj(String skriptText, String skriptSoubor, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) { + public static Source interpretuj(String skriptText, String skriptSoubor, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) throws Exception { + String výstupSkriptu = získejVýstupSkriptu(skriptText, skriptSoubor, jazyk, uriStránky, nadpisStránky, perexStránky); + return vyrobXml(výstupSkriptu, "xml".equals(výstupníFormát)); + } + + private static String získejVýstupSkriptu(String skriptText, String skriptSoubor, String jazyk, String uriStránky, String nadpisStránky, String perexStránky) throws Exception { + try { if (isNeprázdný(skriptSoubor)) { System.err.println("\tInterpretuji skript ze souboru: " + skriptSoubor); @@ -136,7 +146,7 @@ System.err.println("Nicméně skript skončil úspěšně, takže pokračujeme dál."); } - return připravVýstup(výsledek, výstupníFormát); + return výsledek.trim(); } else { System.err.println("--- Standardní výstup skriptu: -----"); System.err.println(výsledek); @@ -146,26 +156,12 @@ throw new Exception("Návratová hodnota: " + p.exitValue()); } } catch (Exception e) { - System.err.println("Došlo k chybě při vykonávání skriptu v jazyce: " + jazyk); + System.err.println("Došlo k chybě při vykonávání skriptu."); System.err.println("--------"); System.err.println(skriptText); System.err.println("--------"); e.printStackTrace(System.err); - return null; - } - } - - private static String připravVýstup(String výsledek, String formát) { - if ("xml".equals(formát)) { - if (zkontrolujXml(výsledek)) { - return výsledek.trim(); - } else { - System.err.println("Chyba v XML generovaném skriptem:"); - System.err.println(výsledek); - return null; - } - } else { - return výsledek.trim(); + throw e; } } @@ -174,19 +170,34 @@ } /** - * @param xml fragment XML vygenerovaný skriptem - * @return true v případě, že výstup je validním fragmentem XML + * @param zadání výstup vygenerovaný skriptem + * @param xmlFormát formát zadání: true = xml fragment | false = prostý text + * @return xml fragment nebo prostý text zabalený do html/body + * @throws Exception */ - private static boolean zkontrolujXml(String xml) { - try { - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - DocumentBuilder db = dbf.newDocumentBuilder(); - xml = "" + xml + ""; - Document d = db.parse(new ByteArrayInputStream(xml.getBytes())); - return true; - } catch (Exception e) { - e.printStackTrace(System.err); - return false; + private static Source vyrobXml(String zadání, boolean xmlFormát) throws Exception { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + Document d; + + if (xmlFormát) { + try { + zadání = "" + zadání + ""; + d = db.parse(new ByteArrayInputStream(zadání.getBytes())); + } catch (Exception e) { + System.err.println("Chyba: Skript vrátil neplatné XML."); + throw e; + } + } else { + d = db.newDocument(); + Node html = d.createElementNS(XHTML, "html"); + Node body = d.createElementNS(XHTML, "body"); + Node text = d.createTextNode(zadání); + body.appendChild(text); + html.appendChild(body); + d.appendChild(html); } + + return new DOMSource(d); } }