diff --git a/build.gradle b/build.gradle index bf59996982..7bf0aafd32 100644 --- a/build.gradle +++ b/build.gradle @@ -6,8 +6,10 @@ buildscript { classpath("io.spring.gradle:dependency-management-plugin:1.0.0.RELEASE") classpath("io.spring.gradle:propdeps-plugin:0.0.8") classpath("io.spring.gradle:docbook-reference-plugin:0.3.1") - classpath("org.asciidoctor:asciidoctor-gradle-plugin:1.5.3") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.1") + classpath("org.asciidoctor:asciidoctor-gradle-plugin:1.5.3") + classpath("org.asciidoctor:asciidoctorj-pdf:1.5.0-alpha.14") + classpath("org.asciidoctor:asciidoctorj-epub3:1.5.0-alpha.6") } } @@ -86,7 +88,6 @@ configure(allprojects) { project -> ext.servletVersion = "3.1.0" ext.slf4jVersion = "1.7.25" ext.snakeyamlVersion = "1.18" - ext.snifferVersion = "1.15" ext.testngVersion = "6.11" ext.tiles3Version = "3.0.7" ext.tomcatVersion = "8.5.12" @@ -104,6 +105,7 @@ configure(allprojects) { project -> apply plugin: "java" apply plugin: "test-source-set-dependencies" apply from: "${gradleScriptDir}/ide.gradle" + apply from: "${gradleScriptDir}/sniffer.gradle" // Kotlin compiler does not support JDK 9 yet, see https://youtrack.jetbrains.com/issue/KT-14988 if (!JavaVersion.current().java9Compatible) { @@ -119,11 +121,6 @@ configure(allprojects) { project -> } } - configurations { - sniffer - javaApiSignature - } - configurations.all { // Check for updates every build resolutionStrategy.cacheChangingModulesFor 0, 'seconds' @@ -192,44 +189,6 @@ configure(allprojects) { project -> testCompile("org.hamcrest:hamcrest-all:${hamcrestVersion}") testRuntime("org.apache.logging.log4j:log4j-core:${log4jVersion}") testRuntime("org.apache.logging.log4j:log4j-jcl:${log4jVersion}") - - sniffer("org.codehaus.mojo:animal-sniffer-ant-tasks:${snifferVersion}") - javaApiSignature("org.codehaus.mojo.signature:java18:1.0@signature") - } - - task copyJavaApiSignature(type: Copy) { - ext.to = file("$buildDir/javaApiSignature/") - description "Copy the resolved Animal Sniffer signature dependency artifact to a known location and name" - from configurations.javaApiSignature - into to - rename '.*signature', 'javaApi.signature' - } - - task sniff { - group = "Verification" - description = "Checks the Java API signatures" - - dependsOn compileJava - dependsOn copyJavaApiSignature - - inputs.dir sourceSets.main.output.classesDir - inputs.dir copyJavaApiSignature.to - - doLast { - ant.taskdef( - name: 'animalSniffer', - classname: 'org.codehaus.mojo.animal_sniffer.ant.CheckSignatureTask', - classpath: configurations.sniffer.asPath - ) - - // TODO: Animal Sniffer currently chokes on optional JDK 9 bytecode in AspectJ 1.9 beta 5 - // ant.animalSniffer( - // signature: "$buildDir/javaApiSignature/javaApi.signature", - // classpath: sourceSets.main.compileClasspath.asPath) { - // path(path: sourceSets.main.output.classesDir) - // annotation(className: "org.springframework.lang.UsesSunHttpServer") - // } - } } ext.javadocLinks = [ @@ -1240,13 +1199,11 @@ sonarqube { configure(rootProject) { description = "Spring Framework" - apply plugin: "org.asciidoctor.convert" - apply plugin: "docbook-reference" apply plugin: "groovy" apply plugin: "io.spring.dependency-management" - // apply plugin: "detect-split-packages" apply from: "${gradleScriptDir}/jdiff.gradle" + apply from: "${gradleScriptDir}/docs.gradle" dependencyManagement { imports { @@ -1258,25 +1215,6 @@ configure(rootProject) { applyMavenExclusions = false } - asciidoctor { - sourceDir project.file('src/asciidoc') - separateOutputDirs = false - backends = ['docbook'] - options doctype: 'book', eruby: 'erubis' - attributes 'spring-version': project.version, 'revnumber': project.version, 'docinfo': "" - } - - reference { - sourceDir = asciidoctor.outputDir - pdfFilename = "spring-framework-reference.pdf" - epubFilename = "spring-framework-reference.epub" - expandPlaceholders = "" - } - - afterEvaluate { - tasks.findAll { it.name.startsWith("reference") }.each{ it.dependsOn.add("asciidoctor") } - } - // TODO: DetectSplitPackagesPlugin fails in line 154 due to method not found on java.io.File. // TODO: Possibly related to user rights or OS differences; passes on local Windows machine. // detectSplitPackages { @@ -1305,159 +1243,6 @@ configure(rootProject) { testCompile("org.hsqldb:hsqldb:${hsqldbVersion}") } - task api(type: Javadoc) { - group = "Documentation" - description = "Generates aggregated Javadoc API documentation." - title = "${rootProject.description} ${version} API" - - dependsOn { - subprojects.collect { - it.tasks.getByName("jar") - } - } - options.memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PROTECTED - options.author = true - options.header = rootProject.description - options.overview = "src/api/overview.html" - options.stylesheetFile = file("src/api/stylesheet.css") - options.splitIndex = true - options.links(project.ext.javadocLinks) - options.addStringOption('Xdoclint:none', '-quiet') - - source subprojects.collect { project -> - project.sourceSets.main.allJava - } - - maxMemory = "1024m" - destinationDir = new File(buildDir, "api") - - doFirst { - classpath = files( - // Ensure the javadoc process can resolve types compiled from .aj sources - project(":spring-aspects").sourceSets.main.output - ) - classpath += files(subprojects.collect { it.sourceSets.main.compileClasspath }) - } - } - - task docsZip(type: Zip, dependsOn: 'reference') { - group = "Distribution" - baseName = "spring-framework" - classifier = "docs" - description = "Builds -${classifier} archive containing api and reference " + - "for deployment at http://static.springframework.org/spring-framework/docs." - - from("src/dist") { - include "changelog.txt" - } - - from (api) { - into "javadoc-api" - } - - from (reference) { - into "spring-framework-reference" - } - } - - task schemaZip(type: Zip) { - group = "Distribution" - baseName = "spring-framework" - classifier = "schema" - description = "Builds -${classifier} archive containing all " + - "XSDs for deployment at http://springframework.org/schema." - duplicatesStrategy 'exclude' - moduleProjects.each { subproject -> - def Properties schemas = new Properties(); - - subproject.sourceSets.main.resources.find { - it.path.endsWith("META-INF/spring.schemas") - }?.withInputStream { schemas.load(it) } - - for (def key : schemas.keySet()) { - def shortName = key.replaceAll(/http.*schema.(.*).spring-.*/, '$1') - assert shortName != key - File xsdFile = subproject.sourceSets.main.resources.find { - it.path.endsWith(schemas.get(key)) - } - assert xsdFile != null - into (shortName) { - from xsdFile.path - } - } - } - } - - task distZip(type: Zip, dependsOn: [docsZip, schemaZip]) { - group = "Distribution" - baseName = "spring-framework" - classifier = "dist" - description = "Builds -${classifier} archive, containing all jars and docs, " + - "suitable for community download page." - - ext.baseDir = "${baseName}-${project.version}"; - - from("src/dist") { - include "readme.txt" - include "license.txt" - include "notice.txt" - into "${baseDir}" - expand(copyright: new Date().format("yyyy"), version: project.version) - } - - from(zipTree(docsZip.archivePath)) { - into "${baseDir}/docs" - } - - from(zipTree(schemaZip.archivePath)) { - into "${baseDir}/schema" - } - - moduleProjects.each { subproject -> - into ("${baseDir}/libs") { - from subproject.jar - if (subproject.tasks.findByPath("sourcesJar")) { - from subproject.sourcesJar - } - if (subproject.tasks.findByPath("javadocJar")) { - from subproject.javadocJar - } - } - } - } - - // Create a distribution that contains all dependencies (required and optional). - // Not published by default; only for use when building from source. - task depsZip(type: Zip, dependsOn: distZip) { zipTask -> - group = "Distribution" - baseName = "spring-framework" - classifier = "dist-with-deps" - description = "Builds -${classifier} archive, containing everything " + - "in the -${distZip.classifier} archive plus all runtime dependencies." - - from zipTree(distZip.archivePath) - - gradle.taskGraph.whenReady { taskGraph -> - if (taskGraph.hasTask(":${zipTask.name}")) { - def projectNames = rootProject.subprojects*.name - def artifacts = new HashSet() - subprojects.each { subproject -> - (subproject.configurations.runtime.resolvedConfiguration.resolvedArtifacts + - subproject.configurations.optional.resolvedConfiguration.resolvedArtifacts).each { artifact -> - def dependency = artifact.moduleVersion.id - if (!projectNames.contains(dependency.name)) { - artifacts << artifact.file - } - } - } - - zipTask.from(artifacts) { - into "${distZip.baseDir}/deps" - } - } - } - } - artifacts { archives docsZip archives schemaZip @@ -1497,22 +1282,6 @@ configure(project(':spring-core')) { } } -/* - * Copyright 2002-2016 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 - * - * http://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. - */ - /* * Support publication of artifacts versioned by topic branch. * CI builds supply `-P BRANCH_NAME=` to gradle at build time. diff --git a/gradle/docs.gradle b/gradle/docs.gradle new file mode 100644 index 0000000000..5acdd37af3 --- /dev/null +++ b/gradle/docs.gradle @@ -0,0 +1,191 @@ +/* + * Copyright 2002-2017 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 + * + * http://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. + */ + +apply plugin: "org.asciidoctor.convert" + +asciidoctor { + sources { + include '*.adoc' + } + logDocuments = true + backends = ["html5", "pdf"] + options doctype: 'book', eruby: 'erubis' + attributes 'icons': 'font', + 'idprefix': '', + 'idseparator': '-', + docinfo: '', + revnumber: project.version, + sectanchors: '', + sectnums: '', + 'source-highlighter': 'coderay', + stylesdir: 'stylesheets/', + stylesheet: 'spring.css', + 'spring-version': project.version + +} + +task api(type: Javadoc) { + group = "Documentation" + description = "Generates aggregated Javadoc API documentation." + title = "${rootProject.description} ${version} API" + + dependsOn { + subprojects.collect { + it.tasks.getByName("jar") + } + } + options.memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PROTECTED + options.author = true + options.header = rootProject.description + options.overview = "src/docs/api/overview.html" + options.stylesheetFile = file("src/docs/api/stylesheet.css") + options.splitIndex = true + options.links(project.ext.javadocLinks) + options.addStringOption('Xdoclint:none', '-quiet') + + source subprojects.collect { project -> + project.sourceSets.main.allJava + } + + maxMemory = "1024m" + destinationDir = new File(buildDir, "api") + + doFirst { + classpath = files( + // ensure the javadoc process can resolve types compiled from .aj sources + project(":spring-aspects").sourceSets.main.output + ) + classpath += files(subprojects.collect { it.sourceSets.main.compileClasspath }) + } +} + +task docsZip(type: Zip, dependsOn: 'asciidoctor') { + group = "Distribution" + baseName = "spring-framework" + classifier = "docs" + description = "Builds -${classifier} archive containing api and reference " + + "for deployment at http://docs.spring.io/spring-framework/docs." + + from("src/dist") { + include "changelog.txt" + } + + from (api) { + into "javadoc-api" + } + + from (asciidoctor) { + into "spring-framework-reference" + } +} + +task schemaZip(type: Zip) { + group = "Distribution" + baseName = "spring-framework" + classifier = "schema" + description = "Builds -${classifier} archive containing all " + + "XSDs for deployment at http://springframework.org/schema." + duplicatesStrategy 'exclude' + moduleProjects.each { subproject -> + def Properties schemas = new Properties(); + + subproject.sourceSets.main.resources.find { + it.path.endsWith("META-INF/spring.schemas") + }?.withInputStream { schemas.load(it) } + + for (def key : schemas.keySet()) { + def shortName = key.replaceAll(/http.*schema.(.*).spring-.*/, '$1') + assert shortName != key + File xsdFile = subproject.sourceSets.main.resources.find { + it.path.endsWith(schemas.get(key)) + } + assert xsdFile != null + into (shortName) { + from xsdFile.path + } + } + } +} + +task distZip(type: Zip, dependsOn: [docsZip, schemaZip]) { + group = "Distribution" + baseName = "spring-framework" + classifier = "dist" + description = "Builds -${classifier} archive, containing all jars and docs, " + + "suitable for community download page." + + ext.baseDir = "${baseName}-${project.version}"; + + from("src/docs/dist") { + include "readme.txt" + include "license.txt" + include "notice.txt" + into "${baseDir}" + expand(copyright: new Date().format("yyyy"), version: project.version) + } + + from(zipTree(docsZip.archivePath)) { + into "${baseDir}/docs" + } + + from(zipTree(schemaZip.archivePath)) { + into "${baseDir}/schema" + } + + moduleProjects.each { subproject -> + into ("${baseDir}/libs") { + from subproject.jar + if (subproject.tasks.findByPath("sourcesJar")) { + from subproject.sourcesJar + } + if (subproject.tasks.findByPath("javadocJar")) { + from subproject.javadocJar + } + } + } +} + +// Create a distribution that contains all dependencies (required and optional). +// Not published by default; only for use when building from source. +task depsZip(type: Zip, dependsOn: distZip) { zipTask -> + group = "Distribution" + baseName = "spring-framework" + classifier = "dist-with-deps" + description = "Builds -${classifier} archive, containing everything " + + "in the -${distZip.classifier} archive plus all runtime dependencies." + + from zipTree(distZip.archivePath) + + gradle.taskGraph.whenReady { taskGraph -> + if (taskGraph.hasTask(":${zipTask.name}")) { + def projectNames = rootProject.subprojects*.name + def artifacts = new HashSet() + subprojects.each { subproject -> + (subproject.configurations.runtime.resolvedConfiguration.resolvedArtifacts + + subproject.configurations.optional.resolvedConfiguration.resolvedArtifacts).each { artifact -> + def dependency = artifact.moduleVersion.id + if (!projectNames.contains(dependency.name)) { + artifacts << artifact.file + } + } + } + + zipTask.from(artifacts) { + into "${distZip.baseDir}/deps" + } + } + } +} \ No newline at end of file diff --git a/gradle/sniffer.gradle b/gradle/sniffer.gradle new file mode 100644 index 0000000000..eb1a3451a1 --- /dev/null +++ b/gradle/sniffer.gradle @@ -0,0 +1,67 @@ +/* + * Copyright 2002-2017 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 + * + * http://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. + */ + +configure(allprojects) { project -> + + ext.snifferVersion = "1.15" + + configurations { + sniffer + javaApiSignature + } + + dependencies { + sniffer("org.codehaus.mojo:animal-sniffer-ant-tasks:${snifferVersion}") + javaApiSignature("org.codehaus.mojo.signature:java18:1.0@signature") + } +} + +task copyJavaApiSignature(type: Copy) { + ext.to = file("$buildDir/javaApiSignature/") + description "Copy the resolved Animal Sniffer signature dependency artifact to a known location and name" + from configurations.javaApiSignature + into to + rename '.*signature', 'javaApi.signature' +} + +task sniff { + group = "Verification" + description = "Checks the Java API signatures" + + dependsOn compileJava + dependsOn copyJavaApiSignature + + inputs.dir sourceSets.main.output.classesDir + inputs.dir copyJavaApiSignature.to + + doLast { + ant.taskdef( + name: 'animalSniffer', + classname: 'org.codehaus.mojo.animal_sniffer.ant.CheckSignatureTask', + classpath: configurations.sniffer.asPath + ) + + // TODO: Animal Sniffer currently chokes on optional JDK 9 bytecode in AspectJ 1.9 beta 5 + // ant.animalSniffer( + // signature: "$buildDir/javaApiSignature/javaApi.signature", + // classpath: sourceSets.main.compileClasspath.asPath) { + // path(path: sourceSets.main.output.classesDir) + // annotation(className: "org.springframework.lang.UsesSunHttpServer") + // } + } +} + + diff --git a/src/asciidoc/index-docinfo.xml b/src/asciidoc/index-docinfo.xml deleted file mode 100644 index 57d964cffb..0000000000 --- a/src/asciidoc/index-docinfo.xml +++ /dev/null @@ -1,11 +0,0 @@ -Spring Framework -{revnumber} - - 2004-2016 - - - Copies of this document may be made for your own use and for distribution to - others, provided that you do not charge any fee for such copies and further provided - that each copy contains this Copyright Notice, whether distributed in print or - electronically. - diff --git a/src/asciidoc/index.adoc b/src/asciidoc/index.adoc deleted file mode 100644 index c9fed91b7b..0000000000 --- a/src/asciidoc/index.adoc +++ /dev/null @@ -1,28 +0,0 @@ -= Spring Framework Reference Documentation -Rod Johnson; Juergen Hoeller; Keith Donald; Colin Sampaleanu; Rob Harrop; Thomas Risberg; Alef Arendsen; Darren Davison; Dmitriy Kopylenko; Mark Pollack; Thierry Templier; Erwin Vervaet; Portia Tung; Ben Hale; Adrian Colyer; John Lewis; Costin Leau; Mark Fisher; Sam Brannen; Ramnivas Laddad; Arjen Poutsma; Chris Beams; Tareq Abedrabbo; Andy Clement; Dave Syer; Oliver Gierke; Rossen Stoyanchev; Phillip Webb; Rob Winch; Brian Clozel; Stephane Nicoll; Sebastien Deleuze - -:doc-root: http://docs.spring.io - -:api-spring-framework: {doc-root}/spring-framework/docs/{spring-version}/javadoc-api/org/springframework -:wiki-spring-framework: https://github.com/spring-projects/spring-framework/wiki - -:doc-spring-security: {doc-root}/spring-security/site/docs/current/reference -:doc-spring-amqp: {doc-root}/spring-amqp/docs/current/reference -:doc-spring-boot: {doc-root}/spring-boot/docs/current/reference -:doc-spring-gemfire: {doc-root}/spring-gemfire/docs/current/reference - - -include::overview.adoc[] - -include::core.adoc[] - -include::testing.adoc[] - -include::data-access.adoc[] - -include::web.adoc[] - -include::integration.adoc[] - -include::appendix.adoc[] - diff --git a/src/api/overview.html b/src/docs/api/overview.html similarity index 100% rename from src/api/overview.html rename to src/docs/api/overview.html diff --git a/src/api/stylesheet.css b/src/docs/api/stylesheet.css similarity index 100% rename from src/api/stylesheet.css rename to src/docs/api/stylesheet.css diff --git a/src/asciidoc/Guardfile b/src/docs/asciidoc/Guardfile similarity index 100% rename from src/asciidoc/Guardfile rename to src/docs/asciidoc/Guardfile diff --git a/src/asciidoc/appendix.adoc b/src/docs/asciidoc/appendix.adoc similarity index 99% rename from src/asciidoc/appendix.adoc rename to src/docs/asciidoc/appendix.adoc index 07958f6864..5a67bea700 100644 --- a/src/asciidoc/appendix.adoc +++ b/src/docs/asciidoc/appendix.adoc @@ -1,5 +1,8 @@ [[spring-appendices]] = Appendices +:doc-root: https://docs.spring.io +:api-spring-framework: {doc-root}/spring-framework/docs/{spring-version}/javadoc-api/org/springframework +:wiki-spring-framework: https://github.com/spring-projects/spring-framework/wiki [[spring-whats-new]] @@ -3960,7 +3963,7 @@ support described in this chapter. -include::appx-spring-tld.adoc[leveloffset=+1] +include::appendix/appx-spring-tld.adoc[leveloffset=+1] -include::appx-spring-form-tld.adoc[leveloffset=+1] +include::appendix/appx-spring-form-tld.adoc[leveloffset=+1] diff --git a/src/asciidoc/appx-spring-form-tld.adoc b/src/docs/asciidoc/appendix/appx-spring-form-tld.adoc similarity index 100% rename from src/asciidoc/appx-spring-form-tld.adoc rename to src/docs/asciidoc/appendix/appx-spring-form-tld.adoc diff --git a/src/asciidoc/appx-spring-tld.adoc b/src/docs/asciidoc/appendix/appx-spring-tld.adoc similarity index 100% rename from src/asciidoc/appx-spring-tld.adoc rename to src/docs/asciidoc/appendix/appx-spring-tld.adoc diff --git a/src/asciidoc/core.adoc b/src/docs/asciidoc/core.adoc similarity index 66% rename from src/asciidoc/core.adoc rename to src/docs/asciidoc/core.adoc index eb3c20a87a..a59ed1d24f 100644 --- a/src/asciidoc/core.adoc +++ b/src/docs/asciidoc/core.adoc @@ -1,5 +1,7 @@ [[spring-core]] -= Core Technologies += Core Technologies +:doc-root: https://docs.spring.io +:api-spring-framework: {doc-root}/spring-framework/docs/{spring-version}/javadoc-api/org/springframework [partintro] -- @@ -28,15 +30,15 @@ also provided. -include::core-beans.adoc[leveloffset=+1] +include::core/core-beans.adoc[leveloffset=+1] -include::core-resources.adoc[leveloffset=+1] +include::core/core-resources.adoc[leveloffset=+1] -include::core-validation.adoc[leveloffset=+1] +include::core/core-validation.adoc[leveloffset=+1] -include::core-expressions.adoc[leveloffset=+1] +include::core/core-expressions.adoc[leveloffset=+1] -include::core-aop.adoc[leveloffset=+1] +include::core/core-aop.adoc[leveloffset=+1] -include::core-aop-api.adoc[leveloffset=+1] +include::core/core-aop-api.adoc[leveloffset=+1] diff --git a/src/asciidoc/core-aop-api.adoc b/src/docs/asciidoc/core/core-aop-api.adoc similarity index 100% rename from src/asciidoc/core-aop-api.adoc rename to src/docs/asciidoc/core/core-aop-api.adoc diff --git a/src/asciidoc/core-aop.adoc b/src/docs/asciidoc/core/core-aop.adoc similarity index 99% rename from src/asciidoc/core-aop.adoc rename to src/docs/asciidoc/core/core-aop.adoc index 1d6c4ad25d..26f3b2ecfc 100644 --- a/src/asciidoc/core-aop.adoc +++ b/src/docs/asciidoc/core/core-aop.adoc @@ -2506,7 +2506,7 @@ code snippet. If you invoke a method on an object reference, the method is invoked __directly__ on that object reference, as can be seen below. -image::images/aop-proxy-plain-pojo-call.png[width=400] +image::images/aop-proxy-plain-pojo-call.png[] [source,java,indent=0] [subs="verbatim,quotes"] @@ -2526,7 +2526,7 @@ image::images/aop-proxy-plain-pojo-call.png[width=400] Things change slightly when the reference that client code has is a proxy. Consider the following diagram and code snippet. -image::images/aop-proxy-call.png[width=400] +image::images/aop-proxy-call.png[] [source,java,indent=0] [subs="verbatim,quotes"] diff --git a/src/asciidoc/core-beans.adoc b/src/docs/asciidoc/core/core-beans.adoc similarity index 99% rename from src/asciidoc/core-beans.adoc rename to src/docs/asciidoc/core/core-beans.adoc index e0fcfce99b..149c1aed71 100644 --- a/src/asciidoc/core-beans.adoc +++ b/src/docs/asciidoc/core/core-beans.adoc @@ -78,7 +78,7 @@ created and initialized, you have a fully configured and executable system or application. .The Spring IoC container -image::images/container-magic.png[width=250] +image::images/container-magic.png[] @@ -2458,7 +2458,7 @@ defined by that bean definition. This single instance is stored in a cache of su singleton beans, and __all subsequent requests and references__ for that named bean return the cached object. -image::images/singleton.png[width=400] +image::images/singleton.png[] Spring's concept of a singleton bean differs from the Singleton pattern as defined in the Gang of Four (GoF) patterns book. The GoF Singleton hard-codes the scope of an @@ -2494,7 +2494,7 @@ The following diagram illustrates the Spring prototype scope. __A data access ob any conversational state; it was just easier for this author to reuse the core of the singleton diagram.__ -image::images/prototype.png[width=400] +image::images/prototype.png[] The following example defines a bean as a prototype in XML: diff --git a/src/asciidoc/core-expressions.adoc b/src/docs/asciidoc/core/core-expressions.adoc similarity index 100% rename from src/asciidoc/core-expressions.adoc rename to src/docs/asciidoc/core/core-expressions.adoc diff --git a/src/asciidoc/core-resources.adoc b/src/docs/asciidoc/core/core-resources.adoc similarity index 100% rename from src/asciidoc/core-resources.adoc rename to src/docs/asciidoc/core/core-resources.adoc diff --git a/src/asciidoc/core-validation.adoc b/src/docs/asciidoc/core/core-validation.adoc similarity index 100% rename from src/asciidoc/core-validation.adoc rename to src/docs/asciidoc/core/core-validation.adoc diff --git a/src/asciidoc/data-access.adoc b/src/docs/asciidoc/data-access.adoc similarity index 99% rename from src/asciidoc/data-access.adoc rename to src/docs/asciidoc/data-access.adoc index 347c89a7a1..a7385d925b 100644 --- a/src/asciidoc/data-access.adoc +++ b/src/docs/asciidoc/data-access.adoc @@ -1,5 +1,7 @@ [[spring-data-tier]] = Data Access +:doc-root: https://docs.spring.io +:api-spring-framework: {doc-root}/spring-framework/docs/{spring-version}/javadoc-api/org/springframework [partintro] -- @@ -551,7 +553,7 @@ Spring AOP is covered in <>. Conceptually, calling a method on a transactional proxy looks like this... -image::images/tx.png[width=400] +image::images/tx.png[] @@ -1445,7 +1447,7 @@ __logical__ transactions, and how the propagation setting applies to this differ [[tx-propagation-required]] ===== Required -image::images/tx_prop_required.png[width=400] +image::images/tx_prop_required.png[] PROPAGATION_REQUIRED @@ -1471,7 +1473,7 @@ indicate clearly that a rollback was performed instead. [[tx-propagation-requires_new]] ===== RequiresNew -image::images/tx_prop_requires_new.png[width=400] +image::images/tx_prop_requires_new.png[] PROPAGATION_REQUIRES_NEW @@ -2092,7 +2094,7 @@ The exception hierarchy that Spring provides can be seen below. (Please note tha class hierarchy detailed in the image shows only a subset of the entire `DataAccessException` hierarchy.) -image::images/DataAccessException.gif[width=400] +image::images/DataAccessException.gif[] @@ -6201,7 +6203,7 @@ underlying O/X mapping tool does not do so. The O/X Mapping exception hierarchy is shown in the following figure: -image::images/oxm-exceptions.png[width=400] +image::images/oxm-exceptions.png[] O/X Mapping exception hierarchy diff --git a/src/asciidoc/images/DataAccessException.gif b/src/docs/asciidoc/images/DataAccessException.gif similarity index 100% rename from src/asciidoc/images/DataAccessException.gif rename to src/docs/asciidoc/images/DataAccessException.gif diff --git a/src/asciidoc/images/aop-proxy-call.png b/src/docs/asciidoc/images/aop-proxy-call.png similarity index 100% rename from src/asciidoc/images/aop-proxy-call.png rename to src/docs/asciidoc/images/aop-proxy-call.png diff --git a/src/asciidoc/images/aop-proxy-plain-pojo-call.png b/src/docs/asciidoc/images/aop-proxy-plain-pojo-call.png similarity index 100% rename from src/asciidoc/images/aop-proxy-plain-pojo-call.png rename to src/docs/asciidoc/images/aop-proxy-plain-pojo-call.png diff --git a/src/asciidoc/images/aop-uml.gif b/src/docs/asciidoc/images/aop-uml.gif similarity index 100% rename from src/asciidoc/images/aop-uml.gif rename to src/docs/asciidoc/images/aop-uml.gif diff --git a/src/asciidoc/images/bean-lifecycle-overview.gif b/src/docs/asciidoc/images/bean-lifecycle-overview.gif similarity index 100% rename from src/asciidoc/images/bean-lifecycle-overview.gif rename to src/docs/asciidoc/images/bean-lifecycle-overview.gif diff --git a/src/asciidoc/images/bind1.jpg b/src/docs/asciidoc/images/bind1.jpg similarity index 100% rename from src/asciidoc/images/bind1.jpg rename to src/docs/asciidoc/images/bind1.jpg diff --git a/src/asciidoc/images/bind2.jpg b/src/docs/asciidoc/images/bind2.jpg similarity index 100% rename from src/asciidoc/images/bind2.jpg rename to src/docs/asciidoc/images/bind2.jpg diff --git a/src/asciidoc/images/container-magic.png b/src/docs/asciidoc/images/container-magic.png similarity index 100% rename from src/asciidoc/images/container-magic.png rename to src/docs/asciidoc/images/container-magic.png diff --git a/src/asciidoc/images/eclipse-setup-1.png b/src/docs/asciidoc/images/eclipse-setup-1.png similarity index 100% rename from src/asciidoc/images/eclipse-setup-1.png rename to src/docs/asciidoc/images/eclipse-setup-1.png diff --git a/src/asciidoc/images/eclipse-setup-2.png b/src/docs/asciidoc/images/eclipse-setup-2.png similarity index 100% rename from src/asciidoc/images/eclipse-setup-2.png rename to src/docs/asciidoc/images/eclipse-setup-2.png diff --git a/src/asciidoc/images/eclipse-setup-3.png b/src/docs/asciidoc/images/eclipse-setup-3.png similarity index 100% rename from src/asciidoc/images/eclipse-setup-3.png rename to src/docs/asciidoc/images/eclipse-setup-3.png diff --git a/src/asciidoc/images/ejb.gif b/src/docs/asciidoc/images/ejb.gif similarity index 100% rename from src/asciidoc/images/ejb.gif rename to src/docs/asciidoc/images/ejb.gif diff --git a/src/asciidoc/images/ejb.png b/src/docs/asciidoc/images/ejb.png similarity index 100% rename from src/asciidoc/images/ejb.png rename to src/docs/asciidoc/images/ejb.png diff --git a/src/asciidoc/images/ejb.svg b/src/docs/asciidoc/images/ejb.svg similarity index 100% rename from src/asciidoc/images/ejb.svg rename to src/docs/asciidoc/images/ejb.svg diff --git a/src/asciidoc/images/full.gif b/src/docs/asciidoc/images/full.gif similarity index 100% rename from src/asciidoc/images/full.gif rename to src/docs/asciidoc/images/full.gif diff --git a/src/asciidoc/images/full.png b/src/docs/asciidoc/images/full.png similarity index 100% rename from src/asciidoc/images/full.png rename to src/docs/asciidoc/images/full.png diff --git a/src/asciidoc/images/full.svg b/src/docs/asciidoc/images/full.svg similarity index 100% rename from src/asciidoc/images/full.svg rename to src/docs/asciidoc/images/full.svg diff --git a/src/asciidoc/images/idea-setup-1.png b/src/docs/asciidoc/images/idea-setup-1.png similarity index 100% rename from src/asciidoc/images/idea-setup-1.png rename to src/docs/asciidoc/images/idea-setup-1.png diff --git a/src/asciidoc/images/idea-setup-2.png b/src/docs/asciidoc/images/idea-setup-2.png similarity index 100% rename from src/asciidoc/images/idea-setup-2.png rename to src/docs/asciidoc/images/idea-setup-2.png diff --git a/src/asciidoc/images/idea-setup-3.png b/src/docs/asciidoc/images/idea-setup-3.png similarity index 100% rename from src/asciidoc/images/idea-setup-3.png rename to src/docs/asciidoc/images/idea-setup-3.png diff --git a/src/asciidoc/images/idea-setup-4.png b/src/docs/asciidoc/images/idea-setup-4.png similarity index 100% rename from src/asciidoc/images/idea-setup-4.png rename to src/docs/asciidoc/images/idea-setup-4.png diff --git a/src/asciidoc/images/idea-setup-5.png b/src/docs/asciidoc/images/idea-setup-5.png similarity index 100% rename from src/asciidoc/images/idea-setup-5.png rename to src/docs/asciidoc/images/idea-setup-5.png diff --git a/src/asciidoc/images/idea-setup-6.png b/src/docs/asciidoc/images/idea-setup-6.png similarity index 100% rename from src/asciidoc/images/idea-setup-6.png rename to src/docs/asciidoc/images/idea-setup-6.png diff --git a/src/asciidoc/images/message-flow-broker-relay.png b/src/docs/asciidoc/images/message-flow-broker-relay.png similarity index 100% rename from src/asciidoc/images/message-flow-broker-relay.png rename to src/docs/asciidoc/images/message-flow-broker-relay.png diff --git a/src/asciidoc/images/message-flow-simple-broker.png b/src/docs/asciidoc/images/message-flow-simple-broker.png similarity index 100% rename from src/asciidoc/images/message-flow-simple-broker.png rename to src/docs/asciidoc/images/message-flow-simple-broker.png diff --git a/src/asciidoc/images/mvc-context-hierarchy.png b/src/docs/asciidoc/images/mvc-context-hierarchy.png similarity index 100% rename from src/asciidoc/images/mvc-context-hierarchy.png rename to src/docs/asciidoc/images/mvc-context-hierarchy.png diff --git a/src/asciidoc/images/mvc-context-hierarchy.svg b/src/docs/asciidoc/images/mvc-context-hierarchy.svg similarity index 100% rename from src/asciidoc/images/mvc-context-hierarchy.svg rename to src/docs/asciidoc/images/mvc-context-hierarchy.svg diff --git a/src/asciidoc/images/mvc-root-context.png b/src/docs/asciidoc/images/mvc-root-context.png similarity index 100% rename from src/asciidoc/images/mvc-root-context.png rename to src/docs/asciidoc/images/mvc-root-context.png diff --git a/src/asciidoc/images/mvc-root-context.svg b/src/docs/asciidoc/images/mvc-root-context.svg similarity index 100% rename from src/asciidoc/images/mvc-root-context.svg rename to src/docs/asciidoc/images/mvc-root-context.svg diff --git a/src/asciidoc/images/mvc.png b/src/docs/asciidoc/images/mvc.png similarity index 100% rename from src/asciidoc/images/mvc.png rename to src/docs/asciidoc/images/mvc.png diff --git a/src/asciidoc/images/overview-ejb.graffle b/src/docs/asciidoc/images/overview-ejb.graffle similarity index 100% rename from src/asciidoc/images/overview-ejb.graffle rename to src/docs/asciidoc/images/overview-ejb.graffle diff --git a/src/asciidoc/images/overview-ejb.png b/src/docs/asciidoc/images/overview-ejb.png similarity index 100% rename from src/asciidoc/images/overview-ejb.png rename to src/docs/asciidoc/images/overview-ejb.png diff --git a/src/asciidoc/images/overview-full.graffle b/src/docs/asciidoc/images/overview-full.graffle similarity index 100% rename from src/asciidoc/images/overview-full.graffle rename to src/docs/asciidoc/images/overview-full.graffle diff --git a/src/asciidoc/images/overview-full.png b/src/docs/asciidoc/images/overview-full.png similarity index 100% rename from src/asciidoc/images/overview-full.png rename to src/docs/asciidoc/images/overview-full.png diff --git a/src/asciidoc/images/overview-remoting.graffle b/src/docs/asciidoc/images/overview-remoting.graffle similarity index 100% rename from src/asciidoc/images/overview-remoting.graffle rename to src/docs/asciidoc/images/overview-remoting.graffle diff --git a/src/asciidoc/images/overview-remoting.png b/src/docs/asciidoc/images/overview-remoting.png similarity index 100% rename from src/asciidoc/images/overview-remoting.png rename to src/docs/asciidoc/images/overview-remoting.png diff --git a/src/asciidoc/images/overview-thirdparty-web.graffle b/src/docs/asciidoc/images/overview-thirdparty-web.graffle similarity index 100% rename from src/asciidoc/images/overview-thirdparty-web.graffle rename to src/docs/asciidoc/images/overview-thirdparty-web.graffle diff --git a/src/asciidoc/images/overview-thirdparty-web.png b/src/docs/asciidoc/images/overview-thirdparty-web.png similarity index 100% rename from src/asciidoc/images/overview-thirdparty-web.png rename to src/docs/asciidoc/images/overview-thirdparty-web.png diff --git a/src/asciidoc/images/oxm-exceptions.graffle b/src/docs/asciidoc/images/oxm-exceptions.graffle similarity index 100% rename from src/asciidoc/images/oxm-exceptions.graffle rename to src/docs/asciidoc/images/oxm-exceptions.graffle diff --git a/src/asciidoc/images/oxm-exceptions.png b/src/docs/asciidoc/images/oxm-exceptions.png similarity index 100% rename from src/asciidoc/images/oxm-exceptions.png rename to src/docs/asciidoc/images/oxm-exceptions.png diff --git a/src/asciidoc/images/prototype.png b/src/docs/asciidoc/images/prototype.png similarity index 100% rename from src/asciidoc/images/prototype.png rename to src/docs/asciidoc/images/prototype.png diff --git a/src/asciidoc/images/remoting.gif b/src/docs/asciidoc/images/remoting.gif similarity index 100% rename from src/asciidoc/images/remoting.gif rename to src/docs/asciidoc/images/remoting.gif diff --git a/src/asciidoc/images/remoting.png b/src/docs/asciidoc/images/remoting.png similarity index 100% rename from src/asciidoc/images/remoting.png rename to src/docs/asciidoc/images/remoting.png diff --git a/src/asciidoc/images/remoting.svg b/src/docs/asciidoc/images/remoting.svg similarity index 100% rename from src/asciidoc/images/remoting.svg rename to src/docs/asciidoc/images/remoting.svg diff --git a/src/asciidoc/images/singleton.png b/src/docs/asciidoc/images/singleton.png similarity index 100% rename from src/asciidoc/images/singleton.png rename to src/docs/asciidoc/images/singleton.png diff --git a/src/asciidoc/images/spring-overview.gif b/src/docs/asciidoc/images/spring-overview.gif similarity index 100% rename from src/asciidoc/images/spring-overview.gif rename to src/docs/asciidoc/images/spring-overview.gif diff --git a/src/asciidoc/images/spring-overview.graffle b/src/docs/asciidoc/images/spring-overview.graffle similarity index 100% rename from src/asciidoc/images/spring-overview.graffle rename to src/docs/asciidoc/images/spring-overview.graffle diff --git a/src/asciidoc/images/spring-overview.png b/src/docs/asciidoc/images/spring-overview.png similarity index 100% rename from src/asciidoc/images/spring-overview.png rename to src/docs/asciidoc/images/spring-overview.png diff --git a/src/asciidoc/images/spring-overview.svg b/src/docs/asciidoc/images/spring-overview.svg similarity index 100% rename from src/asciidoc/images/spring-overview.svg rename to src/docs/asciidoc/images/spring-overview.svg diff --git a/src/asciidoc/images/spring-overview.vsd b/src/docs/asciidoc/images/spring-overview.vsd similarity index 100% rename from src/asciidoc/images/spring-overview.vsd rename to src/docs/asciidoc/images/spring-overview.vsd diff --git a/src/asciidoc/images/spring.sxd b/src/docs/asciidoc/images/spring.sxd similarity index 100% rename from src/asciidoc/images/spring.sxd rename to src/docs/asciidoc/images/spring.sxd diff --git a/src/asciidoc/images/thirdparty-web.gif b/src/docs/asciidoc/images/thirdparty-web.gif similarity index 100% rename from src/asciidoc/images/thirdparty-web.gif rename to src/docs/asciidoc/images/thirdparty-web.gif diff --git a/src/asciidoc/images/thirdparty-web.png b/src/docs/asciidoc/images/thirdparty-web.png similarity index 100% rename from src/asciidoc/images/thirdparty-web.png rename to src/docs/asciidoc/images/thirdparty-web.png diff --git a/src/asciidoc/images/thirdparty-web.svg b/src/docs/asciidoc/images/thirdparty-web.svg similarity index 100% rename from src/asciidoc/images/thirdparty-web.svg rename to src/docs/asciidoc/images/thirdparty-web.svg diff --git a/src/asciidoc/images/tx.png b/src/docs/asciidoc/images/tx.png similarity index 100% rename from src/asciidoc/images/tx.png rename to src/docs/asciidoc/images/tx.png diff --git a/src/asciidoc/images/tx_prop_required.png b/src/docs/asciidoc/images/tx_prop_required.png similarity index 100% rename from src/asciidoc/images/tx_prop_required.png rename to src/docs/asciidoc/images/tx_prop_required.png diff --git a/src/asciidoc/images/tx_prop_requires_new.png b/src/docs/asciidoc/images/tx_prop_requires_new.png similarity index 100% rename from src/asciidoc/images/tx_prop_requires_new.png rename to src/docs/asciidoc/images/tx_prop_requires_new.png diff --git a/src/asciidoc/images/webflux-overview.png b/src/docs/asciidoc/images/webflux-overview.png similarity index 100% rename from src/asciidoc/images/webflux-overview.png rename to src/docs/asciidoc/images/webflux-overview.png diff --git a/src/docs/asciidoc/index.adoc b/src/docs/asciidoc/index.adoc new file mode 100644 index 0000000000..b3f16704b0 --- /dev/null +++ b/src/docs/asciidoc/index.adoc @@ -0,0 +1,19 @@ += Spring Framework Reference Documentation +The Spring Framework team and contributors https://github.com/spring-projects/spring-framework/graphs/contributors +:doc-root: https://docs.spring.io +:api-spring-framework: {doc-root}/spring-framework/docs/{spring-version}/javadoc-api/org/springframework + + +<> + +<> + +<> + +<> + +<> + +<> + +<> \ No newline at end of file diff --git a/src/asciidoc/integration.adoc b/src/docs/asciidoc/integration.adoc similarity index 99% rename from src/asciidoc/integration.adoc rename to src/docs/asciidoc/integration.adoc index 9d15ae74b1..9d28ba6c4a 100644 --- a/src/asciidoc/integration.adoc +++ b/src/docs/asciidoc/integration.adoc @@ -1,5 +1,9 @@ [[spring-integration]] = Integration +:doc-root: https://docs.spring.io +:api-spring-framework: {doc-root}/spring-framework/docs/{spring-version}/javadoc-api/org/springframework +:doc-spring-amqp: {doc-root}/spring-amqp/docs/current/reference +:doc-spring-gemfire: {doc-root}/spring-gemfire/docs/current/reference [partintro] -- diff --git a/src/asciidoc/overview.adoc b/src/docs/asciidoc/overview.adoc similarity index 99% rename from src/asciidoc/overview.adoc rename to src/docs/asciidoc/overview.adoc index 4ec4548139..61fb5c683f 100644 --- a/src/asciidoc/overview.adoc +++ b/src/docs/asciidoc/overview.adoc @@ -1,5 +1,7 @@ [[spring-introduction]] = Overview of Spring Framework +:doc-root: https://docs.spring.io +:api-spring-framework: {doc-root}/spring-framework/docs/{spring-version}/javadoc-api/org/springframework [partintro] -- @@ -116,7 +118,7 @@ are grouped into Core Container, Data Access/Integration, Web, AOP (Aspect Orien Programming), Instrumentation, Messaging, and Test, as shown in the following diagram. .Overview of the Spring Framework -image::images/spring-overview.png[width=400] +image::images/spring-overview.png[] The following sections list the available modules for each feature along with their artifact names and the topics they cover. Artifact names correlate to _artifact IDs_ used @@ -245,7 +247,7 @@ enterprise applications that use Spring's transaction management functionality a framework integration. .Typical full-fledged Spring web application -image::images/overview-full.png[width=400] +image::images/overview-full.png[] Spring's <> make the web application fully transactional, just as it would be if you used EJB @@ -260,7 +262,7 @@ seamlessly integrate the web-layer with the domain model, removing the need for domain model. .Spring middle-tier using a third-party web framework -image::images/overview-thirdparty-web.png[width=400] +image::images/overview-thirdparty-web.png[] Sometimes circumstances do not allow you to completely switch to a different framework. The Spring Framework does __not__ force you to use everything within it; it is not an @@ -271,14 +273,14 @@ using an `ApplicationContext` and use a `WebApplicationContext` to integrate you layer. .Remoting usage scenario -image::images/overview-remoting.png[width=400] +image::images/overview-remoting.png[] When you need to access existing code through web services, you can use Spring's `Hessian-`, `Rmi-` or `HttpInvokerProxyFactoryBean` classes. Enabling remote access to existing applications is not difficult. .EJBs - Wrapping existing POJOs -image::images/overview-ejb.png[width=400] +image::images/overview-ejb.png[] The Spring Framework also provides an <> for Enterprise JavaBeans, enabling you to reuse your existing POJOs and wrap them in diff --git a/src/docs/asciidoc/stylesheets/spring.css b/src/docs/asciidoc/stylesheets/spring.css new file mode 100644 index 0000000000..faa7c4732e --- /dev/null +++ b/src/docs/asciidoc/stylesheets/spring.css @@ -0,0 +1,691 @@ +@import url(https://fonts.googleapis.com/css?family=Varela+Round|Montserrat:400,700); +/*! normalize.css v2.1.2 | MIT License | git.io/normalize */ +/* ========================================================================== HTML5 display definitions ========================================================================== */ +/** Correct `block` display not defined in IE 8/9. */ +article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; } + +/** Correct `inline-block` display not defined in IE 8/9. */ +audio, canvas, video { display: inline-block; } + +/** Prevent modern browsers from displaying `audio` without controls. Remove excess height in iOS 5 devices. */ +audio:not([controls]) { display: none; height: 0; } + +/** Address `[hidden]` styling not present in IE 8/9. Hide the `template` element in IE, Safari, and Firefox < 22. */ +[hidden], template { display: none; } + +script { display: none !important; } + +/* ========================================================================== Base ========================================================================== */ +/** 1. Set default font family to sans-serif. 2. Prevent iOS text size adjust after orientation change, without disabling user zoom. */ +html { font-family: sans-serif; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ -webkit-text-size-adjust: 100%; /* 2 */ } + +/** Remove default margin. */ +body { margin: 0; } + +/* ========================================================================== Links ========================================================================== */ +/** Remove the gray background color from active links in IE 10. */ +a { background: transparent; } + +/** Address `outline` inconsistency between Chrome and other browsers. */ +a:focus { outline: thin dotted; } + +/** Improve readability when focused and also mouse hovered in all browsers. */ +a:active, a:hover { outline: 0; } + +/* ========================================================================== Typography ========================================================================== */ +/** Address variable `h1` font-size and margin within `section` and `article` contexts in Firefox 4+, Safari 5, and Chrome. */ +h1 { font-size: 2em; margin: 0.67em 0; } + +/** Address styling not present in IE 8/9, Safari 5, and Chrome. */ +abbr[title] { border-bottom: 1px dotted; } + +/** Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. */ +b, strong { font-weight: bold; } + +/** Address styling not present in Safari 5 and Chrome. */ +dfn { font-style: italic; } + +/** Address differences between Firefox and other browsers. */ +hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; } + +/** Address styling not present in IE 8/9. */ +mark { background: #ff0; color: #000; } + +/** Correct font family set oddly in Safari 5 and Chrome. */ +code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; } + +/** Improve readability of pre-formatted text in all browsers. */ +pre { white-space: pre-wrap; } + +/** Set consistent quote types. */ +q { quotes: "\201C" "\201D" "\2018" "\2019"; } + +/** Address inconsistent and variable font size in all browsers. */ +small { font-size: 80%; } + +/** Prevent `sub` and `sup` affecting `line-height` in all browsers. */ +sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } + +sup { top: -0.5em; } + +sub { bottom: -0.25em; } + +/* ========================================================================== Embedded content ========================================================================== */ +/** Remove border when inside `a` element in IE 8/9. */ +img { border: 0; } + +/** Correct overflow displayed oddly in IE 9. */ +svg:not(:root) { overflow: hidden; } + +/* ========================================================================== Figures ========================================================================== */ +/** Address margin not present in IE 8/9 and Safari 5. */ +figure { margin: 0; } + +/* ========================================================================== Forms ========================================================================== */ +/** Define consistent border, margin, and padding. */ +fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } + +/** 1. Correct `color` not being inherited in IE 8/9. 2. Remove padding so people aren't caught out if they zero out fieldsets. */ +legend { border: 0; /* 1 */ padding: 0; /* 2 */ } + +/** 1. Correct font family not being inherited in all browsers. 2. Correct font size not being inherited in all browsers. 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. */ +button, input, select, textarea { font-family: inherit; /* 1 */ font-size: 100%; /* 2 */ margin: 0; /* 3 */ } + +/** Address Firefox 4+ setting `line-height` on `input` using `!important` in the UA stylesheet. */ +button, input { line-height: normal; } + +/** Address inconsistent `text-transform` inheritance for `button` and `select`. All other form control elements do not inherit `text-transform` values. Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. Correct `select` style inheritance in Firefox 4+ and Opera. */ +button, select { text-transform: none; } + +/** 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls. 2. Correct inability to style clickable `input` types in iOS. 3. Improve usability and consistency of cursor style between image-type `input` and others. */ +button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ } + +/** Re-set default cursor for disabled elements. */ +button[disabled], html input[disabled] { cursor: default; } + +/** 1. Address box sizing set to `content-box` in IE 8/9. 2. Remove excess padding in IE 8/9. */ +input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ } + +/** 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome (include `-moz` to future-proof). */ +input[type="search"] { -webkit-appearance: textfield; /* 1 */ -moz-box-sizing: content-box; -webkit-box-sizing: content-box; /* 2 */ box-sizing: content-box; } + +/** Remove inner padding and search cancel button in Safari 5 and Chrome on OS X. */ +input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } + +/** Remove inner padding and border in Firefox 4+. */ +button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } + +/** 1. Remove default vertical scrollbar in IE 8/9. 2. Improve readability and alignment in all browsers. */ +textarea { overflow: auto; /* 1 */ vertical-align: top; /* 2 */ } + +/* ========================================================================== Tables ========================================================================== */ +/** Remove most spacing between table cells. */ +table { border-collapse: collapse; border-spacing: 0; } + +meta.foundation-mq-small { font-family: "only screen and (min-width: 768px)"; width: 768px; } + +meta.foundation-mq-medium { font-family: "only screen and (min-width:1280px)"; width: 1280px; } + +meta.foundation-mq-large { font-family: "only screen and (min-width:1440px)"; width: 1440px; } + +*, *:before, *:after { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; } + +html, body { font-size: 100%; } + +body { background: white; color: #34302d; padding: 0; margin: 0; font-family: "Varela Round", sans-serif; font-weight: normal; font-style: normal; line-height: 1; position: relative; cursor: auto; } + +a:hover { cursor: pointer; } + +img, object, embed { max-width: 100%; height: auto; } + +object, embed { height: 100%; } + +img { -ms-interpolation-mode: bicubic; } + +#map_canvas img, #map_canvas embed, #map_canvas object, .map_canvas img, .map_canvas embed, .map_canvas object { max-width: none !important; } + +.left { float: left !important; } + +.right { float: right !important; } + +.text-left { text-align: left !important; } + +.text-right { text-align: right !important; } + +.text-center { text-align: center !important; } + +.text-justify { text-align: justify !important; } + +.hide { display: none; } + +.antialiased { -webkit-font-smoothing: antialiased; } + +img { display: inline-block; vertical-align: middle; } + +textarea { height: auto; min-height: 50px; } + +select { width: 100%; } + +object, svg { display: inline-block; vertical-align: middle; } + +.center { margin-left: auto; margin-right: auto; } + +.spread { width: 100%; } + +p.lead, .paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { font-size: 1.21875em; line-height: 1.6; } + +.subheader, .admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { line-height: 1.45; color: #0b0a0a; font-weight: normal; margin-top: 0; margin-bottom: 0.25em; } + +/* Typography resets */ +div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6, pre, form, p, blockquote, th, td { margin: 0; padding: 0; direction: ltr; } + +/* Default Link Styles */ +a { color: #548e2e; text-decoration: underline; line-height: inherit; } +a:hover, a:focus { color: #487a28; } +a img { border: none; } + +/* Default paragraph styles */ +p { font-family: inherit; font-weight: normal; font-size: 1em; line-height: 1.6; margin-bottom: 1.25em; text-rendering: optimizeLegibility; } +p aside { font-size: 0.875em; line-height: 1.35; font-style: italic; } + +/* Default header styles */ +h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { font-family: Montserrat, sans-serif; font-weight: 400; font-style: normal; color: #34302d; text-rendering: optimizeLegibility; margin-top: 1em; margin-bottom: 0.5em; line-height: 1.0125em; } +h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > .title small, h4 small, h5 small, h6 small { font-size: 60%; color: #867c74; line-height: 0; } + +h1 { font-size: 2.125em; } + +h2 { font-size: 1.6875em; } + +h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.375em; } + +h4 { font-size: 1.125em; } + +h5 { font-size: 1.125em; } + +h6 { font-size: 1em; } + +hr { border: solid #ddddd8; border-width: 1px 0 0; clear: both; margin: 1.25em 0 1.1875em; height: 0; } + +/* Helpful Typography Defaults */ +em, i { font-style: italic; line-height: inherit; } + +strong, b { font-weight: bold; line-height: inherit; } + +small { font-size: 60%; line-height: inherit; } + +code { font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-weight: normal; color: rgba(0, 0, 0, 0.9); } + +/* Lists */ +ul, ol, dl { font-size: 1em; line-height: 1.6; margin-bottom: 1.25em; list-style-position: outside; font-family: inherit; } + +ul, ol { margin-left: 1.5em; } +ul.no-bullet, ol.no-bullet { margin-left: 1.5em; } + +/* Unordered Lists */ +ul li ul, ul li ol { margin-left: 1.25em; margin-bottom: 0; font-size: 1em; /* Override nested font-size change */ } +ul.square li ul, ul.circle li ul, ul.disc li ul { list-style: inherit; } +ul.square { list-style-type: square; } +ul.circle { list-style-type: circle; } +ul.disc { list-style-type: disc; } +ul.no-bullet { list-style: none; } + +/* Ordered Lists */ +ol li ul, ol li ol { margin-left: 1.25em; margin-bottom: 0; } + +/* Definition Lists */ +dl dt { margin-bottom: 0.3125em; font-weight: bold; } +dl dd { margin-bottom: 1.25em; } + +/* Abbreviations */ +abbr, acronym { text-transform: uppercase; font-size: 90%; color: #34302d; border-bottom: 1px dotted #dddddd; cursor: help; } + +abbr { text-transform: none; } + +/* Blockquotes */ +blockquote { margin: 0 0 1.25em; padding: 0.5625em 1.25em 0 1.1875em; border-left: 1px solid #dddddd; } +blockquote cite { display: block; font-size: 0.9375em; color: rgba(0, 0, 0, 0.6); } +blockquote cite:before { content: "\2014 \0020"; } +blockquote cite a, blockquote cite a:visited { color: rgba(0, 0, 0, 0.6); } + +blockquote, blockquote p { line-height: 1.6; color: rgba(0, 0, 0, 0.85); } + +/* Microformats */ +.vcard { display: inline-block; margin: 0 0 1.25em 0; border: 1px solid #dddddd; padding: 0.625em 0.75em; } +.vcard li { margin: 0; display: block; } +.vcard .fn { font-weight: bold; font-size: 0.9375em; } + +.vevent .summary { font-weight: bold; } +.vevent abbr { cursor: auto; text-decoration: none; font-weight: bold; border: none; padding: 0 0.0625em; } + +@media only screen and (min-width: 768px) { h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.2; } + h1 { font-size: 2.75em; } + h2 { font-size: 2.3125em; } + h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.6875em; } + h4 { font-size: 1.4375em; } } +/* Tables */ +table { background: white; margin-bottom: 1.25em; border: solid 1px #dedede; } +table thead, table tfoot { background: #f7f8f7; font-weight: bold; } +table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { padding: 0.5em 0.625em 0.625em; font-size: inherit; color: #34302d; text-align: left; } +table tr th, table tr td { padding: 0.5625em 0.625em; font-size: inherit; color: #34302d; } +table tr.even, table tr.alt, table tr:nth-of-type(even) { background: #f8f8f7; } +table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td { display: table-cell; line-height: 1.6; } + +body { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; tab-size: 4; } + +h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.2; word-spacing: -0.05em; } + +.clearfix:before, .clearfix:after, .float-group:before, .float-group:after { content: " "; display: table; } +.clearfix:after, .float-group:after { clear: both; } + +*:not(pre) > code { font-size: 0.9375em; font-style: normal !important; letter-spacing: 0; padding: 0.1em 0.5ex; word-spacing: -0.15em; background-color: #f7f7f8; -webkit-border-radius: 4px; border-radius: 4px; line-height: 1.45; text-rendering: optimizeSpeed; word-wrap: break-word; } +*:not(pre) > code.nobreak { word-wrap: normal; } +*:not(pre) > code.nowrap { white-space: nowrap; } + +pre, pre > code { line-height: 1.45; color: rgba(0, 0, 0, 0.9); font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-weight: normal; text-rendering: optimizeSpeed; } + +em em { font-style: normal; } + +strong strong { font-weight: normal; } + +.keyseq { color: #6b625c; } + +kbd { font-family: Monaco, Menlo, Consolas, "Courier New", monospace; display: inline-block; color: #34302d; font-size: 0.65em; line-height: 1.45; background-color: #f7f7f7; border: 1px solid #ccc; -webkit-border-radius: 3px; border-radius: 3px; -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; margin: 0 0.15em; padding: 0.2em 0.5em; vertical-align: middle; position: relative; top: -0.1em; white-space: nowrap; } + +.keyseq kbd:first-child { margin-left: 0; } + +.keyseq kbd:last-child { margin-right: 0; } + +.menuseq, .menu { color: #191715; } + +b.button:before, b.button:after { position: relative; top: -1px; font-weight: normal; } + +b.button:before { content: "["; padding: 0 3px 0 2px; } + +b.button:after { content: "]"; padding: 0 2px 0 3px; } + +p a > code:hover { color: rgba(0, 0, 0, 0.9); } + +#header, #content, #footnotes, #footer { width: 100%; margin-left: auto; margin-right: auto; margin-top: 0; margin-bottom: 0; max-width: 62.5em; *zoom: 1; position: relative; padding-left: 0.9375em; padding-right: 0.9375em; } +#header:before, #header:after, #content:before, #content:after, #footnotes:before, #footnotes:after, #footer:before, #footer:after { content: " "; display: table; } +#header:after, #content:after, #footnotes:after, #footer:after { clear: both; } + +#content { margin-top: 1.25em; } + +#content:before { content: none; } + +#header > h1:first-child { color: rgba(0, 0, 0, 0.85); margin-top: 2.25rem; margin-bottom: 0; } +#header > h1:first-child + #toc { margin-top: 8px; border-top: 1px solid #ddddd8; } +#header > h1:only-child, body.toc2 #header > h1:nth-last-child(2) { border-bottom: 1px solid #ddddd8; padding-bottom: 8px; } +#header .details { border-bottom: 1px solid #ddddd8; line-height: 1.45; padding-top: 0.25em; padding-bottom: 0.25em; padding-left: 0.25em; color: rgba(0, 0, 0, 0.6); display: -ms-flexbox; display: -webkit-flex; display: flex; -ms-flex-flow: row wrap; -webkit-flex-flow: row wrap; flex-flow: row wrap; } +#header .details span:first-child { margin-left: -0.125em; } +#header .details span.email a { color: rgba(0, 0, 0, 0.85); } +#header .details br { display: none; } +#header .details br + span:before { content: "\00a0\2013\00a0"; } +#header .details br + span.author:before { content: "\00a0\22c5\00a0"; color: rgba(0, 0, 0, 0.85); } +#header .details br + span#revremark:before { content: "\00a0|\00a0"; } +#header #revnumber { text-transform: capitalize; } +#header #revnumber:after { content: "\00a0"; } + +#content > h1:first-child:not([class]) { color: rgba(0, 0, 0, 0.85); border-bottom: 1px solid #ddddd8; padding-bottom: 8px; margin-top: 0; padding-top: 1rem; margin-bottom: 1.25rem; } + +#toc { border-bottom: 1px solid #efefed; padding-bottom: 0.5em; } +#toc > ul { margin-left: 0.125em; } +#toc ul.sectlevel0 > li > a { font-style: italic; } +#toc ul.sectlevel0 ul.sectlevel1 { margin: 0.5em 0; } +#toc ul { font-family: Montserrat, sans-serif; list-style-type: none; } +#toc li { line-height: 1.3334; margin-top: 0.3334em; } +#toc a { text-decoration: none; } +#toc a:active { text-decoration: underline; } + +#toctitle { color: #0b0a0a; font-size: 1.2em; } + +@media only screen and (min-width: 768px) { #toctitle { font-size: 1.375em; } + body.toc2 { padding-left: 15em; padding-right: 0; } + #toc.toc2 { margin-top: 0 !important; background-color: #f1f1f1; position: fixed; width: 15em; left: 0; top: 0; border-right: 1px solid #efefed; border-top-width: 0 !important; border-bottom-width: 0 !important; z-index: 1000; padding: 1.25em 1em; height: 100%; overflow: auto; } + #toc.toc2 #toctitle { margin-top: 0; margin-bottom: 0.8rem; font-size: 1.2em; } + #toc.toc2 > ul { font-size: 0.9em; margin-bottom: 0; } + #toc.toc2 ul ul { margin-left: 0; padding-left: 1em; } + #toc.toc2 ul.sectlevel0 ul.sectlevel1 { padding-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; } + body.toc2.toc-right { padding-left: 0; padding-right: 15em; } + body.toc2.toc-right #toc.toc2 { border-right-width: 0; border-left: 1px solid #efefed; left: auto; right: 0; } } +@media only screen and (min-width: 1280px) { body.toc2 { padding-left: 20em; padding-right: 0; } + #toc.toc2 { width: 20em; } + #toc.toc2 #toctitle { font-size: 1.375em; } + #toc.toc2 > ul { font-size: 0.95em; } + #toc.toc2 ul ul { padding-left: 1.25em; } + body.toc2.toc-right { padding-left: 0; padding-right: 20em; } } +#content #toc { border-style: solid; border-width: 1px; border-color: #d7d7d7; margin-bottom: 1.25em; padding: 1.25em; background: #f1f1f1; -webkit-border-radius: 4px; border-radius: 4px; } +#content #toc > :first-child { margin-top: 0; } +#content #toc > :last-child { margin-bottom: 0; } + +#footer { max-width: 100%; background-color: #34302d; padding: 1.25em; } + +#footer-text { color: #cbcfd2; line-height: 1.44; } + +.sect1 { padding-bottom: 0.625em; } + +@media only screen and (min-width: 768px) { .sect1 { padding-bottom: 1.25em; } } +.sect1 + .sect1 { border-top: 1px solid #efefed; } + +#content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, .sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor { position: absolute; z-index: 1001; width: 1.5ex; margin-left: -1.5ex; display: block; text-decoration: none !important; visibility: hidden; text-align: center; font-weight: normal; } +#content h1 > a.anchor:before, h2 > a.anchor:before, h3 > a.anchor:before, #toctitle > a.anchor:before, .sidebarblock > .content > .title > a.anchor:before, h4 > a.anchor:before, h5 > a.anchor:before, h6 > a.anchor:before { content: "\00A7"; font-size: 0.85em; display: block; padding-top: 0.1em; } +#content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, .sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, #toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover { visibility: visible; } +#content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, .sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > a.link { color: #34302d; text-decoration: none; } +#content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > a.link:hover, h5 > a.link:hover, h6 > a.link:hover { color: #262321; } + +.audioblock, .imageblock, .literalblock, .listingblock, .stemblock, .videoblock { margin-bottom: 1.25em; } + +.admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { text-rendering: optimizeLegibility; text-align: left; font-family: "Varela Round", sans-serif; font-size: 1rem; font-style: italic; } + +table.tableblock > caption.title { white-space: nowrap; overflow: visible; max-width: 0; } + +.paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { color: rgba(0, 0, 0, 0.85); } + +table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p { font-size: inherit; } + +.admonitionblock > table { border-collapse: separate; border: 0; background: none; width: 100%; } +.admonitionblock > table td.icon { text-align: center; width: 80px; } +.admonitionblock > table td.icon img { max-width: initial; } +.admonitionblock > table td.icon .title { font-weight: bold; font-family: Montserrat, sans-serif; text-transform: uppercase; } +.admonitionblock > table td.content { padding-left: 1.125em; padding-right: 1.25em; border-left: 1px solid #ddddd8; color: rgba(0, 0, 0, 0.6); } +.admonitionblock > table td.content > :last-child > :last-child { margin-bottom: 0; } + +.exampleblock > .content { border-style: solid; border-width: 1px; border-color: #e6e6e6; margin-bottom: 1.25em; padding: 1.25em; background: white; -webkit-border-radius: 4px; border-radius: 4px; } +.exampleblock > .content > :first-child { margin-top: 0; } +.exampleblock > .content > :last-child { margin-bottom: 0; } + +.sidebarblock { border-style: solid; border-width: 1px; border-color: #d7d7d7; margin-bottom: 1.25em; padding: 1.25em; background: #f1f1f1; -webkit-border-radius: 4px; border-radius: 4px; } +.sidebarblock > :first-child { margin-top: 0; } +.sidebarblock > :last-child { margin-bottom: 0; } +.sidebarblock > .content > .title { color: #0b0a0a; margin-top: 0; text-align: center; } + +.exampleblock > .content > :last-child > :last-child, .exampleblock > .content .olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul > li:last-child > :last-child, .exampleblock > .content .qlist > ol > li:last-child > :last-child, .sidebarblock > .content > :last-child > :last-child, .sidebarblock > .content .olist > ol > li:last-child > :last-child, .sidebarblock > .content .ulist > ul > li:last-child > :last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child { margin-bottom: 0; } + +.literalblock pre, .listingblock pre:not(.highlight), .listingblock pre[class="highlight"], .listingblock pre[class^="highlight "], .listingblock pre.CodeRay, .listingblock pre.prettyprint { background: whitesmoke; } +.sidebarblock .literalblock pre, .sidebarblock .listingblock pre:not(.highlight), .sidebarblock .listingblock pre[class="highlight"], .sidebarblock .listingblock pre[class^="highlight "], .sidebarblock .listingblock pre.CodeRay, .sidebarblock .listingblock pre.prettyprint { background: #f2f1f1; } + +.literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { border: 1px solid #dddddd; -webkit-border-radius: 4px; border-radius: 4px; word-wrap: break-word; padding: 1em; font-size: 0.8125em; } +.literalblock pre.nowrap, .literalblock pre[class].nowrap, .listingblock pre.nowrap, .listingblock pre[class].nowrap { overflow-x: auto; white-space: pre; word-wrap: normal; } +@media only screen and (min-width: 768px) { .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { font-size: 0.90625em; } } +@media only screen and (min-width: 1280px) { .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { font-size: 1em; } } + +.literalblock.output pre { color: whitesmoke; background-color: rgba(0, 0, 0, 0.9); } + +.listingblock pre.highlightjs { padding: 0; } +.listingblock pre.highlightjs > code { padding: 1em; -webkit-border-radius: 4px; border-radius: 4px; } + +.listingblock > .content { position: relative; } + +.listingblock code[data-lang]:before { display: none; content: attr(data-lang); position: absolute; font-size: 0.75em; top: 0.425rem; right: 0.5rem; line-height: 1; text-transform: uppercase; color: #999; } + +.listingblock:hover code[data-lang]:before { display: block; } + +.listingblock.terminal pre .command:before { content: attr(data-prompt); padding-right: 0.5em; color: #999; } + +.listingblock.terminal pre .command:not([data-prompt]):before { content: "$"; } + +table.pyhltable { border-collapse: separate; border: 0; margin-bottom: 0; background: none; } + +table.pyhltable td { vertical-align: top; padding-top: 0; padding-bottom: 0; line-height: 1.45; } + +table.pyhltable td.code { padding-left: .75em; padding-right: 0; } + +pre.pygments .lineno, table.pyhltable td:not(.code) { color: #999; padding-left: 0; padding-right: .5em; border-right: 1px solid #ddddd8; } + +pre.pygments .lineno { display: inline-block; margin-right: .25em; } + +table.pyhltable .linenodiv { background: none !important; padding-right: 0 !important; } + +.quoteblock { margin: 0 1em 1.25em 1.5em; display: table; } +.quoteblock > .title { margin-left: -1.5em; margin-bottom: 0.75em; } +.quoteblock blockquote, .quoteblock blockquote p { color: rgba(0, 0, 0, 0.85); font-size: 1.15rem; line-height: 1.75; word-spacing: 0.1em; letter-spacing: 0; font-style: italic; text-align: justify; } +.quoteblock blockquote { margin: 0; padding: 0; border: 0; } +.quoteblock blockquote:before { content: "\201c"; float: left; font-size: 2.75em; font-weight: bold; line-height: 0.6em; margin-left: -0.6em; color: #0b0a0a; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); } +.quoteblock blockquote > .paragraph:last-child p { margin-bottom: 0; } +.quoteblock .attribution { margin-top: 0.5em; margin-right: 0.5ex; text-align: right; } +.quoteblock .quoteblock { margin-left: 0; margin-right: 0; padding: 0.5em 0; border-left: 3px solid rgba(0, 0, 0, 0.6); } +.quoteblock .quoteblock blockquote { padding: 0 0 0 0.75em; } +.quoteblock .quoteblock blockquote:before { display: none; } + +.verseblock { margin: 0 1em 1.25em 1em; } +.verseblock pre { font-family: "Open Sans", "DejaVu Sans", sans; font-size: 1.15rem; color: rgba(0, 0, 0, 0.85); font-weight: 300; text-rendering: optimizeLegibility; } +.verseblock pre strong { font-weight: 400; } +.verseblock .attribution { margin-top: 1.25rem; margin-left: 0.5ex; } + +.quoteblock .attribution, .verseblock .attribution { font-size: 0.9375em; line-height: 1.45; font-style: italic; } +.quoteblock .attribution br, .verseblock .attribution br { display: none; } +.quoteblock .attribution cite, .verseblock .attribution cite { display: block; letter-spacing: -0.025em; color: rgba(0, 0, 0, 0.6); } + +.quoteblock.abstract { margin: 0 0 1.25em 0; display: block; } +.quoteblock.abstract blockquote, .quoteblock.abstract blockquote p { text-align: left; word-spacing: 0; } +.quoteblock.abstract blockquote:before, .quoteblock.abstract blockquote p:first-of-type:before { display: none; } + +table.tableblock { max-width: 100%; border-collapse: separate; } +table.tableblock td > .paragraph:last-child p > p:last-child, table.tableblock th > p:last-child, table.tableblock td > p:last-child { margin-bottom: 0; } + +table.tableblock, th.tableblock, td.tableblock { border: 0 solid #dedede; } + +table.grid-all th.tableblock, table.grid-all td.tableblock { border-width: 0 1px 1px 0; } + +table.grid-all tfoot > tr > th.tableblock, table.grid-all tfoot > tr > td.tableblock { border-width: 1px 1px 0 0; } + +table.grid-cols th.tableblock, table.grid-cols td.tableblock { border-width: 0 1px 0 0; } + +table.grid-all * > tr > .tableblock:last-child, table.grid-cols * > tr > .tableblock:last-child { border-right-width: 0; } + +table.grid-rows th.tableblock, table.grid-rows td.tableblock { border-width: 0 0 1px 0; } + +table.grid-all tbody > tr:last-child > th.tableblock, table.grid-all tbody > tr:last-child > td.tableblock, table.grid-all thead:last-child > tr > th.tableblock, table.grid-rows tbody > tr:last-child > th.tableblock, table.grid-rows tbody > tr:last-child > td.tableblock, table.grid-rows thead:last-child > tr > th.tableblock { border-bottom-width: 0; } + +table.grid-rows tfoot > tr > th.tableblock, table.grid-rows tfoot > tr > td.tableblock { border-width: 1px 0 0 0; } + +table.frame-all { border-width: 1px; } + +table.frame-sides { border-width: 0 1px; } + +table.frame-topbot { border-width: 1px 0; } + +th.halign-left, td.halign-left { text-align: left; } + +th.halign-right, td.halign-right { text-align: right; } + +th.halign-center, td.halign-center { text-align: center; } + +th.valign-top, td.valign-top { vertical-align: top; } + +th.valign-bottom, td.valign-bottom { vertical-align: bottom; } + +th.valign-middle, td.valign-middle { vertical-align: middle; } + +table thead th, table tfoot th { font-weight: bold; } + +tbody tr th { display: table-cell; line-height: 1.6; background: #f7f8f7; } + +tbody tr th, tbody tr th p, tfoot tr th, tfoot tr th p { color: #34302d; font-weight: bold; } + +p.tableblock > code:only-child { background: none; padding: 0; } + +p.tableblock { font-size: 1em; } + +td > div.verse { white-space: pre; } + +ol { margin-left: 1.75em; } + +ul li ol { margin-left: 1.5em; } + +dl dd { margin-left: 1.125em; } + +dl dd:last-child, dl dd:last-child > :last-child { margin-bottom: 0; } + +ol > li p, ul > li p, ul dd, ol dd, .olist .olist, .ulist .ulist, .ulist .olist, .olist .ulist { margin-bottom: 0.625em; } + +ul.unstyled, ol.unnumbered, ul.checklist, ul.none { list-style-type: none; } + +ul.unstyled, ol.unnumbered, ul.checklist { margin-left: 0.625em; } + +ul.checklist li > p:first-child > .fa-square-o:first-child, ul.checklist li > p:first-child > .fa-check-square-o:first-child { width: 1em; font-size: 0.85em; } + +ul.checklist li > p:first-child > input[type="checkbox"]:first-child { width: 1em; position: relative; top: 1px; } + +ul.inline { margin: 0 auto 0.625em auto; margin-left: -1.375em; margin-right: 0; padding: 0; list-style: none; overflow: hidden; } +ul.inline > li { list-style: none; float: left; margin-left: 1.375em; display: block; } +ul.inline > li > * { display: block; } + +.unstyled dl dt { font-weight: normal; font-style: normal; } + +ol.arabic { list-style-type: decimal; } + +ol.decimal { list-style-type: decimal-leading-zero; } + +ol.loweralpha { list-style-type: lower-alpha; } + +ol.upperalpha { list-style-type: upper-alpha; } + +ol.lowerroman { list-style-type: lower-roman; } + +ol.upperroman { list-style-type: upper-roman; } + +ol.lowergreek { list-style-type: lower-greek; } + +.hdlist > table, .colist > table { border: 0; background: none; } +.hdlist > table > tbody > tr, .colist > table > tbody > tr { background: none; } + +td.hdlist1, td.hdlist2 { vertical-align: top; padding: 0 0.625em; } + +td.hdlist1 { font-weight: bold; padding-bottom: 1.25em; } + +.literalblock + .colist, .listingblock + .colist { margin-top: -0.5em; } + +.colist > table tr > td:first-of-type { padding: 0 0.75em; line-height: 1; } +.colist > table tr > td:first-of-type img { max-width: initial; } +.colist > table tr > td:last-of-type { padding: 0.25em 0; } + +.thumb, .th { line-height: 0; display: inline-block; border: solid 4px white; -webkit-box-shadow: 0 0 0 1px #dddddd; box-shadow: 0 0 0 1px #dddddd; } + +.imageblock.left, .imageblock[style*="float: left"] { margin: 0.25em 0.625em 1.25em 0; } +.imageblock.right, .imageblock[style*="float: right"] { margin: 0.25em 0 1.25em 0.625em; } +.imageblock > .title { margin-bottom: 0; } +.imageblock.thumb, .imageblock.th { border-width: 6px; } +.imageblock.thumb > .title, .imageblock.th > .title { padding: 0 0.125em; } + +.image.left, .image.right { margin-top: 0.25em; margin-bottom: 0.25em; display: inline-block; line-height: 0; } +.image.left { margin-right: 0.625em; } +.image.right { margin-left: 0.625em; } + +a.image { text-decoration: none; display: inline-block; } +a.image object { pointer-events: none; } + +sup.footnote, sup.footnoteref { font-size: 0.875em; position: static; vertical-align: super; } +sup.footnote a, sup.footnoteref a { text-decoration: none; } +sup.footnote a:active, sup.footnoteref a:active { text-decoration: underline; } + +#footnotes { padding-top: 0.75em; padding-bottom: 0.75em; margin-bottom: 0.625em; } +#footnotes hr { width: 20%; min-width: 6.25em; margin: -0.25em 0 0.75em 0; border-width: 1px 0 0 0; } +#footnotes .footnote { padding: 0 0.375em 0 0.225em; line-height: 1.3334; font-size: 0.875em; margin-left: 1.2em; text-indent: -1.05em; margin-bottom: 0.2em; } +#footnotes .footnote a:first-of-type { font-weight: bold; text-decoration: none; } +#footnotes .footnote:last-of-type { margin-bottom: 0; } +#content #footnotes { margin-top: -0.625em; margin-bottom: 0; padding: 0.75em 0; } + +.gist .file-data > table { border: 0; background: #fff; width: 100%; margin-bottom: 0; } +.gist .file-data > table td.line-data { width: 99%; } + +div.unbreakable { page-break-inside: avoid; } + +.big { font-size: larger; } + +.small { font-size: smaller; } + +.underline { text-decoration: underline; } + +.overline { text-decoration: overline; } + +.line-through { text-decoration: line-through; } + +.aqua { color: #00bfbf; } + +.aqua-background { background-color: #00fafa; } + +.black { color: black; } + +.black-background { background-color: black; } + +.blue { color: #0000bf; } + +.blue-background { background-color: #0000fa; } + +.fuchsia { color: #bf00bf; } + +.fuchsia-background { background-color: #fa00fa; } + +.gray { color: #606060; } + +.gray-background { background-color: #7d7d7d; } + +.green { color: #006000; } + +.green-background { background-color: #007d00; } + +.lime { color: #00bf00; } + +.lime-background { background-color: #00fa00; } + +.maroon { color: #600000; } + +.maroon-background { background-color: #7d0000; } + +.navy { color: #000060; } + +.navy-background { background-color: #00007d; } + +.olive { color: #606000; } + +.olive-background { background-color: #7d7d00; } + +.purple { color: #600060; } + +.purple-background { background-color: #7d007d; } + +.red { color: #bf0000; } + +.red-background { background-color: #fa0000; } + +.silver { color: #909090; } + +.silver-background { background-color: #bcbcbc; } + +.teal { color: #006060; } + +.teal-background { background-color: #007d7d; } + +.white { color: #bfbfbf; } + +.white-background { background-color: #fafafa; } + +.yellow { color: #bfbf00; } + +.yellow-background { background-color: #fafa00; } + +span.icon > .fa { cursor: default; } + +.admonitionblock td.icon [class^="fa icon-"] { font-size: 2.5em; text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); cursor: default; } +.admonitionblock td.icon .icon-note:before { content: "\f05a"; color: #3f6a22; } +.admonitionblock td.icon .icon-tip:before { content: "\f0eb"; text-shadow: 1px 1px 2px rgba(155, 155, 0, 0.8); color: #111; } +.admonitionblock td.icon .icon-warning:before { content: "\f071"; color: #bf6900; } +.admonitionblock td.icon .icon-caution:before { content: "\f06d"; color: #bf3400; } +.admonitionblock td.icon .icon-important:before { content: "\f06a"; color: #bf0000; } + +.conum[data-value] { display: inline-block; color: #fff !important; background-color: #34302d; -webkit-border-radius: 100px; border-radius: 100px; text-align: center; font-size: 0.75em; width: 1.67em; height: 1.67em; line-height: 1.67em; font-family: "Open Sans", "DejaVu Sans", sans-serif; font-style: normal; font-weight: bold; } +.conum[data-value] * { color: #fff !important; } +.conum[data-value] + b { display: none; } +.conum[data-value]:after { content: attr(data-value); } +pre .conum[data-value] { position: relative; top: -0.125em; } + +b.conum * { color: inherit !important; } + +.conum:not([data-value]):empty { display: none; } + +.admonitionblock { border-left: 4px solid #6db33f; background-color: #ebf1e7; padding: 1.2em 0; margin: 30px 0; width: auto; } + +#toc a:hover { text-decoration: underline; } + +.admonitionblock > table td.content { border-left: none; } diff --git a/src/asciidoc/testing.adoc b/src/docs/asciidoc/testing.adoc similarity index 99% rename from src/asciidoc/testing.adoc rename to src/docs/asciidoc/testing.adoc index 17447a7350..7727986caa 100644 --- a/src/asciidoc/testing.adoc +++ b/src/docs/asciidoc/testing.adoc @@ -1,5 +1,8 @@ [[testing]] = Testing +:doc-root: https://docs.spring.io +:api-spring-framework: {doc-root}/spring-framework/docs/{spring-version}/javadoc-api/org/springframework +:doc-spring-boot: {doc-root}/spring-boot/docs/current/reference [partintro] -- diff --git a/src/asciidoc/web.adoc b/src/docs/asciidoc/web.adoc similarity index 62% rename from src/asciidoc/web.adoc rename to src/docs/asciidoc/web.adoc index 31139894ec..aa16c07e80 100644 --- a/src/asciidoc/web.adoc +++ b/src/docs/asciidoc/web.adoc @@ -1,5 +1,7 @@ [[spring-web]] = The Web +:doc-root: https://docs.spring.io +:api-spring-framework: {doc-root}/spring-framework/docs/{spring-version}/javadoc-api/org/springframework [partintro] -- @@ -20,14 +22,14 @@ The section then concludes with comprehensive coverage of the Spring Framework * <> -- -include::web-mvc.adoc[leveloffset=+1] +include::web/web-mvc.adoc[leveloffset=+1] -include::web-view.adoc[leveloffset=+1] +include::web/web-view.adoc[leveloffset=+1] -include::web-cors.adoc[leveloffset=+1] +include::web/web-cors.adoc[leveloffset=+1] -include::web-integration.adoc[leveloffset=+1] +include::web/web-integration.adoc[leveloffset=+1] -include::web-websocket.adoc[leveloffset=+1] +include::web/web-websocket.adoc[leveloffset=+1] -include::web-flux.adoc[leveloffset=+1] +include::web/web-flux.adoc[leveloffset=+1] diff --git a/src/asciidoc/web-cors.adoc b/src/docs/asciidoc/web/web-cors.adoc similarity index 100% rename from src/asciidoc/web-cors.adoc rename to src/docs/asciidoc/web/web-cors.adoc diff --git a/src/asciidoc/web-flux-functional.adoc b/src/docs/asciidoc/web/web-flux-functional.adoc similarity index 100% rename from src/asciidoc/web-flux-functional.adoc rename to src/docs/asciidoc/web/web-flux-functional.adoc diff --git a/src/asciidoc/web-flux.adoc b/src/docs/asciidoc/web/web-flux.adoc similarity index 100% rename from src/asciidoc/web-flux.adoc rename to src/docs/asciidoc/web/web-flux.adoc diff --git a/src/asciidoc/web-integration.adoc b/src/docs/asciidoc/web/web-integration.adoc similarity index 100% rename from src/asciidoc/web-integration.adoc rename to src/docs/asciidoc/web/web-integration.adoc diff --git a/src/asciidoc/web-mvc.adoc b/src/docs/asciidoc/web/web-mvc.adoc similarity index 99% rename from src/asciidoc/web-mvc.adoc rename to src/docs/asciidoc/web/web-mvc.adoc index e0bd555ab9..2e366db43a 100644 --- a/src/asciidoc/web-mvc.adoc +++ b/src/docs/asciidoc/web/web-mvc.adoc @@ -1,6 +1,6 @@ [[mvc]] = Web MVC framework - +:doc-spring-security: {doc-root}/spring-security/site/docs/current/reference [[mvc-introduction]] == Introduction to Spring Web MVC framework @@ -157,7 +157,7 @@ in the following diagram. The pattern-savvy reader will recognize that the pattern that Spring Web MVC shares with many other leading web frameworks). .The request processing workflow in Spring Web MVC (high level) -image::images/mvc.png[width=400] +image::images/mvc.png[] The `DispatcherServlet` is an actual `Servlet` (it inherits from the `HttpServlet` base class), and as such is declared in your web application. You need to map requests that @@ -226,7 +226,7 @@ instances. These inherited beans can be overridden in the servlet-specific scope, and you can define new scope-specific beans local to a given Servlet instance. .Typical context hierarchy in Spring Web MVC -image::images/mvc-context-hierarchy.png[width=400] +image::images/mvc-context-hierarchy.png[] Upon initialization of a `DispatcherServlet`, Spring MVC looks for a file named __[servlet-name]-servlet.xml__ in the `WEB-INF` directory of your web application and @@ -259,7 +259,7 @@ configuration file through a Servlet initialization parameter (see below for det It is also possible to have just one root context for single DispatcherServlet scenarios. .Single root context in Spring Web MVC -image::images/mvc-root-context.png[width=400] +image::images/mvc-root-context.png[] This can be configured by setting an empty contextConfigLocation servlet init parameter, as shown below: diff --git a/src/asciidoc/web-view.adoc b/src/docs/asciidoc/web/web-view.adoc similarity index 100% rename from src/asciidoc/web-view.adoc rename to src/docs/asciidoc/web/web-view.adoc diff --git a/src/asciidoc/web-websocket.adoc b/src/docs/asciidoc/web/web-websocket.adoc similarity index 99% rename from src/asciidoc/web-websocket.adoc rename to src/docs/asciidoc/web/web-websocket.adoc index 05aadcd3e5..ab65955828 100644 --- a/src/asciidoc/web-websocket.adoc +++ b/src/docs/asciidoc/web/web-websocket.adoc @@ -1,5 +1,8 @@ [[websocket]] = WebSocket Support +:doc-spring-security: {doc-root}/spring-security/site/docs/current/reference + + This part of the reference documentation covers Spring Framework's support for WebSocket-style messaging in web applications including use of STOMP as an application level WebSocket sub-protocol. @@ -1233,7 +1236,7 @@ The `@EnableWebSocketMessageBroker` Java config and the `