From fe6b75ee2a1d0920748037d1ec3b3804ae3c2777 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Mon, 11 Aug 2014 12:09:31 -0500 Subject: [PATCH] DATAREDIS-336 - Fine tune build process and formatting. Original pull request: #94. --- build.gradle | 30 +- .../appendix/appendix-command-reference.adoc | 1 + src/asciidoc/appendix/appendix-schema.adoc | 5 +- src/asciidoc/appendix/introduction.adoc | 3 +- src/asciidoc/index.adoc | 51 ++- .../introduction/getting-started.adoc | 3 +- src/asciidoc/preface.adoc | 2 +- src/asciidoc/reference/introduction.adoc | 1 + src/asciidoc/reference/redis.adoc | 81 ++-- src/main/resources/asciidoc/spring.css | 356 ++++++++++++++++++ 10 files changed, 482 insertions(+), 51 deletions(-) create mode 100644 src/main/resources/asciidoc/spring.css diff --git a/build.gradle b/build.gradle index 1a64fb03b..241b3d522 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,6 @@ buildscript { } dependencies { classpath 'org.springframework.build.gradle:bundlor-plugin:0.1.2' - classpath 'org.springframework.build.gradle:docbook-reference-plugin:0.2.4' classpath 'org.springframework.build.gradle:spring-io-plugin:0.0.3.RELEASE' classpath 'me.champeau.gradle:gradle-javadoc-hotfix-plugin:0.1' classpath('org.asciidoctor:asciidoctor-gradle-plugin:0.7.0') @@ -25,7 +24,6 @@ apply plugin: "java" apply plugin: 'eclipse' apply plugin: 'idea' apply from: "$rootDir/maven.gradle" -apply plugin: 'docbook-reference' apply plugin: 'bundlor' apply plugin: 'javadocHotfix' apply plugin: 'asciidoctor' @@ -52,19 +50,27 @@ configurations.all { } asciidoctor { + sourceDocumentName = new File("$sourceDir/index.adoc") + outputDir = new File("$buildDir/reference/htmlsingle") options = [ eruby: 'erubis', attributes: [ + linkcss: 'true', copycss : '', icons : 'font', 'source-highlighter': 'prettify', sectanchors : '', - toc2: '', + toc: '', + toclevels: '4', idprefix: '', idseparator: '-', doctype: 'book', numbered: '', - revnumber : project.version + version: project.version, + baseDir: "$sourceDir", + stylesheet: "spring.css", + resourcesDir: "$rootDir/src/main/resources", + referenceDir: "$sourceDir/reference" ] ] } @@ -177,11 +183,9 @@ task javadocJar(type: Jar) { from javadoc } -reference { - sourceDir = file('docs/src/reference/docbook') -} - task docsZip(type: Zip) { + dependsOn asciidoctor + group = 'Distribution' classifier = 'docs' description = "Builds -${classifier} archive containing api and reference for deployment" @@ -194,8 +198,14 @@ task docsZip(type: Zip) { into 'api' } - from (reference) { - into 'reference' + from (asciidoctor.outputDir) { + include "index.html" + into 'reference/htmlsingle' + } + + from ("src/main/resources/asciidoc") { + include "spring.css" + into "reference/htmlsingle" } } diff --git a/src/asciidoc/appendix/appendix-command-reference.adoc b/src/asciidoc/appendix/appendix-command-reference.adoc index a034e49ae..f864d6325 100644 --- a/src/asciidoc/appendix/appendix-command-reference.adoc +++ b/src/asciidoc/appendix/appendix-command-reference.adoc @@ -1,6 +1,7 @@ [[appendix:command-reference]] = Command Reference +.Redis commands supported by RedisTemplate. [width="50%",cols="<2,^1",options="header"] |========================================================= |Command |Template Support diff --git a/src/asciidoc/appendix/appendix-schema.adoc b/src/asciidoc/appendix/appendix-schema.adoc index d5f361924..fc83056fa 100644 --- a/src/asciidoc/appendix/appendix-schema.adoc +++ b/src/asciidoc/appendix/appendix-schema.adoc @@ -1,7 +1,10 @@ [[appendix:schema]] = Schema +:resourcesDir: ../../main/resources + +Core schema [source,xml] ------------------------------------------- -include::/src/main/resources/org/springframework/data/redis/config/spring-redis-1.0.xsd[] +include::{resourcesDir}/org/springframework/data/redis/config/spring-redis-1.0.xsd[] ------------------------------------------- diff --git a/src/asciidoc/appendix/introduction.adoc b/src/asciidoc/appendix/introduction.adoc index ca4b4dc63..d35bda708 100644 --- a/src/asciidoc/appendix/introduction.adoc +++ b/src/asciidoc/appendix/introduction.adoc @@ -1,6 +1,7 @@ +[float] = Document structure Various appendixes outside the reference documentation. -<> defines the schemas provided by Spring Data Redis. +<> defines the schemas provided by Spring Data Redis. diff --git a/src/asciidoc/index.adoc b/src/asciidoc/index.adoc index 7beb899f2..253c03ae2 100644 --- a/src/asciidoc/index.adoc +++ b/src/asciidoc/index.adoc @@ -1,23 +1,48 @@ [[spring-data-keyvalue-reference]] = Spring Data Redis +Costin Leau, Jennifer Hickey, Christoph Strobl, Thomas Darimont +:baseDir: . +:toc: +:spring-data-commons-docs: https://raw.githubusercontent.com/spring-projects/spring-data-commons/master/src/main/asciidoc -include::src/asciidoc/preface.adoc[] +{version} +(C) 2011-2014 The original authors + +NOTE: _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._ + +include::{baseDir}/preface.adoc[] + +:numbered: +:leveloffset: 0 [[introduction]] -== Introduction += Introduction -include::src/asciidoc/introduction/introduction.adoc[] -include::src/asciidoc/introduction/why-sdr.adoc[] -include::src/asciidoc/introduction/requirements.adoc[] -include::src/asciidoc/introduction/getting-started.adoc[] +:leveloffset: 2 +include::{baseDir}/introduction/introduction.adoc[] +include::{baseDir}/introduction/why-sdr.adoc[] +include::{baseDir}/introduction/requirements.adoc[] +include::{baseDir}/introduction/getting-started.adoc[] + +:leveloffset: 0 [[reference]] -== Reference Documentation += Reference Documentation -include::src/asciidoc/reference/introduction.adoc[] -include::src/asciidoc/reference/redis.adoc[] +:leveloffset: 1 +include::{baseDir}/reference/introduction.adoc[] +include::{baseDir}/reference/redis.adoc[] + +:leveloffset: 0 [[appendixes]] -== Appendixes += Appendixes -include::src/asciidoc/appendix/introduction.adoc[] -include::src/asciidoc/appendix/appendix-schema.adoc[] -include::src/asciidoc/appendix/appendix-command-reference.adoc[] +:numbered!: +:leveloffset: 1 + +include::{baseDir}/appendix/introduction.adoc[] + +[appendix] +include::{baseDir}/appendix/appendix-schema.adoc[] + +[appendix] +include::{baseDir}/appendix/appendix-command-reference.adoc[] diff --git a/src/asciidoc/introduction/getting-started.adoc b/src/asciidoc/introduction/getting-started.adoc index 248836521..17aa10ad9 100644 --- a/src/asciidoc/introduction/getting-started.adoc +++ b/src/asciidoc/introduction/getting-started.adoc @@ -43,7 +43,8 @@ Professional, from-the-source support, with guaranteed response time, is availab For information on the Spring Data source code repository, nightly builds and snapshot artifacts please see the Spring Data home http://spring.io/spring-data[page]. -You can help make Spring Data best serve the needs of the Spring community by interacting with developers on http://stackoverflow.com/questions/tagged/spring-data[Stackoverflow]. +You can help make Spring Data best serve the needs of the Spring community by interacting with developers on Stackoverflow at either +http://stackoverflow.com/questions/tagged/spring-data[spring-data] or http://stackoverflow.com/questions/tagged/spring-data-redis[spring-data-redis]. If you encounter a bug or want to suggest an improvement, please create a ticket on the Spring Data issue https://jira.springsource.org/browse/DATAREDIS[tracker]. diff --git a/src/asciidoc/preface.adoc b/src/asciidoc/preface.adoc index 1f0b063cd..f2adc26a8 100644 --- a/src/asciidoc/preface.adoc +++ b/src/asciidoc/preface.adoc @@ -1,4 +1,4 @@ -[[preface]] +[preface] = Preface The Spring Data Redis project applies core Spring concepts to the development of solutions using a key-value style data store. We provide a "template" as a high-level abstraction for sending and receiving messages. You will notice similarities to the JDBC support in the Spring Framework. diff --git a/src/asciidoc/reference/introduction.adoc b/src/asciidoc/reference/introduction.adoc index 709273181..66850eb5f 100644 --- a/src/asciidoc/reference/introduction.adoc +++ b/src/asciidoc/reference/introduction.adoc @@ -1,3 +1,4 @@ +[float] = Document structure This part of the reference documentation explains the core functionality offered by Spring Data Redis. diff --git a/src/asciidoc/reference/redis.adoc b/src/asciidoc/reference/redis.adoc index f2f87b72b..b5b77d50d 100644 --- a/src/asciidoc/reference/redis.adoc +++ b/src/asciidoc/reference/redis.adoc @@ -1,10 +1,13 @@ [[redis]] = Redis support +:referenceDir: . -One of the key value stores supported by Spring Data is http://redis.io[Redis]. To quote the project home page: [quote] +One of the key value stores supported by Spring Data is http://redis.io[Redis]. To quote the project home page: + +[quote] Redis is an advanced key-value store. It is similar to memcached but the dataset is not volatile, and values can be strings, exactly like in memcached, but also lists, sets, and ordered sets. All this data types can be manipulated with atomic operations to push/pop elements, add/remove elements, perform server side union, intersection, difference between sets, and so forth. Redis supports different kind of sorting abilities. - Spring Data Redis provides easy configuration and access to Redis from Spring applications. It offers both low-level and high-level abstractions for interacting with the store, freeing the user from infrastructural concerns. +Spring Data Redis provides easy configuration and access to Redis from Spring applications. It offers both low-level and high-level abstractions for interacting with the store, freeing the user from infrastructural concerns. [[redis:requirements]] == Redis Requirements @@ -181,20 +184,46 @@ Most users are likely to use `RedisTemplate` and its coresponding package `org.s Moreover, the template provides operations views (following the grouping from Redis command http://redis.io/commands[reference]) that offer rich, generified interfaces for working against a certain type or certain key (through the `KeyBound` interfaces) as described below: +.Operational views [width="80%",cols="<1,<2",options="header"] -|========================================================= -|Interface |Description -|ValueOperations |Redis string (or value) operations -|ListOperations |Redis list operations -|SetOperations |Redis set operations -|ZSetOperations |Redis zset (or sorted set) operations -|HashOperations |Redis hash operations -|BoundValueOperations |Redis string (or value) key bound operations -|BoundListOperations |Redis list key bound operations -|BoundSetOperations |Redis set key bound operations -|BoundZSetOperations |Redis zset (or sorted set) key bound operations -|BoundHashOperations |Redis hash key bound operations -|========================================================= +|==== +|Interface +|Description + +2+^|_Key Type Operations_ + +|ValueOperations +|Redis string (or value) operations + +|ListOperations +|Redis list operations + +|SetOperations +|Redis set operations + +|ZSetOperations +|Redis zset (or sorted set) operations + +|HashOperations +|Redis hash operations + +2+^|_Key Bound Operations_ + +|BoundValueOperations +|Redis string (or value) key bound operations + +|BoundListOperations +|Redis list key bound operations + +|BoundSetOperations +|Redis set key bound operations + +|BoundZSetOperations +|Redis zset (or sorted set) key bound operations + +|BoundHashOperations +|Redis hash key bound operations +|==== Once configured, the template is thread-safe and can be reused across multiple instances. @@ -289,23 +318,27 @@ public void useCallback() { From the framework perspective, the data stored in Redis is just bytes. While Redis itself supports various types, for the most part these refer to the way the data is stored rather then what it represents. It is up to the user to decide whether the information gets translated into Strings or any other objects. The conversion between the user (custom) types and raw data (and vice-versa) is handled in Spring Data Redis through the `RedisSerializer` interface (package `org.springframework.data.redis.serializer`) which as the name implies, takes care of the serialization process. Multiple implementations are available out of the box, two of which have been already mentioned before in this documentation: the `StringRedisSerializer` and the `JdkSerializationRedisSerializer`. However one can use `OxmSerializer` for Object/XML mapping through Spring 3 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/oxm.html[OXM] support or either `JacksonJsonRedisSerializer` or `Jackson2JsonRedisSerializer` for storing data in http://en.wikipedia.org/wiki/JSON[JSON] format. Do note that the storage format is not limited only to values - it can be used for keys, values or hashes without any restrictions. -include::./redis-messaging.adoc[] +:leveloffset: 2 +include::{referenceDir}/redis-messaging.adoc[] -include::./redis-transactions.adoc[] +include::{referenceDir}/redis-transactions.adoc[] -include::./pipelining.adoc[] +include::{referenceDir}/pipelining.adoc[] -include::./redis-scripting.adoc[] +include::{referenceDir}/redis-scripting.adoc[] +:leveloffset: 1 [[redis:support]] == Support Classes -Package `org.springframework.data.redis.support` offers various reusable components that rely on Redis as a backing store. Curently the package contains various JDK-based interface implementations on top of Redis such as http://download.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/package-summary.html[atomic] counters and JDK ` - Ulink (Section qName:ulink level:5, chunks:[Collections] attrs:[url:http://download.oracle.com/javase/6/docs/api/java/util/Collection.html]) - `. +Package `org.springframework.data.redis.support` offers various reusable components that rely on Redis as a backing store. Currently the package contains various JDK-based +interface implementations on top of Redis such as http://download.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/package-summary.html[atomic] counters and JDK +http://download.oracle.com/javase/6/docs/api/java/util/Collection.html[Collections]. -The atomic counters make it easy to wrap Redis key incrementation while the collections allow easy management of Redis keys with minimal storage exposure or API leakage: in particular the `RedisSet` and `RedisZSet` interfaces offer easy access to the *set* operations supported by Redis such as `intersection` and `union` while `RedisList` implements the `List`, `Queue` and `Deque` contracts (and their equivalent blocking siblings) on top of Redis, exposing the storage as a *FIFO (First-In-First-Out)*, *LIFO - (Last-In-First-Out)* or *capped collection* with minimal configuration: +The atomic counters make it easy to wrap Redis key incrementation while the collections allow easy management of Redis keys with minimal storage exposure or API +leakage: in particular the `RedisSet` and `RedisZSet` interfaces offer easy access to the *set* operations supported by Redis such as `intersection` and `union` +while `RedisList` implements the `List`, `Queue` and `Deque` contracts (and their equivalent blocking siblings) on top of Redis, exposing the storage as a +_FIFO (First-In-First-Out)_, _LIFO (Last-In-First-Out)_ or _capped collection_ with minimal configuration: [source,xml] ---- diff --git a/src/main/resources/asciidoc/spring.css b/src/main/resources/asciidoc/spring.css new file mode 100644 index 000000000..149836248 --- /dev/null +++ b/src/main/resources/asciidoc/spring.css @@ -0,0 +1,356 @@ +/* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */ +article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; } +audio, canvas, video { display: inline-block; } +audio:not([controls]) { display: none; height: 0; } +[hidden] { display: none; } +html { background: #fff; color: #000; font-family: sans-serif; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; } +body { margin: 0; } +a:focus { outline: thin dotted; } +a:active, a:hover { outline: 0; } +h1 { font-size: 2em; margin: 0.67em 0; } +abbr[title] { border-bottom: 1px dotted; } +b, strong { font-weight: bold; } +dfn { font-style: italic; } +hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; } +mark { background: #ff0; color: #000; } +code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; } +pre { white-space: pre-wrap; } +q { quotes: "\201C" "\201D" "\2018" "\2019"; } +small { font-size: 80%; } +sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } +sup { top: -0.5em; } +sub { bottom: -0.25em; } +img { border: 0; } +svg:not(:root) { overflow: hidden; } +figure { margin: 0; } +fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } +legend { border: 0; padding: 0; } +button, input, select, textarea { font-family: inherit; font-size: 100%; margin: 0; } +button, input { line-height: normal; } +button, select { text-transform: none; } +button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; cursor: pointer; } +button[disabled], html input[disabled] { cursor: default; } +input[type="checkbox"], input[type="radio"] { box-sizing: border-box; padding: 0; } +input[type="search"] { -webkit-appearance: textfield; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; } +input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } +button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } +textarea { overflow: auto; vertical-align: top; } +table { border-collapse: collapse; border-spacing: 0; } +*, *: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: #222222; padding: 0; margin: 0; font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; font-weight: normal; font-style: normal; line-height: 1; position: relative; cursor: auto; } +a:hover { cursor: pointer; } +a:focus { outline: none; } +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, body { -webkit-font-smoothing: antialiased; } +img { display: inline-block; vertical-align: middle; } +textarea { height: auto; min-height: 50px; } +select { width: 100%; } +p.lead, .paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { font-size: 1.21875em; line-height: 1.6; } +.subheader, #content #toctitle, .admonitionblock td.content > .title, .exampleblock > .title, .imageblock > .title, .videoblock > .title, .listingblock > .title, .literalblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, .sidebarblock > .title, .tableblock > .title, .verseblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title, .tableblock > caption { line-height: 1.4; color: #7a2518; font-weight: 300; margin-top: 0.2em; margin-bottom: 0.5em; } +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; } +a { color: #060; text-decoration: underline; line-height: inherit; } +a:hover, a:focus { color: #040; } +a img { border: none; } +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; } +h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { font-family: Georgia, "URW Bookman L", Helvetica, Arial, sans-serif; font-weight: normal; font-style: normal; color: #ba3925; text-rendering: optimizeLegibility; margin-top: 1em; margin-bottom: 0.5em; line-height: 1.2125em; } +h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > .title small, h4 small, h5 small, h6 small { font-size: 60%; color: #e99b8f; 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 #dddddd; border-width: 1px 0 0; clear: both; margin: 1.25em 0 1.1875em; height: 0; } +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: Consolas, "Liberation Mono", Courier, monospace; font-weight: normal; color: #060; } +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 li ul, ul li ol { margin-left: 1.25em; margin-bottom: 0; font-size: 1em; } +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; } +ol li ul, ol li ol { margin-left: 1.25em; margin-bottom: 0; } +dl dt { margin-bottom: 0.3125em; font-weight: bold; } +dl dd { margin-bottom: 1.25em; } +abbr, acronym { text-transform: uppercase; font-size: 90%; color: #222222; border-bottom: 1px dotted #dddddd; cursor: help; } +abbr { text-transform: none; } +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: inherit; color: #555555; } +blockquote cite:before { content: "\2014 \0020"; } +blockquote cite a, blockquote cite a:visited { color: #555555; } +blockquote, blockquote p { line-height: 1.6; color: #6f6f6f; } +.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.4; } + h1 { font-size: 2.75em; } + h2 { font-size: 2.3125em; } + h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.6875em; } + h4 { font-size: 1.4375em; } } +.print-only { display: none !important; } +@media print { * { background: transparent !important; color: #000 !important; box-shadow: none !important; text-shadow: none !important; } + a, a:visited { text-decoration: underline; } + a[href]:after { content: " (" attr(href) ")"; } + abbr[title]:after { content: " (" attr(title) ")"; } + .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } + pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } + thead { display: table-header-group; } + tr, img { page-break-inside: avoid; } + img { max-width: 100% !important; } + @page { margin: 0.5cm; } + p, h2, h3, #toctitle, .sidebarblock > .content > .title { orphans: 3; widows: 3; } + h2, h3, #toctitle, .sidebarblock > .content > .title { page-break-after: avoid; } + .hide-on-print { display: none !important; } + .print-only { display: block !important; } + .hide-for-print { display: none !important; } + .show-for-print { display: inherit !important; } } +table { background: white; margin-bottom: 1.25em; border: solid 1px #dddddd; } +table thead, table tfoot { background: whitesmoke; 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: #222222; text-align: left; } +table tr th, table tr td { padding: 0.5625em 0.625em; font-size: inherit; color: #222222; } +table tr.even, table tr.alt, table tr:nth-of-type(even) { background: #f9f9f9; } +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; } +.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; padding: 1px 3px 0; white-space: nowrap; background-color: #f2f2f2; border: 1px solid #cccccc; -webkit-border-radius: 4px; border-radius: 4px; text-shadow: none; } +pre, pre > code { line-height: 1.4; color: inherit; font-family: Consolas, "Liberation Mono", Courier, monospace; font-weight: normal; } +kbd.keyseq { color: #555555; } +kbd:not(.keyseq) { display: inline-block; color: #222222; font-size: 0.75em; line-height: 1.4; 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 2px white inset; box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px white inset; margin: -0.15em 0.15em 0 0.15em; padding: 0.2em 0.6em 0.2em 0.5em; vertical-align: middle; white-space: nowrap; } +kbd kbd:first-child { margin-left: 0; } +kbd kbd:last-child { margin-right: 0; } +.menuseq, .menu { color: #090909; } +p a > code:hover { color: #561309; } +#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; } +#header { margin-bottom: 2.5em; } +#header > h1 { color: black; font-weight: normal; border-bottom: 1px solid #dddddd; margin-bottom: -28px; padding-bottom: 32px; } +#header span { color: #6f6f6f; } +#header #revnumber { text-transform: capitalize; } +#header br { display: none; } +#header br + span { padding-left: 3px; } +#header br + span:before { content: "\2013 \0020"; } +#header br + span.author { padding-left: 0; } +#header br + span.author:before { content: ", "; } +#toc { border-bottom: 3px double #ebebeb; padding-bottom: 1.25em; } +#toc > ul { margin-left: 0.25em; } +#toc ul.sectlevel0 > li > a { font-style: italic; } +#toc ul.sectlevel0 ul.sectlevel1 { margin-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; } +#toc ul { list-style-type: none; } +#toctitle { color: #7a2518; } +@media only screen and (min-width: 1280px) { body.toc2 { padding-left: 20em; } + #toc.toc2 { position: fixed; width: 20em; left: 0; top: 0; border-right: 1px solid #ebebeb; border-bottom: 0; z-index: 1000; padding: 1em; height: 100%; overflow: auto; } + #toc.toc2 #toctitle { margin-top: 0; } + #toc.toc2 > ul { font-size: .95em; } + #toc.toc2 ul ul { margin-left: 0; padding-left: 1.25em; } + #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: 20em; } + body.toc2.toc-right #toc.toc2 { border-right: 0; border-left: 1px solid #ebebeb; left: auto; right: 0; } } +#content #toc { border-style: solid; border-width: 1px; border-color: #d9d9d9; margin-bottom: 1.25em; padding: 1.25em; background: #f2f2f2; border-width: 0; -webkit-border-radius: 4px; border-radius: 4px; } +#content #toc > :first-child { margin-top: 0; } +#content #toc > :last-child { margin-bottom: 0; } +#content #toc a { text-decoration: none; } +#content #toctitle { font-weight: bold; font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; font-size: 1em; padding-left: 0.125em; } +#footer { max-width: 100%; background-color: #222222; padding: 1.25em; } +#footer-text { color: #dddddd; line-height: 1.44; } +.sect1 { padding-bottom: 1.25em; } +.sect1 + .sect1 { border-top: 3px double #ebebeb; } +#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; width: 1em; margin-left: -1em; display: block; text-decoration: none; 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: .85em; vertical-align: text-top; display: block; margin-top: 0.05em; } +#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: #ba3925; 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: #a53221; } +.imageblock, .literalblock, .listingblock, .verseblock, .videoblock { margin-bottom: 1.25em; } +.admonitionblock td.content > .title, .exampleblock > .title, .imageblock > .title, .videoblock > .title, .listingblock > .title, .literalblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, .sidebarblock > .title, .tableblock > .title, .verseblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { text-align: left; font-weight: bold; } +.tableblock > caption { text-align: left; font-weight: bold; white-space: nowrap; overflow: visible; max-width: 0; } +table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p { font-size: inherit; } +.admonitionblock > table { border: 0; background: none; width: 100%; } +.admonitionblock > table td.icon { text-align: center; width: 80px; } +.admonitionblock > table td.icon img { max-width: none; } +.admonitionblock > table td.icon .title { font-weight: bold; text-transform: uppercase; } +.admonitionblock > table td.content { padding-left: 1.125em; padding-right: 1.25em; border-left: 1px solid #dddddd; color: #6f6f6f; } +.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; } +.exampleblock > .content h1, .exampleblock > .content h2, .exampleblock > .content h3, .exampleblock > .content #toctitle, .sidebarblock.exampleblock > .content > .title, .exampleblock > .content h4, .exampleblock > .content h5, .exampleblock > .content h6, .exampleblock > .content p { color: #333333; } +.exampleblock > .content h1, .exampleblock > .content h2, .exampleblock > .content h3, .exampleblock > .content #toctitle, .sidebarblock.exampleblock > .content > .title, .exampleblock > .content h4, .exampleblock > .content h5, .exampleblock > .content h6 { line-height: 1; margin-bottom: 0.625em; } +.exampleblock > .content h1.subheader, .exampleblock > .content h2.subheader, .exampleblock > .content h3.subheader, .exampleblock > .content .subheader#toctitle, .sidebarblock.exampleblock > .content > .subheader.title, .exampleblock > .content h4.subheader, .exampleblock > .content h5.subheader, .exampleblock > .content h6.subheader { line-height: 1.4; } +.exampleblock.result > .content { -webkit-box-shadow: 0 1px 8px #d9d9d9; box-shadow: 0 1px 8px #d9d9d9; } +.sidebarblock { border-style: solid; border-width: 1px; border-color: #d9d9d9; margin-bottom: 1.25em; padding: 1.25em; background: #f2f2f2; -webkit-border-radius: 4px; border-radius: 4px; } +.sidebarblock > :first-child { margin-top: 0; } +.sidebarblock > :last-child { margin-bottom: 0; } +.sidebarblock h1, .sidebarblock h2, .sidebarblock h3, .sidebarblock #toctitle, .sidebarblock > .content > .title, .sidebarblock h4, .sidebarblock h5, .sidebarblock h6, .sidebarblock p { color: #333333; } +.sidebarblock h1, .sidebarblock h2, .sidebarblock h3, .sidebarblock #toctitle, .sidebarblock > .content > .title, .sidebarblock h4, .sidebarblock h5, .sidebarblock h6 { line-height: 1; margin-bottom: 0.625em; } +.sidebarblock h1.subheader, .sidebarblock h2.subheader, .sidebarblock h3.subheader, .sidebarblock .subheader#toctitle, .sidebarblock > .content > .subheader.title, .sidebarblock h4.subheader, .sidebarblock h5.subheader, .sidebarblock h6.subheader { line-height: 1.4; } +.sidebarblock > .content > .title { color: #7a2518; margin-top: 0; line-height: 1.6; } +.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 > .content pre, .listingblock > .content pre { background: none; border-width: 1px 0; border-style: dotted; border-color: #bfbfbf; -webkit-border-radius: 4px; border-radius: 4px; padding: 0.75em 0.75em 0.5em 0.75em; word-wrap: break-word; } +.literalblock > .content pre.nowrap, .listingblock > .content pre.nowrap { overflow-x: auto; white-space: pre; word-wrap: normal; } +.literalblock > .content pre > code, .listingblock > .content pre > code { display: block; } +@media only screen { .literalblock > .content pre, .listingblock > .content pre { font-size: 0.8em; } } +@media only screen and (min-width: 768px) { .literalblock > .content pre, .listingblock > .content pre { font-size: 0.9em; } } +@media only screen and (min-width: 1280px) { .literalblock > .content pre, .listingblock > .content pre { font-size: 1em; } } +.listingblock > .content { position: relative; } +.listingblock:hover code[class*=" language-"]:before { text-transform: uppercase; font-size: 0.9em; color: #999; position: absolute; top: 0.375em; right: 0.375em; } +.listingblock:hover code.asciidoc:before { content: "asciidoc"; } +.listingblock:hover code.clojure:before { content: "clojure"; } +.listingblock:hover code.css:before { content: "css"; } +.listingblock:hover code.groovy:before { content: "groovy"; } +.listingblock:hover code.html:before { content: "html"; } +.listingblock:hover code.java:before { content: "java"; } +.listingblock:hover code.javascript:before { content: "javascript"; } +.listingblock:hover code.python:before { content: "python"; } +.listingblock:hover code.ruby:before { content: "ruby"; } +.listingblock:hover code.scss:before { content: "scss"; } +.listingblock:hover code.xml:before { content: "xml"; } +.listingblock:hover code.yaml:before { content: "yaml"; } +.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: 0; margin-bottom: 0; } +table.pyhltable td { vertical-align: top; padding-top: 0; padding-bottom: 0; } +table.pyhltable td.code { padding-left: .75em; padding-right: 0; } +.highlight.pygments .lineno, table.pyhltable td:not(.code) { color: #999; padding-left: 0; padding-right: .5em; border-right: 1px solid #dddddd; } +.highlight.pygments .lineno { display: inline-block; margin-right: .25em; } +table.pyhltable .linenodiv { background-color: transparent !important; padding-right: 0 !important; } +.quoteblock { margin: 0 0 1.25em; padding: 0.5625em 1.25em 0 1.1875em; border-left: 1px solid #dddddd; } +.quoteblock blockquote { margin: 0 0 1.25em 0; padding: 0 0 0.5625em 0; border: 0; } +.quoteblock blockquote > .paragraph:last-child p { margin-bottom: 0; } +.quoteblock .attribution { margin-top: -.25em; padding-bottom: 0.5625em; font-size: inherit; color: #555555; } +.quoteblock .attribution br { display: none; } +.quoteblock .attribution cite { display: block; margin-bottom: 0.625em; } +table thead th, table tfoot th { font-weight: bold; } +table.tableblock.grid-all { border-collapse: separate; border-spacing: 1px; -webkit-border-radius: 4px; border-radius: 4px; border-top: 1px solid #dddddd; border-bottom: 1px solid #dddddd; } +table.tableblock.frame-topbot, table.tableblock.frame-none { border-left: 0; border-right: 0; } +table.tableblock.frame-sides, table.tableblock.frame-none { border-top: 0; border-bottom: 0; } +table.tableblock td .paragraph:last-child p, table.tableblock td > p:last-child { margin-bottom: 0; } +th.tableblock.halign-left, td.tableblock.halign-left { text-align: left; } +th.tableblock.halign-right, td.tableblock.halign-right { text-align: right; } +th.tableblock.halign-center, td.tableblock.halign-center { text-align: center; } +th.tableblock.valign-top, td.tableblock.valign-top { vertical-align: top; } +th.tableblock.valign-bottom, td.tableblock.valign-bottom { vertical-align: bottom; } +th.tableblock.valign-middle, td.tableblock.valign-middle { vertical-align: middle; } +p.tableblock.header { color: #222222; font-weight: bold; } +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 > i[class^="icon-check"]:first-child, ul.checklist li > p:first-child > input[type="checkbox"]:first-child { margin-right: 0.25em; } +ul.checklist li > p:first-child > input[type="checkbox"]:first-child { 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 { padding-right: .8em; font-weight: bold; } +td.hdlist1, td.hdlist2 { vertical-align: top; } +.literalblock + .colist, .listingblock + .colist { margin-top: -0.5em; } +.colist > table tr > td:first-of-type { padding: 0 .8em; line-height: 1; } +.colist > table tr > td:last-of-type { padding: 0.25em 0; } +.qanda > ol > li > p > em:only-child { color: #00467f; } +.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; } +span.footnote, span.footnoteref { vertical-align: super; font-size: 0.875em; } +span.footnote a, span.footnoteref a { text-decoration: none; } +#footnotes { padding-top: 0.75em; padding-bottom: 0.75em; margin-bottom: 0.625em; } +#footnotes hr { width: 20%; min-width: 6.25em; margin: -.25em 0 .75em 0; border-width: 1px 0 0 0; } +#footnotes .footnote { padding: 0 0.375em; line-height: 1.3; font-size: 0.875em; margin-left: 1.2em; text-indent: -1.2em; margin-bottom: .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: none; 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 > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } +.admonitionblock td.icon [class^="icon-"]:before { 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: #005498; color: #003f72; } +.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 { display: inline-block; color: white !important; background-color: #222222; -webkit-border-radius: 100px; border-radius: 100px; text-align: center; width: 20px; height: 20px; font-size: 12px; font-weight: bold; line-height: 20px; font-family: Arial, sans-serif; font-style: normal; position: relative; top: -2px; letter-spacing: -1px; } +.conum * { color: white !important; } +.conum + b { display: none; } +.conum:after { content: attr(data-value); } +.conum:not([data-value]):empty { display: none; } +.literalblock > .content > pre, .listingblock > .content > pre { -webkit-border-radius: 0; border-radius: 0; } + +/** Spring IO customizations **/ + +h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { color: #060; } +.subheader, #content #toctitle, .admonitionblock td.content > .title, .exampleblock > .title, .imageblock > .title, .videoblock > .title, .listingblock > .title, .literalblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, .sidebarblock > .title, .tableblock > .title, .verseblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title, .tableblock > caption { color: #080; } \ No newline at end of file