|
@@ -1,208 +0,0 @@
|
|
-/*
|
|
|
|
- * Copyright 2019-2020 the original author or authors.
|
|
|
|
- *
|
|
|
|
- * Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
- * you may not use this file except in compliance with the License.
|
|
|
|
- * You may obtain a copy of the License at
|
|
|
|
- *
|
|
|
|
- * https://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
- *
|
|
|
|
- * Unless required by applicable law or agreed to in writing, software
|
|
|
|
- * distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
- * See the License for the specific language governing permissions and
|
|
|
|
- * limitations under the License.
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-package io.spring.gradle.convention;
|
|
|
|
-
|
|
|
|
-import org.asciidoctor.gradle.base.AsciidoctorAttributeProvider;
|
|
|
|
-import org.asciidoctor.gradle.jvm.AbstractAsciidoctorTask;
|
|
|
|
-import org.asciidoctor.gradle.jvm.AsciidoctorJExtension;
|
|
|
|
-import org.asciidoctor.gradle.jvm.AsciidoctorJPlugin;
|
|
|
|
-import org.asciidoctor.gradle.jvm.AsciidoctorTask;
|
|
|
|
-import org.gradle.api.Action;
|
|
|
|
-import org.gradle.api.Plugin;
|
|
|
|
-import org.gradle.api.Project;
|
|
|
|
-import org.gradle.api.artifacts.Configuration;
|
|
|
|
-import org.gradle.api.artifacts.DependencySet;
|
|
|
|
-import org.gradle.api.artifacts.dsl.RepositoryHandler;
|
|
|
|
-import org.gradle.api.file.CopySpec;
|
|
|
|
-import org.gradle.api.file.FileTree;
|
|
|
|
-import org.gradle.api.tasks.Sync;
|
|
|
|
-
|
|
|
|
-import java.io.File;
|
|
|
|
-import java.net.URI;
|
|
|
|
-import java.time.LocalDate;
|
|
|
|
-import java.util.ArrayList;
|
|
|
|
-import java.util.Collections;
|
|
|
|
-import java.util.HashMap;
|
|
|
|
-import java.util.List;
|
|
|
|
-import java.util.Map;
|
|
|
|
-import java.util.concurrent.Callable;
|
|
|
|
-import java.util.function.Consumer;
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- * Conventions that are applied in the presence of the {@link AsciidoctorJPlugin}. When
|
|
|
|
- * the plugin is applied:
|
|
|
|
- *
|
|
|
|
- * <ul>
|
|
|
|
- * <li>All warnings are made fatal.
|
|
|
|
- * <li>A task is created to resolve and unzip our documentation resources (CSS and
|
|
|
|
- * Javascript).
|
|
|
|
- * <li>For each {@link AsciidoctorTask} (HTML only):
|
|
|
|
- * <ul>
|
|
|
|
- * <li>A configuration named asciidoctorExtensions is ued to add the
|
|
|
|
- * <a href="https://github.com/spring-io/spring-asciidoctor-extensions#block-switch">block
|
|
|
|
- * switch</a> extension
|
|
|
|
- * <li>{@code doctype} {@link AsciidoctorTask#options(Map) option} is configured.
|
|
|
|
- * <li>{@link AsciidoctorTask#attributes(Map) Attributes} are configured for syntax
|
|
|
|
- * highlighting, CSS styling, docinfo, etc.
|
|
|
|
- * </ul>
|
|
|
|
- * <li>For each {@link AbstractAsciidoctorTask} (HTML and PDF):
|
|
|
|
- * <ul>
|
|
|
|
- * <li>{@link AsciidoctorTask#attributes(Map) Attributes} are configured to enable
|
|
|
|
- * warnings for references to missing attributes, the year is added as @{code today-year},
|
|
|
|
- * etc
|
|
|
|
- * <li>{@link AbstractAsciidoctorTask#baseDirFollowsSourceDir() baseDirFollowsSourceDir()}
|
|
|
|
- * is enabled.
|
|
|
|
- * </ul>
|
|
|
|
- * </ul>
|
|
|
|
- *
|
|
|
|
- * @author Andy Wilkinson
|
|
|
|
- * @author Rob Winch
|
|
|
|
- */
|
|
|
|
-public class AsciidoctorConventionPlugin implements Plugin<Project> {
|
|
|
|
-
|
|
|
|
- public void apply(Project project) {
|
|
|
|
- project.getPlugins().withType(AsciidoctorJPlugin.class, (asciidoctorPlugin) -> {
|
|
|
|
- createDefaultAsciidoctorRepository(project);
|
|
|
|
- makeAllWarningsFatal(project);
|
|
|
|
- Sync unzipResources = createUnzipDocumentationResourcesTask(project);
|
|
|
|
- project.getTasks().withType(AbstractAsciidoctorTask.class, (asciidoctorTask) -> {
|
|
|
|
- asciidoctorTask.dependsOn(unzipResources);
|
|
|
|
- configureExtensions(project, asciidoctorTask);
|
|
|
|
- configureCommonAttributes(project, asciidoctorTask);
|
|
|
|
- configureOptions(asciidoctorTask);
|
|
|
|
- asciidoctorTask.baseDirFollowsSourceDir();
|
|
|
|
- asciidoctorTask.useIntermediateWorkDir();
|
|
|
|
- asciidoctorTask.resources(new Action<CopySpec>() {
|
|
|
|
- @Override
|
|
|
|
- public void execute(CopySpec resourcesSpec) {
|
|
|
|
- resourcesSpec.from(unzipResources);
|
|
|
|
- resourcesSpec.from(asciidoctorTask.getSourceDir(), new Action<CopySpec>() {
|
|
|
|
- @Override
|
|
|
|
- public void execute(CopySpec resourcesSrcDirSpec) {
|
|
|
|
- // https://github.com/asciidoctor/asciidoctor-gradle-plugin/issues/523
|
|
|
|
- // For now copy the entire sourceDir over so that include files are
|
|
|
|
- // available in the intermediateWorkDir
|
|
|
|
- // resourcesSrcDirSpec.include("images/**");
|
|
|
|
- }
|
|
|
|
- });
|
|
|
|
- }
|
|
|
|
- });
|
|
|
|
- if (asciidoctorTask instanceof AsciidoctorTask) {
|
|
|
|
- configureHtmlOnlyAttributes(project, asciidoctorTask);
|
|
|
|
- }
|
|
|
|
- });
|
|
|
|
- });
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- private void createDefaultAsciidoctorRepository(Project project) {
|
|
|
|
- project.getGradle().afterProject(new Action<Project>() {
|
|
|
|
- @Override
|
|
|
|
- public void execute(Project project) {
|
|
|
|
- RepositoryHandler repositories = project.getRepositories();
|
|
|
|
- if (repositories.isEmpty()) {
|
|
|
|
- repositories.mavenCentral();
|
|
|
|
- repositories.maven(repo -> {
|
|
|
|
- repo.setUrl(URI.create("https://repo.spring.io/release"));
|
|
|
|
- });
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- });
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- private void makeAllWarningsFatal(Project project) {
|
|
|
|
- project.getExtensions().getByType(AsciidoctorJExtension.class).fatalWarnings(".*");
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- private void configureExtensions(Project project, AbstractAsciidoctorTask asciidoctorTask) {
|
|
|
|
- Configuration extensionsConfiguration = project.getConfigurations().maybeCreate("asciidoctorExtensions");
|
|
|
|
- extensionsConfiguration.defaultDependencies(new Action<DependencySet>() {
|
|
|
|
- @Override
|
|
|
|
- public void execute(DependencySet dependencies) {
|
|
|
|
- dependencies.add(project.getDependencies().create("io.spring.asciidoctor:spring-asciidoctor-extensions-block-switch:0.4.2.RELEASE"));
|
|
|
|
- }
|
|
|
|
- });
|
|
|
|
- asciidoctorTask.configurations(extensionsConfiguration);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- private Sync createUnzipDocumentationResourcesTask(Project project) {
|
|
|
|
- Configuration documentationResources = project.getConfigurations().maybeCreate("documentationResources");
|
|
|
|
- documentationResources.getDependencies()
|
|
|
|
- .add(project.getDependencies().create("io.spring.docresources:spring-doc-resources:0.2.5"));
|
|
|
|
- Sync unzipResources = project.getTasks().create("unzipDocumentationResources",
|
|
|
|
- Sync.class, new Action<Sync>() {
|
|
|
|
- @Override
|
|
|
|
- public void execute(Sync sync) {
|
|
|
|
- sync.dependsOn(documentationResources);
|
|
|
|
- sync.from(new Callable<List<FileTree>>() {
|
|
|
|
- @Override
|
|
|
|
- public List<FileTree> call() throws Exception {
|
|
|
|
- List<FileTree> result = new ArrayList<>();
|
|
|
|
- documentationResources.getAsFileTree().forEach(new Consumer<File>() {
|
|
|
|
- @Override
|
|
|
|
- public void accept(File file) {
|
|
|
|
- result.add(project.zipTree(file));
|
|
|
|
- }
|
|
|
|
- });
|
|
|
|
- return result;
|
|
|
|
- }
|
|
|
|
- });
|
|
|
|
- File destination = new File(project.getBuildDir(), "docs/resources");
|
|
|
|
- sync.into(project.relativePath(destination));
|
|
|
|
- }
|
|
|
|
- });
|
|
|
|
- return unzipResources;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- private void configureOptions(AbstractAsciidoctorTask asciidoctorTask) {
|
|
|
|
- asciidoctorTask.options(Collections.singletonMap("doctype", "book"));
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- private void configureHtmlOnlyAttributes(Project project, AbstractAsciidoctorTask asciidoctorTask) {
|
|
|
|
- Map<String, Object> attributes = new HashMap<>();
|
|
|
|
- attributes.put("source-highlighter", "highlight.js");
|
|
|
|
- attributes.put("highlightjsdir", "js/highlight");
|
|
|
|
- attributes.put("highlightjs-theme", "github");
|
|
|
|
- attributes.put("linkcss", true);
|
|
|
|
- attributes.put("icons", "font");
|
|
|
|
- attributes.put("stylesheet", "css/spring.css");
|
|
|
|
- asciidoctorTask.getAttributeProviders().add(new AsciidoctorAttributeProvider() {
|
|
|
|
- @Override
|
|
|
|
- public Map<String, Object> getAttributes() {
|
|
|
|
- Object version = project.getVersion();
|
|
|
|
- Map<String, Object> attrs = new HashMap<>();
|
|
|
|
- if (version != null && version.toString() != Project.DEFAULT_VERSION) {
|
|
|
|
- attrs.put("revnumber", version);
|
|
|
|
- }
|
|
|
|
- return attrs;
|
|
|
|
- }
|
|
|
|
- });
|
|
|
|
- asciidoctorTask.attributes(attributes);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- private void configureCommonAttributes(Project project, AbstractAsciidoctorTask asciidoctorTask) {
|
|
|
|
- Map<String, Object> attributes = new HashMap<>();
|
|
|
|
- attributes.put("attribute-missing", "warn");
|
|
|
|
- attributes.put("icons", "font");
|
|
|
|
- attributes.put("idprefix", "");
|
|
|
|
- attributes.put("idseparator", "-");
|
|
|
|
- attributes.put("docinfo", "shared");
|
|
|
|
- attributes.put("sectanchors", "");
|
|
|
|
- attributes.put("sectnums", "");
|
|
|
|
- attributes.put("today-year", LocalDate.now().getYear());
|
|
|
|
- asciidoctorTask.attributes(attributes);
|
|
|
|
- }
|
|
|
|
-}
|
|
|