Created
April 19, 2016 13:50
-
-
Save bodiam/7ea203cd1b928377f8afaaf9ac060d69 to your computer and use it in GitHub Desktop.
AsciidoctorJ has a dependency on JRuby, which is quite a heavy library to download and load. This one is based on Groovy, and could easily be ported to Java, and while limited, does provide quite some functionality.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* A very basic regex based parser for Asciidoc. | |
* | |
* Based on Slimdown (Markdown) parsers: | |
* - https://gist.github.com/jbroadway/2836900 | |
* - https://gist.github.com/renehamburger/12f14a9bd9297394e5bd | |
* - https://gist.github.com/paulcuth/8967731 | |
* | |
* @author Erik Pragt | |
*/ | |
class AsciiLite { | |
private static def para = { | |
String line = it[1] | |
String trimmed = line.trim() | |
if (trimmed =~ /^<\/?(ul|ol|li|h|p|bl)|(<!--)/) { | |
return "\n${line}\n" | |
} else { | |
return "\n<p>$trimmed</p>\n" | |
} | |
} | |
private static def blockquote = { | |
return "\n<blockquote>${it[2].trim()}</blockquote>" | |
} | |
private static def ul_list = { | |
return "\n<ul>\n\t<li>${it[1].trim()}</li>\n</ul>" | |
} | |
private static def ol_list = { | |
return "\n<ol>\n\t<li>${it[1].trim()}</li>\n</ol>" | |
} | |
private static def header = { | |
def s = it[1].size() | |
return "<h$s>${it[2].trim()}</h$s>" | |
} | |
private static def rules = [ | |
/(=+)(.*)/ : header, // header | |
/(^|\s)\/\/\s?(.*)/ : '<!-- $2 -->', // comment | |
/image::(.*)\[\]/ : '<img src="$1">', // image | |
/([^\n)]+)\[([^\[]+)\]/ : '<a href="$1">$2</a>', // links | |
/(\*)(.*?)\1/ : '<strong>$2</strong>', // bold | |
/(_)(.*?)\1/ : '<em>$2</em>', // emphasis | |
/(\[line-through\])(.*)/ : '<del>$2</del>', // del | |
// '/\:\"(.*?)\"\:/' => '<q>\1</q>', // quote /?? | |
/(\+)(.*?)\1/ : '<code>$2</code>', // inline code | |
/\n\*(.*)/ : ul_list, // ul lists | |
/\n\.(.*)/ : ol_list, // ol lists | |
/\n(>|\>)(.*)/ : blockquote, // blockquotes | |
/'''/ : '<hr />', // horizontal rule | |
/\n([^\n]+)\n/ : para, // add paragraphs | |
/<\/ul>\s?<ul>/ : '', // fix extra ul | |
/<\/ol>\s?<ol>/ : '', // fix extra ol | |
/<\/blockquote>\n<blockquote>/: "\n", // fix extra blockquote | |
/<p><\/p>/ : '' // fix extra p | |
] | |
static String render(String input) { | |
def result = "\n" + input + "\n" | |
rules.each { k, v -> | |
result = result.replaceAll(k, v) | |
} | |
result.trim() | |
} | |
} |
Author
bodiam
commented
Apr 19, 2016
For someone who is interested, I am working on a Groovy implementation of AsciiDoc called "AsciiDog": https://github.com/SuperMMX/asciidog, now it has a very basic working version that can output to HTML5 and epub.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment