| 
					
				 | 
			
			
				@@ -0,0 +1,143 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 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 org.springframework.gradle.docs; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.net.URI; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.Collections; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.HashMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.Map; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+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.asciidoctor.gradle.jvm.pdf.AsciidoctorJPdfPlugin; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.gradle.api.Plugin; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.gradle.api.Project; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 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 used 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 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @author Steve Riesenberg 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+public class SpringAsciidoctorPlugin implements Plugin<Project> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private static final String ASCIIDOCTORJ_VERSION = "2.4.3"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private static final String EXTENSIONS_CONFIGURATION_NAME = "asciidoctorExtensions"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public void apply(Project project) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// Apply asciidoctor plugin 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		project.getPluginManager().apply(AsciidoctorJPlugin.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		project.getPluginManager().apply(AsciidoctorJPdfPlugin.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// Configure asciidoctor 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		project.getPlugins().withType(AsciidoctorJPlugin.class, (asciidoctorPlugin) -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			configureDocumentationDependenciesRepository(project); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			makeAllWarningsFatal(project); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			upgradeAsciidoctorJVersion(project); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			createAsciidoctorExtensionsConfiguration(project); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			project.getTasks().withType(AbstractAsciidoctorTask.class, this::configureAsciidoctorExtension); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private void configureDocumentationDependenciesRepository(Project project) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		project.getRepositories().maven((mavenRepo) -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			mavenRepo.setUrl(URI.create("https://repo.spring.io/release")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			mavenRepo.mavenContent((mavenContent) -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				mavenContent.includeGroup("io.spring.asciidoctor"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				mavenContent.includeGroup("io.spring.asciidoctor.backends"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				mavenContent.includeGroup("io.spring.docresources"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private void makeAllWarningsFatal(Project project) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		project.getExtensions().getByType(AsciidoctorJExtension.class).fatalWarnings(".*"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private void upgradeAsciidoctorJVersion(Project project) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		project.getExtensions().getByType(AsciidoctorJExtension.class).setVersion(ASCIIDOCTORJ_VERSION); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private void createAsciidoctorExtensionsConfiguration(Project project) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		project.getConfigurations().create(EXTENSIONS_CONFIGURATION_NAME, (configuration) -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			project.getConfigurations().matching((candidate) -> "management".equals(candidate.getName())) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					.all(configuration::extendsFrom); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			configuration.getDependencies().add(project.getDependencies() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					.create("io.spring.asciidoctor.backends:spring-asciidoctor-backends:0.0.3")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			configuration.getDependencies() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					.add(project.getDependencies().create("org.asciidoctor:asciidoctorj-pdf:1.5.3")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private void configureAsciidoctorExtension(AbstractAsciidoctorTask asciidoctorTask) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		asciidoctorTask.configurations(EXTENSIONS_CONFIGURATION_NAME); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		configureCommonAttributes(asciidoctorTask); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		configureOptions(asciidoctorTask); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		asciidoctorTask.baseDirFollowsSourceDir(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		asciidoctorTask.resources((resourcesSpec) -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			resourcesSpec.from(asciidoctorTask.getSourceDir(), (resourcesSrcDirSpec) -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// Not using intermediateWorkDir. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// See https://github.com/asciidoctor/asciidoctor-gradle-plugin/issues/523 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				resourcesSrcDirSpec.include("images/*.png", "css/**", "js/**"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (asciidoctorTask instanceof AsciidoctorTask) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			boolean pdf = asciidoctorTask.getName().toLowerCase().contains("pdf"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			String backend = (!pdf) ? "spring-html" : "spring-pdf"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			((AsciidoctorTask) asciidoctorTask).outputOptions((outputOptions) -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					outputOptions.backends(backend)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private void configureCommonAttributes(AbstractAsciidoctorTask asciidoctorTask) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Map<String, Object> attributes = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		attributes.put("attribute-missing", "warn"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		attributes.put("revnumber", null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		asciidoctorTask.attributes(attributes); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private void configureOptions(AbstractAsciidoctorTask asciidoctorTask) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		asciidoctorTask.options(Collections.singletonMap("doctype", "book")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |