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