Dave Jarvis' Repositories

git clone https://repo.autonoma.ca/repo/delibero.git

Menus generated at runtime from single XML file.

AuthorDave Jarvis <email>
Date2015-02-02 22:53:52 GMT-0800
Commit22279fefb3d6119e4030851018dfc32b5a2e0e8e
Parent742ea1e
build.gradle
}
-// Build the menu
-task buildMenu( type: JavaExec ) {
- main = "net.sf.saxon.Transform"
- classpath = configurations.runtime
- args "-s:source/xsl/menu/menu.xml", "-xsl:source/xsl/menu/menu.xsl"
-}
-
// Map menu items to servlets
task createServletMap( type: JavaExec ) {
main = "net.sf.saxon.Transform"
classpath = configurations.runtime
- args "-s:source/xsl/menu/menu.xml", "-xsl:source/xsl/servlet/servlet.xsl"
+ args "-s:resources/menu/menu.xml", "-xsl:source/xsl/servlet/servlet.xsl"
}
-buildMenu.dependsOn( copyLibraries )
-run.dependsOn( [createServletMap, buildMenu] )
+createServletMap.dependsOn( copyLibraries )
+run.dependsOn( [createServletMap] )
dependencies {
resources/.gitignore
servlet.properties
-menu
resources/menu/menu.xml
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ | Single source for the menu system. This can use XSLT to transform the
+ | menu relationship into a GraphViz graph. The graph can then be stylized
+ | and included in the manual.
+ +-->
+<menus>
+ <items>
+ <item id="1" link="home">Home</item>
+ <item id="2" link="synopsis">Synopsis</item>
+ <item id="3" link="proposal">Proposal</item>
+ <item id="4" link="resources">Resources</item>
+ <item id="5" link="discuss">Discuss</item>
+ <item id="6" link="success">Success</item>
+ <item id="7" link="account">Account</item>
+ <item id="8" link="tags">Tags</item>
+ <item id="9" link="edit">Edit</item>
+ <item id="10" link="flag">Flag</item>
+ <item id="11" link="support">Support</item>
+ <item id="12" link="new">Add Item</item>
+ <item id="13" link="refute">Refute</item>
+ <item id="14" link="login">Log In</item>
+ <item id="15" link="logout">Log Out</item>
+ </items>
+ <menu id="1">
+ <item id="7"/> <item id="8"/> <item id="12"/> <item id="15"/>
+ </menu>
+ <menu id="2">
+ <item id="1"/> <item id="3"/> <item id="4"/> <item id="5"/> <item id="6"/>
+ <item id="7"/> <item id="15"/>
+ </menu>
+ <menu id="3">
+ <item id="1"/> <item id="2"/> <item id="4"/> <item id="5"/> <item id="6"/>
+ <item id="7"/> <item id="9"/> <item id="10"/> <item id="15"/>
+ </menu>
+ <menu id="4">
+ <item id="1"/> <item id="2"/> <item id="3"/> <item id="5"/> <item id="6"/>
+ <item id="7"/> <item id="9"/> <item id="10"/> <item id="15"/>
+ </menu>
+ <menu id="5">
+ <item id="1"/> <item id="2"/> <item id="3"/> <item id="4"/> <item id="6"/>
+ <item id="7"/> <item id="12"/> <item id="15"/>
+ </menu>
+ <menu id="6">
+ <item id="1"/> <item id="2"/> <item id="3"/> <item id="4"/> <item id="5"/>
+ <item id="7"/> <item id="9"/> <item id="10"/> <item id="15"/>
+ </menu>
+ <menu id="7">
+ <item id="1"/> <item id="15"/>
+ </menu>
+ <menu id="8">
+ <item id="1"/> <item id="15"/>
+ </menu>
+ <menu id="11">
+ <item id="1"/> <item id="3"/> <item id="4"/> <item id="4"/> <item id="5"/>
+ <item id="6"/> <item id="7"/> <item id="9"/> <item id="10"/>
+ <item id="13"/> <item id="15"/>
+ </menu>
+ <menu id="14">
+ <item id="1"/> <item id="15"/>
+ </menu>
+ <menu id="15">
+ <item id="1"/>
+ </menu>
+</menus>
+
source/xsl/account.xsl
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:variable name="APP_NAME">account</xsl:variable>
+
<xsl:variable name="artefacts">
<artefacts>
<css>account</css>
- <xsl:copy-of select="document( 'menu/account.xml' )"/>
</artefacts>
</xsl:variable>
source/xsl/common.xsl
<xsl:param name="P_AUTHENTICATED" select="false()"/>
+<!-- Read the entire menu into an XML fragment variable. -->
+<xsl:variable name="MENU">
+ <xsl:copy-of select="document( 'menu/menu.xml' )"/>
+</xsl:variable>
+
+<!-- Create a menu index based on the unique menu IDs. -->
+<xsl:key name="items" match="/menus/items/item" use="@id"/>
+
<xsl:template match="/">
<html>
</head>
<body>
- <xsl:apply-templates select="$artefacts" mode="menu"/>
+ <xsl:apply-templates select="$MENU" mode="menu"/>
<xsl:apply-templates/>
- <xsl:apply-templates select="$artefacts" mode="menu"/>
+ <xsl:apply-templates select="$MENU" mode="menu"/>
<xsl:apply-templates select="$artefacts" mode="js"/>
</body>
</xsl:template>
-<xsl:template match="artefacts" mode="menu">
- <xsl:apply-templates select="menu" mode="menu"/>
-</xsl:template>
+<xsl:template match="menus" mode="menu">
+ <!-- The application name is given by the imported stylesheet. -->
+ <xsl:variable name="id" select="$MENU/menus/items/item[@link=$APP_NAME]/@id"/>
-<xsl:template match="menu" mode="menu">
<ul class="menu">
- <xsl:apply-templates mode="menu"/>
+ <xsl:apply-templates select="menu[@id=$id]" mode="menu"/>
</ul>
+</xsl:template>
+
+<xsl:template match="menu" mode="menu">
+ <xsl:apply-templates mode="menu"/>
</xsl:template>
<xsl:template name="menu-item">
+ <xsl:variable name="link" select="key( 'items', @id )/@link"/>
<li class="item">
- <a href="{$P_CONTEXT}/{@link}" class="{@link}"><xsl:apply-templates/></a>
+ <a href="{$P_CONTEXT}/{$link}" class="{$link}">
+ <xsl:value-of select="key( 'items', @id )"/>
+ </a>
</li>
</xsl:template>
source/xsl/discuss.xsl
<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
+<xsl:variable name="APP_NAME">discuss</xsl:variable>
+
<xsl:variable name="artefacts">
<artefacts>
<css>discuss</css>
- <xsl:copy-of select="document( 'menu/discuss.xml' )"/>
</artefacts>
</xsl:variable>
source/xsl/home.xsl
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:variable name="APP_NAME">home</xsl:variable>
+
<xsl:variable name="artefacts">
<artefacts>
<css>home</css>
- <xsl:copy-of select="document( 'menu/home.xml' )"/>
</artefacts>
</xsl:variable>
source/xsl/login.xsl
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:variable name="APP_NAME">login</xsl:variable>
+
<xsl:variable name="artefacts">
<artefacts>
<css>login</css>
- <xsl:copy-of select="document( 'menu/login.xml' )"/>
</artefacts>
</xsl:variable>
source/xsl/logout.xsl
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:variable name="APP_NAME">logout</xsl:variable>
+
<!-- Shouldn't be used because log out redirects to the home page. -->
<xsl:variable name="artefacts">
<artefacts>
<css>home</css>
- <xsl:copy-of select="document( 'menu/logout.xml' )"/>
</artefacts>
</xsl:variable>
source/xsl/menu/README.md
-# Overview
-
-This directory contains the scripts and source code to generate the system
-menu.
-
-In addition to generating the system menu it is possible to generate the
-corresponding documentation that illustrates the menu relationships using
-a graph.
-
-# Building
-
-Building the menu requires SAXON 9 be installed. SAXON 9 is required
-because `menu.xsl` uses the keyword `xsl:result-document` to write the
-individual menu documents. This keyword requires XSLT 2, and SAXON 9 is
-an XSLT 2 processor.
-
-The build task is part of the Gradle build scripts.
-
-# Relationship Graphs
-
-The relationship graphs are not yet generated.
-
source/xsl/menu/menu.xml
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- | Single source for the menu system. This can use XSLT to transform the
- | menu relationship into a GraphViz graph. The graph can then be stylized
- | and included in the manual.
- +-->
-<menus>
- <items>
- <item id="1" link="home">Home</item>
- <item id="2" link="synopsis">Synopsis</item>
- <item id="3" link="proposal">Proposal</item>
- <item id="4" link="resources">Resources</item>
- <item id="5" link="discuss">Discuss</item>
- <item id="6" link="success">Success</item>
- <item id="7" link="account">Account</item>
- <item id="8" link="tags">Tags</item>
- <item id="9" link="edit">Edit</item>
- <item id="10" link="flag">Flag</item>
- <item id="11" link="support">Support</item>
- <item id="12" link="new">Add Item</item>
- <item id="13" link="refute">Refute</item>
- <item id="14" link="login">Log In</item>
- <item id="15" link="logout">Log Out</item>
- </items>
- <menu id="1">
- <item id="7"/> <item id="8"/> <item id="12"/> <item id="15"/>
- </menu>
- <menu id="2">
- <item id="1"/> <item id="3"/> <item id="4"/> <item id="5"/> <item id="6"/>
- <item id="7"/> <item id="15"/>
- </menu>
- <menu id="3">
- <item id="1"/> <item id="2"/> <item id="4"/> <item id="5"/> <item id="6"/>
- <item id="7"/> <item id="9"/> <item id="10"/> <item id="15"/>
- </menu>
- <menu id="4">
- <item id="1"/> <item id="2"/> <item id="3"/> <item id="5"/> <item id="6"/>
- <item id="7"/> <item id="9"/> <item id="10"/> <item id="15"/>
- </menu>
- <menu id="5">
- <item id="1"/> <item id="2"/> <item id="3"/> <item id="4"/> <item id="6"/>
- <item id="7"/> <item id="12"/> <item id="15"/>
- </menu>
- <menu id="6">
- <item id="1"/> <item id="2"/> <item id="3"/> <item id="4"/> <item id="5"/>
- <item id="7"/> <item id="9"/> <item id="10"/> <item id="15"/>
- </menu>
- <menu id="7">
- <item id="1"/> <item id="15"/>
- </menu>
- <menu id="8">
- <item id="1"/> <item id="15"/>
- </menu>
- <menu id="11">
- <item id="1"/> <item id="3"/> <item id="4"/> <item id="4"/> <item id="5"/>
- <item id="6"/> <item id="7"/> <item id="9"/> <item id="10"/>
- <item id="13"/> <item id="15"/>
- </menu>
- <menu id="14">
- <item id="1"/> <item id="15"/>
- </menu>
- <menu id="15">
- <item id="1"/>
- </menu>
-</menus>
-
source/xsl/menu/menu.xsl
-<?xml version='1.0' encoding='utf-8'?>
-<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
-
-<xsl:output indent="yes" method="xml" encoding="utf-8"/>
-
-<xsl:strip-space elements="*"/>
-
-<xsl:key name="items" match="/menus/items/item" use="@id"/>
-
-<xsl:template match="/">
- <xsl:apply-templates/>
-</xsl:template>
-
-<xsl:template match="menus">
- <xsl:apply-templates select="menu"/>
-</xsl:template>
-
-<xsl:template match="menu">
- <xsl:variable name="menu" select="key( 'items', @id )"/>
- <xsl:result-document method="xml"
- href="resources/menu/{$menu/@link}.xml">
- <xsl:comment>Machine generated: change via menu.xsl.</xsl:comment>
- <xsl:text>&#x0A;</xsl:text>
- <menu>
- <xsl:apply-templates />
- </menu>
- </xsl:result-document>
-</xsl:template>
-
-<!-- The ID is required so that the menu can change dynamically. -->
-<xsl:template match="item">
- <item id="{@id}">
- <xsl:attribute name="link" select="key( 'items', @id )/@link"/>
- <xsl:value-of select="key( 'items', @id )"/>
- </item>
-</xsl:template>
-
-<!-- Ignore /menus/items -->
-<xsl:template match="*"/>
-
-</xsl:stylesheet>
source/xsl/proposal.xsl
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:variable name="APP_NAME">proposal</xsl:variable>
+
<xsl:variable name="artefacts">
<artefacts>
<css>proposal</css>
- <xsl:copy-of select="document( 'menu/proposal.xml' )"/>
</artefacts>
</xsl:variable>
source/xsl/resources.xsl
<xsl:include href="chart.xsl"/>
+<xsl:variable name="APP_NAME">resources</xsl:variable>
+
<xsl:variable name="artefacts">
<artefacts>
<css>resources</css>
- <xsl:copy-of select="document( 'menu/resources.xml' )"/>
</artefacts>
</xsl:variable>
source/xsl/success.xsl
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:variable name="APP_NAME">success</xsl:variable>
+
<xsl:variable name="artefacts">
<artefacts>
<css>success</css>
- <xsl:copy-of select="document( 'menu/success.xml' )"/>
</artefacts>
</xsl:variable>
source/xsl/support.xsl
<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
+<xsl:variable name="APP_NAME">support</xsl:variable>
+
<xsl:variable name="artefacts">
<artefacts>
<css>support</css>
<js>editor.min</js>
<js>support</js>
- <xsl:copy-of select="document( 'menu/support.xml' )"/>
</artefacts>
</xsl:variable>
source/xsl/synopsis.xsl
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:variable name="APP_NAME">synopsis</xsl:variable>
+
<xsl:variable name="artefacts">
<artefacts>
<css>synopsis</css>
- <xsl:copy-of select="document( 'menu/synopsis.xml' )"/>
</artefacts>
</xsl:variable>
source/xsl/tags.xsl
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:variable name="APP_NAME">tags</xsl:variable>
+
<xsl:variable name="artefacts">
<artefacts>
<css>tags</css>
<js>jquery.min</js>
<js>tags</js>
- <xsl:copy-of select="document( 'menu/tags.xml' )"/>
</artefacts>
</xsl:variable>
Delta113 lines added, 159 lines removed, 46-line decrease