diff options
Initial implementation of a tree-like website generator based on InputXSLT
The foundation was forked from `blog.kummerlaender.eu`. Currently generates arbitrarily nested markdown documents in addition to overview pages for branches in the tree. This includes resolution of branch node contents.
Diffstat (limited to 'utility')
-rw-r--r-- | utility/datasource.xsl | 24 | ||||
-rw-r--r-- | utility/date-time.xsl | 241 | ||||
-rw-r--r-- | utility/formatter.xsl | 134 | ||||
-rw-r--r-- | utility/master.xsl | 76 | ||||
-rw-r--r-- | utility/xhtml.xsl | 28 |
5 files changed, 503 insertions, 0 deletions
diff --git a/utility/datasource.xsl b/utility/datasource.xsl new file mode 100644 index 0000000..411086a --- /dev/null +++ b/utility/datasource.xsl @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet + version="1.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" +> + +<xsl:output + method="xml" + omit-xml-declaration="no" + encoding="UTF-8" + indent="no" +/> + +<xsl:variable name="root" select="/datasource"/> + +<xsl:template match="/"> + <datasource> + <xsl:apply-templates /> + </datasource> +</xsl:template> + +<xsl:template match="text()|@*"/> + +</xsl:stylesheet> diff --git a/utility/date-time.xsl b/utility/date-time.xsl new file mode 100644 index 0000000..1815e06 --- /dev/null +++ b/utility/date-time.xsl @@ -0,0 +1,241 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> + +<!-- + +Description: + +This is a date formatting utility. The named template "format-date" takes 2 parameters: + +1. date - [required] takes an ISO date (2005-12-01) +2. format - [optional] takes a format string. + +Format options: + +Y - year in 4 digits e.g. 1981, 1992, 2008 +y - year in 2 digits e.g. 81, 92, 08 +M - month as a full word e.g. January, March, September +m - month in 3 letters e.g. Jan, Mar, Sep +N - month in digits without leading zero +n - month in digits with leading zero +D - day with suffix and no leading zero e.g. 1st, 23rd +d - day in digits with leading zero e.g. 01, 09, 12, 25 +x - day in digits with no leading zero e.g. 1, 9, 12, 25 +T - time in 24-hours e.g. 18:30 +t - time in 12-hours e.g. 6:30pm +W - weekday as a full word e.g. Monday, Tuesday +w - weekday in 3 letters e.g. Mon, Tue, Wed + +Examples: + +M => January +d M => 21 September +m D, y => Sep 21st, 81 +n-d-y => 09-21-81 +d/n/y => 21/09/81 +d/n/y t => 21/09/81 6:30pm + +--> + +<xsl:template name="format-date"> + <xsl:param name="date"/> + <xsl:param name="format" select="'D M, Y'"/> + <xsl:choose> + <xsl:when test="string-length($format) <= 10"> + <xsl:call-template name="date-controller"> + <xsl:with-param name="date" select="$date"/> + <xsl:with-param name="format" select="$format"/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:text>Error: format parameter is not correctly set. You have: </xsl:text> + <xsl:value-of select="string-length($format)"/> + <xsl:text>.</xsl:text> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +<xsl:template name="date-controller"> + <xsl:param name="date"/> + <xsl:param name="format"/> + <xsl:param name="letter" select="substring($format,1,1)"/> + <xsl:param name="tletter" select="translate($letter,'DMNYTW','dmnytw')"/> + <xsl:choose> + <xsl:when test="$tletter = 'y'"> + <xsl:call-template name="format-year"> + <xsl:with-param name="date" select="$date"/> + <xsl:with-param name="format" select="$letter"/> + </xsl:call-template> + </xsl:when> + <xsl:when test="$tletter = 'm'"> + <xsl:call-template name="format-month"> + <xsl:with-param name="date" select="$date"/> + <xsl:with-param name="format" select="$letter"/> + </xsl:call-template> + </xsl:when> + <xsl:when test="$tletter = 'n'"> + <xsl:call-template name="format-month"> + <xsl:with-param name="date" select="$date"/> + <xsl:with-param name="format" select="$letter"/> + </xsl:call-template> + </xsl:when> + <xsl:when test="$tletter = 'd'"> + <xsl:call-template name="format-day"> + <xsl:with-param name="date" select="$date"/> + <xsl:with-param name="format" select="$letter"/> + </xsl:call-template> + </xsl:when> + <xsl:when test="$tletter = 'x'"> + <xsl:call-template name="format-day"> + <xsl:with-param name="date" select="$date"/> + <xsl:with-param name="format" select="$letter"/> + </xsl:call-template> + </xsl:when> + <xsl:when test="$tletter = 't'"> + <xsl:call-template name="format-time"> + <xsl:with-param name="time" select="$date/@time"/> + <xsl:with-param name="format" select="$letter"/> + </xsl:call-template> + </xsl:when> + <xsl:when test="$tletter = 'w'"> + <xsl:call-template name="format-weekday"> + <xsl:with-param name="weekday" select="$date/@weekday"/> + <xsl:with-param name="format" select="$letter"/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$letter"/> + </xsl:otherwise> + </xsl:choose> + <xsl:if test="$letter = not('')"> + <xsl:call-template name="date-controller"> + <xsl:with-param name="date" select="$date"/> + <xsl:with-param name="format" select="substring($format,2)"/> + </xsl:call-template> + </xsl:if> +</xsl:template> + +<xsl:template name="format-year"> + <xsl:param name="date"/> + <xsl:param name="year" select="substring($date,1,4)"/> + <xsl:param name="format" select="'y'"/> + <xsl:choose> + <xsl:when test="$format = 'y'"> + <xsl:value-of select="substring($year,3)"/> + </xsl:when> + <xsl:when test="$format = 'Y'"> + <xsl:value-of select="$year"/> + </xsl:when> + </xsl:choose> +</xsl:template> + +<xsl:template name="format-month"> + <xsl:param name="date"/> + <xsl:param name="month" select="format-number(substring($date,6,2), '##')"/> + <xsl:param name="format" select="'m'"/> + <xsl:param name="month-word"> + <xsl:choose> + <xsl:when test="$month = 01">January</xsl:when> + <xsl:when test="$month = 02">February</xsl:when> + <xsl:when test="$month = 03">March</xsl:when> + <xsl:when test="$month = 04">April</xsl:when> + <xsl:when test="$month = 05">May</xsl:when> + <xsl:when test="$month = 06">June</xsl:when> + <xsl:when test="$month = 07">July</xsl:when> + <xsl:when test="$month = 08">August</xsl:when> + <xsl:when test="$month = 09">September</xsl:when> + <xsl:when test="$month = 10">October</xsl:when> + <xsl:when test="$month = 11">November</xsl:when> + <xsl:when test="$month = 12">December</xsl:when> + </xsl:choose> + </xsl:param> + <xsl:choose> + <xsl:when test="$format = 'm'"> + <xsl:value-of select="substring($month-word, 1,3)"/> + </xsl:when> + <xsl:when test="$format = 'M'"> + <xsl:value-of select="$month-word"/> + </xsl:when> + <xsl:when test="$format = 'n'"> + <xsl:value-of select="format-number($month, '00')"/> + </xsl:when> + <xsl:when test="$format = 'N'"> + <xsl:value-of select="format-number($month, '0')"/> + </xsl:when> + </xsl:choose> +</xsl:template> + +<xsl:template name="format-day"> + <xsl:param name="date"/> + <xsl:param name="day" select="format-number(substring($date,9,2),'00')"/> + <xsl:param name="format" select="'d'"/> + <xsl:param name="suffix"> + <xsl:choose> + <xsl:when test="(substring($day,2) = 1) and not(substring($day,1,1) = 1)">st</xsl:when> + <xsl:when test="(substring($day,2) = 2) and not(substring($day,1,1) = 1)">nd</xsl:when> + <xsl:when test="(substring($day,2) = 3) and not(substring($day,1,1) = 1)">rd</xsl:when> + <xsl:otherwise>th</xsl:otherwise> + </xsl:choose> + </xsl:param> + <xsl:choose> + <xsl:when test="$format = 'd'"> + <xsl:value-of select="$day"/> + </xsl:when> + <xsl:when test="$format = 'x'"> + <xsl:value-of select="format-number($day,'0')"/> + </xsl:when> + <xsl:when test="$format = 'D'"> + <xsl:value-of select="format-number($day,'0')"/> + <xsl:value-of select="$suffix"/> + </xsl:when> + </xsl:choose> +</xsl:template> + +<xsl:template name="format-time"> + <xsl:param name="time"/> + <xsl:param name="hour" select="substring-before($time, ':')"/> + <xsl:param name="minute" select="substring-after($time, ':')"/> + <xsl:param name="format" select="'T'"/> + <xsl:choose> + <xsl:when test="$format = 'T'"> + <xsl:value-of select="$time"/> + </xsl:when> + <xsl:when test="$format = 't'"> + <xsl:choose> + <xsl:when test="$hour mod 12 = 0">12</xsl:when> + <xsl:otherwise><xsl:value-of select="($hour mod 12)"/></xsl:otherwise> + </xsl:choose> + <xsl:value-of select="concat(':',$minute)"/> + <xsl:choose> + <xsl:when test="$hour < 12">am</xsl:when> + <xsl:otherwise>pm</xsl:otherwise> + </xsl:choose> + </xsl:when> + </xsl:choose> +</xsl:template> + +<xsl:template name="format-weekday"> + <xsl:param name="weekday"/> + <xsl:param name="format" select="'w'"/> + <xsl:param name="result"> + <xsl:choose> + <xsl:when test="$weekday = 1">Monday</xsl:when> + <xsl:when test="$weekday = 2">Tuesday</xsl:when> + <xsl:when test="$weekday = 3">Wednesday</xsl:when> + <xsl:when test="$weekday = 4">Thursday</xsl:when> + <xsl:when test="$weekday = 5">Friday</xsl:when> + <xsl:when test="$weekday = 6">Saturday</xsl:when> + <xsl:when test="$weekday = 7">Sunday</xsl:when> + </xsl:choose> + </xsl:param> + <xsl:choose> + <xsl:when test="$format = 'W'"> + <xsl:value-of select="$result"/> + </xsl:when> + <xsl:when test="$format = 'w'"> + <xsl:value-of select="substring($result,1,3)"/> + </xsl:when> + </xsl:choose> +</xsl:template> + +</xsl:stylesheet>
\ No newline at end of file diff --git a/utility/formatter.xsl b/utility/formatter.xsl new file mode 100644 index 0000000..f590d89 --- /dev/null +++ b/utility/formatter.xsl @@ -0,0 +1,134 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet + version="1.0" + xmlns="http://www.w3.org/1999/xhtml" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xalan="http://xml.apache.org/xalan" + xmlns:InputXSLT="function.inputxslt.application" + exclude-result-prefixes="xalan InputXSLT" +> + +<xsl:template name="plain_formatter"> + <xsl:param name="format"/> + <xsl:param name="source"/> + + <xsl:copy-of select="InputXSLT:external-command( + $format, + $source + )/self::command/node()"/> +</xsl:template> + +<xsl:template name="math_highlighter"> + <xsl:param name="source"/> + <xsl:param name="arguments"/> + + <xsl:variable name="formatted_expression"> + <xsl:call-template name="plain_formatter"> + <xsl:with-param name="format"> + <xsl:text>katex </xsl:text> + <xsl:value-of select="$arguments"/> + </xsl:with-param> + <xsl:with-param name="source" select="$source"/> + </xsl:call-template> + </xsl:variable> + + <xsl:copy-of select="xalan:nodeset($formatted_expression)/node()"/> +</xsl:template> + +<xsl:template name="code_highlighter"> + <xsl:param name="source"/> + <xsl:param name="language"/> + + <xsl:variable name="formatted_code"> + <xsl:call-template name="plain_formatter"> + <xsl:with-param name="format"> + <xsl:text>highlight --out-format=xhtml --inline-css --style=molokai --fragment --enclose-pre --wrap-simple --syntax=</xsl:text> + <xsl:value-of select="$language"/> + </xsl:with-param> + <xsl:with-param name="source" select="$source"/> + </xsl:call-template> + </xsl:variable> + + <pre> + <xsl:copy-of select="xalan:nodeset($formatted_code)/pre/node()"/> + </pre> +</xsl:template> + +<xsl:template match="@*|node()" mode="embellish"> + <xsl:copy> + <xsl:apply-templates select="@*|node()" mode="embellish"/> + </xsl:copy> +</xsl:template> + +<xsl:template match="h2" mode="embellish"> + <h3> + <xsl:apply-templates select="node()" mode="embellish"/> + </h3> +</xsl:template> + +<xsl:template match="h3" mode="embellish"> + <h4> + <xsl:apply-templates select="node()" mode="embellish"/> + </h4> +</xsl:template> + +<xsl:template match="pre" mode="embellish"> + <xsl:call-template name="code_highlighter"> + <xsl:with-param name="source" select="code/text()"/> + <xsl:with-param name="language"> + <xsl:choose> + <xsl:when test="@class"> + <xsl:value-of select="@class"/> + </xsl:when> + <xsl:otherwise> + <xsl:text>txt</xsl:text> + </xsl:otherwise> + </xsl:choose> + </xsl:with-param> + </xsl:call-template> +</xsl:template> + +<xsl:template match="div[@class = 'figure']" mode="embellish"> + <p> + <xsl:apply-templates select="img" mode="embellish"/> + </p> +</xsl:template> + +<xsl:template match="div[@class = 'footnotes']/hr" mode="embellish"/> + +<xsl:template match="span[contains(@class, 'math')]" mode="embellish"> + <xsl:choose> + <xsl:when test="contains(@class, 'display')"> + <p class="math"> + <xsl:call-template name="math_highlighter"> + <xsl:with-param name="source" select="text()"/> + <xsl:with-param name="arguments"> + <xsl:text>--display-mode</xsl:text> + </xsl:with-param> + </xsl:call-template> + </p> + </xsl:when> + <xsl:otherwise> + <span class="math"> + <xsl:call-template name="math_highlighter"> + <xsl:with-param name="source" select="text()"/> + </xsl:call-template> + </span> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +<xsl:template name="formatter"> + <xsl:param name="source"/> + + <xsl:variable name="content"> + <xsl:call-template name="plain_formatter"> + <xsl:with-param name="format">pandoc -f markdown -t html --katex --no-highlight</xsl:with-param> + <xsl:with-param name="source" select="$source"/> + </xsl:call-template> + </xsl:variable> + + <xsl:apply-templates select="xalan:nodeset($content)" mode="embellish"/> +</xsl:template> + +</xsl:stylesheet> diff --git a/utility/master.xsl b/utility/master.xsl new file mode 100644 index 0000000..80bfccd --- /dev/null +++ b/utility/master.xsl @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet + version="1.0" + xmlns="http://www.w3.org/1999/xhtml" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" +> + +<xsl:output + method="xml" + doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" + doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" + omit-xml-declaration="yes" + encoding="UTF-8" + indent="no" +/> + +<xsl:variable name="root" select="datasource"/> + +<xsl:template match="/"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> + <meta name="author" content="Adrian Kummerländer" /> + <meta name="robots" content="all"/> + <meta name="viewport" content="width=device-width,initial-scale=1.0"/> + + <link rel="stylesheet" type="text/css" href="/main.css" /> + <link rel="shortcut icon" type="image/x-icon" href="/media/favicon.ico" /> + + <xsl:if test="//*[(self::p or self::span) and @class = 'math']"> + <link rel="stylesheet" type="text/css" href="https://static.kummerlaender.eu/katex/katex.min.css" /> + </xsl:if> + + <title> + <xsl:call-template name="title-text"/> @ <xsl:value-of select="$root/meta/title"/> + </title> +</head> +<body> + <div id="navigation" class="center border_bottom"> + <h1> + <xsl:value-of select="$root/meta/title"/> + </h1> + + <ul class="buttonlist"> + <li> + <a href="/">Start</a> + </li> + <li> + <a href="/projects">Projects</a> + </li> + <li> + <a href="/contact">Contact</a> + </li> + </ul> + </div> + + <div id="content" class="center"> + <xsl:apply-templates /> + </div> + + <div id="footer" class="center border_top"> + <a href="/projects/xslt/static_xslt/">Made with XSLT</a> + + <ul class="buttonlist"> + <li> + <a href="/contact">Contact</a> + </li> + </ul> + </div> +</body> +</html> +</xsl:template> + +<xsl:template match="text()|@*"/> + +</xsl:stylesheet> diff --git a/utility/xhtml.xsl b/utility/xhtml.xsl new file mode 100644 index 0000000..00f1ef2 --- /dev/null +++ b/utility/xhtml.xsl @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet + version="1.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" +> + +<xsl:template match="*" mode="xhtml"> + <xsl:element name="{local-name()}" namespace="http://www.w3.org/1999/xhtml"> + <xsl:copy-of select="@*"/> + <xsl:apply-templates select="node()" mode="xhtml"/> + </xsl:element> +</xsl:template> + +<xsl:template match="span" mode="xhtml"> + <xsl:element name="{local-name()}" namespace="http://www.w3.org/1999/xhtml"> + <xsl:copy-of select="@*"/> + <xsl:apply-templates select="node()" mode="xhtml"/> + <xsl:if test="not(node())"> + <xsl:comment></xsl:comment> + </xsl:if> + </xsl:element> +</xsl:template> + +<xsl:template match="comment() | processing-instruction()" mode="xhtml"> + <xsl:copy/> +</xsl:template> + +</xsl:stylesheet> |