# HG changeset patch # User František Kučera # Date 1340467241 -7200 # Node ID 4b3ba32f613c74b9dab9b205185113b0d88ea3b2 # Parent 5b55827de220fcb4d5e935c8bc3489b9b6bc696c Skriptování: první verze diff -r 5b55827de220 -r 4b3ba32f613c vstup/skriptování.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vstup/skriptování.xml Sat Jun 23 18:00:41 2012 +0200 @@ -0,0 +1,109 @@ + + Skriptování + Na stránku můžeme vložit výstup skriptů. + + + +

+ Na stránkách můžeme používat skripty. + Spouští se při generování a jejich standardní výstup se vloží do stránky. + Třeba doprostřed ostavce nebo do jiného elementu. +

+

+ Příklad: + Tyto stránky byly vygenerované v systému uname -o. +

+ +

+ V současnosti jsou podporované tyto jazyky: +

+ +
) {
+#i.put("bash", "/bin/bash");
+	if (/podporovanýJazyk\.put\("(\w+)",\s*"(.*)"\);/) {
+		print "$1\n";
+	}
+}
+			]]>
+ +

Perl

+

Jazyky použité nebo citované na této stránce:

+
) {
+	if (/m:skript\s+jazyk="(\w+)"/) {
+		$skripty{$1}++;
+	}
+}
+
+for(keys(%skripty)) {
+	print "$skripty{$_}×\t $_\n";
+}
+			]]>
+ +

BASH

+
+ + + +

Proměnné prostředí

+

+ Ve skriptech máme dostupné následující proměnné prostředí: +

+ +
    +
  • XWG_STRANKA_URI – URI aktuálně zpracovávané stránky
  • +
  • XWG_STRANKA_SOUBOR – absolutní cesta k souboru
  • +
  • XWG_STRANKA_NADPIS – nadpis stránky
  • +
  • XWG_STRANKA_PEREX – perex stránky
  • +
+ +

+ Kód: +

+ + +echo "URI: $XWG_STRANKA_URI"; +echo "Soubor: $XWG_STRANKA_SOUBOR"; +echo "Nadpis: $XWG_STRANKA_NADPIS"; +echo "Perex: $XWG_STRANKA_PEREX"; +]]> + +

nám vypíše:

+ +
+ +
+ +
+ diff -r 5b55827de220 -r 4b3ba32f613c šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java Sat Jun 23 18:00:41 2012 +0200 @@ -0,0 +1,131 @@ +/** + * XML Web generátor – program na generování webových stránek + * Copyright © 2012 František Kučera (frantovo.cz) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package cz.frantovo.xmlWebGenerator.makra; + +import static cz.frantovo.xmlWebGenerator.NástrojeCLI.načtiProud; +import java.io.File; +import java.io.PrintStream; +import java.net.URI; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * Provedeme skript a do stránky vložíme jeho výstup. + * + * @author František Kučera (frantovo.cz) + */ +public class Skriptování { + + /** + * klíč = jazyk – např. bash + * hodnota = interpret – např. /bin/bash + */ + private static final Map interpreti; + + static { + Map podporovanýJazyk = new HashMap(); + podporovanýJazyk.put("bash", "/bin/bash"); + podporovanýJazyk.put("perl", "/usr/bin/perl"); + podporovanýJazyk.put("php", "/usr/bin/php"); + podporovanýJazyk.put("python", "/usr/bin/python"); + interpreti = Collections.unmodifiableMap(podporovanýJazyk); + } + + /** + * TODO: podporovat i složitější scénáře (např. kompilaci), + * než jen vložení do souboru a přidání správného záhlaví. + * + * @param skript program k vykonání + * @param jazyk programovací jazyk + * @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 + */ + public static String interpretuj(String skript, String jazyk, String uriStránky, String nadpisStránky, String perexStránky) { + try { + System.err.println("\tInterpretuji skript v jazyce: " + jazyk); + String interpret = interpreti.get(jazyk); + if (interpret == null) { + System.err.println("Neznámý skriptovací jazyk: " + jazyk); + return null; + } else { + File f = File.createTempFile("xml-web-generátor-", ".skript"); + f.deleteOnExit(); + + PrintStream ps = new PrintStream(f); + ps.print("#!"); + ps.println(interpret); + ps.println(); + ps.print(skript); + ps.close(); + + f.setExecutable(true); + + String[] prostředí = new String[]{ + "LANG=" + System.getenv("LANG"), + "USER=" + System.getenv("USER"), + "XWG_STRANKA_URI=" + uriStránky, + "XWG_STRANKA_SOUBOR=" + (new File(new URI(uriStránky)).getAbsolutePath()), + "XWG_STRANKA_NADPIS=" + nadpisStránky, + "XWG_STRANKA_PEREX=" + perexStránky + }; + + + + Runtime r = Runtime.getRuntime(); + Process p = r.exec(new String[]{f.getAbsolutePath()}, prostředí); + + String výsledek = načtiProud(p.getInputStream()); + String chyby = načtiProud(p.getErrorStream()); + + p.waitFor(); + + /** + * TODO: podporovat zvláštní návratový kód, kterým skript řekne, + * že výstupem je XML a má se vložit jako fragment do dokumentu, + * ne jako prostý text. + */ + if (p.exitValue() == 0) { + if (chyby.length() > 0) { + System.err.println("--- Cyhbový výstup skriptu -----"); + System.err.println(chyby); + System.err.println("--------------------------------"); + } + + return výsledek.trim(); + } else { + System.err.println("--- Standardní výstup skriptu: -----"); + System.err.println(výsledek); + System.err.println("--- Cyhbový výstup skriptu: ---------"); + System.err.println(chyby); + System.err.println("--------------------------------------"); + throw new RuntimeException("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("--------"); + System.err.println(skript); + System.err.println("--------"); + e.printStackTrace(System.err); + return null; + } + } +} diff -r 5b55827de220 -r 4b3ba32f613c šablona/makra/skriptování.xsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/šablona/makra/skriptování.xsl Sat Jun 23 18:00:41 2012 +0200 @@ -0,0 +1,46 @@ + + + + + + + + + + + +