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>

fj-doc-freemarker/src/test/java/test/org/fugerit/java/doc/freemarker/coverage/TestFreemarkerCoverage.java

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
package test.org.fugerit.java.doc.freemarker.coverage;
22

3-
import java.io.ByteArrayOutputStream;
4-
import java.io.InputStreamReader;
3+
import java.io.*;
54
import java.util.Arrays;
65

76
import org.fugerit.java.core.function.SafeFunction;
87
import org.fugerit.java.core.function.SimpleValue;
98
import org.fugerit.java.core.lang.helpers.ClassHelper;
9+
import org.fugerit.java.doc.base.config.DocConfig;
1010
import org.fugerit.java.doc.base.config.DocInput;
1111
import org.fugerit.java.doc.base.config.DocOutput;
1212
import org.fugerit.java.doc.base.config.DocTypeHandler;
13+
import org.fugerit.java.doc.freemarker.asciidoc.FreeMarkerAsciidocTypeHandler;
1314
import org.fugerit.java.doc.freemarker.html.FreeMarkerHtmlFragmentTypeHandler;
1415
import org.fugerit.java.doc.freemarker.html.FreeMarkerHtmlFragmentTypeHandlerUTF8;
1516
import org.fugerit.java.doc.freemarker.html.FreeMarkerHtmlTypeHandler;
@@ -34,7 +35,8 @@ public class TestFreemarkerCoverage {
3435
private final static DocTypeHandler[] HANDLERS = { FreeMarkerHtmlTypeHandler.HANDLER,
3536
FreeMarkerHtmlTypeHandlerUTF8.HANDLER,
3637
FreeMarkerHtmlFragmentTypeHandler.HANDLER,
37-
FreeMarkerHtmlFragmentTypeHandlerUTF8.HANDLER };
38+
FreeMarkerHtmlFragmentTypeHandlerUTF8.HANDLER,
39+
FreeMarkerAsciidocTypeHandler.HANDLER_UTF8 };
3840

3941
private boolean worker( String path, boolean result ) {
4042
SimpleValue<Boolean> res = new SimpleValue<>(false);
@@ -63,7 +65,22 @@ public void test01() {
6365
} );
6466
Assert.assertTrue( Boolean.TRUE );
6567
}
66-
68+
69+
@Test
70+
public void testAsciidoc() {
71+
String docId = "asciidoc";
72+
DocTypeHandler handler = FreeMarkerAsciidocTypeHandler.HANDLER_UTF8;
73+
String type = DocConfig.TYPE_ADOC;
74+
File outputFile = new File( "target/asciidoc."+type );
75+
SafeFunction.apply( () -> {
76+
try ( InputStreamReader reader = new InputStreamReader( ClassHelper.loadFromDefaultClassLoader( "coverage/xml/"+docId+".xml" ) );
77+
FileOutputStream fos = new FileOutputStream( outputFile ) ) {
78+
handler.handle( DocInput.newInput( handler.getType() , reader ) , DocOutput.newOutput( fos ) );
79+
}
80+
} );
81+
Assert.assertTrue( outputFile.exists() );
82+
}
83+
6784
}
6885

6986
@AllArgsConstructor
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<doc
3+
xmlns="http://javacoredoc.fugerit.org"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xsi:schemaLocation="http://javacoredoc.fugerit.org https://www.fugerit.org/data/java/doc/xsd/doc-2-1.xsd" >
6+
7+
<metadata>
8+
<!-- Margin for document : left;right;top;bottom -->
9+
<info name="margins">10;10;10;30</info>
10+
<info name="excel-table-id">excel-table=print</info>
11+
<!-- documenta meta information -->
12+
<info name="doc-title">The asciidoc chronicles</info>
13+
<info name="doc-subject">fj doc venus sample source xml</info>
14+
<info name="doc-author">fugerit79</info>
15+
<info name="doc-language">en</info>
16+
<!-- additional properties -->
17+
<info name="set-total-page">true</info>
18+
<info name="html-css-link">/css/test.css</info>
19+
<!-- CSV options -->
20+
<info name="csv-table-id">excel-table</info>
21+
<header-ext>
22+
<para align="center" fore-color="#eeeeee">header test</para>
23+
</header-ext>
24+
<footer-ext>
25+
<para align="left">test</para>
26+
<para align="center">${r"${currentPage}"} / ${r"${pageCount}"}</para>
27+
<para align="right">test</para>
28+
</footer-ext>
29+
<bookmark-tree>
30+
<bookmark ref="title">Test</bookmark>
31+
</bookmark-tree>
32+
</metadata>
33+
<body>
34+
35+
<h id="title" head-level="1">The asciidoc chronicles</h>
36+
37+
<para>This is a normal paragraph</para>
38+
<para style="bold">This is a bold paragraph</para>
39+
<para style="italic">This is an italic paragraph</para>
40+
<para style="bolditalic">This is a bold italic paragraph</para>
41+
42+
<table columns="3" colwidths="30;30;40" width="100" id="excel-table" padding="2">
43+
<row header="true">
44+
<cell>
45+
<para style="bold">Name</para>
46+
</cell>
47+
<cell>
48+
<para style="bold">Surname</para>
49+
</cell>
50+
<cell>
51+
<para style="bold">Title</para>
52+
</cell>
53+
</row>
54+
<row>
55+
<cell>
56+
<para><![CDATA[Luthien]]></para>
57+
</cell>
58+
<cell>
59+
<para><![CDATA[Tinuviel]]></para>
60+
</cell>
61+
<cell>
62+
<para style="italic"><![CDATA[Queen]]></para>
63+
</cell>
64+
</row>
65+
<row>
66+
<cell>
67+
<para><![CDATA[Thorin]]></para>
68+
</cell>
69+
<cell>
70+
<para><![CDATA[Oakshield]]></para>
71+
</cell>
72+
<cell>
73+
<para style="italic"><![CDATA[King]]></para>
74+
</cell>
75+
</row>
76+
<row>
77+
<cell colspan="2">
78+
<phrase><![CDATA[Galadriel]]></phrase>
79+
</cell>
80+
<cell rowspan="2">
81+
<phrase style="italic"><![CDATA[Queen]]></phrase>
82+
</cell>
83+
</row>
84+
<row>
85+
<cell colspan="2">
86+
<phrase><![CDATA[Arwen]]></phrase>
87+
</cell>
88+
</row>
89+
</table>
90+
91+
<page-break/>
92+
93+
<list list-type="ol">
94+
<li>
95+
<para>Linux</para>
96+
<list list-type="ol">
97+
<li><para>Debian</para></li>
98+
<li><para>Red Hat</para></li>
99+
<li><para>Slackware</para></li>
100+
</list>
101+
</li>
102+
<li><para>Mac OS</para></li>
103+
<li><para>Windows</para>
104+
<list list-type="ul">
105+
<li><para>Windows 10</para></li>
106+
<li><para>Windows 11</para></li>
107+
</list>
108+
</li>
109+
</list>
110+
111+
</body>
112+
113+
</doc>

0 commit comments

Comments
 (0)