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
64 public FlexmarkDoxiaLinkResolver(@NotNull LinkResolverBasicContext context) {
65 this.pattern = Pattern.compile("^(?![^:]+:)((?:\\./)?(?:\\.\\./)*[^\\.]+).(?:"
66 + MarkdownParserModule.FILE_EXTENSION
67 + "|"
68 + MarkdownParserModule.ALTERNATE_FILE_EXTENSION
69 + ")(#[^#\\.]*){0,1}$");
70 }
71
72
73 @Override
74 public @NotNull ResolvedLink resolveLink(
75 @NotNull Node node, @NotNull LinkResolverBasicContext context, @NotNull ResolvedLink link) {
76 if (link.getLinkType() == LinkType.LINK) {
77 Matcher matcher = this.pattern.matcher(link.getUrl());
78 if (matcher.matches()) {
79 return link.withStatus(LinkStatus.VALID).withUrl(matcher.replaceAll("$1.html$2"));
80 }
81 }
82
83 return link;
84 }
85
86
87
88
89 public static class Factory extends IndependentLinkResolverFactory {
90 @Override
91 public @Nullable Set<Class<?>> getBeforeDependents() {
92 Set<Class<?>> set = new HashSet<>();
93 set.add(WikiLinkLinkResolver.Factory.class);
94 return set;
95 }
96
97 @Override
98 public @NotNull LinkResolver apply(@NotNull LinkResolverBasicContext context) {
99 return new FlexmarkDoxiaLinkResolver(context);
100 }
101 }
102 }