use of org.commonmark.node.FencedCodeBlock in project hippo by NHS-digital-website.
the class FencedCodeBlockNodeRenderer method render.
@Override
public void render(Node node) {
// We only handle one type as per getNodeTypes, so we can just cast it here.
final FencedCodeBlock codeBlock = (FencedCodeBlock) node;
final String codeLanguage = codeBlock.getInfo();
final String literal = codeBlock.getLiteral();
html.tag("article", Collections.singletonMap("class", "nhsd-o-code-viewer nhsd-t-body"));
html.tag("div", ImmutableMap.of("class", "nhsd-o-code-viewer__tab-content", "role", "tabpanel", "aria-hidden", "true"));
if (codeLanguage != null) {
html.tag("p", ImmutableMap.of("class", "nhsd-t-heading-s nhsd-!t-margin-3", "data-hide-tab-header", ""));
html.text(codeLanguage.toUpperCase());
html.tag("/p");
}
html.tag("div", Collections.singletonMap("class", "nhsd-o-code-viewer__code nhsd-o-code-viewer__code__slim"));
html.tag("div", Collections.singletonMap("class", "nhsd-o-code-viewer__code-content nhsd-o-code-viewer__code-content__slim"));
html.tag("pre", Collections.singletonMap("class", "line-numbers"));
if (codeLanguage != null) {
html.tag("code", Collections.singletonMap("class", String.format("language-%s", codeLanguage)));
} else {
html.tag("code");
}
html.text(literal);
html.tag("/code");
html.tag("/pre");
html.tag("/div");
html.tag("/div");
html.tag("/div");
html.tag("/article");
}
use of org.commonmark.node.FencedCodeBlock in project hippo by NHS-digital-website.
the class FencedCodeBlockNodeRendererTest method rendersCodeBlock.
@Test
public void rendersCodeBlock() {
// Arrange
final String literal = "<button class=\"nhsd-a-button\" type=\"button\">\n <span class=\"nhsd-a-button__label\">Take primary action</span>\n</button>";
final String language = "html";
final String languageClass = String.format("language-%s", language);
FencedCodeBlock node = new FencedCodeBlock();
node.setInfo(language);
node.setLiteral(literal);
// Act
renderer.render(node);
// Assert
InOrder inOrder = Mockito.inOrder(html);
inOrder.verify(html).tag("article", Collections.singletonMap("class", "nhsd-o-code-viewer nhsd-t-body"));
inOrder.verify(html).tag("div", ImmutableMap.of("class", "nhsd-o-code-viewer__tab-content", "role", "tabpanel", "aria-hidden", "true"));
inOrder.verify(html).tag("p", ImmutableMap.of("class", "nhsd-t-heading-s nhsd-!t-margin-3", "data-hide-tab-header", ""));
inOrder.verify(html).text(language.toUpperCase());
inOrder.verify(html).tag("/p");
inOrder.verify(html).tag("div", Collections.singletonMap("class", "nhsd-o-code-viewer__code nhsd-o-code-viewer__code__slim"));
inOrder.verify(html).tag("div", Collections.singletonMap("class", "nhsd-o-code-viewer__code-content nhsd-o-code-viewer__code-content__slim"));
inOrder.verify(html).tag("pre", Collections.singletonMap("class", "line-numbers"));
inOrder.verify(html).tag("code", Collections.singletonMap("class", languageClass));
inOrder.verify(html).text(literal);
inOrder.verify(html).tag("/code");
inOrder.verify(html).tag("/pre");
inOrder.verify(html, times(3)).tag("/div");
inOrder.verify(html).tag("/article");
inOrder.verifyNoMoreInteractions();
}
use of org.commonmark.node.FencedCodeBlock in project PocketHub by pockethub.
the class MarkwonUtils method createMarkwon.
public static Markwon createMarkwon(Context context, String baseUrl) {
final Prism4j prism4j = new Prism4j(new GrammarLocatorDef());
return Markwon.builder(context).usePlugin(StrikethroughPlugin.create()).usePlugin(TaskListPlugin.create(context)).usePlugin(HtmlPlugin.create()).usePlugin(new AbstractMarkwonPlugin() {
@Override
public void configureVisitor(@NonNull MarkwonVisitor.Builder builder) {
builder.on(FencedCodeBlock.class, (visitor, fencedCodeBlock) -> {
// We actually won't be applying code spans here, as our custom view will
// draw background and apply mono typeface
//
// NB the `trim` operation on literal (as code will have a new line at the end)
final CharSequence code = visitor.configuration().syntaxHighlight().highlight(fencedCodeBlock.getInfo(), fencedCodeBlock.getLiteral().trim());
visitor.builder().append(code);
});
}
@Override
public void configureParser(@NonNull Parser.Builder builder) {
super.configureParser(builder);
builder.postProcessor(new PostProcessor() {
@Override
public Node process(Node node) {
Visitor t = new AbstractVisitor() {
@Override
public void visit(HtmlBlock htmlBlock) {
String literal = htmlBlock.getLiteral();
if (literal.startsWith("<!--")) {
htmlBlock.unlink();
} else {
super.visit(htmlBlock);
}
}
};
node.accept(t);
return node;
}
});
}
}).usePlugin(GlideImagesPlugin.create(new GifAwareGlideStore(context))).usePlugin(new SpanLinkPlugin(baseUrl)).usePlugin(new AbstractMarkwonPlugin() {
@Override
public void configure(@NonNull Registry registry) {
registry.require(HtmlPlugin.class, htmlPlugin -> htmlPlugin.addHandler(new AlignHandler()));
}
}).usePlugin(TableEntryPlugin.create(TablePlugin.create(context))).usePlugin(SyntaxHighlightPlugin.create(prism4j, Prism4jThemeDefault.create())).usePlugin(new AsyncDrawableSchedulerPlugin()).build();
}
Aggregations