Skip to content

Commit

Permalink
(main) Bump AsciidoctorJ to the latest v2.5.12 (#121)
Browse files Browse the repository at this point in the history
* Bump AsciidoctorJ to the latest v2.5.12
* Avoid setting null as doc_type which caused NPE.
* Fix Asciidoctor instance creation.
* Avoid the use of deprecated methods. Those that use Map are still needed and cannot be removed.
* Rewrite assertions in AttributesLoaderTest to use AssertJ

closes #119
  • Loading branch information
abelsromero committed Mar 23, 2024
1 parent 0fd7795 commit 3d38fd0
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 47 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
<dependency>
<groupId>org.asciidoctor</groupId>
<artifactId>asciidoctorj</artifactId>
<version>1.5.8.1</version>
<version>2.5.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
Expand Down
1 change: 1 addition & 0 deletions src/main/java/module-info.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
module asciidoclet {
requires java.base;
requires jdk.javadoc;
requires asciidoctorj.api;
requires asciidoctorj;
exports org.asciidoctor.asciidoclet;
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,21 @@
package org.asciidoctor.asciidoclet;

import jdk.javadoc.doclet.Reporter;
import org.asciidoctor.*;
import org.asciidoctor.Asciidoctor;
import org.asciidoctor.Attributes;
import org.asciidoctor.AttributesBuilder;
import org.asciidoctor.Options;
import org.asciidoctor.OptionsBuilder;
import org.asciidoctor.SafeMode;
import org.asciidoctor.extension.RubyExtensionRegistry;
import org.asciidoctor.jruby.AsciidoctorJRuby;

import java.io.IOException;
import java.util.List;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static org.asciidoctor.Asciidoctor.Factory.create;

/**
* Doclet converter using and configuring AsciidoctorJ.
*
Expand All @@ -36,7 +41,7 @@ class AsciidoctorConverter {
static final String MARKER = " \t \t";

private static AttributesBuilder defaultAttributes() {
return AttributesBuilder.attributes()
return Attributes.builder()
.attribute("at", "&#64;")
.attribute("slash", "/")
.attribute("icons", null)
Expand All @@ -51,7 +56,7 @@ private static AttributesBuilder defaultAttributes() {
}

private static OptionsBuilder defaultOptions() {
return OptionsBuilder.options()
return Options.builder()
.safe(SafeMode.SAFE)
.backend("html5");
}
Expand All @@ -64,7 +69,14 @@ private static OptionsBuilder defaultOptions() {
private final Options options;

AsciidoctorConverter(DocletOptions docletOptions, Reporter reporter) {
this(docletOptions, reporter, OutputTemplates.create(reporter), create(docletOptions.gemPath()));
this(docletOptions, reporter, OutputTemplates.create(reporter), createAsciidoctorInstance(docletOptions.gemPath()));
}

private static Asciidoctor createAsciidoctorInstance(String gemPath) {
if (gemPath != null) {
return AsciidoctorJRuby.Factory.create(gemPath);
}
return Asciidoctor.Factory.create();
}

/**
Expand Down Expand Up @@ -161,15 +173,16 @@ private void convertTag(JavadocParser.Tag tag, StringBuilder buffer) {
* end line (e.g., `"\n "`), which gets left behind by the Javadoc
* processor.
*
* @param input AsciiDoc source
* @param input AsciiDoc source
* @param inline true to set doc_type to inline, null otherwise
* @return content rendered by Asciidoctor
*/
private String convert(String input, boolean inline) {
if (input.trim().isEmpty()) {
return "";
}
options.setDocType(inline ? INLINE_DOCTYPE : null);
return asciidoctor.render(cleanJavadocInput(input), options);
options.setDocType(inline ? INLINE_DOCTYPE : "");
return asciidoctor.convert(cleanJavadocInput(input), options);
}

static String cleanJavadocInput(String input) {
Expand Down
23 changes: 18 additions & 5 deletions src/main/java/org/asciidoctor/asciidoclet/AttributesLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,23 @@
import jdk.javadoc.doclet.Reporter;
import org.asciidoctor.Asciidoctor;
import org.asciidoctor.Attributes;
import org.asciidoctor.Options;
import org.asciidoctor.OptionsBuilder;
import org.asciidoctor.SafeMode;
import org.asciidoctor.jruby.internal.IOUtils;

import javax.tools.Diagnostic;
import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Scanner;
import java.util.Set;

class AttributesLoader {
Expand Down Expand Up @@ -82,15 +87,23 @@ private Map<String, Object> parseAttributesFile(Optional<File> attrsFile, Map<St
}

private Map<String, Object> parseAttributes(Reader in, Map<String, Object> existingAttrs) {
OptionsBuilder options = OptionsBuilder.options()
OptionsBuilder options = Options.builder()
.safe(SafeMode.SAFE)
.attributes(existingAttrs);
.attributes(existingAttrs)
.parseHeaderOnly(true);
if (docletOptions.baseDir().isPresent()) {
options.baseDir(docletOptions.baseDir().get());
}
Map<String, Object> parsed = asciidoctor.readDocumentStructure(in, options.get().map()).getHeader().getAttributes();
// workaround for https://github.com/asciidoctor/asciidoctorj/pull/169
return new HashMap<>(parsed);

final String content = read(in);
final Map<String, Object> parsed = asciidoctor.load(content, options.build()).getAttributes();
return parsed;
}

public static String read(Reader reader) {
try (Scanner scanner = new Scanner(reader).useDelimiter("\\A")){
return scanner.next();
}
}

private Set<String> getUnsetAttributes(List<String> args) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
*/
public class AsciidoctorConverterTest {

// Asciidoctorj < v2.5.12 used OS linebreaks instead of simply \n
private static final String LINEBREAK = "\r?\n";

private AsciidoctorConverter converter;
Expand Down Expand Up @@ -59,6 +58,12 @@ public void testCleanInput() {
assertEquals("/", AsciidoctorConverter.cleanJavadocInput("{slash}"));
}

@Test
public void testComment() {
assertThat(converter.convert("comment\n"))
.matches(MARKER + "<p>comment</p>" + LINEBREAK);
}

@Test
public void testParameterWithoutTypeTag() {
assertThat(converter.convert("comment\n@param p description"))
Expand Down
71 changes: 40 additions & 31 deletions src/test/java/org/asciidoctor/asciidoclet/AttributesLoaderTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,7 @@
import java.util.List;
import java.util.Map;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.assertj.core.api.Assertions.assertThat;

public class AttributesLoaderTest {

Expand All @@ -48,7 +46,7 @@ public void testNoAttributes() {

Map<String, Object> attrs = loader.load();

assertTrue(attrs.isEmpty());
assertThat(attrs).isEmpty();
reporter.assertNoMoreInteractions();
}

Expand All @@ -60,11 +58,13 @@ public void testOnlyCommandLineAttributes() {

Map<String, Object> attrs = loader.load();

assertEquals(attrs.get("foo"), "bar");
assertEquals(attrs.get("foo2"), "foo-two");
assertEquals(attrs.get("override"), "override@");
assertFalse(attrs.containsKey("not"));
assertTrue(attrs.containsKey("not!"));
assertThat(attrs)
.containsEntry("foo", "bar")
.containsEntry("foo2", "foo-two")
.containsEntry("override", "override@")
.containsKey("not!");
assertThat(attrs)
.doesNotContainKey("not");
reporter.assertNoMoreInteractions();
}

Expand All @@ -77,11 +77,13 @@ public void testOnlyCommandLineAttributesMulti() {

Map<String, Object> attrs = loader.load();

assertEquals(attrs.get("foo"), "bar");
assertEquals(attrs.get("foo2"), "foo two");
assertEquals(attrs.get("override"), "override@");
assertFalse(attrs.containsKey("not"));
assertTrue(attrs.containsKey("not!"));
assertThat(attrs)
.containsEntry("foo", "bar")
.containsEntry("foo2", "foo two")
.containsEntry("override", "override@")
.containsKey("not!");
assertThat(attrs)
.doesNotContainKey("not");
reporter.assertNoMoreInteractions();
}

Expand All @@ -95,10 +97,11 @@ public void testOnlyAttributesFile() throws IOException {

Map<String, Object> attrs = loader.load();

assertEquals(attrs.get("foo"), "BAR");
assertEquals(attrs.get("foo2"), "BAR-TWO");
assertEquals(attrs.get("override"), "OVERRIDE");
assertTrue(attrs.containsKey("not"));
assertThat(attrs)
.containsEntry("foo", "BAR")
.containsEntry("foo2", "BAR-TWO")
.containsEntry("override", "OVERRIDE")
.containsKey("not");
reporter.assertNoMoreInteractions();
}

Expand All @@ -113,11 +116,13 @@ public void testCommandLineAndAttributesFile() throws IOException {

Map<String, Object> attrs = new HashMap<>(loader.load());

assertEquals(attrs.get("foo"), "bar");
assertEquals(attrs.get("foo2"), "bar-TWO");
assertEquals(attrs.get("override"), "OVERRIDE");
assertFalse(attrs.containsKey("not"));
assertTrue(attrs.containsKey("not!"));
assertThat(attrs)
.containsEntry("foo", "bar")
.containsEntry("foo2", "bar-TWO")
.containsEntry("override", "OVERRIDE")
.containsKey("not!");
assertThat(attrs)
.doesNotContainKey("not");
reporter.assertNoMoreInteractions();
}

Expand All @@ -133,10 +138,12 @@ public void testAttributesFileIncludeFromBaseDir() throws IOException {

Map<String, Object> attrs = loader.load();

assertEquals(attrs.get("foo"), "BAR");
assertEquals(attrs.get("foo2"), "BAR-TWO");
assertEquals(attrs.get("override"), "OVERRIDE");
assertTrue(attrs.containsKey("not"));
assertThat(attrs)
.containsEntry("foo", "BAR")
.containsEntry("foo2", "BAR-TWO")
.containsEntry("override", "OVERRIDE")
.containsKey("not");

reporter.assertNoMoreInteractions();
}

Expand All @@ -153,10 +160,12 @@ public void testAttributesFileIncludeFromOtherDir() throws IOException {

Map<String, Object> attrs = loader.load();

assertEquals(attrs.get("foo"), "BAR");
assertEquals(attrs.get("foo2"), "BAR-TWO");
assertEquals(attrs.get("override"), "OVERRIDE");
assertTrue(attrs.containsKey("not"));
assertThat(attrs)
.containsEntry("foo", "BAR")
.containsEntry("foo2", "BAR-TWO")
.containsEntry("override", "OVERRIDE")
.containsKey("not");

reporter.assertNoMoreInteractions();
}

Expand Down

0 comments on commit 3d38fd0

Please sign in to comment.