šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Wiki.java
author František Kučera <franta-hg@frantovo.cz>
Thu Jul 05 14:27:01 2012 +0200 (2012-07-05)
changeset 106 ae484a54d7fb
parent 87 25dec6931f18
child 133 8628ef19f353
permissions -rw-r--r--
#20 Skriptování: Podpora spouštění skriptů ze šablon (ne jen z dokumentů), oprava chyby (URI stránky bylo null),
ale při přiřazování výstupu skriptu do proměnné nejde použít disable-output-escaping="yes" resp. vloží se escapovaný výstup
(jiná makra lze přes proměnné procpat a používat je tak v jiných makrech).

viz http://www.stylusstudio.com/xsllist/200105/post40940.html
     1 /**
     2  * XML Web generátor – program na generování webových stránek
     3  * Copyright © 2012 František Kučera (frantovo.cz)
     4  *
     5  * This program is free software: you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License as published by
     7  * the Free Software Foundation, either version 3 of the License, or
     8  * (at your option) any later version.
     9  *
    10  * This program is distributed in the hope that it will be useful,
    11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    13  * GNU General Public License for more details.
    14  *
    15  * You should have received a copy of the GNU General Public License
    16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
    17  */
    18 package cz.frantovo.xmlWebGenerator.makra;
    19 
    20 import java.io.IOException;
    21 import java.io.PrintStream;
    22 import static cz.frantovo.xmlWebGenerator.NástrojeCLI.*;
    23 import java.io.BufferedReader;
    24 import java.io.InputStreamReader;
    25 import java.io.OutputStreamWriter;
    26 import java.net.URL;
    27 import java.net.URLConnection;
    28 import java.net.URLEncoder;
    29 
    30 /**
    31  * Wiki syntaxe
    32  *
    33  * @author František Kučera (frantovo.cz)
    34  */
    35 public class Wiki {
    36 
    37 	public enum SYNTAXE {
    38 
    39 		markdown,
    40 		texy
    41 	}
    42 	private static final String PŘÍKAZ_MARKDOWN = "markdown";
    43 	/**
    44 	 * Zde číhá tento PHP skript:
    45 	 * https://hg.frantovo.cz/nekurak.net/file/tip/php/texy/http/index.php
    46 	 */
    47 	private static final String URL_TEXY = "http://nekurak.net/texy/http/";
    48 
    49 	/**
    50 	 * Převede text ve wiki syntaxi do XHTML.
    51 	 *
    52 	 * @param wiki vstupní text v dané wiki syntaxi
    53 	 * @param syntaxe null nebo volitelně syntaxe (markdown, texy)
    54 	 * @return naformátované XHTML
    55 	 * TODO:
    56 	 * - vracet místo textu instanci com.icl.saxon.om.NodeInfo
    57 	 * http://saxon.sourceforge.net/saxon6.5.3/extensibility.html
    58 	 * - nebo kontrolovat validitu vygenerovaného kódu (v současnosti se spoléháme na bezchybnost
    59 	 * markdownu případně texy)
    60 	 *
    61 	 */
    62 	public static String formátujWiki(String wiki, String syntaxe) throws IOException {
    63 		if (syntaxe == null || SYNTAXE.valueOf(syntaxe) == SYNTAXE.markdown) {
    64 			return formátujMarkdown(wiki);
    65 		} else if (SYNTAXE.valueOf(syntaxe) == SYNTAXE.texy) {
    66 			return formátujTexy(wiki);
    67 		} else {
    68 			throw new IllegalArgumentException("Syntaxe není podporovaná: " + syntaxe);
    69 		}
    70 	}
    71 
    72 	private static String formátujMarkdown(String wiki) throws IOException {
    73 		if (isPříkazDostupný(PŘÍKAZ_MARKDOWN)) {
    74 			Runtime r = Runtime.getRuntime();
    75 			Process p = r.exec(new String[]{PŘÍKAZ_MARKDOWN});
    76 
    77 			/**
    78 			 * TODO: oříznout mezery na začátcích řádků, pokud je jich všude stejně?
    79 			 * (odsazení v XML)
    80 			 */
    81 			PrintStream vstupProcesu = new PrintStream(p.getOutputStream());
    82 			vstupProcesu.print(wiki);
    83 			vstupProcesu.close();
    84 
    85 			String chyby = načtiProud(p.getErrorStream());
    86 			String xhtml = načtiProud(p.getInputStream());
    87 
    88 			if (chyby.length() == 0) {
    89 				return xhtml;
    90 			} else {
    91 				System.err.print("Při zpracování wiki syntaxe došlo k chybě: " + chyby);
    92 				return null;
    93 			}
    94 		} else {
    95 			System.err.println("Příkaz " + PŘÍKAZ_MARKDOWN + " není na vašem systému dostupný → nelze formátovat texty ve wiki syntaxi.");
    96 			System.err.println("Můžete ho nainstalovat pomocí:");
    97 			System.err.println("\t$ aptitude install markdown         # (Debian/Ubuntu)");
    98 			System.err.println("\t$ yum install perl-Text-Markdown    # (Fedora/RedHat)");
    99 			return null;
   100 		}
   101 	}
   102 
   103 	/**
   104 	 * Texy! syntaxe je experimentální a oficiálně nepodporovaná.
   105 	 *
   106 	 * TODO: až bude balíček texy pro GNU/Linuxové distribuce:
   107 	 * http://forum.texy.info/cs/873-balicek-pro-linuxove-distribuce
   108 	 * řešit stejně jako Markdown.
   109 	 */
   110 	private static String formátujTexy(String wiki) throws IOException {
   111 		System.out.println("Pozor: Texy! wiki syntaxe je experimentální a oficiálně nepodporovaná.");
   112 		System.out.println("Pozor: používáte na vlastní nebezpečí!");
   113 		System.out.println("Pozor: text k interpretování bude odeslán na vzdálené URL: " + URL_TEXY);
   114 		System.out.println("Pokračovat? [a/N]");
   115 		int pokračovat = System.in.read();
   116 
   117 		if (pokračovat == 'a') {
   118 			OutputStreamWriter požadavek = null;
   119 			BufferedReader odpověď = null;
   120 			final String kódování = "UTF-8";
   121 			try {
   122 				URL url = new URL(URL_TEXY);
   123 				URLConnection spojeni = url.openConnection();
   124 				spojeni.setDoOutput(true);
   125 
   126 				/** Odešleme data */
   127 				požadavek = new OutputStreamWriter(spojeni.getOutputStream());
   128 				požadavek.write(URLEncoder.encode(wiki, kódování));
   129 				požadavek.flush();
   130 
   131 				/** Přijmeme odpověď */
   132 				odpověď = new BufferedReader(new InputStreamReader(spojeni.getInputStream(), kódování));
   133 				StringBuilder vysledek = new StringBuilder();
   134 				String radka;
   135 				while ((radka = odpověď.readLine()) != null) {
   136 					vysledek.append(radka);
   137 					vysledek.append("\n");
   138 				}
   139 
   140 				return vysledek.toString();
   141 			} catch (Exception e) {
   142 				throw new RuntimeException("Chyba při zpracovávání Texy! syntaxe: " + wiki, e);
   143 			} finally {
   144 				try {
   145 					požadavek.close();
   146 				} catch (IOException e) {
   147 					e.printStackTrace(System.err);
   148 				}
   149 				try {
   150 					odpověď.close();
   151 				} catch (IOException e) {
   152 					e.printStackTrace(System.err);
   153 				}
   154 			}
   155 		} else {
   156 			String hláška = "Texy! wiki syntaxe nebyla interpretována. Zdrojový text nebyl nikam odeslán.";
   157 			System.out.println(hláška);
   158 			return "<!-- " + hláška + " -->";
   159 		}
   160 	}
   161 }