1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.doxia.module.markdown;
20
21 import java.util.HashSet;
22 import java.util.Set;
23 import java.util.regex.Matcher;
24 import java.util.regex.Pattern;
25
26 import com.vladsch.flexmark.ext.wikilink.internal.WikiLinkLinkResolver;
27 import com.vladsch.flexmark.html.IndependentLinkResolverFactory;
28 import com.vladsch.flexmark.html.LinkResolver;
29 import com.vladsch.flexmark.html.renderer.LinkResolverBasicContext;
30 import com.vladsch.flexmark.html.renderer.LinkStatus;
31 import com.vladsch.flexmark.html.renderer.LinkType;
32 import com.vladsch.flexmark.html.renderer.ResolvedLink;
33 import com.vladsch.flexmark.util.ast.Node;
34 import org.jetbrains.annotations.NotNull;
35 import org.jetbrains.annotations.Nullable;
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 public class FlexmarkDoxiaLinkResolver implements LinkResolver {
57 final Pattern pattern;
58
59
60
61
62
63 public FlexmarkDoxiaLinkResolver() {
64 this.pattern = Pattern.compile("^(?![^:]+:)((?:\\./)?(?:\\.\\./)*[^\\.]+).(?:"
65 + MarkdownParserModule.FILE_EXTENSION
66 + "|"
67 + MarkdownParserModule.ALTERNATE_FILE_EXTENSION
68 + ")(#[^#\\.]*){0,1}$");
69 }
70
71 @Override
72 public @NotNull ResolvedLink resolveLink(
73 @NotNull Node node, @NotNull LinkResolverBasicContext context, @NotNull ResolvedLink link) {
74 if (link.getLinkType() == LinkType.LINK) {
75 Matcher matcher = this.pattern.matcher(link.getUrl());
76 if (matcher.matches()) {
77 return link.withStatus(LinkStatus.VALID).withUrl(matcher.replaceAll("$1.html$2"));
78 }
79 }
80
81 return link;
82 }
83
84
85
86
87 public static class Factory extends IndependentLinkResolverFactory {
88 @Override
89 public @Nullable Set<Class<?>> getBeforeDependents() {
90 Set<Class<?>> set = new HashSet<>();
91 set.add(WikiLinkLinkResolver.Factory.class);
92 return set;
93 }
94
95 @Override
96 public @NotNull LinkResolver apply(@NotNull LinkResolverBasicContext context) {
97 return new FlexmarkDoxiaLinkResolver();
98 }
99 }
100 }