Texy syntaxe: oprava chyby – ztrácely se konce řádků (problém u elementů s atributy).
1 package cz.frantovo.nekurak.ext;
3 import cz.frantovo.nekurak.dto.Komentar;
4 import cz.frantovo.nekurak.vyjimky.WikiSyntaxVyjimka;
5 import java.io.BufferedReader;
6 import java.io.IOException;
7 import java.io.InputStream;
8 import java.io.InputStreamReader;
9 import java.io.OutputStreamWriter;
10 import java.io.PrintStream;
12 import java.net.URLConnection;
13 import java.net.URLEncoder;
14 import java.util.logging.Level;
15 import java.util.logging.Logger;
18 * Neprovádí vlastní interpretaci wiki syntaxe syntaxe, ale volá HTTP službu napsanou v PHP nebo samostatný proces v systému.
19 * TODO: použít webové služby, nebo něco lepšího než ruční práci s URL.
22 public class WikiSyntaxProcesor {
24 /** TODO: parametrizovatelnost */
25 private static final String URL_SLUZBY = "http://nekurak.net/texy/http/";
26 private static final String KODOVANI = "UTF-8";
27 private static final Logger log = Logger.getLogger(WikiSyntaxProcesor.class.getSimpleName());
28 private String[] markdownPříkaz = new String[]{"sudo", "-u", "markdown", "/usr/bin/markdown"};
30 public String převeď(String text, Komentar.TYP syntaxe) throws WikiSyntaxVyjimka {
33 return převeďMarkdown(text);
35 return převeďTexy(text);
37 throw new WikiSyntaxVyjimka("Nepodporovaná wiki syntaxe.", null);
41 private String převeďMarkdown(String text) throws WikiSyntaxVyjimka {
43 Runtime r = Runtime.getRuntime();
44 Process p = r.exec(markdownPříkaz);
46 PrintStream processInput = new PrintStream(p.getOutputStream());
47 processInput.print(text);
50 String errors = načtiProud(p.getErrorStream());
51 String htmlFragment = načtiProud(p.getInputStream());
53 if (errors.length() == 0) {
56 throw new WikiSyntaxVyjimka("Markdown procesor vrátil chyby: " + errors, null);
58 } catch (Exception e) {
59 throw new WikiSyntaxVyjimka("Chyba při transformaci Markdown → XHTML", e);
63 private String převeďTexy(String text) throws WikiSyntaxVyjimka {
64 OutputStreamWriter wr = null;
65 BufferedReader rd = null;
67 URL url = new URL(URL_SLUZBY);
68 URLConnection spojeni = url.openConnection();
69 spojeni.setDoOutput(true);
72 wr = new OutputStreamWriter(spojeni.getOutputStream());
73 wr.write(URLEncoder.encode(text, KODOVANI));
76 /** Přijmeme odpověď */
77 rd = new BufferedReader(new InputStreamReader(spojeni.getInputStream(), KODOVANI));
78 StringBuilder vysledek = new StringBuilder();
80 while ((radka = rd.readLine()) != null) {
81 vysledek.append(radka);
82 vysledek.append("\n");
85 return vysledek.toString();
86 } catch (Exception e) {
87 throw new WikiSyntaxVyjimka("Chyba při zpracovávání textu: " + text, e);
91 } catch (IOException e) {
92 log.log(Level.WARNING, "Selhalo zavírání OutputStreamWriteru", e);
96 } catch (IOException e) {
97 log.log(Level.WARNING, "Selhalo zavírání BufferedReaderu", e);
103 * Čte proud dat dokud to jde a výsledek pak vrátí jako text.
104 * @param proud vstupní proud
105 * @return obsah proudu jako text
106 * @throws IOException
108 public static String načtiProud(InputStream proud) throws IOException {
109 StringBuilder výsledek = new StringBuilder();
110 BufferedReader buf = new BufferedReader(new InputStreamReader(proud));
112 String radek = buf.readLine();
116 výsledek.append(radek);
117 výsledek.append("\n");
120 return výsledek.toString();
124 * Můžeme nastavit vlastní příkaz pro transformaci Markdown syntaxe.
125 * Ve výchozím nastavení se Markdown procesor volá přes sudo pod uživatelem markdown.
126 * @param markdownPříkaz první je příkaz, následují případné parametry
128 public void setMarkdownPříkaz(String[] markdownPříkaz) {
129 this.markdownPříkaz = markdownPříkaz;