-
Notifications
You must be signed in to change notification settings - Fork 3
/
CustomFencedCodeBlockRenderer.java
88 lines (79 loc) · 3.13 KB
/
CustomFencedCodeBlockRenderer.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package io.github.md2conf.flexmart.ext.fenced.code.block.internal;
import com.vladsch.flexmark.html.HtmlWriter;
import com.vladsch.flexmark.html.renderer.NodeRenderer;
import com.vladsch.flexmark.html.renderer.NodeRendererContext;
import com.vladsch.flexmark.html.renderer.NodeRendererFactory;
import com.vladsch.flexmark.html.renderer.NodeRenderingHandler;
import com.vladsch.flexmark.util.data.DataHolder;
import io.github.md2conf.flexmart.ext.fenced.code.block.CustomFencedCodeBlock;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class CustomFencedCodeBlockRenderer implements NodeRenderer {
private static final Map<String, String> LANG_MAP;
static {
LANG_MAP = new HashMap<>();
//identity mapping from confluence code names
//https://confluence.atlassian.com/doc/code-block-macro-139390.html
LANG_MAP.put("actionscript3", "actionscript3");
LANG_MAP.put("applescript", "applescript");
LANG_MAP.put("bash", "bash");
LANG_MAP.put("c#", "c#");
LANG_MAP.put("cpp", "cpp");
LANG_MAP.put("css", "css");
LANG_MAP.put("coldfusion", "coldfusion");
LANG_MAP.put("delphi", "delphi");
LANG_MAP.put("diff", "diff");
LANG_MAP.put("erlang", "erlang");
LANG_MAP.put("groovy", "groovy");
LANG_MAP.put("xml", "xml");
LANG_MAP.put("java", "java");
LANG_MAP.put("jfx", "jfx");
LANG_MAP.put("js", "js");
LANG_MAP.put("text", "text");
LANG_MAP.put("powershell", "powershell");
LANG_MAP.put("python", "python");
LANG_MAP.put("ruby", "ruby");
LANG_MAP.put("sql", "sql");
LANG_MAP.put("sass", "sass");
LANG_MAP.put("scala", "scala");
LANG_MAP.put("vb", "vb");
LANG_MAP.put("yml", "yml");
// some additional mappings from code names to confluence names
LANG_MAP.put("javascript", "js");
LANG_MAP.put("yaml", "yml");
LANG_MAP.put("txt", "text");
}
@Override
public @Nullable Set<NodeRenderingHandler<?>> getNodeRenderingHandlers() {
HashSet<NodeRenderingHandler<?>> set = new HashSet<>();
set.add(new NodeRenderingHandler<>(CustomFencedCodeBlock.class, this::render));
return set;
}
private void render(CustomFencedCodeBlock node, NodeRendererContext context, HtmlWriter html) {
String language;
if (node.getInfo() != null) {
language = LANG_MAP.getOrDefault(node.getInfo().toString(), "");
} else {
language = "";
}
html.raw("{code");
if (!language.isEmpty()) {
html.raw(":language=" + language);
}
html.raw("}\n");
html.openPreFormatted(true);
html.raw(node.getChars());
html.closePreFormatted();
html.raw("{code}\n");
}
public static class Factory implements NodeRendererFactory {
@NotNull
public NodeRenderer apply(@NotNull DataHolder options) {
return new CustomFencedCodeBlockRenderer();
}
}
}