浏览代码

Build updates to include uploading of distro and docs, plus addition of admon graphics path to docbook plugin.

Luke Taylor 15 年之前
父节点
当前提交
dbf673ec37
共有 4 个文件被更改,包括 506 次插入436 次删除
  1. 2 1
      .gitignore
  2. 82 11
      build.gradle
  3. 3 3
      docs/manual/manual.gradle
  4. 419 421
      docs/manual/src/xsl/pdf-custom.xsl

+ 2 - 1
.gitignore

@@ -4,4 +4,5 @@ target/
 .settings/
 build/
 *.log
-.gradle/
+.gradle/
+gradle.properties

+ 82 - 11
build.gradle

@@ -6,12 +6,14 @@ apply id: 'base'
 allprojects {
     version = '3.0.2.CI-SNAPSHOT'
     releaseBuild = version.endsWith('RELEASE')
+    snapshotBuild = version.endsWith('SNAPSHOT')
+
     group = 'org.springframework.security'
 
     repositories {
         mavenRepo name:'Local', urls:'file:///Users/luke/.m2/repository'
         mavenCentral()
-        mavenRepo name:'SpringSource Milestone Repo', urls:'http://repository.springsource.com/maven/bundles/milestone'
+//        mavenRepo name:'SpringSource Milestone Repo', urls:'http://repository.springsource.com/maven/bundles/milestone'
     }
 }
 
@@ -121,6 +123,20 @@ configure(javaProjects()) {
     conf2ScopeMappings.addMapping(1, configurations.provided, "provided")
 }
 
+repositories {
+    // Required for ant s3 task
+    mavenRepo name: "s2.com release", urls: "http://repository.springsource.com/maven/bundles/release"
+}
+
+configurations {
+    antlibs
+}
+
+dependencies {
+    antlibs "org.springframework.build:org.springframework.build.aws.ant:3.0.3.RELEASE",
+            "net.java.dev.jets3t:jets3t:0.6.1"
+}
+
 task apidocs(type: Javadoc) {
     destinationDir = new File(buildDir, 'apidocs')
     optionsFile = file("$buildDir/tmp/javadoc.options")
@@ -133,25 +149,69 @@ task apidocs(type: Javadoc) {
         project.sourceSets.main.compileClasspath })
 }
 
-task dist (type: Zip) {
-    def docsDir = new File(project(':manual').buildDir, 'docs')
-    into('docs/apidocs') {
+task apitar(type: Tar, dependsOn: apidocs) {
+    compression = Compression.BZIP2
+    classifier = 'apidocs'
+    into('apidocs') {
         from apidocs.destinationDir
     }
-    into('docs/reference') {
-        from docsDir
-    }
-    into('dist') {
-        from coreModuleProjects().collect { project -> project.libsDir }
+}
+
+task login << {
+    ant.input("Please enter the ssh username for host '$sshHost'", addproperty: "ssh.username")
+    ant.input("Please enter the ssh password '$sshHost'", addproperty: "ssh.password")
+    def username = ant.properties['ssh.username']
+    def password = ant.properties['ssh.password']
+}
+
+task uploadApidocs (dependsOn: login) << {
+    ant.scp(file: apitar.archivePath, todir: "${login.username}@$sshHost:$remoteDocsDir", password: password)
+    ant.sshexec(host: sshHost, username: login.username, password: login.password, command: "cd $remoteDocsDir && tar -xjf ${apitar.archiveName}")
+    ant.sshexec(host: sshHost, username: login.username, password: login.password, command: "rm $remoteDocsDir/${apitar.archiveName}")
+}
+
+task dist (type: Zip) {
+    def docsDir = new File(project(':manual').buildDir, 'docs')
+    def zipRootDir = "${project.name}-$version"
+    into (zipRootDir) {
+        into('docs/apidocs') {
+            from apidocs.destinationDir
+        }
+        into('docs/reference') {
+            from docsDir
+        }
+        into('dist') {
+            from coreModuleProjects().collect { project -> project.libsDir }
+            from project(':spring-security-samples-tutorial').libsDir
+            from project(':spring-security-samples-contacts').libsDir
+        }
     }
 }
 
+dist.dependsOn apidocs, ':manual:doc'
+dist.dependsOn subprojects.collect { "$it.path:assemble" }
+
 dist.doLast {
     ant.checksum(file: archivePath, algorithm: 'SHA1', fileext: '.sha1')
 }
 
-dist.dependsOn apidocs, ':manual:doc'
-dist.dependsOn subprojects.collect { "$it.path:assemble" }
+task uploadDist << {
+    def shaFile = file("${dist.archivePath}.sha1")
+    assert dist.archivePath.isFile()
+    assert shaFile.isFile()
+    ant.taskdef(resource: 'org/springframework/build/aws/ant/antlib.xml', classpath: configurations.antlibs.asPath)
+    ant.s3(accessKey: s3AccessKey, secretKey: s3SecretAccessKey) {
+        upload(bucketName: 'dist.springframework.org', file: dist.archivePath,
+                toFile: releaseType() + "/SEC/${dist.archiveName}", publicRead: 'true') {
+            metadata(name: 'project.name', value: 'Spring Security')
+            metadata(name: 'release.type', value: releaseType())
+            metadata(name: 'bundle.version', value: version)
+            metadata(name: 'package.file.name', value: dist.archiveName)
+        }
+        upload(bucketName: 'dist.springframework.org', file: shaFile,
+                toFile: releaseType() + "/SEC/${dist.archiveName}.sha1", publicRead: 'true')
+    }
+}
 
 def javaProjects() {
     subprojects.findAll { project -> project.name != 'faq' && project.name != 'manual' }
@@ -164,3 +224,14 @@ def sampleProjects() {
 def coreModuleProjects() {
     javaProjects() - sampleProjects()
 }
+
+def releaseType() {
+    if (releaseBuild) {
+        'release'
+    } else if (snapshotBuild) {
+        'snapshot'
+    } else {
+        'milestone'
+    }
+}
+

+ 3 - 3
docs/manual/manual.gradle

@@ -4,14 +4,14 @@ apply id: 'docbook'
 docbookSrcFileName = 'springsecurity.xml'
 docbookHtml.stylesheet = new File(projectDir, 'src/xsl/html-custom.xsl')
 docbookFoPdf.stylesheet = new File(projectDir, 'src/xsl/pdf-custom.xsl')
+def imagesDir = new File(projectDir, 'src/docbook/images');
+docbookFoPdf.admonGraphicsPath = "${imagesDir}/"
 
 task doc (dependsOn: [docbookHtml, docbookFoPdf]) << {
     resourcesDir = new File(projectDir, 'src/resources')
     ant {
         docsDir = new File(buildDir, 'docs')
         copy(toDir: docsDir) {fileset(dir: resourcesDir)}
-        copy(toDir: new File(docsDir, 'images')) {fileset(dir: new File(projectDir, 'src/docbook/images'))}
-        // TODO: Add this to the plugin
-        delete { fileset(dir: docsDir, includes: "*.fo")}
+        copy(toDir: new File(docsDir, 'images')) {fileset(dir: imagesDir)}
     }
 }

+ 419 - 421
docs/manual/src/xsl/pdf-custom.xsl

@@ -20,482 +20,480 @@
 -->
 
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-				xmlns:fo="http://www.w3.org/1999/XSL/Format"
-				xmlns:xslthl="http://xslthl.sf.net"
-				exclude-result-prefixes="xslthl"
-				version='1.0'>
-	<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/>
-	<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/highlight.xsl"/>
-
-	<xsl:param name="admon.graphics">'1'</xsl:param>
-	<xsl:param name="admon.graphics.path">src/docbook/images/</xsl:param>
-	<!-- xsl:param name="draft.watermark.image" select="'images/draft.png'"/ -->
-	<xsl:param name="paper.type" select="'A4'"/>
-
-	<xsl:param name="page.margin.top" select="'1cm'"/>
-	<xsl:param name="region.before.extent" select="'1cm'"/>
-	<xsl:param name="body.margin.top" select="'1.5cm'"/>
-
-	<xsl:param name="body.margin.bottom" select="'1.5cm'"/>
-	<xsl:param name="region.after.extent" select="'1cm'"/>
-	<xsl:param name="page.margin.bottom" select="'1cm'"/>
-	<xsl:param name="title.margin.left" select="'0cm'"/>
+                xmlns:fo="http://www.w3.org/1999/XSL/Format"
+                xmlns:xslthl="http://xslthl.sf.net"
+                exclude-result-prefixes="xslthl"
+                version='1.0'>
+    <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/>
+    <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/highlight.xsl"/>
+
+    <!-- xsl:param name="draft.watermark.image" select="'images/draft.png'"/ -->
+    <xsl:param name="paper.type" select="'A4'"/>
+
+    <xsl:param name="page.margin.top" select="'1cm'"/>
+    <xsl:param name="region.before.extent" select="'1cm'"/>
+    <xsl:param name="body.margin.top" select="'1.5cm'"/>
+
+    <xsl:param name="body.margin.bottom" select="'1.5cm'"/>
+    <xsl:param name="region.after.extent" select="'1cm'"/>
+    <xsl:param name="page.margin.bottom" select="'1cm'"/>
+    <xsl:param name="title.margin.left" select="'0cm'"/>
 
 <!--###################################################
-		Header
-	################################################### -->
+        Header
+    ################################################### -->
 
 <!-- More space in the center header for long text -->
-	<xsl:attribute-set name="header.content.properties">
-		<xsl:attribute name="font-family">
-			<xsl:value-of select="$body.font.family"/>
-		</xsl:attribute>
-		<xsl:attribute name="margin-left">-5em</xsl:attribute>
-		<xsl:attribute name="margin-right">-5em</xsl:attribute>
-	</xsl:attribute-set>
+    <xsl:attribute-set name="header.content.properties">
+        <xsl:attribute name="font-family">
+            <xsl:value-of select="$body.font.family"/>
+        </xsl:attribute>
+        <xsl:attribute name="margin-left">-5em</xsl:attribute>
+        <xsl:attribute name="margin-right">-5em</xsl:attribute>
+    </xsl:attribute-set>
 
 <!--###################################################
-		Table of Contents
-	################################################### -->
+        Table of Contents
+    ################################################### -->
 
-	<xsl:param name="generate.toc">
-		book      toc,title
-	</xsl:param>
+    <xsl:param name="generate.toc">
+        book      toc,title
+    </xsl:param>
 
 <!--###################################################
-		Custom Header
-	################################################### -->
-
-	<xsl:template name="header.content">
-		<xsl:param name="pageclass" select="''"/>
-		<xsl:param name="sequence" select="''"/>
-		<xsl:param name="position" select="''"/>
-		<xsl:param name="gentext-key" select="''"/>
-
-		<xsl:variable name="Version">
-			<xsl:choose>
-				<xsl:when test="//productname">
-					<xsl:value-of select="//productname"/><xsl:text> </xsl:text>
-				</xsl:when>
-				<xsl:otherwise>
-					<xsl:text>please define productname in your docbook file!</xsl:text>
-				</xsl:otherwise>
-			</xsl:choose>
-		</xsl:variable>
-
-		<xsl:choose>
-			<xsl:when test="$sequence='blank'">
-				<xsl:choose>
-					<xsl:when test="$position='center'">
-						<xsl:value-of select="$Version"/>
-					</xsl:when>
-					
-					<xsl:otherwise>
-					</xsl:otherwise>
-				</xsl:choose>
-			</xsl:when>
-
-			<xsl:when test="$pageclass='titlepage'">
-			</xsl:when>
-
-			<xsl:when test="$position='center'">
-				<xsl:value-of select="$Version"/>
-			</xsl:when>
-
-			<xsl:otherwise>
-			</xsl:otherwise>
-		</xsl:choose>
-	</xsl:template>
+        Custom Header
+    ################################################### -->
+
+    <xsl:template name="header.content">
+        <xsl:param name="pageclass" select="''"/>
+        <xsl:param name="sequence" select="''"/>
+        <xsl:param name="position" select="''"/>
+        <xsl:param name="gentext-key" select="''"/>
+
+        <xsl:variable name="Version">
+            <xsl:choose>
+                <xsl:when test="//productname">
+                    <xsl:value-of select="//productname"/><xsl:text> </xsl:text>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:text>please define productname in your docbook file!</xsl:text>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:variable>
+
+        <xsl:choose>
+            <xsl:when test="$sequence='blank'">
+                <xsl:choose>
+                    <xsl:when test="$position='center'">
+                        <xsl:value-of select="$Version"/>
+                    </xsl:when>
+
+                    <xsl:otherwise>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:when>
+
+            <xsl:when test="$pageclass='titlepage'">
+            </xsl:when>
+
+            <xsl:when test="$position='center'">
+                <xsl:value-of select="$Version"/>
+            </xsl:when>
+
+            <xsl:otherwise>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
 
 <!--###################################################
-		Custom Footer
-	################################################### -->
-
-	<xsl:template name="footer.content">
-		<xsl:param name="pageclass" select="''"/>
-		<xsl:param name="sequence" select="''"/>
-		<xsl:param name="position" select="''"/>
-		<xsl:param name="gentext-key" select="''"/>
-
-		<xsl:variable name="Version">
-			<xsl:choose>
-				<xsl:when test="//releaseinfo">
-					<xsl:value-of select="//releaseinfo"/>
-				</xsl:when>
-				<xsl:otherwise>
-				</xsl:otherwise>
-			</xsl:choose>
-		</xsl:variable>
-
-		<xsl:variable name="Title">
-			<xsl:value-of select="//title"/>
-		</xsl:variable>
-
-		<xsl:choose>
-			<xsl:when test="$sequence='blank'">
-				<xsl:choose>
-					<xsl:when test="$double.sided != 0 and $position = 'left'">
-						<xsl:value-of select="$Version"/>
-					</xsl:when>
-
-					<xsl:when test="$double.sided = 0 and $position = 'center'">
-					</xsl:when>
-
-					<xsl:otherwise>
-						<fo:page-number/>
-					</xsl:otherwise>
-				</xsl:choose>
-			</xsl:when>
-
-			<xsl:when test="$pageclass='titlepage'">
-			</xsl:when>
-
-			<xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='left'">
-				<fo:page-number/>
-			</xsl:when>
-
-			<xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='right'">
-				<fo:page-number/>
-			</xsl:when>
-
-			<xsl:when test="$double.sided = 0 and $position='right'">
-				<fo:page-number/>
-			</xsl:when>
-
-			<xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='left'">
-				<xsl:value-of select="$Version"/>
-			</xsl:when>
-
-			<xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='right'">
-				<xsl:value-of select="$Version"/>
-			</xsl:when>
-
-			<xsl:when test="$double.sided = 0 and $position='left'">
-				<xsl:value-of select="$Version"/>
-			</xsl:when>
-
-			<xsl:when test="$position='center'">
-				<xsl:value-of select="$Title"/>
-			</xsl:when>
-
-			<xsl:otherwise>
-			</xsl:otherwise>
-		</xsl:choose>
-	</xsl:template>
-
-	<xsl:template match="processing-instruction('hard-pagebreak')">
-		<fo:block break-before='page'/>
-	</xsl:template>
+        Custom Footer
+    ################################################### -->
+
+    <xsl:template name="footer.content">
+        <xsl:param name="pageclass" select="''"/>
+        <xsl:param name="sequence" select="''"/>
+        <xsl:param name="position" select="''"/>
+        <xsl:param name="gentext-key" select="''"/>
+
+        <xsl:variable name="Version">
+            <xsl:choose>
+                <xsl:when test="//releaseinfo">
+                    <xsl:value-of select="//releaseinfo"/>
+                </xsl:when>
+                <xsl:otherwise>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:variable>
+
+        <xsl:variable name="Title">
+            <xsl:value-of select="//title"/>
+        </xsl:variable>
+
+        <xsl:choose>
+            <xsl:when test="$sequence='blank'">
+                <xsl:choose>
+                    <xsl:when test="$double.sided != 0 and $position = 'left'">
+                        <xsl:value-of select="$Version"/>
+                    </xsl:when>
+
+                    <xsl:when test="$double.sided = 0 and $position = 'center'">
+                    </xsl:when>
+
+                    <xsl:otherwise>
+                        <fo:page-number/>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:when>
+
+            <xsl:when test="$pageclass='titlepage'">
+            </xsl:when>
+
+            <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='left'">
+                <fo:page-number/>
+            </xsl:when>
+
+            <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='right'">
+                <fo:page-number/>
+            </xsl:when>
+
+            <xsl:when test="$double.sided = 0 and $position='right'">
+                <fo:page-number/>
+            </xsl:when>
+
+            <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='left'">
+                <xsl:value-of select="$Version"/>
+            </xsl:when>
+
+            <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='right'">
+                <xsl:value-of select="$Version"/>
+            </xsl:when>
+
+            <xsl:when test="$double.sided = 0 and $position='left'">
+                <xsl:value-of select="$Version"/>
+            </xsl:when>
+
+            <xsl:when test="$position='center'">
+                <xsl:value-of select="$Title"/>
+            </xsl:when>
+
+            <xsl:otherwise>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+    <xsl:template match="processing-instruction('hard-pagebreak')">
+        <fo:block break-before='page'/>
+    </xsl:template>
 
 <!--###################################################
-		Extensions
-	################################################### -->
-
-	<!-- These extensions are required for table printing and other stuff  
-	<xsl:param name="use.extensions">1</xsl:param>
-	<xsl:param name="tablecolumns.extension">0</xsl:param>
-	<xsl:param name="callout.extensions">1</xsl:param>
-	<xsl:param name="fop.extensions">1</xsl:param>
-	-->
+        Extensions
+    ################################################### -->
+
+    <!-- These extensions are required for table printing and other stuff
+    <xsl:param name="use.extensions">1</xsl:param>
+    <xsl:param name="tablecolumns.extension">0</xsl:param>
+    <xsl:param name="callout.extensions">1</xsl:param>
+    <xsl:param name="fop.extensions">1</xsl:param>
+    -->
 <!--###################################################
-		Paper & Page Size
-	################################################### -->
+        Paper & Page Size
+    ################################################### -->
 
-	<!-- Paper type, no headers on blank pages, no double sided printing --> 
-	<xsl:param name="double.sided">0</xsl:param>
-	<xsl:param name="headers.on.blank.pages">0</xsl:param>
-	<xsl:param name="footers.on.blank.pages">0</xsl:param>
+    <!-- Paper type, no headers on blank pages, no double sided printing -->
+    <xsl:param name="double.sided">0</xsl:param>
+    <xsl:param name="headers.on.blank.pages">0</xsl:param>
+    <xsl:param name="footers.on.blank.pages">0</xsl:param>
 
 <!--###################################################
-		Fonts & Styles
-	################################################### -->
+        Fonts & Styles
+    ################################################### -->
 
-	<xsl:param name="hyphenate">false</xsl:param>
+    <xsl:param name="hyphenate">false</xsl:param>
 
-<!-- Default Font size --> 
-	<xsl:param name="body.font.master">11</xsl:param>
-	<xsl:param name="body.font.small">8</xsl:param>
+<!-- Default Font size -->
+    <xsl:param name="body.font.master">11</xsl:param>
+    <xsl:param name="body.font.small">8</xsl:param>
 
-	<!-- Line height in body text --> 
-	<xsl:param name="line-height">1.4</xsl:param>
+    <!-- Line height in body text -->
+    <xsl:param name="line-height">1.4</xsl:param>
 
 <!-- Chapter title size -->
-	<xsl:attribute-set name="chapter.titlepage.recto.style">
-		<xsl:attribute name="text-align">left</xsl:attribute>
-		<xsl:attribute name="font-weight">bold</xsl:attribute>
-		<xsl:attribute name="font-size">
-			<xsl:value-of select="$body.font.master * 1.8"/>
-			<xsl:text>pt</xsl:text>
-		</xsl:attribute>
-	</xsl:attribute-set>
+    <xsl:attribute-set name="chapter.titlepage.recto.style">
+        <xsl:attribute name="text-align">left</xsl:attribute>
+        <xsl:attribute name="font-weight">bold</xsl:attribute>
+        <xsl:attribute name="font-size">
+            <xsl:value-of select="$body.font.master * 1.8"/>
+            <xsl:text>pt</xsl:text>
+        </xsl:attribute>
+    </xsl:attribute-set>
 
 <!-- Why is the font-size for chapters hardcoded in the XSL FO templates?
-	Let's remove it, so this sucker can use our attribute-set only... --> 
-	<xsl:template match="title" mode="chapter.titlepage.recto.auto.mode">
-		<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"
-				xsl:use-attribute-sets="chapter.titlepage.recto.style">
-			<xsl:call-template name="component.title">
-			<xsl:with-param name="node" select="ancestor-or-self::chapter[1]"/>
-			</xsl:call-template>
-		</fo:block>
-	</xsl:template>
+    Let's remove it, so this sucker can use our attribute-set only... -->
+    <xsl:template match="title" mode="chapter.titlepage.recto.auto.mode">
+        <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"
+                xsl:use-attribute-sets="chapter.titlepage.recto.style">
+            <xsl:call-template name="component.title">
+            <xsl:with-param name="node" select="ancestor-or-self::chapter[1]"/>
+            </xsl:call-template>
+        </fo:block>
+    </xsl:template>
 
 <!-- Sections 1, 2 and 3 titles have a small bump factor and padding -->
-	
-	<xsl:attribute-set name="section.title.level1.properties">
-		<xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
-		<xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
-		<xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
-		<xsl:attribute name="font-size">
-			<xsl:value-of select="$body.font.master * 1.5"/>
-			<xsl:text>pt</xsl:text>
-		</xsl:attribute>
-		<xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
-		<xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
-		<xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
-	</xsl:attribute-set>
-	<xsl:attribute-set name="section.title.level2.properties">
-		<xsl:attribute name="space-before.optimum">0.6em</xsl:attribute>
-		<xsl:attribute name="space-before.minimum">0.6em</xsl:attribute>
-		<xsl:attribute name="space-before.maximum">0.6em</xsl:attribute>
-		<xsl:attribute name="font-size">
-			<xsl:value-of select="$body.font.master * 1.25"/>
-			<xsl:text>pt</xsl:text>
-		</xsl:attribute>
-		<xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
-		<xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
-		<xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
-	</xsl:attribute-set>
-	<xsl:attribute-set name="section.title.level3.properties">
-		<xsl:attribute name="space-before.optimum">0.4em</xsl:attribute>
-		<xsl:attribute name="space-before.minimum">0.4em</xsl:attribute>
-		<xsl:attribute name="space-before.maximum">0.4em</xsl:attribute>
-		<xsl:attribute name="font-size">
-			<xsl:value-of select="$body.font.master * 1.0"/>
-			<xsl:text>pt</xsl:text>
-		</xsl:attribute>
-		<xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
-		<xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
-		<xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
-	</xsl:attribute-set>
+
+    <xsl:attribute-set name="section.title.level1.properties">
+        <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
+        <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+        <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
+        <xsl:attribute name="font-size">
+            <xsl:value-of select="$body.font.master * 1.5"/>
+            <xsl:text>pt</xsl:text>
+        </xsl:attribute>
+        <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+        <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+        <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+    </xsl:attribute-set>
+    <xsl:attribute-set name="section.title.level2.properties">
+        <xsl:attribute name="space-before.optimum">0.6em</xsl:attribute>
+        <xsl:attribute name="space-before.minimum">0.6em</xsl:attribute>
+        <xsl:attribute name="space-before.maximum">0.6em</xsl:attribute>
+        <xsl:attribute name="font-size">
+            <xsl:value-of select="$body.font.master * 1.25"/>
+            <xsl:text>pt</xsl:text>
+        </xsl:attribute>
+        <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+        <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+        <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+    </xsl:attribute-set>
+    <xsl:attribute-set name="section.title.level3.properties">
+        <xsl:attribute name="space-before.optimum">0.4em</xsl:attribute>
+        <xsl:attribute name="space-before.minimum">0.4em</xsl:attribute>
+        <xsl:attribute name="space-before.maximum">0.4em</xsl:attribute>
+        <xsl:attribute name="font-size">
+            <xsl:value-of select="$body.font.master * 1.0"/>
+            <xsl:text>pt</xsl:text>
+        </xsl:attribute>
+        <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+        <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+        <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+    </xsl:attribute-set>
 
 <!-- Use code syntax highlighting -->
-	<xsl:param name="highlight.source" select="1"/>
-	<xsl:param name="highlight.default.language" select="xml" />
-
-	<xsl:template match='xslthl:keyword'>
-		<fo:inline font-weight="bold" color="#7F0055"><xsl:apply-templates/></fo:inline>
-	</xsl:template>
-	
-	<xsl:template match='xslthl:comment'>
-		<fo:inline font-style="italic" color="#3F5F5F"><xsl:apply-templates/></fo:inline>
-	</xsl:template>
-
-	<xsl:template match='xslthl:oneline-comment'>
-		<fo:inline font-style="italic" color="#3F5F5F"><xsl:apply-templates/></fo:inline>
-	</xsl:template>
-
-	<xsl:template match='xslthl:multiline-comment'>
-		<fo:inline font-style="italic" color="#3F5FBF"><xsl:apply-templates/></fo:inline>
-	</xsl:template>
-
-	<xsl:template match='xslthl:tag'>
-		<fo:inline  color="#3F7F7F"><xsl:apply-templates/></fo:inline>
-	</xsl:template>
-
-	<xsl:template match='xslthl:attribute'>
-		<fo:inline color="#7F007F"><xsl:apply-templates/></fo:inline>
-	</xsl:template>
-	
-	<xsl:template match='xslthl:value'>
-		<fo:inline color="#2A00FF"><xsl:apply-templates/></fo:inline>
-	</xsl:template>
-
-	<xsl:template match='xslthl:string'>
-		<fo:inline color="#2A00FF"><xsl:apply-templates/></fo:inline>
-	</xsl:template>
+    <xsl:param name="highlight.source" select="1"/>
+    <xsl:param name="highlight.default.language" select="xml" />
+
+    <xsl:template match='xslthl:keyword'>
+        <fo:inline font-weight="bold" color="#7F0055"><xsl:apply-templates/></fo:inline>
+    </xsl:template>
+
+    <xsl:template match='xslthl:comment'>
+        <fo:inline font-style="italic" color="#3F5F5F"><xsl:apply-templates/></fo:inline>
+    </xsl:template>
+
+    <xsl:template match='xslthl:oneline-comment'>
+        <fo:inline font-style="italic" color="#3F5F5F"><xsl:apply-templates/></fo:inline>
+    </xsl:template>
+
+    <xsl:template match='xslthl:multiline-comment'>
+        <fo:inline font-style="italic" color="#3F5FBF"><xsl:apply-templates/></fo:inline>
+    </xsl:template>
+
+    <xsl:template match='xslthl:tag'>
+        <fo:inline  color="#3F7F7F"><xsl:apply-templates/></fo:inline>
+    </xsl:template>
+
+    <xsl:template match='xslthl:attribute'>
+        <fo:inline color="#7F007F"><xsl:apply-templates/></fo:inline>
+    </xsl:template>
+
+    <xsl:template match='xslthl:value'>
+        <fo:inline color="#2A00FF"><xsl:apply-templates/></fo:inline>
+    </xsl:template>
+
+    <xsl:template match='xslthl:string'>
+        <fo:inline color="#2A00FF"><xsl:apply-templates/></fo:inline>
+    </xsl:template>
 
 <!--###################################################
-		Tables
-	################################################### -->
+        Tables
+    ################################################### -->
 
-	<!-- Some padding inside tables -->
-	<xsl:attribute-set name="table.cell.padding">
-		<xsl:attribute name="padding-left">4pt</xsl:attribute>
-		<xsl:attribute name="padding-right">4pt</xsl:attribute>
-		<xsl:attribute name="padding-top">4pt</xsl:attribute>
-		<xsl:attribute name="padding-bottom">4pt</xsl:attribute>
-	</xsl:attribute-set>
+    <!-- Some padding inside tables -->
+    <xsl:attribute-set name="table.cell.padding">
+        <xsl:attribute name="padding-left">4pt</xsl:attribute>
+        <xsl:attribute name="padding-right">4pt</xsl:attribute>
+        <xsl:attribute name="padding-top">4pt</xsl:attribute>
+        <xsl:attribute name="padding-bottom">4pt</xsl:attribute>
+    </xsl:attribute-set>
 
 <!-- Only hairlines as frame and cell borders in tables -->
-	<xsl:param name="table.frame.border.thickness">0.1pt</xsl:param>
-	<xsl:param name="table.cell.border.thickness">0.1pt</xsl:param>
+    <xsl:param name="table.frame.border.thickness">0.1pt</xsl:param>
+    <xsl:param name="table.cell.border.thickness">0.1pt</xsl:param>
 
 <!--###################################################
-		Labels
-	################################################### -->
+        Labels
+    ################################################### -->
 
 <!-- Label Chapters and Sections (numbering) -->
-	<xsl:param name="chapter.autolabel" select="1"/>
-	<xsl:param name="section.autolabel" select="1"/>
-	<xsl:param name="section.autolabel.max.depth" select="1"/>
+    <xsl:param name="chapter.autolabel" select="1"/>
+    <xsl:param name="section.autolabel" select="1"/>
+    <xsl:param name="section.autolabel.max.depth" select="1"/>
 
-	<xsl:param name="section.label.includes.component.label" select="1"/>
-	<xsl:param name="table.footnote.number.format" select="'1'"/>
+    <xsl:param name="section.label.includes.component.label" select="1"/>
+    <xsl:param name="table.footnote.number.format" select="'1'"/>
 
 <!--###################################################
-		Programlistings
-	################################################### -->
-
-	<!-- Verbatim text formatting (programlistings) -->
-	<xsl:attribute-set name="monospace.verbatim.properties">
-		<xsl:attribute name="font-size">
-			<xsl:value-of select="$body.font.small * 1.0"/>
-			<xsl:text>pt</xsl:text>
-		</xsl:attribute>
-	</xsl:attribute-set>
-
-	<xsl:attribute-set name="verbatim.properties">
-		<xsl:attribute name="space-before.minimum">1em</xsl:attribute>
-		<xsl:attribute name="space-before.optimum">1em</xsl:attribute>
-		<xsl:attribute name="space-before.maximum">1em</xsl:attribute>
-		<xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
-		<xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
-		<xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
-
-		<xsl:attribute name="border-color">#444444</xsl:attribute>
-		<xsl:attribute name="border-style">solid</xsl:attribute>
-		<xsl:attribute name="border-width">0.1pt</xsl:attribute>
-		<xsl:attribute name="padding-top">0.5em</xsl:attribute>
-		<xsl:attribute name="padding-left">0.5em</xsl:attribute>
-		<xsl:attribute name="padding-right">0.5em</xsl:attribute>
-		<xsl:attribute name="padding-bottom">0.5em</xsl:attribute>
-		<xsl:attribute name="margin-left">0.5em</xsl:attribute>
-		<xsl:attribute name="margin-right">0.5em</xsl:attribute>
-	</xsl:attribute-set>
-
-	<!-- Shade (background) programlistings -->
-	<xsl:param name="shade.verbatim">1</xsl:param>
-	<xsl:attribute-set name="shade.verbatim.style">
-		<xsl:attribute name="background-color">#F0F0F0</xsl:attribute>
-	</xsl:attribute-set>
-
-	<xsl:attribute-set name="list.block.spacing">
-		<xsl:attribute name="space-before.optimum">0.1em</xsl:attribute>
-		<xsl:attribute name="space-before.minimum">0.1em</xsl:attribute>
-		<xsl:attribute name="space-before.maximum">0.1em</xsl:attribute>
-		<xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
-		<xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
-		<xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
-	</xsl:attribute-set>
-
-	<xsl:attribute-set name="example.properties">
-		<xsl:attribute name="space-before.minimum">0.5em</xsl:attribute>
-		<xsl:attribute name="space-before.optimum">0.5em</xsl:attribute>
-		<xsl:attribute name="space-before.maximum">0.5em</xsl:attribute>
-		<xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
-		<xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
-		<xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
-		<xsl:attribute name="keep-together.within-column">always</xsl:attribute>
-	</xsl:attribute-set>
-    
+        Programlistings
+    ################################################### -->
+
+    <!-- Verbatim text formatting (programlistings) -->
+    <xsl:attribute-set name="monospace.verbatim.properties">
+        <xsl:attribute name="font-size">
+            <xsl:value-of select="$body.font.small * 1.0"/>
+            <xsl:text>pt</xsl:text>
+        </xsl:attribute>
+    </xsl:attribute-set>
+
+    <xsl:attribute-set name="verbatim.properties">
+        <xsl:attribute name="space-before.minimum">1em</xsl:attribute>
+        <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+        <xsl:attribute name="space-before.maximum">1em</xsl:attribute>
+        <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+        <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+        <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+
+        <xsl:attribute name="border-color">#444444</xsl:attribute>
+        <xsl:attribute name="border-style">solid</xsl:attribute>
+        <xsl:attribute name="border-width">0.1pt</xsl:attribute>
+        <xsl:attribute name="padding-top">0.5em</xsl:attribute>
+        <xsl:attribute name="padding-left">0.5em</xsl:attribute>
+        <xsl:attribute name="padding-right">0.5em</xsl:attribute>
+        <xsl:attribute name="padding-bottom">0.5em</xsl:attribute>
+        <xsl:attribute name="margin-left">0.5em</xsl:attribute>
+        <xsl:attribute name="margin-right">0.5em</xsl:attribute>
+    </xsl:attribute-set>
+
+    <!-- Shade (background) programlistings -->
+    <xsl:param name="shade.verbatim">1</xsl:param>
+    <xsl:attribute-set name="shade.verbatim.style">
+        <xsl:attribute name="background-color">#F0F0F0</xsl:attribute>
+    </xsl:attribute-set>
+
+    <xsl:attribute-set name="list.block.spacing">
+        <xsl:attribute name="space-before.optimum">0.1em</xsl:attribute>
+        <xsl:attribute name="space-before.minimum">0.1em</xsl:attribute>
+        <xsl:attribute name="space-before.maximum">0.1em</xsl:attribute>
+        <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+        <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+        <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+    </xsl:attribute-set>
+
+    <xsl:attribute-set name="example.properties">
+        <xsl:attribute name="space-before.minimum">0.5em</xsl:attribute>
+        <xsl:attribute name="space-before.optimum">0.5em</xsl:attribute>
+        <xsl:attribute name="space-before.maximum">0.5em</xsl:attribute>
+        <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+        <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+        <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+        <xsl:attribute name="keep-together.within-column">always</xsl:attribute>
+    </xsl:attribute-set>
+
 <!--###################################################
-		Title information for Figures, Examples etc.
-	################################################### -->
-
-	<xsl:attribute-set name="formal.title.properties" use-attribute-sets="normal.para.spacing">
-		<xsl:attribute name="font-weight">normal</xsl:attribute>
-		<xsl:attribute name="font-style">italic</xsl:attribute>
-		<xsl:attribute name="font-size">
-			<xsl:value-of select="$body.font.master"/>
-			<xsl:text>pt</xsl:text>
-		</xsl:attribute>
-		<xsl:attribute name="hyphenate">false</xsl:attribute>
-		<xsl:attribute name="space-before.minimum">0.1em</xsl:attribute>
-		<xsl:attribute name="space-before.optimum">0.1em</xsl:attribute>
-		<xsl:attribute name="space-before.maximum">0.1em</xsl:attribute>
-	</xsl:attribute-set>
+        Title information for Figures, Examples etc.
+    ################################################### -->
+
+    <xsl:attribute-set name="formal.title.properties" use-attribute-sets="normal.para.spacing">
+        <xsl:attribute name="font-weight">normal</xsl:attribute>
+        <xsl:attribute name="font-style">italic</xsl:attribute>
+        <xsl:attribute name="font-size">
+            <xsl:value-of select="$body.font.master"/>
+            <xsl:text>pt</xsl:text>
+        </xsl:attribute>
+        <xsl:attribute name="hyphenate">false</xsl:attribute>
+        <xsl:attribute name="space-before.minimum">0.1em</xsl:attribute>
+        <xsl:attribute name="space-before.optimum">0.1em</xsl:attribute>
+        <xsl:attribute name="space-before.maximum">0.1em</xsl:attribute>
+    </xsl:attribute-set>
 
 <!--###################################################
-		Callouts
-	################################################### -->
+        Callouts
+    ################################################### -->
 
-<!-- don't use images for callouts 
-	<xsl:param name="callout.graphics">0</xsl:param>
-	<xsl:param name="callout.unicode">1</xsl:param>
+<!-- don't use images for callouts
+    <xsl:param name="callout.graphics">0</xsl:param>
+    <xsl:param name="callout.unicode">1</xsl:param>
 -->
-<!-- Place callout marks at this column in annotated areas 
-	<xsl:param name="callout.defaultcolumn">90</xsl:param>
+<!-- Place callout marks at this column in annotated areas
+    <xsl:param name="callout.defaultcolumn">90</xsl:param>
 -->
 <!--###################################################
-		Misc
-	################################################### -->
+        Misc
+    ################################################### -->
 
 <!-- Placement of titles -->
-	<xsl:param name="formal.title.placement">
-		figure after
-		example after
-		equation before
-		table before
-		procedure before
-	</xsl:param>
+    <xsl:param name="formal.title.placement">
+        figure after
+        example after
+        equation before
+        table before
+        procedure before
+    </xsl:param>
 
 <!-- Format Variable Lists as Blocks (prevents horizontal overflow) -->
-	<xsl:param name="variablelist.as.blocks">1</xsl:param>
+    <xsl:param name="variablelist.as.blocks">1</xsl:param>
 
-	<xsl:param name="body.start.indent">0pt</xsl:param>
+    <xsl:param name="body.start.indent">0pt</xsl:param>
 
 <!-- Show only Sections up to level 3 in the TOCs -->
-	<xsl:param name="toc.section.depth">3</xsl:param>
-
-	<!-- Remove "Chapter" from the Chapter titles... -->
-	<xsl:param name="local.l10n.xml" select="document('')"/>
-	<l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0">
-		<l:l10n language="en">
-			<l:context name="title-numbered">
-				<l:template name="chapter" text="%n.&#160;%t"/>
-				<l:template name="section" text="%n&#160;%t"/>
-			</l:context>
-			<l:context name="title">
-				<l:template name="example" text="Example&#160;%n&#160;%t"/>
-			</l:context>
-		</l:l10n>
-	</l:i18n>
+    <xsl:param name="toc.section.depth">3</xsl:param>
+
+    <!-- Remove "Chapter" from the Chapter titles... -->
+    <xsl:param name="local.l10n.xml" select="document('')"/>
+    <l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0">
+        <l:l10n language="en">
+            <l:context name="title-numbered">
+                <l:template name="chapter" text="%n.&#160;%t"/>
+                <l:template name="section" text="%n&#160;%t"/>
+            </l:context>
+            <l:context name="title">
+                <l:template name="example" text="Example&#160;%n&#160;%t"/>
+            </l:context>
+        </l:l10n>
+    </l:i18n>
 
 <!--###################################################
-		colored and hyphenated links 
-	################################################### --> 
+        colored and hyphenated links
+    ################################################### -->
 <!--
-	<xsl:template match="ulink">
-		<fo:basic-link external-destination="{@url}"
-				xsl:use-attribute-sets="xref.properties"
-				text-decoration="underline"
-				color="blue">
-			<xsl:choose>
-				<xsl:when test="count(child::node())=0">
-					<xsl:value-of select="@url"/>
-				</xsl:when>
-				<xsl:otherwise>
-					<xsl:apply-templates/>
-				</xsl:otherwise>
-			</xsl:choose>
-		</fo:basic-link>
-	</xsl:template>
-
-	<xsl:template match="link">
-		<fo:basic-link internal-destination="{@linkend}"
-				xsl:use-attribute-sets="xref.properties"
-				text-decoration="underline"
-				color="blue">
-			<xsl:choose>
-				<xsl:when test="count(child::node())=0">
-					<xsl:value-of select="@linkend"/>
-				</xsl:when>
-				<xsl:otherwise>
-					<xsl:apply-templates/>
-				</xsl:otherwise>
-			</xsl:choose>
-		</fo:basic-link>
-	</xsl:template>
+    <xsl:template match="ulink">
+        <fo:basic-link external-destination="{@url}"
+                xsl:use-attribute-sets="xref.properties"
+                text-decoration="underline"
+                color="blue">
+            <xsl:choose>
+                <xsl:when test="count(child::node())=0">
+                    <xsl:value-of select="@url"/>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:apply-templates/>
+                </xsl:otherwise>
+            </xsl:choose>
+        </fo:basic-link>
+    </xsl:template>
+
+    <xsl:template match="link">
+        <fo:basic-link internal-destination="{@linkend}"
+                xsl:use-attribute-sets="xref.properties"
+                text-decoration="underline"
+                color="blue">
+            <xsl:choose>
+                <xsl:when test="count(child::node())=0">
+                    <xsl:value-of select="@linkend"/>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:apply-templates/>
+                </xsl:otherwise>
+            </xsl:choose>
+        </fo:basic-link>
+    </xsl:template>
 -->
-</xsl:stylesheet>
+</xsl:stylesheet>