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 com.vladsch.flexmark.ast.FencedCodeBlock;
23 import com.vladsch.flexmark.ast.IndentedCodeBlock;
24 import com.vladsch.flexmark.html.CustomNodeRenderer;
25 import com.vladsch.flexmark.html.HtmlWriter;
26 import com.vladsch.flexmark.html.renderer.NodeRenderer;
27 import com.vladsch.flexmark.html.renderer.NodeRendererContext;
28 import com.vladsch.flexmark.html.renderer.NodeRendererFactory;
29 import com.vladsch.flexmark.html.renderer.NodeRenderingHandler;
30 import com.vladsch.flexmark.util.options.DataHolder;
31
32 import java.util.Arrays;
33 import java.util.HashSet;
34 import java.util.Set;
35
36
37
38
39 @SuppressWarnings( "WeakerAccess" )
40 class FlexmarkDoxiaNodeRenderer implements NodeRenderer
41 {
42 FlexmarkDoxiaNodeRenderer( DataHolder options )
43 {
44 }
45
46
47 @Override
48 public Set<NodeRenderingHandler<?>> getNodeRenderingHandlers()
49 {
50 return new HashSet<NodeRenderingHandler<?>>( Arrays.asList(
51 new NodeRenderingHandler<>( IndentedCodeBlock.class, new CustomNodeRenderer<IndentedCodeBlock>()
52 {
53 @Override
54 public void render( IndentedCodeBlock node, NodeRendererContext context, HtmlWriter html )
55 {
56 FlexmarkDoxiaNodeRenderer.this.render( node, context, html );
57 }
58 } ),
59 new NodeRenderingHandler<>( FencedCodeBlock.class, new CustomNodeRenderer<FencedCodeBlock>()
60 {
61 @Override
62 public void render( FencedCodeBlock node, NodeRendererContext context, HtmlWriter html )
63 {
64 FlexmarkDoxiaNodeRenderer.this.render( node, context, html );
65 }
66 } )
67 ) );
68 }
69
70 private void render( IndentedCodeBlock node, NodeRendererContext context, HtmlWriter html )
71 {
72 html.line();
73 html.attr( "class", "source" ).withAttr().tag( "div" );
74 html.srcPosWithEOL( node.getChars() ).tag( "pre" ).openPre();
75
76 String noLanguageClass = context.getHtmlOptions().noLanguageClass.trim();
77 if ( !noLanguageClass.isEmpty() )
78 {
79 html.attr( "class", noLanguageClass );
80 }
81
82
83 String s = node.getContentChars().trimTailBlankLines().normalizeEndWithEOL();
84 while ( !s.isEmpty() && s.charAt( 0 ) == '\n' )
85 {
86 html.raw( "<br/>" );
87 s = s.substring( 1 );
88 }
89 html.text( s );
90
91
92 html.tag( "/pre" ).closePre();
93 html.tag( "/div" );
94 html.line();
95 }
96
97 private void render( FencedCodeBlock node, NodeRendererContext context, HtmlWriter html )
98 {
99 html.line();
100 html.attr( "class", "source" ).withAttr().tag( "div" );
101 html.srcPosWithTrailingEOL( node.getChars() ).tag( "pre" ).openPre();
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121 String s = node.getContentChars().normalizeEOL();
122 while ( !s.isEmpty() && s.charAt( 0 ) == '\n' )
123 {
124 html.raw( "<br/>" );
125 s = s.substring( 1 );
126 }
127 html.text( s );
128
129
130 html.tag( "/pre" ).closePre();
131 html.tag( "/div" );
132 html.line();
133 }
134
135
136
137
138 public static class Factory implements NodeRendererFactory
139 {
140 @Override
141 public NodeRenderer create( final DataHolder options )
142 {
143 return new FlexmarkDoxiaNodeRenderer( options );
144 }
145 }
146 }