1 package org.apache.maven.doxia.module.markdown;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.HashSet;
23 import java.util.Set;
24 import java.util.regex.Matcher;
25 import java.util.regex.Pattern;
26
27 import com.vladsch.flexmark.ext.wikilink.internal.WikiLinkLinkResolver;
28 import com.vladsch.flexmark.html.IndependentLinkResolverFactory;
29 import com.vladsch.flexmark.html.LinkResolver;
30 import com.vladsch.flexmark.html.LinkResolverFactory;
31 import com.vladsch.flexmark.html.renderer.LinkResolverContext;
32 import com.vladsch.flexmark.html.renderer.LinkStatus;
33 import com.vladsch.flexmark.html.renderer.LinkType;
34 import com.vladsch.flexmark.html.renderer.ResolvedLink;
35 import com.vladsch.flexmark.util.ast.Node;
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 {
58 final Pattern pattern;
59
60
61
62
63
64
65 public FlexmarkDoxiaLinkResolver( LinkResolverContext context )
66 {
67 this.pattern = Pattern.compile(
68 "^(?![^:]+:)((?:\\./)?(?:\\.\\./)*[^\\.]+).(?:"
69 + MarkdownParserModule.FILE_EXTENSION
70 + "|"
71 + MarkdownParserModule.ALTERNATE_FILE_EXTENSION
72 + ")(#[^#\\.]*){0,1}$"
73 );
74 }
75
76
77 @Override
78 public ResolvedLink resolveLink( Node node, LinkResolverContext context, ResolvedLink link )
79 {
80 if ( link.getLinkType() == LinkType.LINK )
81 {
82 Matcher matcher = this.pattern.matcher( link.getUrl() );
83 if ( matcher.matches() )
84 {
85 return link.withStatus( LinkStatus.VALID ).withUrl( matcher.replaceAll( "$1.html$2" ) );
86 }
87 }
88
89 return link;
90 }
91
92
93
94
95 public static class Factory extends IndependentLinkResolverFactory
96 {
97 @Override
98 public Set<Class<? extends LinkResolverFactory>> getBeforeDependents()
99 {
100 Set<Class<? extends LinkResolverFactory>> set = new HashSet<>();
101 set.add( WikiLinkLinkResolver.Factory.class );
102 return set;
103 }
104
105 @Override
106 public LinkResolver create( LinkResolverContext context )
107 {
108 return new FlexmarkDoxiaLinkResolver( context );
109 }
110 }
111 }