| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- class Markdown {
-
- String parse(String markdown)
- {
- String[] lines = markdown.split("\n");
- StringBuilder result = new StringBuilder();
- boolean activeList = false;
-
- for (int i = 0; i < lines.length; i++)
- {
- String lineResult = parseLine(lines[i]);
-
- if(lineResult.matches(".*(<li>).*") && !activeList){
- activeList = true;
- result.append("<ul>");
- result.append(lineResult);
- }
- else if(!lineResult.matches(".*(<li>).*") && activeList){
- activeList = false;
- result.append("</ul>");
- result.append(lineResult);
- }
- else {
- result.append(lineResult);
- }
- }
-
- if(activeList){
- result.append("</ul>");
- }
-
- return result.toString();
- }
-
- private String parseLine(String markdown)
- {
- String result = parseHeader(markdown);
-
- if (result == null)
- {
- result = parseListItem(markdown);
- }
-
- if (result == null)
- {
- result = parseParagraph(markdown);
- }
-
- return result;
- }
-
- private String parseHeader(String markdown)
- {
- int count = 0;
-
- for (int i = 0; i < markdown.length(); i++)
- {
- if (markdown.charAt(i) == '#')
- {
- count++;
- }
- else
- {
- break;
- }
- }
-
- if (count == 0)
- {
- return null;
- }
-
- return wrap(markdown.substring(count + 1), "h" + Integer.toString(count));
- }
-
- private String parseListItem(String markdown)
- {
- if (markdown.startsWith("*"))
- {
- return wrap(parseText(markdown.substring(2)), "li");
- }
-
- return null;
- }
-
- private String parseParagraph(String markdown)
- {
- return wrap(parseText(markdown), "p");
- }
-
- private String parseText(String markdown)
- {
- return parse_(parse__(markdown));
- }
-
- private String parse_(String markdown)
- {
- return parseViaRegex(markdown, "_", "em");
- }
-
- private String parse__(String markdown)
- {
- return parseViaRegex(markdown, "__", "strong");
- }
-
- private String parseViaRegex(String markdown, String delimiter, String tag)
- {
- String pattern = delimiter + "(.+)" + delimiter;
- String replacement = "<" + tag + ">$1</" + tag + ">";
- return markdown.replaceAll(pattern, replacement);
- }
-
- private String wrap(String text, String tag){
- return "<" + tag + ">" + text + "</" + tag + ">";
- }
- }
|