Skip to content

Instantly share code, notes, and snippets.

@mkstayalive
Last active July 27, 2024 08:16
Show Gist options
  • Save mkstayalive/3211541988e5b995c751e18ca53f179f to your computer and use it in GitHub Desktop.
Save mkstayalive/3211541988e5b995c751e18ca53f179f to your computer and use it in GitHub Desktop.
Slackdown-Java: Slack flavoured Markdown to HTML in Java using flexmark-java
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