<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:map="http://www.w3.org/2005/xpath-functions/map" xmlns:pf="http://www.daisy.org/ns/pipeline/functions" xmlns:f="http://www.daisy.org/ns/pipeline/internal-functions" xmlns:d="http://www.daisy.org/ns/pipeline/data" xmlns:c="http://www.w3.org/ns/xproc-step" xmlns:java="implemented-in-java" version="2.0" exclude-result-prefixes="#all"> <xsl:import href="http://www.daisy.org/pipeline/modules/file-utils/library.xsl"/> <xsl:function name="pf:css-to-fileset" as="element(d:fileset)"> <xsl:param name="css-uri" as="xs:string"/> <xsl:param name="context.fileset" as="document-node(element(d:fileset))?"/> <xsl:param name="context.in-memory" as="document-node()*"/> <xsl:variable name="css" as="xs:string?" select="f:load($css-uri,$context.fileset,$context.in-memory)"/> <d:fileset> <xsl:attribute name="xml:base" select="$css-uri"/> <xsl:for-each select="($css-uri, if ($css) then pf:css-to-fileset($css,$css-uri,$context.fileset,$context.in-memory) else ())"> <xsl:variable name="href" select="."/> <xsl:variable name="file-in-context" as="element(d:file)?" select="$context.fileset//d:file[resolve-uri(@href,base-uri(.))=$href][1]"/> <d:file href="{pf:relativize-uri($href,$css-uri)}"> <xsl:choose> <xsl:when test="$file-in-context[@original-href]"> <xsl:sequence select="$file-in-context/@original-href"/> </xsl:when> <xsl:when test="$file-in-context"/> <xsl:otherwise> <xsl:attribute name="original-href" select="$href"/> </xsl:otherwise> </xsl:choose> <xsl:if test="pf:get-extension($href)='css'"> <xsl:attribute name="media-type" select="'text/css'"/> </xsl:if> </d:file> </xsl:for-each> </d:fileset> </xsl:function> <xsl:function name="pf:css-to-fileset" as="xs:string*"> <xsl:param name="css" as="xs:string"/> <xsl:param name="css-base" as="xs:string"/> <xsl:param name="context.fileset" as="document-node(element(d:fileset))?"/> <xsl:param name="context.in-memory" as="document-node()*"/> <xsl:analyze-string select="$css" regex="@import\s+(.*?)(\s*|\s+[^)].*);"> <xsl:matching-substring> <xsl:variable name="url" select="f:parse-css-url(replace(regex-group(1),'^url\(\s*(.*?)\s*\)$','$1'))"/> <xsl:if test="$url"> <xsl:variable name="url" select="resolve-uri($url,$css-base)"/> <xsl:sequence select="$url"/> <xsl:if test="pf:get-extension($url)='css'"> <xsl:variable name="css" as="xs:string?" select="f:load($url,$context.fileset,$context.in-memory)"/> <xsl:if test="exists($css)"> <xsl:sequence select="pf:css-to-fileset($css,$url,$context.fileset,$context.in-memory)"/> </xsl:if> </xsl:if> </xsl:if> </xsl:matching-substring> <xsl:non-matching-substring> <xsl:analyze-string select="." regex="url\(\s*(.*?)\s*\)"> <xsl:matching-substring> <xsl:variable name="url" select="f:parse-css-url(regex-group(1))"/> <xsl:if test="$url and not(starts-with($url,'data:'))"> <xsl:variable name="url" select="resolve-uri($url,$css-base)"/> <xsl:sequence select="$url"/> <xsl:if test="pf:get-extension($url)='css'"> <xsl:variable name="css" as="xs:string?" select="f:load($url,$context.fileset,$context.in-memory)"/> <xsl:if test="exists($css)"> <xsl:sequence select="pf:css-to-fileset($css,$url,$context.fileset,$context.in-memory)"/> </xsl:if> </xsl:if> </xsl:if> </xsl:matching-substring> </xsl:analyze-string> </xsl:non-matching-substring> </xsl:analyze-string> </xsl:function> <xsl:function name="f:parse-css-url" as="xs:string?"> <xsl:param name="url" as="xs:string"/> <xsl:sequence select="if (matches($url,'''(.*?)''')) then replace($url,'''(.*?)''','$1') else if (matches($url,'"(.*?)"')) then replace($url,'"(.*?)"','$1') else if (matches($url,'^[^''"]') and not(matches($url,'^attr\('))) then $url else ()"/> </xsl:function> <xsl:function name="f:load" as="xs:string?"> <xsl:param name="url" as="xs:string"/> <xsl:param name="context.fileset" as="document-node(element(d:fileset))?"/> <xsl:param name="context.in-memory" as="document-node()*"/> <xsl:variable name="file" as="element(d:file)?" select="$context.fileset//d:file[resolve-uri(@href,base-uri(.))=$url][1]"/> <xsl:choose> <xsl:when test="$file[@original-href]"> <xsl:variable name="url" select="$file/resolve-uri(@original-href,base-uri(.))"/> <xsl:if test="unparsed-text-available($url)"> <xsl:sequence select="unparsed-text($url)"/> </xsl:if> </xsl:when> <xsl:when test="$file"> <xsl:sequence select="$context.in-memory[/c:data][base-uri(/*)=$url][1]/string(.)"/> </xsl:when> <xsl:when test="unparsed-text-available($url)"> <xsl:sequence select="unparsed-text($url)"/> </xsl:when> </xsl:choose> </xsl:function> <doc xmlns="http://www.oxygenxml.com/ns/doc/xsl"> <desc> <p>Test whether a media query matches a medium.</p> </desc> </doc> <java:function name="pf:media-query-matches" as="xs:boolean"> <xsl:param name="media-query" as="xs:string"/> <xsl:param name="medium" as="xs:string"/> </java:function> <doc xmlns="http://www.oxygenxml.com/ns/doc/xsl"> <desc> <p>Parse a style sheet parameter set string and return it as a map.</p> <p>The argument may also be an already parsed parameter set in the form of a map or c:param-set document.</p> <p>If a sequence of arguments is provided, a single map containing all the parameters is returned. In case of duplicates, the first occurence wins.</p> </desc> </doc> <xsl:function xmlns:StylesheetParametersParser="org.daisy.pipeline.css.impl.StylesheetParametersParser" name="pf:css-parse-param-set" as="map(xs:string,item())"> <xsl:param name="param-set" as="item()*"/> <xsl:map> <xsl:for-each select="$param-set"> <xsl:choose> <xsl:when test=". instance of map(*)"> <xsl:if test="map:size(.)>0"> <xsl:sequence select="."/> </xsl:if> </xsl:when> <xsl:when test=". instance of document-node() or . instance of element()"> <xsl:for-each select=".//c:param[not(@namespace[not(.='')])]"> <xsl:map-entry key="string(@name)"> <xsl:choose> <xsl:when test="matches(@value,'^(0|-?[1-9][0-9]*)$')"> <xsl:sequence select="xs:integer(number(@value))"/> </xsl:when> <xsl:when test="@value='true'"> <xsl:sequence select="true()"/> </xsl:when> <xsl:when test="@value='false'"> <xsl:sequence select="false()"/> </xsl:when> <xsl:otherwise> <xsl:sequence select="string(@value)"/> </xsl:otherwise> </xsl:choose> </xsl:map-entry> </xsl:for-each> </xsl:when> <xsl:when test=". castable as xs:string"> <xsl:sequence select="StylesheetParametersParser:parse(string(.))"> </xsl:sequence> </xsl:when> <xsl:otherwise> <xsl:message terminate="yes">illegal argument</xsl:message> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:map> </xsl:function> </xsl:stylesheet>