Skip to content

Commit 96494e7

Browse files
authored
Simple asciidoc renderer (#203)
* Simple asciidoc renderer #129 * Code coverage
1 parent fcc801c commit 96494e7

File tree

12 files changed

+287
-7
lines changed

12 files changed

+287
-7
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Added
11+
12+
- [fj-doc-freemarker] new simple asciidoc renderer
13+
1014
### Changed
1115

1216
- [fj-doc-playground-quarkus] base image changed to registry.access.redhat.com/ubi9/openjdk-21:1.20-2.1725851045

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ There are five kinds of components (each components README.md contains module st
8989
* Doc format [![xsd](https://img.shields.io/badge/venus%20xsd-doc%202.1-purple.svg)](https://www.fugerit.org/data/java/doc/xsd/doc-2-1.xsd)
9090

9191
### 2. Modules :
92-
* [FreeMarker template, (fj-doc-freemarker)](fj-doc-freemarker/README.md) (contains a simple renderer for [HTML](fj-doc-freemarker/src/main/java/org/fugerit/java/doc/freemarker/html/FreeMarkerHtmlTypeHandler.java) and [HTML FRAGMENT](fj-doc-freemarker/src/main/java/org/fugerit/java/doc/freemarker/html/FreeMarkerHtmlFragmentTypeHandler.java))
92+
* [FreeMarker template, (fj-doc-freemarker)](fj-doc-freemarker/README.md) (contains a simple renderer for [HTML](fj-doc-freemarker/src/main/java/org/fugerit/java/doc/freemarker/html/FreeMarkerHtmlTypeHandler.java) and [HTML FRAGMENT](fj-doc-freemarker/src/main/java/org/fugerit/java/doc/freemarker/html/FreeMarkerHtmlFragmentTypeHandler.java) and [ADOC](fj-doc-freemarker/src/main/java/org/fugerit/java/doc/freemarker/asciidoc/FreeMarkerAsciidocTypeHandler.java) )
9393
* [Apache POI Module (fj-doc-mod-poi)](fj-doc-mod-poi/README.md) ([XLS](fj-doc-mod-poi/src/main/java/org/fugerit/java/doc/mod/poi/XlsPoiTypeHandler.java)/[XLSX](fj-doc-mod-poi/src/main/java/org/fugerit/java/doc/mod/poi/XlsPoiTypeHandler.java))
9494
* [Apache FOP Module (fj-doc-mod-fop)](fj-doc-mod-fop/README.md) ([PDF](fj-doc-mod-fop/src/main/java/org/fugerit/java/doc/mod/fop/PdfFopTypeHandler.java)/[FO](fj-doc-mod-fop/src/main/java/org/fugerit/java/doc/mod/fop/FreeMarkerFopTypeHandler.java))
9595
* [OpenCSV Module (fj-doc-mod-opencsv)](fj-doc-mod-opencsv/README.md) ([CSV](fj-doc-mod-opencsv/src/main/java/org/fugerit/java/doc/mod/opencsv/OpenCSVTypeHandler.java))
@@ -102,6 +102,7 @@ There are five kinds of components (each components README.md contains module st
102102
* [MD EXT](fj-doc-base/src/main/java/org/fugerit/java/doc/base/typehandler/markdown/SimpleMarkdownExtTypeHandler.java) - (fj-doc-base) output as Markdown extended (include tables) language
103103
* [HTML](fj-doc-freemarker/src/main/java/org/fugerit/java/doc/freemarker/html/FreeMarkerHtmlTypeHandler.java) - (fj-doc-freemarker) output as html
104104
* [HTML FRAGMENT](fj-doc-freemarker/src/main/java/org/fugerit/java/doc/freemarker/html/FreeMarkerHtmlFragmentTypeHandler.java) - (fj-doc-freemarker) output as html body content only (no html, head or body tags)
105+
* [ADOC](fj-doc-freemarker/src/main/java/org/fugerit/java/doc/freemarker/asciidoc/FreeMarkerAsciidocTypeHandler.java) - (fj-doc-freemarker) output as asciidoc
105106
* [XLS](fj-doc-mod-poi/src/main/java/org/fugerit/java/doc/mod/poi/XlsPoiTypeHandler.java) - (fj-doc-mod-poi) output as Microsoft XLS using Apache POI
106107
* [XLSX](fj-doc-mod-poi/src/main/java/org/fugerit/java/doc/mod/poi/XlsPoiTypeHandler.java) - (fj-doc-mod-poi) output as Microsoft XLSX using Apache POI
107108
* [PDF](fj-doc-mod-fop/src/main/java/org/fugerit/java/doc/mod/fop/PdfFopTypeHandler.java) - (fj-doc-mod-fop) - output as PDF using Apache FOP

fj-doc-base/src/main/java/org/fugerit/java/doc/base/config/DocConfig.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,11 @@ public DocConfig() {
3232
public static final String TYPE_XLSX = "xlsx";
3333

3434
public static final String TYPE_FO = "fo";
35-
35+
3636
public static final String TYPE_MD = "md";
37-
37+
38+
public static final String TYPE_ADOC = "adoc";
39+
3840
public static final String TYPE_CSV = "csv";
3941

4042
public static final String DOC_VERSION_COMPATIBILITY_2_X = "2-x";

fj-doc-base/src/main/java/org/fugerit/java/doc/base/model/DocList.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,12 @@ public String getHtmlType() {
5252
return clt;
5353
}
5454

55+
public boolean isOrdered() {
56+
return this.getListType().startsWith( "o" );
57+
}
58+
59+
public boolean isUnordered() {
60+
return !this.isOrdered();
61+
}
62+
5563
}

fj-doc-base/src/test/java/test/org/fugerit/java/doc/base/model/TestDocList.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public void testElement() {
2323
element.setId( TEST_ID );
2424
element.setListType( DocList.LIST_TYPE_OL );
2525
Assert.assertNotNull( this.worker( element ) );
26+
Assert.assertFalse( element.isUnordered() );
27+
Assert.assertTrue( element.isOrdered() );
2628
element.setListType( DocList.LIST_TYPE_OLL );
2729
Assert.assertNotNull( this.worker( element ) );
2830
element.setListType( DocList.LIST_TYPE_OLN );
@@ -33,6 +35,8 @@ public void testElement() {
3335
Assert.assertNotNull( this.worker( element ) );
3436
element.setListType( DocList.LIST_TYPE_ULM );
3537
Assert.assertNotNull( this.worker( element ) );
38+
Assert.assertTrue( element.isUnordered() );
39+
Assert.assertFalse( element.isOrdered() );
3640
}
3741

3842
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.fugerit.java.doc.freemarker.asciidoc;
2+
3+
import org.fugerit.java.doc.base.config.DocConfig;
4+
import org.fugerit.java.doc.base.config.DocTypeHandler;
5+
import org.fugerit.java.doc.freemarker.helper.FreeMarkerDocHelperTypeHandler;
6+
7+
import java.nio.charset.Charset;
8+
import java.nio.charset.StandardCharsets;
9+
10+
public class FreeMarkerAsciidocTypeHandler extends FreeMarkerDocHelperTypeHandler {
11+
12+
public static final DocTypeHandler HANDLER = new FreeMarkerAsciidocTypeHandler();
13+
14+
public static final DocTypeHandler HANDLER_UTF8 = new FreeMarkerAsciidocTypeHandler(StandardCharsets.UTF_8);
15+
16+
public static final String CHAIN_FREEMARKER = "asciidoc";
17+
18+
/**
19+
*
20+
*/
21+
private static final long serialVersionUID = -7394516771708L;
22+
23+
public FreeMarkerAsciidocTypeHandler() {
24+
super(DocConfig.TYPE_ADOC, CHAIN_FREEMARKER);
25+
}
26+
27+
public FreeMarkerAsciidocTypeHandler(Charset charset) {
28+
super(DocConfig.TYPE_ADOC, charset, CHAIN_FREEMARKER);
29+
}
30+
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.fugerit.java.doc.freemarker.asciidoc;
2+
3+
import org.fugerit.java.doc.base.config.DocTypeHandler;
4+
import org.fugerit.java.doc.base.config.DocTypeHandlerDecorator;
5+
6+
public class FreeMarkerAsciidocTypeHandlerUTF8 extends DocTypeHandlerDecorator {
7+
8+
public static final DocTypeHandler HANDLER = new FreeMarkerAsciidocTypeHandlerUTF8();
9+
10+
/**
11+
*
12+
*/
13+
private static final long serialVersionUID = -7394516771708L;
14+
15+
public FreeMarkerAsciidocTypeHandlerUTF8() {
16+
super( FreeMarkerAsciidocTypeHandler.HANDLER_UTF8 );
17+
}
18+
19+
}

fj-doc-freemarker/src/main/resources/fj_doc_freemarker_config/fm-freemarker-doc-process-config.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
<!-- Type handlers for html using freemarker (fragment version, only generates body content no html or head part -->
1717
<docHandler id="html-fragment-fm" info="fhtml" type="org.fugerit.java.doc.freemarker.html.FreeMarkerHtmlFragmentTypeHandlerEscapeUTF8" />
1818

19+
<!-- Type handlers for asciidoc using freemarker -->
20+
<docHandler id="asoc-fm" info="asoc" type="org.fugerit.java.doc.freemarker.asciidoc.FreeMarkerAsciidocTypeHandlerUTF8" />
21+
1922
<!-- Simple default PDF FOP Type handler with no added configuration -->
2023
<docHandler id="pdf-fop" info="pdf" type="org.fugerit.java.doc.mod.fop.PdfFopTypeHandler" unsafe="true" unsafeMode="log-message"/>
2124

@@ -69,4 +72,8 @@
6972
<chainStep stepType="complex" map-all="1" template-path="${chainId}.ftl"/>
7073
</docChain>
7174

75+
<docChain id="asciidoc" parent="base-freemarker-html">
76+
<chainStep stepType="complex" template-path="asciidoc.ftl"/>
77+
</docChain>
78+
7279
</freemarker-doc-process-config>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<#import "macro/ascidoc-element.ftl" as doc_element>
2+
<#if (docBase.infoDocTitle)??>= ${docBase.infoDocTitle}</#if>
3+
<#if (docBase.infoDocAuthor)??>${docBase.infoDocAuthor}</#if>
4+
<#if (docBase.infoDocSubject)??>:description: ${docBase.infoDocSubject}</#if>
5+
<#if (docBase.infoDocSubject)??>:lang: ${docBase.infoDocLanguage}</#if>
6+
7+
<#list docBase.docBody.elementList as item>
8+
<@doc_element.handleElement current=item/>
9+
</#list>
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
<#macro handleElement current><@handleElementWorker current=current isInner=false/></#macro>
2+
3+
<#macro handleElementWorker current isInner>
4+
<#assign elementType="${current.class.simpleName}"/>
5+
<#if elementType = 'DocPhrase'>
6+
<@handlePhrase current=current/>
7+
<#elseif elementType = 'DocNbsp'>&nbsp;
8+
<#elseif elementType = 'DocBr'>
9+
<#elseif elementType = 'DocPara'>
10+
<#if isInner><@handlePhrase current=current/><#else><@handlePara current=current/></#if>
11+
<#elseif elementType = 'DocTable'>
12+
<@handleTable docTable=current/>
13+
<#elseif elementType = 'DocImage'>
14+
<@handleImage docImage=current/>
15+
<#elseif elementType = 'DocList'>
16+
<@handleList docList=current level=1/>
17+
<#elseif elementType = 'DocPageBreak'>
18+
19+
<<<
20+
21+
<#elseif elementType = 'DocContainer'>
22+
<#list current.elementList as currentChild><@handleElement current=currentChild/></#list>
23+
<#else>
24+
<span>Element type non implemented yet : ${elementType}</span>
25+
</#if>
26+
</#macro>
27+
28+
<#macro handlePara current><@handleHeadings headLevel=current.headLevel/><@handleTextStyle styleValue=current.style text=current.text/> +
29+
</#macro>
30+
31+
<#macro handlePhrase current><@handleTextStyle styleValue=current.style text=current.text/></#macro>
32+
33+
<#macro handleRowList docTable rowList>
34+
<#list rowList as row>
35+
<#list row.elementList as cell><#if cell.columnSpan &gt; 1>${cell.columnSpan}+</#if><#if cell.rowSpan &gt; 1>.${cell.rowSpan}+</#if>|<#list cell.elementList as cellElement><@handleElement current=cellElement/></#list></#list>
36+
</#list>
37+
</#macro>
38+
39+
<#macro handleColWidth docTableCols><#list docTableCols as current><#if current?index != 0>,</#if>${current}</#list></#macro>
40+
41+
<#macro handleTable docTable>
42+
<#assign docTableUtil=docTable.util/>
43+
<#if (docTableUtil.strictHeader)>
44+
45+
[%header,cols="<@handleColWidth docTableCols=docTable.colWithds/>"]
46+
<#else>
47+
[cols="<@handleColWidth docTableCols=docTable.colWithds/>"]
48+
</#if>
49+
|===
50+
<@handleRowList docTable=docTable rowList=docTable.elementList/>
51+
|===
52+
</#macro>
53+
54+
<#macro handleImage docImage></#macro>
55+
56+
<#macro handleList docList level>
57+
<#list docList.elementList as li>
58+
<#if docList.ordered><#list 1..level as x>.</#list><#else><#list 1..level as x>*</#list></#if><#list li.elementList as element><#if element.class.simpleName='DocList'>
59+
<@handleList docList=element level=level+1/><#else> <@handleElementWorker current=element isInner=true/></#if></#list>
60+
</#list>
61+
</#macro>
62+
63+
<#macro handleTextStyle styleValue text><#if styleValue = 2>*${text}*<#elseif styleValue = 3>__${text}__<#elseif styleValue = 4>_${text}_<#elseif styleValue = 5>*_${text}_*<#else>${text}</#if></#macro>
64+
65+
<#macro handleHeadings headLevel><#if headLevel != 0><#list 0..headLevel as x>=</#list> </#if></#macro>

0 commit comments

Comments
 (0)