package blade.migrate.core; import aQute.lib.io.IO; import com.liferay.markdown.converter.factory.MarkdownConverterFactoryUtil; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.nodes.Node; import org.jsoup.select.Elements; public class MarkdownParser { private final static Map<String, Map<String, String>> _markdowns = new HashMap<>(); public static Map<String, String> parse(String fileName) { Map<String, String> retval = _markdowns.get(fileName); if (retval == null) { try { final String markdown = new String(IO.read(MarkdownParser.class.getResourceAsStream(fileName))); final String html = MarkdownConverterFactoryUtil.create().convert(markdown); Map<String, String> sections = parseHtml(html); _markdowns.put(fileName, sections); retval = sections; } catch (IOException e) { } } return retval; } private static Map<String, String> parseHtml(String html) { Map<String, String> retval = new HashMap<>(); Document document = Jsoup.parse(html); Elements elements = document.select("a[href] > h3"); for (Element h3 : elements) { Element a = h3.parent(); int index = a.siblingIndex(); List<Node> siblings = a.siblingNodes(); StringBuilder sb = new StringBuilder(); List<Node> interesting = new ArrayList<>(); for (int i = index; i < siblings.size(); i++) { Node sibling = siblings.get(i); if (sibling.toString().startsWith("<hr")) { break; } else { interesting.add(sibling); } } for (Node node : interesting) { sb.append(node.toString()); } String href = a.attr("href"); retval.put(href, sb.toString()); } return retval; } public static String getSection(String fileName, String sectionKey) { String retval = null; if (sectionKey.equals("#legacy")) { retval = "#legacy"; } else { final Map<String, String> sections = parse(fileName); if (sections != null) { retval = sections.get(sectionKey); } } return retval; } }