Coder Social home page Coder Social logo

asciidoctor / asciidoctor-gradle-plugin Goto Github PK

View Code? Open in Web Editor NEW
282.0 23.0 119.0 12.9 MB

A Gradle plugin that uses Asciidoctor via JRuby to process AsciiDoc source files within the project.

Home Page: https://asciidoctor.github.io/asciidoctor-gradle-plugin/

License: Apache License 2.0

Groovy 94.20% Java 5.72% TeX 0.01% JavaScript 0.01% Shell 0.05% HTML 0.01%

asciidoctor-gradle-plugin's Introduction

Asciidoctor Gradle Plugin

GitHub Actions Status Coverage Status Apache License 2 pipeline

The Asciidoctor Gradle Plugin is the official means of using Asciidoctor to convert all your AsciiDoc documentation using Gradle.

Documentation

We are migrating our documentation to the new Asciidoctor Antora-based site when it is ready. In the meantime you can read a snapshot of the current documentation at https://asciidoctor.github.io/asciidoctor-gradle-plugin/master

Structure

master now represents the code for the latest 4.x release of these plugins. Development for 4.x is against the master branch. PRs are preferably taking against this branch. The 3.x series of the plugin is now in maintenance only mode. PRs for that should be raised against the maintenance-3.xbranches.

asciidoctor-gradle-plugin's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

asciidoctor-gradle-plugin's Issues

'backends' does not seems to work

I am testing 0.8.0-SNAPSHOT.

When doing

backends = ['html5','fopub']

only HTML is generated. However, if I do

backend='fopub'

PDF is generated. The issue might be with handling multiple backends within a single task.

(I know about creating a task for each backend, but I would have thought the backends option is suppose to eliminate it).

Use configured backend in default outputDir for easier segregation of outputs

I think it would be great if the default configuration of AsciidoctorTask took the name of the selected backend and appended it to the outputDir, for example

task generateHTML (type: AsciidoctorTask, description: 'Generates single and multiple HTML documentation.', group: 'Documentation') {
    backend = 'html5'
    outputDir = new File("$buildDir/asciidoc/html")
}

task generateDocbook (type: AsciidoctorTask, description: 'Generates DOCBOOK documentation.', group: 'Documentation') {
    backend = 'docbook'
    outputDir = new File("$buildDir/asciidoc/docbook")
}

would become

task generateHTML (type: AsciidoctorTask, description: 'Generates single and multiple HTML documentation.', group: 'Documentation') {
    backend = 'html5'
}

task generateDocbook (type: AsciidoctorTask, description: 'Generates DOCBOOK documentation.', group: 'Documentation') {
    backend = 'docbook'
}

and their outputs would be placed respoectively under

build/asciidoc/html5
build/asciidoc/docbook

Refactor file processing

Refactor file processing into a common method (or methods) that can be called when processing single and multiple files.

This improvement is related to the recent changes in #36, #37 and #39.

Support all Asciidoctor options

Currently, the Gradle plugin only passes through a handful of the options that Asciidoctor supports. Ideally, the Gradle plugin should offer them all. One example is template_dir.

You can find a full list of options in the following class from the Asciidoctor Java integration library:

https://github.com/asciidoctor/asciidoctor-java-integration/blob/master/src/main/java/org/asciidoctor/Options.java

Ideally, you should make the list of options dynamic, either by synchronizing them using a helper script that keeps the list up to date or by reflecting on them at runtime.

The first case might be the most ideal since the options don't change all that often. You would use a helper script to update the Task class with any new options, then commit the changes.

Allow custom XSL parameters to be defined for fopdf backend

Allow custom XSL parameters to be defined in the plugin configuration for the fopdf backend.

The DocBook XSL templates recognize a plethora of parameters. It should be possible to define these in the plugin configuration and for the plugin to pass them on to the fop XSLT processor.

Here's an example of how this feature works using the standalone fopub script:

fopub sample.xml -param page.orientation landscape

See http://docbook.sourceforge.net/release/xsl/1.78.1/doc/param.html for a list of all possible parameters.

sourceDocumentName is mandatory

Tested with the version 0.4 under Windows 7 64bit:

When using only your snippet as build.grade and having a file in "src\asciidoc\book-multi.ad" I receive the following exception:

Caused by: org.gradle.api.InvalidUserDataException: No value has been specified for property 'sourceDocumentName'
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:46)
        ... 49 more

When setting an explicitely value for sourceDocumentName

asciidoctor {
    sourceDocumentName = new File('src/asciidoc/book-multi.ad')
}

a html file is generated.

So I do believe (not quite sure, please check) that you should annotate sourceDocumentName with org.gradle.api.tasks.Optional.

safe mode option should be configurable

The Gradle plugin should allow the safe mode option to be assigned. It's fine to set the default to UNSAFE (0), but it should still be possible for the user to override this value to unlock the security features in Asciidoctor.

Example:

asciidoctor {
  options = [
    safe: 20i
  ]
}

It might be nice to expose the safe mode constants from the Asciidoctor API so they can be used in the configuration.

Allow passing closure instead of map to options

Simplified, I have a configuration like the following:

asciidoctor {
    options = [
        attributes: [
            revnumber: project.version
        ]
    ]
}

Problem is, project.version is evaluated by grgit-release after the task graph is ready so the options map ends up wrong. It would be nice if one could pass in a closure that evaluates to the options:

asciidoctor {
    options = { [
        attributes: [
            revnumber: project.version
        ]
    ] }
}

This would help also in other cases where the options depend on running some tasks.

Support multiple docs

If I understand correctly this plugin can only handle one doc per project. Would be great to have support for multiple docs simultaneously like we did for gradle-jdocbook.

Provide sourceDocumentName as a property

To pull my asciidoc guide together I use includes in a main document, eg.

include::GuideIntroduction.asciidoc[]

When I specify the main document for sourceDir I get an error, which I guess is to be expected. Specifying only the sourceDir gives another error, probably because there are so many .adoc documents in that directory.

The maven plugin has a 'sourceDocumentName' in addition to source, can you add that as a task property?

Plugin does not work under windows

When running under windows, it seems the plugin (V0.3.0) gets confused by slash and backslash.The exception is (on my machine):

Caused by: org.jruby.exceptions.RaiseException: (IOError) target directory does not exist: D:/Christian/Projekte/Groovy/asciidoc/D:/Christian/Projekte/Groovy/asciidoc/D:/Christian/Projekte/Groovy/asciidoc/build/asciidoc
at RUBY.render(jar:file:C:/Users/Christian/.gradle/caches/artifacts-23/filestore/org.asciidoctor/asciidoctor-java-integration/0.1.2/jar/34e5c3a38e59337da992243afb25185c56462866/asciidoctor-java-integration-0.1.2.jar!/gems/asciidoctor-0.1.2/lib/asciidoctor.rb:811)
at RUBY.render_file(jar:file:C:/Users/Christian/.gradle/caches/artifacts-23/filestore/org.asciidoctor/asciidoctor-java-integration/0.1.2/jar/34e5c3a38e59337da992243afb25185c56462866/asciidoctor-java-integration-0.1.2.jar!/gems/asciidoctor-0.1.2/lib/asciidoctor.rb:870)
at RUBY.render_file(<script>:8)
at org.jruby.gen.InterfaceImpl700735667.render_file(org/jruby/gen/InterfaceImpl700735667.gen:13)
at org.asciidoctor.gradle.AsciidoctorTask$_gititdone_closure1.doCall(AsciidoctorTask.groovy:87)
at org.asciidoctor.gradle.AsciidoctorTask.gititdone(AsciidoctorTask.groovy:74)
at org.gradle.util.ReflectionUtil.invoke(ReflectionUtil.groovy:23)

0.6.1 not found

Could not find org.asciidoctor:asciidoctor-gradle-plugin:0.6.1.

I'm assuming this is the latest as its what's in the README.

fwiw, 0.6.0 fails since JRuby isn't serializable.

Caused by: java.io.NotSerializableException: org.jruby.Ruby

Rendering under Windows fails

I did a test with current 0.3.1-SNAPSHOT and the asciidoc file http://www.methods.co.nz/asciidoc/book-multi.txt

I had to delete the lines

//[partintro]
//.Optional part introduction title
//--
//Optional part introduction goes here.
//--

because these unknown style leads to an error. After that I run into a similar path problem, see the exception here:

Caused by: org.jruby.exceptions.RaiseException: (IOError) target directory does not exist: D:/Christian/Projekte/Groovy/asciidoc/D:/Christian/Projekte/Groovy/asciidoc/D:/Christian/Projekte/Groovy/asciidoc/build/asciidoc
    at RUBY.render(jar:file:C:/Users/Christian/.gradle/caches/artifacts-23/filestore/org.asciidoctor/asciidoctor-java-integration/0.1.2/jar/34e5c3a38e59337da992243afb25185c56462866/asciidoctor-java-integration-0.1.2.jar!/gems/asciidoctor-0.1.2/lib/asciidoctor.rb:811)
    at RUBY.render_file(jar:file:C:/Users/Christian/.gradle/caches/artifacts-23/filestore/org.asciidoctor/asciidoctor-java-integration/0.1.2/jar/34e5c3a38e59337da992243afb25185c56462866/asciidoctor-java-integration-0.1.2.jar!/gems/asciidoctor-0.1.2/lib/asciidoctor.rb:870)
    at RUBY.render_file(<script>:8)
    at org.jruby.gen.InterfaceImpl477748269.render_file(org/jruby/gen/InterfaceImpl477748269.gen:13)
    at org.asciidoctor.gradle.AsciidoctorTask$_gititdone_closure1.doCall(AsciidoctorTask.groovy:97)
    at org.asciidoctor.gradle.AsciidoctorTask.gititdone(AsciidoctorTask.groovy:84)
    at org.gradle.util.ReflectionUtil.invoke(ReflectionUtil.groovy:23)

Populate attributes that map to artifact coordinates

Populate attributes that map to artifact coordinates, such as:

  • groupId
  • artifaceId
  • version

Align these property names with the other build plugins as well.

Proposed:

  • project-groupid
  • project-artifactid
  • project-version

Base plugin should be applied by default when this plugin is applied

The base plugin is responsible for adding basic tasks to a project, the clean task among them. This task is responsible for removing any artifacts created by tasks whose outputs are properly marked as such.

Automatically adding the base plugin allows people to create standalone Asciidoctor projects (just documentation sources) and not worry about additional plugin configurations. Applying this plugin when the behavior is already present (java plugin for example) causes no problem.

Allow baseDir to be specified explicitly

Since Asciidoctor 0.6.0 the baseDir is set to project.projectDir if not set. Allow the user to specify a baseDir explicitly, including a null value. Only set the baseDir if its not specified in the build file*.

* One way to accomplish this is to give baseDir a default value of false. If the value is still false when the task is executed, then change the value to project.projectDir.

Permgen issues when using Gradle daemon

If you rerun even a small project multiple times with the Gradle daemon on, then it eventually (i.e. ~10-15 times) crashes due to lack of permgen. This was also mentioned on the forums To reproduce create a project that uses the daemon. For example, you can create a gradle.properties that contains the followng:

org.gradle.daemon=true

It does not appear that I am able to see a stacktrace all of the time, but I was able to get this once:

$ gradlew clean asciidoctor --stacktrace
:clean
:asciidoctor FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':asciidoctor'.
> (LoadError) load error: jruby/java -- java.lang.OutOfMemoryError: PermGen space

* Try:
Run with --info or --debug option to get more log output.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':asciidoctor'.
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
    at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
    at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:286)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:79)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:63)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:51)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$1.run(DefaultTaskPlanExecutor.java:33)
    at org.gradle.internal.Factories$1.create(Factories.java:22)
    at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(DefaultCacheAccess.java:198)
    at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(DefaultCacheAccess.java:266)
    at org.gradle.cache.internal.DefaultPersistentDirectoryStore.longRunningOperation(DefaultPersistentDirectoryStore.java:135)
    at org.gradle.api.internal.changedetection.state.DefaultTaskArtifactStateCacheAccess.longRunningOperation(DefaultTaskArtifactStateCacheAccess.java:93)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:31)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:86)
    at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:29)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61)
    at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23)
    at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:67)
    at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:54)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:166)
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:113)
    at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:81)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:64)
    at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:33)
    at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:24)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:35)
    at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:45)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34)
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
    at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:42)
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
    at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:24)
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
    at org.gradle.launcher.daemon.server.exec.StartStopIfBuildAndStop.execute(StartStopIfBuildAndStop.java:33)
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
    at org.gradle.launcher.daemon.server.exec.ReturnResult.execute(ReturnResult.java:34)
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:71)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:69)
    at org.gradle.util.Swapper.swap(Swapper.java:38)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:69)
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
    at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34)
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
    at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:60)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34)
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
    at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:45)
    at org.gradle.launcher.daemon.server.DaemonStateCoordinator.runCommand(DaemonStateCoordinator.java:186)
    at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy.doBuild(StartBuildOrRespondWithBusy.java:49)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34)
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
    at org.gradle.launcher.daemon.server.exec.HandleStop.execute(HandleStop.java:36)
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
    at org.gradle.launcher.daemon.server.exec.DaemonHygieneAction.execute(DaemonHygieneAction.java:36)
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
    at org.gradle.launcher.daemon.server.exec.CatchAndForwardDaemonFailure.execute(CatchAndForwardDaemonFailure.java:32)
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
    at org.gradle.launcher.daemon.server.exec.DefaultDaemonCommandExecuter.executeCommand(DefaultDaemonCommandExecuter.java:51)
    at org.gradle.launcher.daemon.server.DefaultIncomingConnectionHandler$ConnectionWorker.handleCommand(DefaultIncomingConnectionHandler.java:155)
    at org.gradle.launcher.daemon.server.DefaultIncomingConnectionHandler$ConnectionWorker.receiveAndHandleCommand(DefaultIncomingConnectionHandler.java:128)
    at org.gradle.launcher.daemon.server.DefaultIncomingConnectionHandler$ConnectionWorker.run(DefaultIncomingConnectionHandler.java:116)
    at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:66)
Caused by: org.jruby.exceptions.RaiseException: (LoadError) load error: jruby/java -- java.lang.OutOfMemoryError: PermGen space
    at org.asciidoctor.gradle.AsciidoctorTask.gititdone(AsciidoctorTask.groovy:86)
Caused by: java.lang.OutOfMemoryError: PermGen space
    at org.jruby.parser.Ruby19Parser.<clinit>(Ruby19Parser.java:729)
    at org.jruby.parser.RubyParserPool.borrowParser(RubyParserPool.java:57)
    at org.jruby.parser.Parser.parse(Parser.java:110)
    at org.jruby.parser.Parser.parse(Parser.java:84)
    at org.jruby.parser.Parser.parse(Parser.java:92)
    at org.jruby.Ruby.parseFile(Ruby.java:2503)
    at org.jruby.Ruby.parseFile(Ruby.java:2514)
    at org.jruby.Ruby.loadFile(Ruby.java:2669)
    at org.jruby.runtime.load.ExternalScript.load(ExternalScript.java:66)
    at org.jruby.runtime.load.LoadService.tryLoadingLibraryOrScript(LoadService.java:958)
    at org.jruby.runtime.load.LoadService.smartLoadInternal(LoadService.java:573)
    at org.jruby.runtime.load.LoadService.requireCommon(LoadService.java:457)
    at org.jruby.runtime.load.LoadService.require(LoadService.java:421)
    at org.jruby.javasupport.Java.load(Java.java:118)
    at org.jruby.runtime.load.LoadService.reflectedLoad(LoadService.java:630)
    at org.jruby.ext.LateLoadingLibrary.load(LateLoadingLibrary.java:48)
    at org.jruby.runtime.load.LoadService.tryLoadingLibraryOrScript(LoadService.java:958)
    at org.jruby.runtime.load.LoadService.smartLoadInternal(LoadService.java:573)
    at org.jruby.runtime.load.LoadService.requireCommon(LoadService.java:457)
    at org.jruby.runtime.load.LoadService.require(LoadService.java:421)
    at org.jruby.ext.jruby.JRubyLibrary.load(JRubyLibrary.java:75)


BUILD FAILED

Total time: 11.238 secs

Looking at this quickly it seems that the issue is that org.jruby.util.log.JavaUtilLoggingLogger is adding a custom handler and formatter that is then statically cached in java.util logging. See http://rxr.whitequark.org/jruby/source/src/org/jruby/util/log/JavaUtilLoggingLogger.java

Since Gradle's daemon is creating a new ClassLoader for each build, it is causing lots of additional references to gradle's MutableURLClassLoader. The logger belongs to MutableURLClassLoader, but is cached in the system classloader via java.util logging.

Template can't see ruby based backend members

As suggested @mojavelinux, copying the default document.html.erb from https://github.com/asciidoctor/asciidoctor-backends and customizing a template from there seems to fail out.

first, I may have taken the suggestion all wrong, so enlightenment there might be the first step.

otherwise help the the below exception would be great. unsure if this is a gradle->java->ruby thing, or simply a java->juby thing. happy to open this issue elsewhere.

Caused by: org.gradle.api.GradleException: Error running Asciidoctor
12:08:27.573 [ERROR] [org.gradle.BuildExceptionReporter]    at org.asciidoctor.gradle.AsciidoctorTask.processSingleDocument(AsciidoctorTask.groovy:94)
12:08:27.574 [ERROR] [org.gradle.BuildExceptionReporter]    at org.asciidoctor.gradle.AsciidoctorTask.gititdone(AsciidoctorTask.groovy:82)
12:08:27.574 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.api.internal.BeanDynamicObject$MetaClassAdapter.invokeMethod(BeanDynamicObject.java:216)
12:08:27.574 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.api.internal.BeanDynamicObject.invokeMethod(BeanDynamicObject.java:122)
12:08:27.575 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.api.internal.CompositeDynamicObject.invokeMethod(CompositeDynamicObject.java:147)
12:08:27.575 [ERROR] [org.gradle.BuildExceptionReporter]    at org.asciidoctor.gradle.AsciidoctorTask_Decorated.invokeMethod(Unknown Source)
12:08:27.576 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.util.ReflectionUtil.invoke(ReflectionUtil.groovy:23)
12:08:27.576 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:217)
12:08:27.576 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:210)
12:08:27.577 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:199)
12:08:27.577 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:526)
12:08:27.578 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:509)
12:08:27.578 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
12:08:27.579 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
12:08:27.579 [ERROR] [org.gradle.BuildExceptionReporter]    ... 67 more
12:08:27.580 [ERROR] [org.gradle.BuildExceptionReporter] Caused by: org.jruby.exceptions.RaiseException: (NoMethodError) undefined method `default_coderay_stylesheet' for Asciidoctor::HTML5::DocumentTemplate:Class
12:08:27.580 [ERROR] [org.gradle.BuildExceptionReporter]    at RUBY.__singleton__(lingual-docs/src/templates/document.html.erb:35)
12:08:27.581 [ERROR] [org.gradle.BuildExceptionReporter]    at org.jruby.RubyBasicObject.instance_eval(org/jruby/RubyBasicObject.java:1735)
12:08:27.581 [ERROR] [org.gradle.BuildExceptionReporter]    at RUBY.__singleton__(lingual-docs/src/templates/document.html.erb)
12:08:27.581 [ERROR] [org.gradle.BuildExceptionReporter]    at RUBY.__tilt_2002(lingual-docs/src/templates/document.html.erb)
12:08:27.588 [ERROR] [org.gradle.BuildExceptionReporter]    at org.jruby.RubyMethod.call(org/jruby/RubyMethod.java:122)
12:08:27.588 [ERROR] [org.gradle.BuildExceptionReporter]    at RUBY.evaluate(jar:file:/Users/cwensel/.gradle/caches/artifacts-24/filestore/org.asciidoctor/asciidoctor-java-integration/0.1.3/jar/5cf21b4331d737ef0f3b3f543a7e5a343c1f27ec/asciidoctor-java-integration-0.1.3.jar!/gems/tilt-1.3.4/lib/tilt/template.rb:144)
12:08:27.589 [ERROR] [org.gradle.BuildExceptionReporter]    at RUBY.render(jar:file:/Users/cwensel/.gradle/caches/artifacts-24/filestore/org.asciidoctor/asciidoctor-java-integration/0.1.3/jar/5cf21b4331d737ef0f3b3f543a7e5a343c1f27ec/asciidoctor-java-integration-0.1.3.jar!/gems/tilt-1.3.4/lib/tilt/template.rb:77)
12:08:27.589 [ERROR] [org.gradle.BuildExceptionReporter]    at RUBY.render(jar:file:/Users/cwensel/.gradle/caches/artifacts-24/filestore/org.asciidoctor/asciidoctor-java-integration/0.1.3/jar/5cf21b4331d737ef0f3b3f543a7e5a343c1f27ec/asciidoctor-java-integration-0.1.3.jar!/gems/asciidoctor-0.1.3/lib/asciidoctor/renderer.rb:100)
12:08:27.590 [ERROR] [org.gradle.BuildExceptionReporter]    at RUBY.render(jar:file:/Users/cwensel/.gradle/caches/artifacts-24/filestore/org.asciidoctor/asciidoctor-java-integration/0.1.3/jar/5cf21b4331d737ef0f3b3f543a7e5a343c1f27ec/asciidoctor-java-integration-0.1.3.jar!/gems/asciidoctor-0.1.3/lib/asciidoctor/document.rb:625)
12:08:27.590 [ERROR] [org.gradle.BuildExceptionReporter]    at RUBY.render(jar:file:/Users/cwensel/.gradle/caches/artifacts-24/filestore/org.asciidoctor/asciidoctor-java-integration/0.1.3/jar/5cf21b4331d737ef0f3b3f543a7e5a343c1f27ec/asciidoctor-java-integration-0.1.3.jar!/gems/asciidoctor-0.1.3/lib/asciidoctor.rb:842)
12:08:27.591 [ERROR] [org.gradle.BuildExceptionReporter]    at RUBY.render_file(jar:file:/Users/cwensel/.gradle/caches/artifacts-24/filestore/org.asciidoctor/asciidoctor-java-integration/0.1.3/jar/5cf21b4331d737ef0f3b3f543a7e5a343c1f27ec/asciidoctor-java-integration-0.1.3.jar!/gems/asciidoctor-0.1.3/lib/asciidoctor.rb:898)
12:08:27.591 [ERROR] [org.gradle.BuildExceptionReporter]    at RUBY.render_file(<script>:8)
12:08:27.592 [ERROR] [org.gradle.BuildExceptionReporter]    at org.jruby.gen.InterfaceImpl2131852401.render_file(org/jruby/gen/InterfaceImpl2131852401.gen:13)
12:08:27.592 [ERROR] [org.gradle.BuildExceptionReporter]    at org.asciidoctor.gradle.AsciidoctorTask.processSingleDocument(AsciidoctorTask.groovy:91)
12:08:27.592 [ERROR] [org.gradle.BuildExceptionReporter]    at org.asciidoctor.gradle.AsciidoctorTask.gititdone(AsciidoctorTask.groovy:82)
12:08:27.593 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.util.ReflectionUtil.invoke(ReflectionUtil.groovy:23)

Assign the project root directory path to an attribute

A Gradle project can consists of a root project and zero or more subprojects. Currently, the Gradle plugin assigns the absolute path of the current project directory (which may be a subproject) to the projectdir directory. This allows a document to locate files relative to the the project using an expression like {projectdir}/path/to/file.

The plugin should also assign the absolute path of the root project directory to the rootdir or rootprojectdir attribute. This allows a document to locate files relative to the root project using an expression like {rootdir}/path/to/file.

Recognize all built-in backends, including docbook5

Asciidoctor 0.1.4 recognizes three built-in backends:

  • html5
  • docbook45
  • docbook5

It also recognizes two backend aliases:

  • html (resolves to html5 internally)
  • docbook (resolves to docbook45 internally)

The Gradle plugin should permit all of these values.

The plugin should also pass through any value it doesn't recognize as a String to the Asciidoctor Java API to allow custom backends to be specified. The backend enum should be a guideline, not a constrained set.

Allow multiple documents in sourceDocumentName property

Hi Andres

we use a lot of includes in our AsciiDoc files and the problem with the sourceDir is that asciidoctor scans all directories recursively, and therefore creates an html file for each include we have.

We are now using the sourceDocumentName property for each AsciiDoc file we have, so we need to defined a asciidoctor task for each document.

Therefor we would like to be able to add a list of specific AsciiDoc files to the sourceDocumentName property of the asciidoctor task.

Cheers,

Guy

gradle install fails with "Invalid publication 'mavenCustom': POM file is invalid"

With current master, try

gradle install

You'll get

FAILURE: Build failed with an exception.

  * What went wrong:
 Execution failed for task ':publishMavenCustomPublicationToMavenLocal'. 
> Failed to publish publication 'mavenCustom' to repository 'MavenLocal'
> Invalid publication 'mavenCustom': POM file is invalid. Check any modifications you  have made to the POM file.

org.gradle.api.UncheckedIOException: java.io.IOException

Under Windows the current version 0.7.0 just don't work. For example with this build file taken from the readme

buildscript {
    repositories {
        maven {
            name 'Bintray Asciidoctor repo'
            url  'http://dl.bintray.com/content/aalmiray/asciidoctor'
        }
        jcenter()
    }

    dependencies {
        classpath 'org.asciidoctor:asciidoctor-gradle-plugin:0.7.0'
    }
}

apply plugin: 'asciidoctor'

// Gradle options
wrapper {
    gradleVersion '1.8'
}

asciidoctor {
    backend = 'html5'
    outputDir = new File("$buildDir/asciidoc/html")
    options = [
        logDocuments: true,
        attributes: [
            icons: 'font',
            'source-highlighter': 'prettify',
            experimental: true,
            copycss: true
        ]
    ]
}

I receive the following exception:

org.gradle.api.UncheckedIOException: java.io.IOException: The process cannot access the file because another process has locked a portion of the file
        at org.gradle.util.hash.HashUtil.createHash(HashUtil.java:56)
        at org.gradle.util.hash.HashUtil.createHash(HashUtil.java:34)
        at org.gradle.api.internal.changedetection.state.DefaultHasher.hash(DefaultHasher.java:24)
        at org.gradle.api.internal.changedetection.state.CachingHasher.hash(CachingHasher.java:45)
        at org.gradle.api.internal.changedetection.state.DefaultFileSnapshotter$1.run(DefaultFileSnapshotter.java:48)
        at org.gradle.internal.Factories$1.create(Factories.java:22)
        at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:143)
        at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:131)
        at org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.java:134)
        at org.gradle.api.internal.changedetection.state.DefaultTaskArtifactStateCacheAccess.useCache(DefaultTaskArtifactStateCacheAccess.java:74)
        at org.gradle.api.internal.changedetection.state.DefaultFileSnapshotter.snapshot(DefaultFileSnapshotter.java:44)
        at org.gradle.api.internal.changedetection.rules.InputFilesStateChangeRule.create(InputFilesStateChangeRule.java:33)
        at org.gradle.api.internal.changedetection.rules.TaskUpToDateState.<init>(TaskUpToDateState.java:46)
        at org.gradle.api.internal.changedetection.changes.DefaultTaskArtifactStateRepository$TaskArtifactStateImpl.getStates(DefaultTaskArtifactStateRepository.java:127)
        at org.gradle.api.internal.changedetection.changes.DefaultTaskArtifactStateRepository$TaskArtifactStateImpl.isUpToDate(DefaultTaskArtifactStateRepository.java:69)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:283)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:79)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:63)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:51)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$1.run(DefaultTaskPlanExecutor.java:33)
        at org.gradle.internal.Factories$1.create(Factories.java:22)
        at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(DefaultCacheAccess.java:214)
        at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(DefaultCacheAccess.java:276)
        at org.gradle.cache.internal.DefaultPersistentDirectoryStore.longRunningOperation(DefaultPersistentDirectoryStore.java:142)
        at org.gradle.api.internal.changedetection.state.DefaultTaskArtifactStateCacheAccess.longRunningOperation(DefaultTaskArtifactStateCacheAccess.java:78)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:31)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:86)
        at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:29)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61)
        at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23)
        at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:67)
        at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:54)
        at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:166)
        at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:113)
        at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:81)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:64)
        at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:33)
        at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:24)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:35)
        at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:45)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34)
        at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
        at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:42)
        at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
        at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:24)
        at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
        at org.gradle.launcher.daemon.server.exec.StartStopIfBuildAndStop.execute(StartStopIfBuildAndStop.java:33)
        at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
        at org.gradle.launcher.daemon.server.exec.ReturnResult.execute(ReturnResult.java:34)
        at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:71)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:69)
        at org.gradle.util.Swapper.swap(Swapper.java:38)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:69)
        at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
        at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34)
        at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
        at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:59)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34)
        at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
        at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:45)
        at org.gradle.launcher.daemon.server.DaemonStateCoordinator.runCommand(DaemonStateCoordinator.java:186)
        at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy.doBuild(StartBuildOrRespondWithBusy.java:49)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34)
        at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
        at org.gradle.launcher.daemon.server.exec.HandleStop.execute(HandleStop.java:36)
        at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
        at org.gradle.launcher.daemon.server.exec.CatchAndForwardDaemonFailure.execute(CatchAndForwardDaemonFailure.java:32)
        at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125)
        at org.gradle.launcher.daemon.server.exec.DefaultDaemonCommandExecuter.executeCommand(DefaultDaemonCommandExecuter.java:48)
        at org.gradle.launcher.daemon.server.DefaultIncomingConnectionHandler$ConnectionWorker.handleCommand(DefaultIncomingConnectionHandler.java:155)
        at org.gradle.launcher.daemon.server.DefaultIncomingConnectionHandler$ConnectionWorker.receiveAndHandleCommand(DefaultIncomingConnectionHandler.java:128)
        at org.gradle.launcher.daemon.server.DefaultIncomingConnectionHandler$ConnectionWorker.run(DefaultIncomingConnectionHandler.java:116)
        at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:66)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:722)
Caused by: java.io.IOException: The process cannot access the file because another process has locked a portion of the file
        at java.io.FileInputStream.readBytes(Native Method)
        at java.io.FileInputStream.read(FileInputStream.java:220)
        at org.gradle.util.hash.HashUtil.createHash(HashUtil.java:46)
        ... 85 more

BUILD FAILED

I performed gradlew clean asciidoctor --no-daemon and I have multiple adoc-files in my source directory.
The locked file is {project dir}/.gradle/1.8/taskArtifacts/cache.properties.lock

I tested two different projects on two different computers, both running Windows.

No asciidoctor warnings are generated (or visible)

In the description of #21 I have noticed some warnings and other output from AsciiDoctor. However, I do not see this kind of output in my setup.

I tried latest version 0.5.0 and 0.4.1 (btw, README is still pointing to the old version). Tried with latest Gradle 1.6. build.gradle was copy pasted from your README, with no additions.

The problem I had was with {MyVar}-style variable substitution. When MyVar is not defined the whole line is swallowed up (which is ok, as it says that in the manual), but no warnings are generated to std-out.

Have I left out a setting somewhere?

Thanks!

if sourceFileName is given, sourceDir cannot be empty

just an inconvenience:
if sourceDocument lives in other than src/asciidoc AND
sourceDocumentName is given - then sourceDir MUST be set

(which is inconvenient, as one needs to set a variable which is never used...)

Solution would be to ignore existance-checking of the sourceDir-default...

Put your bintray project into jcenter

Please add your bintray package into jcenter(). It's just a click in your bintray config and you save us the hassle with your specific url. In my case the build has to work behind a firewall and we are forced to use the enterprise artifactory. JCenter is already configured (as well as maven central etc.). It's a pain in the neck to configure a remote repository for every single plugin into this enterprise wide artifactory...

Don't process files or folders that begin with an underscore

The user generally doesn't want include files to be rendered separately. A convention often used to hide these files from a document processor is to prefix the file name with an underscore. This plugin should honor that convention.

Consider the following hierarchy:

src/
  asciidoc/
    user-manual.adoc
    _examples/
      example-a.adoc
    faq.adoc
    _license.adoc

Both the faq.adoc and user-manual.adoc files should be processed, but the _examples directory and _license.adoc file should be skipped.

Paths using project root, not sub-project root

for some reason the template_dir option and the stylesdir and imagesdir attributes are relative to the project root, not the current sub-project root, which is counter to expectation.

Log processed documents

It would be good to have the ability to log processed documents. For example, if an error or a warning is produced by asciidoctor, we don't know which document is concerned. See this output, for example:

asciidoctor: WARNING: line 506: section title out of sequence: expected level 3, got level 4
asciidoctor: WARNING: line 528: section title out of sequence: expected level 3, got level 4
asciidoctor: ERROR: line 11: only book doctypes can contain level 0 sections
asciidoctor: WARNING: line 862: include file not found: /home/cchampeau/DEV/PROJECTS/GITHUB/groovy-core/src/spec/doc/tools/tools-groovyeclipse.adoc
asciidoctor: WARNING: line 1399: section title out of sequence: expected level 5, got level 6
asciidoctor: WARNING: line 1421: section title out of sequence: expected level 5, got level 6
asciidoctor: WARNING: line 384: include file not found: /home/cchampeau/DEV/PROJECTS/GITHUB/groovy-core/src/spec/doc/tools/tools-groovyeclipse.adoc
asciidoctor: ERROR: line 13: only book doctypes can contain level 0 sections

Attributes don't seem to pass through to the doc

I'm likely doing it wrong, or it just isn't supported, but passing an attributes Map via the options Map does not make the attributes visible to the document for expansion.

For example:

asciidoctor {
  // http://asciidoc.org/userguide.html#X88
  Map attributes = [
          'source-highlighter': 'highlightjs',
          stylesheet: 'github.css', stylesdir: 'stylesheets/',
          autowidth: 'true',
          publishURL: project.s3Bucket
  ]

  options = [attributes: attributes]
}

Won't expand via {publishURL}.

Don't copy docinfo files to the output directory

docinfo files are intended to be weaved into the output document (as handled by the processor), not copied to the output directory. The plugin should exclude these files when copying non-AsciiDoc files to the output directory.

docinfo files can be matched with the following pattern:

^(.+\-)?docinfo(-footer)?\.[^.]+$

Examples include:

  • docinfo.xml
  • docinfo.html
  • docinfo-footer.html
  • docinfo-footer.xml
  • docname-docinfo.xml
  • docname-docinfo.html
  • docname-docinfo-footer.xml
  • docname-docinfo-footer.html

cache taskArtifacts.bin Exception

With asciidoctor-gradle-plugin:0.5.0 the following snippets worked:

import org.asciidoctor.gradle.AsciidoctorTask

// common Asciidoctor settings
tasks.withType(AsciidoctorTask) { docTask ->
    options = [
        logDocuments: true,
        attributes: [
            icons: 'font',
            'source-highlighter': 'prettify',
            experimental: true
        ]
    ]
}

task generateHTML (type: AsciidoctorTask, description: 'Generates single and multiple HTML documentation.', group: 'Documentation') {
    backend = 'html5'
    outputDir = new File("$buildDir/asciidoc/html")
    options.attributes.copycss = true
}

task generateDocbook (type: AsciidoctorTask, description: 'Generates DOCBOOK documentation.', group: 'Documentation') {
    backend = 'docbook'
    outputDir = new File("$buildDir/asciidoc/docbook")
}

With asciidoctor-gradle-plugin:0.6.0 I receive the following exception:

org.gradle.api.UncheckedIOException: Could not add entry ':generateHTML' to cache taskArtifacts.bin (C:\Work\Projekte\Groovy\documentation\.gradle\1.7
\taskArtifacts\taskArtifacts.bin).
        at org.gradle.cache.internal.btree.BTreePersistentIndexedCache.put(BTreePersistentIndexedCache.java:152)
        at org.gradle.cache.internal.MultiProcessSafePersistentIndexedCache$2.run(MultiProcessSafePersistentIndexedCache.java:53)
        at org.gradle.cache.internal.DefaultFileLockManager$DefaultFileLock.doWriteAction(DefaultFileLockManager.java:199)
        at org.gradle.cache.internal.DefaultFileLockManager$DefaultFileLock.writeFile(DefaultFileLockManager.java:188)
        at org.gradle.cache.internal.DefaultCacheAccess$UnitOfWorkFileAccess.writeFile(DefaultCacheAccess.java:365)
        at org.gradle.cache.internal.MultiProcessSafePersistentIndexedCache.put(MultiProcessSafePersistentIndexedCache.java:51)
        at sun.reflect.GeneratedMethodAccessor29.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.gradle.listener.LazyCreationProxy$LazyInvocationHandler.invoke(LazyCreationProxy.java:49)
        at com.sun.proxy.$Proxy20.put(Unknown Source)
        at org.gradle.api.internal.changedetection.state.CacheBackedTaskHistoryRepository$1$1.run(CacheBackedTaskHistoryRepository.java:79)
        at org.gradle.internal.Factories$1.create(Factories.java:22)
        at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:143)
        at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:131)
        at org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.java:134)
        at org.gradle.api.internal.changedetection.state.DefaultTaskArtifactStateCacheAccess.useCache(DefaultTaskArtifactStateCacheAccess.java:74)
        at org.gradle.api.internal.changedetection.state.CacheBackedTaskHistoryRepository$1.update(CacheBackedTaskHistoryRepository.java:62)
        at org.gradle.api.internal.changedetection.changes.DefaultTaskArtifactStateRepository$TaskArtifactStateImpl.afterTask(DefaultTaskArtifactState
Repository.java:118)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:286)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:80)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:66)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTaskWithCacheLock(AbstractTaskPlanExecutor.java:58)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:47)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$1.run(DefaultTaskPlanExecutor.java:33)

When looking to UncheckedIOException: Could not add entry to cache taskArtifacts.bin I can read: This exception indicates that Gradle cannot persist the Task execution state when the Task successfully completes, because some element in the Task state is not Serializable.

Allow attributes to be specified as a String, List or Array

The plugin show allow attributes to be specified as a String, List or Array in addition to a Map.

String example:

options = [
  attributes: 'toc=right source-highlighter=coderay toc-title=Table\\ of\\ Contents'
]

List / Array example:

options = [
  attributes: ['toc=right', 'source-highlighter=coderay', 'toc-title=Table of Contents']
]

In the case of a String, the attributes are split on non-escaped spaces. In both cases, the attribute name and value are split on the first (and only first) equal sign.

cannot set out-file name (neither for docbook nor html5 backend)

in build.gradle I can specifiy an out-file option, but it's ignored :-(

I tried all of the following:

options = [ 'out-file': "lizenz.docbook" ]
options = [ attributes: ['out-file': "lizenz.docbook" ] ]
options = [ 'to-file': "lizenz.docbook"  ]

in every case, the generated output file is named "lizenz.xml"

On the command line, everything works fine: (both for asciidoc and asciidoctor)

asciidoctor --out-file lizenz.docbook -b docbook lizenz.adoc

UP-TO-DATE check fails due to baseDir input being project root

Currently the UP-TO-DATE check fails unnecessarily due to the fact that baseDir is set as the project root which means the gradle cache at .gradle is being considered as an input. An example of the output when determining if the task is up to date is:

$ ./gradlew asciidoc --info
:asciidoctor
In-memory cache of taskArtifacts.bin: Size{2}, CacheStats{hitCount=0, missCount=0, loadSuccessCount=0, loadExceptionCount=0, totalLoadTime=0, evictionCount=0}
In-memory cache of outputFileStates.bin: Size{1}, CacheStats{hitCount=0, missCount=0, loadSuccessCount=0, loadExceptionCount=0, totalLoadTime=0, evictionCount=0}
In-memory cache of fileHashes.bin: Size{26}, CacheStats{hitCount=0, missCount=0, loadSuccessCount=0, loadExceptionCount=0, totalLoadTime=0, evictionCount=0}
Executing task ':asciidoctor' (up-to-date check took 0.006 secs) due to:
  Input file /Users/rwinch/code/asciidoctor-gradle-plugin-sample/.gradle/1.9/taskArtifacts/fileHashes.bin has changed.
  Input file /Users/rwinch/code/asciidoctor-gradle-plugin-sample/.gradle/1.9/taskArtifacts/fileSnapshots.bin has changed.
  Input file /Users/rwinch/code/asciidoctor-gradle-plugin-sample/.gradle/1.9/taskArtifacts/taskArtifacts.bin has changed.
In-memory cache of fileSnapshots.bin: Size{12}, CacheStats{hitCount=0, missCount=0, loadSuccessCount=0, loadExceptionCount=0, totalLoadTime=0, evictionCount=0}
:asciidoctor (Thread[Daemon Thread 7,5,main]) completed. Took 3.274 secs.

Perhaps this is another reason to consider resolving #60

Copy non-AsciiDoc files even when sourceDocumentName is set

When not using the sourceDocumentName, the plugin copies all non-AsciiDoc files to the output directory. Setting the sourceDocumentName inadvertently disables this feature. The plugin should only limit which AsciiDoc file is processed, not change the behavior of how non-AsciiDoc files are handled.

Minor correction in README.md

In the README, under the Usage section it states

The plugin adds a new task named asciidoctor. This task exposes two properties as part of its configuration

It is then followed by three bullets. I guess it should read

This task exposes three properties

I said it was minor, but I thought I'd let you know. :)

Stylesheet attributes cannot take a GString for a value

This is required if you want a dynamic path for the stylesheet.

This configuration:

asciidoctor {
//options attributes: [stylesheet: "stylesheets/bintray.css"]
options attributes: [stylesheet: "$projectDir/src/asciidoc/stylesheets/bintray.css"]
}

Causes the following build exception (while using the commented out line works fine):

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':interaction:documentation:asciidoctor'.
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
    at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
    at org.gradle.api.internal.changedetection.state.CacheLockReleasingTaskExecuter$1.run(CacheLockReleasingTaskExecuter.java:35)
    at org.gradle.internal.Factories$1.create(Factories.java:22)
    at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(DefaultCacheAccess.java:179)
    at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(DefaultCacheAccess.java:232)
    at org.gradle.cache.internal.DefaultPersistentDirectoryStore.longRunningOperation(DefaultPersistentDirectoryStore.java:142)
    at org.gradle.api.internal.changedetection.state.DefaultTaskArtifactStateCacheAccess.longRunningOperation(DefaultTaskArtifactStateCacheAccess.java:83)
    at org.gradle.api.internal.changedetection.state.CacheLockReleasingTaskExecuter.execute(CacheLockReleasingTaskExecuter.java:33)
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:58)
    at org.gradle.api.internal.tasks.execution.ContextualisingTaskExecuter.execute(ContextualisingTaskExecuter.java:34)
    at org.gradle.api.internal.changedetection.state.CacheLockAcquiringTaskExecuter$1.run(CacheLockAcquiringTaskExecuter.java:39)
    at org.gradle.internal.Factories$1.create(Factories.java:22)
    at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:124)
    at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:112)
    at org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.java:134)
    at org.gradle.api.internal.changedetection.state.DefaultTaskArtifactStateCacheAccess.useCache(DefaultTaskArtifactStateCacheAccess.java:79)
    at org.gradle.api.internal.changedetection.state.CacheLockAcquiringTaskExecuter.execute(CacheLockAcquiringTaskExecuter.java:37)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:57)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:41)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:51)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:42)
    at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:282)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.executeTask(DefaultTaskPlanExecutor.java:48)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.processTask(DefaultTaskPlanExecutor.java:34)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:27)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:89)
    at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:29)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61)
    at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23)
    at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:67)
    at org.gradle.api.internal.changedetection.state.TaskCacheLockHandlingBuildExecuter$1.run(TaskCacheLockHandlingBuildExecuter.java:31)
    at org.gradle.internal.Factories$1.create(Factories.java:22)
    at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:124)
    at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:112)
    at org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.java:134)
    at org.gradle.api.internal.changedetection.state.DefaultTaskArtifactStateCacheAccess.useCache(DefaultTaskArtifactStateCacheAccess.java:79)
    at org.gradle.api.internal.changedetection.state.TaskCacheLockHandlingBuildExecuter.execute(TaskCacheLockHandlingBuildExecuter.java:29)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61)
    at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23)
    at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:67)
    at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:54)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:166)
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:113)
    at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:81)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:64)
    at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:33)
    at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:24)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:35)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)
    at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:50)
    at org.gradle.api.internal.Actions$RunnableActionAdapter.execute(Actions.java:171)
    at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:201)
    at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:174)
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:170)
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:139)
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)
    at org.gradle.launcher.Main.doAction(Main.java:48)
    at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
    at org.gradle.launcher.Main.main(Main.java:39)
    at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:50)
    at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:32)
    at org.gradle.launcher.GradleMain.main(GradleMain.java:26)
    at org.gradle.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:33)
    at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:130)
    at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:48)
Caused by: org.gradle.api.GradleException: Error running Asciidoctor
    at org.asciidoctor.gradle.AsciidoctorTask.gititdone(AsciidoctorTask.groovy:95)
    at org.gradle.api.internal.BeanDynamicObject$MetaClassAdapter.invokeMethod(BeanDynamicObject.java:216)
    at org.gradle.api.internal.BeanDynamicObject.invokeMethod(BeanDynamicObject.java:122)
    at org.gradle.api.internal.CompositeDynamicObject.invokeMethod(CompositeDynamicObject.java:147)
    at org.asciidoctor.gradle.AsciidoctorTask_Decorated.invokeMethod(Unknown Source)
    at org.gradle.util.ReflectionUtil.invoke(ReflectionUtil.groovy:23)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:217)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:210)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:199)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:526)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:509)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
    ... 70 more
Caused by: org.jruby.exceptions.RaiseException: (NoMethodError) undefined method `include?' for #<Java::OrgCodehausGroovyRuntime::GStringImpl:0x5dce6375>
    at RUBY.posixfy(jar:file:/Users/yoavl/.gradle/caches/artifacts-24/filestore/org.asciidoctor/asciidoctor-java-integration/0.1.2/jar/34e5c3a38e59337da992243afb25185c56462866/asciidoctor-java-integration-0.1.2.jar!/gems/asciidoctor-0.1.2/lib/asciidoctor/path_resolver.rb:157)
    at RUBY.web_path(jar:file:/Users/yoavl/.gradle/caches/artifacts-24/filestore/org.asciidoctor/asciidoctor-java-integration/0.1.2/jar/34e5c3a38e59337da992243afb25185c56462866/asciidoctor-java-integration-0.1.2.jar!/gems/asciidoctor-0.1.2/lib/asciidoctor/path_resolver.rb:334)
    at RUBY.normalize_web_path(jar:file:/Users/yoavl/.gradle/caches/artifacts-24/filestore/org.asciidoctor/asciidoctor-java-integration/0.1.2/jar/34e5c3a38e59337da992243afb25185c56462866/asciidoctor-java-integration-0.1.2.jar!/gems/asciidoctor-0.1.2/lib/asciidoctor/abstract_node.rb:306)
    at RUBY.result((erb):24)
    at org.jruby.RubyKernel.eval(org/jruby/RubyKernel.java:1066)
    at RUBY.result(jar:file:/Users/yoavl/.gradle/caches/artifacts-24/filestore/org.jruby/jruby-complete/1.7.3/jar/2273e4c2a2abdd4b25a21bc513bfc05cfba31f3b/jruby-complete-1.7.3.jar!/META-INF/jruby.home/lib/ruby/1.9/erb.rb:838)
    at RUBY.render(jar:file:/Users/yoavl/.gradle/caches/artifacts-24/filestore/org.asciidoctor/asciidoctor-java-integration/0.1.2/jar/34e5c3a38e59337da992243afb25185c56462866/asciidoctor-java-integration-0.1.2.jar!/gems/asciidoctor-0.1.2/lib/asciidoctor/backends/base_template.rb:49)
    at RUBY.render(jar:file:/Users/yoavl/.gradle/caches/artifacts-24/filestore/org.asciidoctor/asciidoctor-java-integration/0.1.2/jar/34e5c3a38e59337da992243afb25185c56462866/asciidoctor-java-integration-0.1.2.jar!/gems/asciidoctor-0.1.2/lib/asciidoctor/renderer.rb:117)
    at RUBY.render(jar:file:/Users/yoavl/.gradle/caches/artifacts-24/filestore/org.asciidoctor/asciidoctor-java-integration/0.1.2/jar/34e5c3a38e59337da992243afb25185c56462866/asciidoctor-java-integration-0.1.2.jar!/gems/asciidoctor-0.1.2/lib/asciidoctor/document.rb:630)
    at RUBY.render(jar:file:/Users/yoavl/.gradle/caches/artifacts-24/filestore/org.asciidoctor/asciidoctor-java-integration/0.1.2/jar/34e5c3a38e59337da992243afb25185c56462866/asciidoctor-java-integration-0.1.2.jar!/gems/asciidoctor-0.1.2/lib/asciidoctor.rb:817)
    at RUBY.render_file(jar:file:/Users/yoavl/.gradle/caches/artifacts-24/filestore/org.asciidoctor/asciidoctor-java-integration/0.1.2/jar/34e5c3a38e59337da992243afb25185c56462866/asciidoctor-java-integration-0.1.2.jar!/gems/asciidoctor-0.1.2/lib/asciidoctor.rb:870)
    at RUBY.render_file(<script>:8)
    at org.jruby.gen.InterfaceImpl101228925.render_file(org/jruby/gen/InterfaceImpl101228925.gen:13)
    at org.asciidoctor.gradle.AsciidoctorTask$_gititdone_closure1.doCall(AsciidoctorTask.groovy:87)
    at org.asciidoctor.gradle.AsciidoctorTask.gititdone(AsciidoctorTask.groovy:74)
    at org.gradle.util.ReflectionUtil.invoke(ReflectionUtil.groovy:23)

fopub and gradle offline mode

  1. Create a simple asciidoctor gradle file.
  2. Run it once to ensure all dependencies are downloaded.
  3. Disable network connectivity and rerun with --offline option - ./gradlew asciidoctor --offline --stacktrace

The result is

javax.xml.transform.TransformerException: Had IO Exception with stylesheet file: http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl
javax.xml.transform.TransformerException: Had IO Exception with stylesheet file: http://docbook.sourceforge.net/release/xsl/current/highlighting/common.xsl

The issue is in work/docbook-xsl/fo-pdf.xsl with specific reference to

<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/>

The end-user experience is that it makes it very difficult to work offline on a document which requires PDF as an output format.

Since this is external source, which gets downloaded in FopubFacade, I am not sure whether it is an easy fix at all. It might be worthwhile just adding a release note saying the fopub cannot be used without network connectivity.

0.8.0-SNAPSHOT builds fine, fails to publish

With 0.8.0-SNAPSHOT, if you run ./gradlew publishToMavenLocal, this is the output you get

:generatePomFileForMavenCustomPublication
:compileJava UP-TO-DATE
:compileGroovy UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar UP-TO-DATE
:publishMavenCustomPublicationToMavenLocal FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':publishMavenCustomPublicationToMavenLocal'.
> Failed to publish publication 'mavenCustom' to repository 'MavenLocal'
   > Invalid publication 'mavenCustom': POM file is invalid. Check any modifications you have made to the POM file.

This prevents it from publishing to local mvn. If the custom PM block is commented out, it publishes correctly.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.