sysmodellibs/sysmodelgen/extra/css-module.xsl
changeset 7 3c36c452f013
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysmodellibs/sysmodelgen/extra/css-module.xsl	Wed Oct 13 16:21:25 2010 +0100
@@ -0,0 +1,310 @@
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ 	xmlns:s="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:exslt="http://exslt.org/common"
+  	exclude-result-prefixes="s exslt" >
+
+	<xsl:variable name="css">
+		<css><xsl:copy-of select="/*/@xml:lang"/>
+			<xsl:apply-templates select="//style | //s:style" mode="css"/>
+		</css>
+	</xsl:variable>
+<!-- debugging <xsl:template match="/*"><xsl:copy-of select="$css"/></xsl:template>-->
+
+ 
+<xsl:template match="s:style" mode="unstyle"/>
+
+<xsl:template match="*" mode="unstyle">
+	<xsl:copy>
+		<xsl:apply-templates select="@*" mode="unstyle"/>
+		<xsl:call-template name="style"/>
+		<xsl:apply-templates select="node()" mode="unstyle"/>
+	</xsl:copy>
+</xsl:template>
+
+<xsl:template match="@*|text()" mode="unstyle"><xsl:copy-of select="."/></xsl:template>
+<xsl:template match="@style" mode="unstyle"/>
+
+
+<xsl:template match="*" mode="style-value"><xsl:param name="property"/>
+	<xsl:variable name="this">
+		<xsl:copy>
+			<xsl:apply-templates select="@*" mode="unstyle"/>
+			<xsl:call-template name="style"/>
+		</xsl:copy>
+	</xsl:variable>
+	<xsl:value-of select="exslt:node-set($this)/*/@*[name()=$property]"/>
+</xsl:template>
+
+
+<xsl:template name="style">
+	<xsl:variable name="cur" select="."/>
+	<xsl:variable name="styles">
+		<xsl:for-each select="exslt:node-set($css)/css//item[
+			( contains(concat(' ',normalize-space($cur/@class),' '),concat(' ',@class,' ')) or not(@class) ) and 
+			( @id = $cur/@id or not(@id) ) and
+			( not(starts-with(@psuedo,'lang(')) or lang(substring-before(substring-after(@psuedo,'lang(')),')')) and
+			( @tag = local-name($cur) or not(@tag) ) and not(ancestor::media)]">
+			<xsl:variable name="found">
+				<xsl:if test="parent::parent">
+					<xsl:apply-templates select="parent::parent" mode="match">
+						<xsl:with-param name="svg" select="$cur"/>
+					</xsl:apply-templates>
+				</xsl:if>
+				<xsl:if test="not(parent::parent)">1</xsl:if>
+			</xsl:variable>
+			<xsl:if test="$found!=''">
+				<xsl:copy-of select="*"/>
+			</xsl:if>
+		</xsl:for-each>
+		<xsl:apply-templates select="@style" mode="css"/>
+	</xsl:variable>
+	<!--  debug <xsl:copy-of select="$styles"/>-->
+	<xsl:for-each select="exslt:node-set($styles)/*">
+		<xsl:if test="not(preceding-sibling::*[name()=name(current()) and @bang='important']) and not($cur/@*[name()=name(current())])">
+		<xsl:attribute name="{name()}">
+			<xsl:value-of select="."/>
+		</xsl:attribute>
+		</xsl:if>
+	</xsl:for-each>
+</xsl:template>
+
+<xsl:template match="parent" mode="match">
+	<xsl:param name="svg"/>
+	<xsl:variable name="this" select="."/>
+	<xsl:variable name="match" select="$svg/ancestor::*[
+		( contains(concat(' ',normalize-space(@class),' '),concat(' ',$this/@class,' ')) or not($this/@class) ) and 
+		( $this/@id = @id or not($this/@id) ) and
+		( not(starts-with($this/@psuedo,'lang(')) or lang(substring-before(substring-after($this/@psuedo,'lang(')),')')) and
+		( $this/@tag = local-name() or not($this/@tag) )]"/>
+	<xsl:choose>
+		<xsl:when test="$match and parent::parent">
+			<xsl:for-each select="$match">
+				<xsl:apply-templates select="parent::parent" mode="match">
+					<xsl:with-param name="svg" select="current()"/>
+				</xsl:apply-templates>
+			</xsl:for-each>
+		</xsl:when>
+		<xsl:when test="$match">1</xsl:when>
+	</xsl:choose>
+</xsl:template>
+
+
+<xsl:template match="*" mode="css">
+	<xsl:call-template name="cssitem">
+		<xsl:with-param name="text">
+			<xsl:call-template name="nocomments"/>
+		</xsl:with-param>
+	</xsl:call-template>
+</xsl:template>
+
+<xsl:template match="@style" mode="css">
+	<xsl:call-template name="parse-properties">
+		<xsl:with-param select="." name="text"/>
+	</xsl:call-template>
+</xsl:template>
+
+<xsl:template name="cssitem"><xsl:param name="text" select="."/>
+	<xsl:variable name="pre" select="normalize-space(substring-before($text,'{'))"/>
+	<xsl:variable name="post" select="substring-after($text,'{')"/>
+	<xsl:choose>
+		<xsl:when test="contains($pre,'@')">
+			<xsl:variable name="cnt">
+				<xsl:call-template name="endgroup">
+					<xsl:with-param name="text" select="$post"/>
+				</xsl:call-template>
+			</xsl:variable>		
+			<xsl:element name="{substring-before(substring-after($pre,'@'),' ')}">
+				<xsl:attribute name="type">
+					<xsl:value-of select="normalize-space(substring-after(substring-after($pre,'@'),' '))"/>
+				</xsl:attribute>
+				<xsl:call-template name="cssitem">
+					<xsl:with-param name="text" select="$cnt"/>
+				</xsl:call-template>
+		</xsl:element>
+				<xsl:call-template name="cssitem">
+					<xsl:with-param name="text" select="substring($post,string-length($cnt) +  2)"/>
+				</xsl:call-template>
+		</xsl:when>
+		<xsl:otherwise>
+			<xsl:call-template name="parse-list">
+				<xsl:with-param name="list" select="$pre"/>
+				<xsl:with-param name="value-text" select="substring-before($post,'}')"/>
+			</xsl:call-template>
+			<xsl:variable name="next"  select="substring-after($post,'}')"/>
+			<xsl:if test="normalize-space($next)!=''">
+				<xsl:call-template name="cssitem">
+					<xsl:with-param name="text" select="$next"/>
+				</xsl:call-template>
+			</xsl:if>
+		</xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+
+<xsl:template name="endgroup"><xsl:param name="text"/>
+	<xsl:variable name="open" select="substring-before($text,'{')"/>
+	<xsl:variable name="close" select="substring-before($text,'}')"/>
+	<xsl:choose>
+		<xsl:when test="contains($text,'{') and string-length($open) &lt; string-length($close)">
+			<xsl:value-of select="concat($close,'}')"/>
+			<xsl:call-template name="endgroup">
+				<xsl:with-param name="text" select="substring-after($text,'}')"/>
+			</xsl:call-template>
+		</xsl:when>
+		<xsl:when test="contains($text,'}')">
+			<xsl:value-of select="$close"/>
+		</xsl:when>
+		<xsl:otherwise>
+			<xsl:value-of select="$text"/>
+		</xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+<xsl:template name="nocomments"><xsl:param name="text" select="."/>
+	<xsl:choose>
+		<xsl:when test="contains($text,'/*')">
+			<xsl:value-of select="substring-before($text,'/*')"/>
+			<xsl:call-template name="nocomments">
+				<xsl:with-param select="substring-after(substring-after($text,'/*'),'*/')" name="text"/>
+			</xsl:call-template>
+		</xsl:when>
+		<xsl:otherwise>
+			<xsl:value-of select="$text"/>
+		</xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+
+
+
+<xsl:template name="parse-list"><xsl:param name="value-text"/><xsl:param name="list"/>
+	<xsl:choose>
+		<xsl:when test="contains($list,',')">
+			<xsl:call-template name="parse-item">
+				<xsl:with-param select="normalize-space(substring-before($list,','))" name="item"/>
+				<xsl:with-param select="$value-text" name="value-text"/>
+			</xsl:call-template>
+			<xsl:call-template name="parse-list">
+				<xsl:with-param select="substring-after($list,',')" name="list"/>
+				<xsl:with-param select="$value-text" name="value-text"/>
+			</xsl:call-template>
+		</xsl:when>
+		<xsl:otherwise>
+			<xsl:call-template name="parse-item">
+				<xsl:with-param select="normalize-space($list)" name="item"/>
+				<xsl:with-param select="$value-text" name="value-text"/>
+			</xsl:call-template>
+		</xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+
+<xsl:template name="parse-item"><xsl:param name="value-text"/><xsl:param name="item"/>
+	<xsl:choose>
+		<xsl:when test="contains($item,' ')">
+			<xsl:call-template name="parse-term">
+				<xsl:with-param select="substring-before($item,' ')" name="item"/>
+				<xsl:with-param select="$value-text" name="value-text"/>
+				<xsl:with-param select="substring-after($item,' ')" name="descend"/>
+			</xsl:call-template>
+		</xsl:when>
+		<xsl:otherwise>
+			<xsl:call-template name="parse-term">
+				<xsl:with-param select="$item" name="item"/>
+				<xsl:with-param select="$value-text" name="value-text"/>
+			</xsl:call-template>
+		</xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+<xsl:template name="parse-term"><xsl:param name="value-text"/><xsl:param name="item"/><xsl:param name="descend"/>
+	<xsl:variable name="type">
+		<xsl:choose>
+			<xsl:when test="$descend=''">item</xsl:when>
+			<xsl:otherwise>parent</xsl:otherwise>
+		</xsl:choose>
+	</xsl:variable>
+	<xsl:element name="{$type}">
+		<xsl:variable name="v0"> <!-- check for pseudo class -->
+			<xsl:choose>
+				<xsl:when test="contains($item,':')"><xsl:value-of select="substring-before($item,':')"/></xsl:when>
+				<xsl:otherwise><xsl:value-of select="$item"/></xsl:otherwise>
+			</xsl:choose>
+		</xsl:variable>
+		<xsl:if test="$v0!=$item">
+			<xsl:attribute name="pseudo"><xsl:value-of select="substring-after($item,':')"/></xsl:attribute>
+		</xsl:if>
+		<xsl:if test="$v0 != '' ">
+			<xsl:variable name="v1">
+				<xsl:choose>
+					<xsl:when test="contains($v0,'.')"><xsl:value-of select="substring-before($v0,'.')"/></xsl:when>
+					<xsl:otherwise><xsl:value-of select="$v0"/></xsl:otherwise>
+				</xsl:choose>
+			</xsl:variable>
+			<xsl:if test="$v1!=$v0">
+				<xsl:attribute name="class"><xsl:value-of select="substring-after($v0,'.')"/></xsl:attribute>
+			</xsl:if>
+			<xsl:if test="$v1 != '' ">
+				<xsl:choose>
+					<xsl:when test="starts-with($v1,'#')">
+						<xsl:attribute name="id"><xsl:value-of select="substring($v1,2)"/></xsl:attribute>
+					</xsl:when>
+					<xsl:otherwise><xsl:attribute name="tag"><xsl:value-of select="$v1"/></xsl:attribute></xsl:otherwise>
+				</xsl:choose>
+			</xsl:if>
+		</xsl:if>
+		<xsl:choose>
+			<xsl:when test="$descend!=''">
+				<xsl:call-template name="parse-item">
+					<xsl:with-param select="$descend" name="item"/>
+					<xsl:with-param select="$value-text" name="value-text"/>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:otherwise>
+			<xsl:call-template name="parse-properties">
+				<xsl:with-param select="$value-text" name="text"/>
+			</xsl:call-template>
+		</xsl:otherwise>
+		</xsl:choose>
+	</xsl:element>
+</xsl:template>
+
+
+<xsl:template name="parse-properties"><xsl:param name="text"/>
+	<xsl:choose>
+		<xsl:when test="contains($text,';')">
+		<xsl:call-template name="parse-property">
+			<xsl:with-param select="substring-before($text,';')" name="text"/>
+		</xsl:call-template>
+		<xsl:if test="normalize-space(substring-after($text,';'))!=''">
+			<xsl:call-template name="parse-properties">
+				<xsl:with-param select="substring-after($text,';')" name="text"/>
+			</xsl:call-template>
+		</xsl:if>
+		</xsl:when>
+		<xsl:otherwise>
+			<xsl:call-template name="parse-property">
+				<xsl:with-param select="$text" name="text"/>
+			</xsl:call-template>
+		</xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+<xsl:template name="parse-property"><xsl:param name="text"/>
+<xsl:if test="contains($text,':')">
+	<xsl:variable name="post" select="substring-after($text,':')"/>
+
+	<xsl:element name="{normalize-space(substring-before($text,':'))}">
+		<xsl:choose>
+			<xsl:when test="contains($post,'!')">
+				<xsl:attribute name="bang"><xsl:value-of select="substring-after($post,'!')"/></xsl:attribute>
+				<xsl:value-of select="normalize-space(substring-before($post,'!'))"/>
+			</xsl:when>
+			<xsl:otherwise><xsl:value-of select="normalize-space($post)"/></xsl:otherwise>
+		</xsl:choose>
+	</xsl:element>
+</xsl:if>	
+
+</xsl:template>
+
+
+</xsl:stylesheet>