-
Notifications
You must be signed in to change notification settings - Fork 274
/
Copy pathFormatterWithMods2.java
83 lines (66 loc) · 2.96 KB
/
FormatterWithMods2.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
package com.vladsch.flexmark.java.samples;
import com.vladsch.flexmark.ast.Image;
import com.vladsch.flexmark.ast.Link;
import com.vladsch.flexmark.ast.LinkNodeBase;
import com.vladsch.flexmark.ast.Reference;
import com.vladsch.flexmark.formatter.Formatter;
import com.vladsch.flexmark.html2md.converter.FlexmarkHtmlConverter;
import com.vladsch.flexmark.parser.Parser;
import com.vladsch.flexmark.util.ast.Node;
import com.vladsch.flexmark.util.ast.NodeVisitor;
import com.vladsch.flexmark.util.ast.VisitHandler;
import com.vladsch.flexmark.util.data.DataHolder;
import com.vladsch.flexmark.util.data.MutableDataSet;
import com.vladsch.flexmark.util.sequence.PrefixedSubSequence;
import com.vladsch.flexmark.util.sequence.SegmentedSequence;
import java.util.Arrays;
public class FormatterWithMods2 {
final private static DataHolder OPTIONS = new MutableDataSet();
static final MutableDataSet FORMAT_OPTIONS = new MutableDataSet();
static {
// copy extensions from Pegdown compatible to Formatting
FORMAT_OPTIONS.set(Parser.EXTENSIONS, Parser.EXTENSIONS.get(OPTIONS));
}
static final Parser PARSER = Parser.builder(OPTIONS).build();
static final Formatter RENDERER = Formatter.builder(FORMAT_OPTIONS).build();
static class LinkNodeVisitor {
NodeVisitor visitor = new NodeVisitor(
new VisitHandler<>(Link.class, this::visit),
new VisitHandler<>(Reference.class, this::visit),
new VisitHandler<>(Image.class, this::visit)
);
public void replaceUrl(Node node) {
visitor.visit(node);
}
private void visit(Link node) {
visit((LinkNodeBase) node);
}
private void visit(Reference node) {
visit((LinkNodeBase) node);
}
private void visit(Image node) {
visit((LinkNodeBase) node);
}
private void visit(LinkNodeBase node) {
if (node.getPageRef().startsWith("/")) {
node.setUrlChars(PrefixedSubSequence.prefixOf("https:", node.getPageRef()));
node.setChars(node.getChars().getBuilder().addAll(Arrays.asList(node.getSegmentsForChars())).toSequence());
}
}
}
// use the PARSER to parse and RENDERER to parse pegdown indentation rules and render CommonMark
public static void main(String[] args) {
String html = "<img src=\"//img.alicdn.com/tfscom/TB1mR4xPpXXXXXvapXXXXXXXXXX.jpg\" >";
String markdown = FlexmarkHtmlConverter.builder().build().convert(html);
System.out.println("html\n");
System.out.println(html);
System.out.println("markdown\n");
System.out.println(markdown);
Node document = PARSER.parse(markdown);
LinkNodeVisitor visitor = new LinkNodeVisitor();
visitor.replaceUrl(document);
String commonmark = RENDERER.render(document);
System.out.println("\n\nCommonMark\n");
System.out.println(commonmark);
}
}