-
Notifications
You must be signed in to change notification settings - Fork 298
Expand file tree
/
Copy pathFormatterWithMods.java
More file actions
87 lines (72 loc) · 3.13 KB
/
FormatterWithMods.java
File metadata and controls
87 lines (72 loc) · 3.13 KB
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
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.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 FormatterWithMods {
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().endsWith("replace.com")) {
node.setUrlChars(PrefixedSubSequence.prefixOf("http://replaced.com", node.getPageRef().getEmptyPrefix()));
node.setChars(SegmentedSequence.create(node.getChars(), Arrays.asList(node.getSegmentsForChars())));
}
}
}
// use the PARSER to parse and RENDERER to parse pegdown indentation rules and render CommonMark
public static void main(String[] args) {
String original = "#Heading\n" +
"-----\n" +
"paragraph text \n" +
"[Not Changed](https://example.com#23)\n" +
"lazy continuation\n" +
"[Changed](https://replace.com#abc)\n" +
"\n" +
"[reference not changed]: https://example.com#23\n" +
"[reference changed]: https://replace.com#abc\n" +
"\n" +
"";
System.out.println("original\n");
System.out.println(original);
Node document = PARSER.parse(original);
LinkNodeVisitor visitor = new LinkNodeVisitor();
visitor.replaceUrl(document);
String commonmark = RENDERER.render(document);
System.out.println("\n\nCommonMark\n");
System.out.println(commonmark);
}
}