package org.freertr.enc; import java.util.List; /** * markdown handler * * @author matecsaba */ public class encMarkDown { private encMarkDown() { } /** * convert plain text to html * * @param txt source * @return converted */ public static String txt2html(List txt) { if (txt == null) { return ""; } String res = "
\n";
        for (int i = 0; i < txt.size(); i++) {
            res += htmlize(txt.get(i)) + "\n";
        }
        return res + "
\n"; } private static String htmlize(String s) { s = s.replaceAll("<", "<"); s = s.replaceAll(">", ">"); return s; } private static String doMark(String s, String sb, String se, String hb, String he) { for (;;) { int i = s.indexOf(sb); if (i < 0) { break; } String a = s.substring(0, i); String b = s.substring(i + sb.length(), s.length()); i = b.indexOf(se); if (i < 0) { break; } s = b.substring(i + se.length(), b.length()); b = b.substring(0, i); s = a + hb + b + he + s; } return s; } private static String doLink(String s, String sb, String se, boolean img) { for (;;) { int i = s.indexOf(sb); if (i < 0) { break; } String a = s.substring(0, i); String b = s.substring(i + sb.length(), s.length()); i = b.indexOf(se); if (i < 0) { break; } s = b.substring(i + se.length(), b.length()); b = b.substring(0, i); String c = ""; String d = ""; if (s.startsWith("(")) { i = s.indexOf(")"); if (i < 0) { s = a + b + s; continue; } c = s.substring(1, i); s = s.substring(i + 1, s.length()); i = c.indexOf(" "); if (i >= 0) { d = " title=\"" + c.substring(i + 1, c.length()).replaceAll("\"", "") + "\""; c = c.substring(0, i); } } else { c = d; } c = c.replaceAll("\"", ""); if (img) { s = a + "\""" + s; } else { s = a + "" + b + "" + s; } } return s; } private static String doStr(String s) { s = htmlize(s); s = doLink(s, "![", "]", true); s = doLink(s, "[", "]", false); s = doMark(s, "`", "`", "", ""); s = doMark(s, "**", "**", "", ""); s = doMark(s, "__", "__", "", ""); s = doMark(s, "~~", "~~", "", ""); s = doMark(s, "*", "*", "", ""); s = doMark(s, "_", "_", "", ""); return s; } private static String doTab(String s, String sb, String se) { s = s.substring(1, s.length()); String r = ""; for (;;) { int i = s.indexOf("|"); if (i < 0) { break; } String a = s.substring(0, i); s = s.substring(i + 1, s.length()); r += sb + doStr(a) + se; } return "" + r + s + ""; } private static boolean isUnList(String s) { return s.startsWith("* ") || s.startsWith("- ") || s.startsWith("+ "); } private static boolean isOrdList(String s) { return s.startsWith("0.") || s.startsWith("1.") || s.startsWith("2.") || s.startsWith("3.") || s.startsWith("4.") || s.startsWith("5.") || s.startsWith("6.") || s.startsWith("7.") || s.startsWith("8.") || s.startsWith("9."); } private static boolean isQuote(String s) { return s.startsWith("> "); } private static boolean isCode(String s) { return s.startsWith("```"); } private static boolean isTable(String s) { return s.startsWith("|") && s.endsWith("|"); } /** * convert markdown to html * * @param md source * @return converted */ public static String md2html(List md) { if (md == null) { return ""; } String res = ""; for (int p = 0; p < md.size(); p++) { String s = md.get(p); if (s.startsWith("# ")) { res += "

" + doStr(s.substring(1, s.length())) + "

\n"; continue; } if (s.startsWith("## ")) { res += "

" + doStr(s.substring(2, s.length())) + "

\n"; continue; } if (s.startsWith("### ")) { res += "

" + doStr(s.substring(3, s.length())) + "

\n"; continue; } if (s.startsWith("#### ")) { res += "

" + doStr(s.substring(4, s.length())) + "

\n"; continue; } if (s.equals("---") || s.equals("***") || s.equals("___")) { res += "
\n"; continue; } if (isUnList(s)) { res += "\n"; if (!isUnList(s)) { p--; } continue; } if (isOrdList(s)) { res += "
    \n"; for (; p < md.size(); p++) { s = doStr(md.get(p)); if (!isOrdList(s)) { break; } res += "
  1. " + s.substring(2, s.length()) + "
  2. \n"; } res += "
\n"; if (!isOrdList(s)) { p--; } continue; } if (isQuote(s)) { res += "
\n"; for (; p < md.size(); p++) { s = md.get(p); if (!isQuote(s)) { break; } res += doStr(s.substring(2, s.length())) + "
\n"; } res += "
\n"; if (!isQuote(s)) { p--; } continue; } if (isCode(s)) { res += "
\n";
                for (p++; p < md.size(); p++) {
                    s = md.get(p);
                    if (isCode(s)) {
                        break;
                    }
                    res += htmlize(s) + "\n";
                }
                res += "
\n"; continue; } if (isTable(s)) { res += "\n"; res += doTab(s, "") + "\n"; res += "\n"; for (p += 2; p < md.size(); p++) { s = md.get(p); if (!isTable(s)) { break; } res += doTab(s, "") + "\n"; } res += "
", "
", "
\n"; if (!isTable(s)) { p--; } continue; } res += doStr(s) + "
\n"; } return res + "
\n"; } }