Last active
July 27, 2024 08:16
-
-
Save mkstayalive/3211541988e5b995c751e18ca53f179f to your computer and use it in GitHub Desktop.
Slackdown-Java: Slack flavoured Markdown to HTML in Java using flexmark-java
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
import com.vladsch.flexmark.html.HtmlRenderer; | |
import com.vladsch.flexmark.parser.Parser; | |
import com.vladsch.flexmark.util.ast.Node; | |
import com.vladsch.flexmark.util.options.MutableDataSet; | |
import java.util.regex.Matcher; | |
import java.util.regex.Pattern; | |
/** | |
* @author Manish Singh | |
*/ | |
public class MarkdownUtils { | |
private static final Pattern SLACKDOWN_LINK_PATTERN = Pattern.compile("(<[^>]+>)"); | |
private static final Pattern SLACKDOWN_BOLD_PATTERN = Pattern.compile("(\\*[^\\*]+\\*)"); | |
public static String markdownToHtml(String markdown) { | |
MutableDataSet options = new MutableDataSet(); | |
options.set(HtmlRenderer.SOFT_BREAK, "<br />\n"); | |
Parser parser = Parser.builder(options).build(); | |
HtmlRenderer renderer = HtmlRenderer.builder(options).build(); | |
// You can re-use parser and renderer instances | |
Node document = parser.parse(markdown); | |
return renderer.render(document); | |
} | |
public static String slackdownToHtml(String slackdown) { | |
return markdownToHtml(slackdownToMarkdown(slackdown)); | |
} | |
public static String slackdownToMarkdown(String slackdown) { | |
return handleSlackdownBold(handleSlackdownLinks(slackdown)); | |
} | |
private static String handleSlackdownLinks(String slackdown) { | |
StringBuffer sb = new StringBuffer(); | |
Matcher m = SLACKDOWN_LINK_PATTERN.matcher(slackdown); | |
while (m.find()) | |
{ | |
String match = m.group(1); | |
String replacement; | |
int pipeIndex = match.indexOf("|"); | |
if (pipeIndex != -1) { | |
String link = match.substring(1, pipeIndex); | |
String text = match.substring(pipeIndex + 1, match.length() - 1); | |
replacement = String.format("[%s](%s)", text, link); | |
} else { | |
String link = match.substring(1, match.length() - 1); | |
replacement = String.format("(%s)", link); | |
} | |
if (replacement != null) | |
m.appendReplacement(sb, replacement); | |
} | |
m.appendTail(sb); | |
return sb.toString(); | |
} | |
private static String handleSlackdownBold(String slackdown) { | |
StringBuffer sb = new StringBuffer(); | |
Matcher m = SLACKDOWN_BOLD_PATTERN.matcher(slackdown); | |
while (m.find()) | |
{ | |
String match = m.group(1); | |
String replacement = String.format("*%s*", match); | |
m.appendReplacement(sb, replacement); | |
} | |
m.appendTail(sb); | |
return sb.toString(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment