šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Wiki.java
changeset 92 8d34f2020884
parent 87 25dec6931f18
child 133 8628ef19f353
equal deleted inserted replaced
91:1a70b4045a19 92:8d34f2020884
     1 /**
     1 /**
     2  * XML Web generátor – program na generování webových stránek
     2  * XML Web generátor – program na generování webových stránek
     3  * Copyright © 2012 František Kučera (frantovo.cz)
     3  * Copyright © 2012 František Kučera (frantovo.cz)
     4  * 
     4  *
     5  * This program is free software: you can redistribute it and/or modify
     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
     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
     7  * the Free Software Foundation, either version 3 of the License, or
     8  * (at your option) any later version.
     8  * (at your option) any later version.
     9  * 
     9  *
    10  * This program is distributed in the hope that it will be useful,
    10  * This program is distributed in the hope that it will be useful,
    11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    13  * GNU General Public License for more details.
    13  * GNU General Public License for more details.
    14  * 
    14  *
    15  * You should have received a copy of the GNU General Public License
    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/>.
    16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
    17  */
    17  */
    18 package cz.frantovo.xmlWebGenerator.makra;
    18 package cz.frantovo.xmlWebGenerator.makra;
    19 
    19 
    20 import java.io.IOException;
    20 import java.io.IOException;
    21 import java.io.PrintStream;
    21 import java.io.PrintStream;
    22 import static cz.frantovo.xmlWebGenerator.NástrojeCLI.*;
    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;
    23 
    29 
    24 /**
    30 /**
    25  * Wiki syntaxe
    31  * Wiki syntaxe
    26  * 
    32  *
    27  * @author František Kučera (frantovo.cz)
    33  * @author František Kučera (frantovo.cz)
    28  */
    34  */
    29 public class Wiki {
    35 public class Wiki {
    30 
    36 
       
    37 	public enum SYNTAXE {
       
    38 
       
    39 		markdown,
       
    40 		texy
       
    41 	}
    31 	private static final String PŘÍKAZ_MARKDOWN = "markdown";
    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/";
    32 
    48 
    33 	/**
    49 	/**
    34 	 * Převede text ve wiki syntaxi do XHTML.
    50 	 * Převede text ve wiki syntaxi do XHTML.
       
    51 	 *
    35 	 * @param wiki vstupní text v dané wiki syntaxi
    52 	 * @param wiki vstupní text v dané wiki syntaxi
    36 	 * @param syntaxe null nebo volitelně syntaxe (markdown, texy)
    53 	 * @param syntaxe null nebo volitelně syntaxe (markdown, texy)
    37 	 * @return naformátované XHTML
    54 	 * @return naformátované XHTML
    38 	 * TODO: 
    55 	 * TODO:
    39 	 *	- vracet místo textu instanci com.icl.saxon.om.NodeInfo http://saxon.sourceforge.net/saxon6.5.3/extensibility.html
    56 	 * - vracet místo textu instanci com.icl.saxon.om.NodeInfo
    40 	 *  - nebo kontrolovat validitu vygenerovaného kódu (v současnosti se spoléháme na bezchybnost markdownu)
    57 	 * http://saxon.sourceforge.net/saxon6.5.3/extensibility.html
    41 	 
    58 	 * - nebo kontrolovat validitu vygenerovaného kódu (v současnosti se spoléháme na bezchybnost
       
    59 	 * markdownu případně texy)
       
    60 	 *
    42 	 */
    61 	 */
    43 	public static String formátujWiki(String wiki, String syntaxe) throws IOException {
    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 {
    44 		if (isPříkazDostupný(PŘÍKAZ_MARKDOWN)) {
    73 		if (isPříkazDostupný(PŘÍKAZ_MARKDOWN)) {
    45 			Runtime r = Runtime.getRuntime();
    74 			Runtime r = Runtime.getRuntime();
    46 			Process p = r.exec(new String[]{PŘÍKAZ_MARKDOWN});
    75 			Process p = r.exec(new String[]{PŘÍKAZ_MARKDOWN});
    47 
    76 
    48 			/**
    77 			/**
    68 			System.err.println("\t$ aptitude install markdown         # (Debian/Ubuntu)");
    97 			System.err.println("\t$ aptitude install markdown         # (Debian/Ubuntu)");
    69 			System.err.println("\t$ yum install perl-Text-Markdown    # (Fedora/RedHat)");
    98 			System.err.println("\t$ yum install perl-Text-Markdown    # (Fedora/RedHat)");
    70 			return null;
    99 			return null;
    71 		}
   100 		}
    72 	}
   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 	}
    73 }
   161 }
    74