Skip to content

Commit 3fd58fe

Browse files
committed
Move from peg markdown to flexmark.
1 parent 73abd10 commit 3fd58fe

File tree

3 files changed

+140
-56
lines changed

3 files changed

+140
-56
lines changed

pom.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,11 +133,11 @@
133133
<artifactId>thymeleaf</artifactId>
134134
<version>3.0.9.RELEASE</version>
135135
</dependency>
136-
<!-- Pegdown markdown parser -->
136+
<!-- Flexmark markdown parser -->
137137
<dependency>
138-
<groupId>org.pegdown</groupId>
139-
<artifactId>pegdown</artifactId>
140-
<version>1.6.0</version>
138+
<groupId>com.vladsch.flexmark</groupId>
139+
<artifactId>flexmark-all</artifactId>
140+
<version>0.62.2</version>
141141
</dependency>
142142

143143
<!-- OrientDB -->

src/main/java/org/segrada/controller/PageController.java

Lines changed: 2 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,7 @@
22

33
import com.google.inject.Singleton;
44
import com.sun.jersey.api.view.Viewable;
5-
import org.parboiled.common.StringUtils;
6-
import org.pegdown.FastEncoder;
7-
import org.pegdown.LinkRenderer;
8-
import org.pegdown.PegDownProcessor;
9-
import org.pegdown.ast.ExpImageNode;
10-
import org.pegdown.ast.ExpLinkNode;
5+
import org.segrada.rendering.markdown.PageMarkdownRenderer;
116

127
import javax.annotation.security.PermitAll;
138
import javax.servlet.http.HttpServletRequest;
@@ -167,51 +162,6 @@ private String renderPageContent(String page, String language, String contextPat
167162
return "IOEXCEPTION: " + e.getMessage();
168163
}
169164

170-
// create markdown renderer
171-
PegDownProcessor markdownParser = new PegDownProcessor();
172-
173-
// render markdown to HTML
174-
return markdownParser.markdownToHtml(sb.toString(), new PageLinkRenderer(contextPath));
175-
}
176-
177-
/**
178-
* link renderer for page context
179-
*/
180-
private class PageLinkRenderer extends LinkRenderer {
181-
private final String contextPath;
182-
183-
public PageLinkRenderer(String contextPath) {
184-
this.contextPath = contextPath;
185-
}
186-
187-
@Override
188-
public Rendering render(ExpLinkNode node, String text) {
189-
// do not change links starting with http
190-
if (node.url.startsWith("http")) // add external class
191-
return super.render(node, text).withAttribute("class", "sg-link-external");
192-
193-
// add context path to url
194-
String url = contextPath + "/page/" + node.url;
195-
// cut away .md suffix if needed
196-
if (url.endsWith(".md")) url = url.substring(0, url.length() - 3);
197-
198-
LinkRenderer.Rendering rendering = new LinkRenderer.Rendering(url, text);
199-
rendering = rendering.withAttribute("class", "sg-data-add");
200-
return StringUtils.isEmpty(node.title)?rendering:rendering.withAttribute("title", FastEncoder.encode(node.title));
201-
}
202-
203-
@Override
204-
public Rendering render(ExpImageNode node, String text) {
205-
// do not change links starting with http
206-
if (node.url.startsWith("http")) return super.render(node, text);
207-
208-
// add context path to url
209-
String url = contextPath + "/page/img/" + node.url;
210-
// cut away .png suffix if needed //TODO: make this work nicely
211-
if (url.endsWith(".png")) url = url.substring(0, url.length() - 4);
212-
213-
LinkRenderer.Rendering rendering = new LinkRenderer.Rendering(url, text);
214-
return StringUtils.isEmpty(node.title)?rendering:rendering.withAttribute("title", FastEncoder.encode(node.title));
215-
}
165+
return PageMarkdownRenderer.render(sb.toString(), contextPath);
216166
}
217167
}
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package org.segrada.rendering.markdown;
2+
3+
import com.vladsch.flexmark.ast.Image;
4+
import com.vladsch.flexmark.ast.Link;
5+
import com.vladsch.flexmark.html.HtmlRenderer;
6+
import com.vladsch.flexmark.html.HtmlRenderer.Builder;
7+
import com.vladsch.flexmark.html.HtmlRenderer.HtmlRendererExtension;
8+
import com.vladsch.flexmark.html.LinkResolver;
9+
import com.vladsch.flexmark.html.LinkResolverFactory;
10+
import com.vladsch.flexmark.html.renderer.LinkResolverBasicContext;
11+
import com.vladsch.flexmark.html.renderer.LinkStatus;
12+
import com.vladsch.flexmark.html.renderer.ResolvedLink;
13+
import com.vladsch.flexmark.parser.Parser;
14+
import com.vladsch.flexmark.util.ast.Node;
15+
import com.vladsch.flexmark.util.data.DataHolder;
16+
import com.vladsch.flexmark.util.data.MutableDataHolder;
17+
import com.vladsch.flexmark.util.data.MutableDataSet;
18+
import org.jetbrains.annotations.NotNull;
19+
import org.jetbrains.annotations.Nullable;
20+
21+
import java.util.Collections;
22+
import java.util.Set;
23+
24+
public class PageMarkdownRenderer {
25+
// markdown data holder with custom extension + more extensions defined below
26+
final private static DataHolder OPTIONS = new MutableDataSet()
27+
.set(Parser.EXTENSIONS, Collections.singletonList(CustomExtension.create())).toImmutable();
28+
29+
// markdown parser and renderer
30+
static final Parser PARSER = Parser.builder(OPTIONS).build();
31+
static final HtmlRenderer RENDERER = HtmlRenderer.builder(OPTIONS).build();
32+
33+
// context path
34+
static private String contextPath;
35+
36+
public static class PageLinkResolver implements LinkResolver {
37+
@Override
38+
public @NotNull ResolvedLink resolveLink(@NotNull Node node, @NotNull LinkResolverBasicContext linkResolverBasicContext, @NotNull ResolvedLink link) {
39+
// Links
40+
if (node instanceof Link) {
41+
String url = link.getUrl();
42+
43+
// external link
44+
if (url.startsWith("http")) {// add external class
45+
link.getMutableAttributes().addValue("class", "sg-link-external");
46+
return link.withStatus(LinkStatus.VALID).withUrl(url);
47+
}
48+
49+
// add context path to url
50+
url = PageMarkdownRenderer.contextPath + "/page/" + url;
51+
// cut away .md suffix if needed
52+
if (url.endsWith(".md")) url = url.substring(0, url.length() - 3);
53+
54+
link.getMutableAttributes().addValue("class", "sg-data-add");
55+
if (link.getTitle() == null || link.getTitle().equals("")) {
56+
return link.withStatus(LinkStatus.VALID).withUrl(url).withTitle(((Link) node).getText());
57+
}
58+
return link.withStatus(LinkStatus.VALID).withUrl(url);
59+
}
60+
61+
// Images
62+
if (node instanceof Image) {
63+
String url = link.getUrl();
64+
65+
// do not change links starting with http
66+
if (url.startsWith("http"))
67+
return link.withStatus(LinkStatus.VALID).withUrl(url);
68+
69+
// add context path to url
70+
url = PageMarkdownRenderer.contextPath + "/page/img/" + url;
71+
// cut away .png suffix if needed
72+
if (url.endsWith(".png")) url = url.substring(0, url.length() - 4);
73+
74+
if (link.getTitle() == null || link.getTitle().equals("")) {
75+
return link.withStatus(LinkStatus.VALID).withUrl(url).withTitle(((Image) node).getTitle());
76+
}
77+
return link.withStatus(LinkStatus.VALID).withUrl(url);
78+
}
79+
80+
return link;
81+
}
82+
83+
public static class Factory implements LinkResolverFactory {
84+
@Override
85+
public @Nullable Set<Class<?>> getAfterDependents() {
86+
return null;
87+
}
88+
89+
@Override
90+
public @Nullable Set<Class<?>> getBeforeDependents() {
91+
return null;
92+
}
93+
94+
@Override
95+
public boolean affectsGlobalScope() {
96+
return false;
97+
}
98+
99+
@Override
100+
public @NotNull LinkResolver apply(@NotNull LinkResolverBasicContext context) {
101+
return new PageLinkResolver();
102+
}
103+
}
104+
}
105+
106+
static class CustomExtension implements HtmlRendererExtension {
107+
@Override
108+
public void rendererOptions(@NotNull MutableDataHolder options) {
109+
110+
}
111+
112+
@Override
113+
public void extend(@NotNull Builder htmlRendererBuilder, @NotNull String rendererType) {
114+
htmlRendererBuilder.linkResolverFactory(new PageLinkResolver.Factory());
115+
}
116+
117+
static CustomExtension create() {
118+
return new CustomExtension();
119+
}
120+
}
121+
122+
/**
123+
* renders markdown to HTML
124+
*
125+
* @param markdown source
126+
* @param contextPath source
127+
* @return html
128+
*/
129+
public static String render(String markdown, String contextPath) {
130+
PageMarkdownRenderer.contextPath = contextPath;
131+
132+
return RENDERER.render(PARSER.parse(markdown));
133+
}
134+
}

0 commit comments

Comments
 (0)