summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVille Skyttä <ville.skytta@iki.fi>2010-10-27 21:31:39 +0300
committerVille Skyttä <ville.skytta@iki.fi>2010-10-27 21:31:39 +0300
commitdbdba40a8ad0465e695b12b1069390332968e9ae (patch)
tree4a3f5d1e7f9938a2ca3c1594935e5ff44b61a685
parentac037453a39670194d1c6af037af733d81d83660 (diff)
downloadvdr-plugin-text2skin-dbdba40a8ad0465e695b12b1069390332968e9ae.tar.gz
vdr-plugin-text2skin-dbdba40a8ad0465e695b12b1069390332968e9ae.tar.bz2
Add experimental RELAX NG schema for skin XML files.
-rw-r--r--Docs/text2skin-1.1.rng899
-rw-r--r--HISTORY1
2 files changed, 900 insertions, 0 deletions
diff --git a/Docs/text2skin-1.1.rng b/Docs/text2skin-1.1.rng
new file mode 100644
index 0000000..41ee971
--- /dev/null
+++ b/Docs/text2skin-1.1.rng
@@ -0,0 +1,899 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Experimantal RELAX NG schema for text2skin (skin) version 1.1 skins.
+
+Usage:
+* With jing, <http://code.google.com/p/jing-trang/>:
+ java -jar jing.jar text2skin-1.1.rng foo.skin
+* With msv, <http://msv.dev.java.net/>:
+ java -jar msv.jar text2skin-1.1.rng foo.skin
+* With xmllint, <http://xmlsoft.org/>:
+ xmllint -noout -relaxng text2skin-1.1.rng foo.skin
+* With xmlstarlet, <http://xmlstarlet.sourceforge.net/>:
+ xmlstarlet val -e -r text2skin-1.1.rng foo.skin
+
+jing and msv seem to produce more to-the-point, easier to understand error
+messages than xmllint or xmlstarlet as of jing 20091111, msv 20090415 and
+libxml 2.7.7, YMMV.
+
+Known/potential issues:
+* <block> handling may not be flexible enough, see for example izegrey16.skin
+ (izegrey16 1.0-20050304, <http://skins.vdr-developer.org/text2skin/>)
+ <display id="volume">
+ <block condition="not({VolumeIsMute})">
+ <window ...>
+ ...
+ </window>
+ </block>
+ </display>
+ ...and we may have the same issues with allowing nonsensical element
+ combinations in other cases as well, would probably need some <group>s
+ and <choice>s.
+* See TODO comments below.
+-->
+<grammar ns=""
+ xmlns="http://relaxng.org/ns/structure/1.0"
+ datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+
+ <start>
+
+ <element name="skin">
+ <attribute name="version">
+ <data type="token">
+ <!-- TODO: or enforce 1.1? -->
+ <param name="pattern">\d+\.\d+</param>
+ </data>
+ </attribute>
+ <attribute name="name">
+ <ref name="nonEmptyNormalizedStringValue"/>
+ </attribute>
+ <attribute name="screenBase">
+ <choice>
+ <value>relative</value>
+ <value>absolute</value>
+ <value>abs1280x720</value>
+ <value>abs1920x1080</value>
+ </choice>
+ </attribute>
+
+ <oneOrMore>
+ <ref name="displayElement"/>
+ </oneOrMore>
+ </element>
+
+ </start>
+
+ <!-- Elements -->
+
+ <define name="blinkElement">
+ <element name="blink">
+ <ref name="textAttributes"/>
+ <optional>
+ <attribute name="blinkColor">
+ <ref name="colorValue"/>
+ </attribute>
+ </optional>
+ <ref name="delayAttribute"/>
+ <ref name="nonEmptyStringValue"/>
+ </element>
+ </define>
+
+ <define name="blockElement">
+ <element name="block">
+ <ref name="commonAttributes"/>
+ <ref name="widthHeightAttributes"/>
+ <interleave>
+ <zeroOrMore>
+ <ref name="blinkElement"/>
+ </zeroOrMore>
+ <!-- TODO: is block allowed here (nested blocks)? -->
+ <zeroOrMore>
+ <ref name="blockElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="ellipseElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="imageElement"/>
+ </zeroOrMore>
+ <!-- TODO: is item allowed here? -->
+ <!-- TODO: is list allowed here? -->
+ <zeroOrMore>
+ <ref name="listElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="marqueeElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="progressElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="rectangleElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="scrollbarElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="scrolltextElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="slopeElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="textElement"/>
+ </zeroOrMore>
+ </interleave>
+ </element>
+ </define>
+
+ <define name="displayElement">
+ <element name="display">
+ <attribute name="id">
+ <choice>
+ <value>channelInfo</value>
+ <value>channelSmall</value>
+ <value>volume</value>
+ <value>audioTracks</value>
+ <value>message</value>
+ <value>replayInfo</value>
+ <value>replaySmall</value>
+ <value>menu</value>
+ </choice>
+ </attribute>
+ <ref name="refreshAttribute"/>
+
+ <oneOrMore>
+ <ref name="windowElement"/>
+ </oneOrMore>
+ <interleave>
+ <zeroOrMore>
+ <ref name="blinkElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="blockElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="ellipseElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="imageElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="listElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="marqueeElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="progressElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="rectangleElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="scrollbarElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="scrolltextElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="slopeElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="textElement"/>
+ </zeroOrMore>
+ </interleave>
+ </element>
+ </define>
+
+ <define name="ellipseElement">
+ <element name="ellipse">
+ <ref name="positionAttributes"/>
+ <ref name="commonAttributes"/>
+ <attribute name="color">
+ <ref name="colorValue"/>
+ </attribute>
+ <ref name="arcAttribute"/>
+ </element>
+ </define>
+
+ <define name="imageElement">
+ <element name="image">
+ <optional>
+ <attribute name="x">
+ <ref name="xValue"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="y">
+ <ref name="yValue"/>
+ </attribute>
+ </optional>
+ <ref name="positionAttributes"/>
+ <ref name="commonAttributes"/>
+ <optional>
+ <attribute name="alpha">
+ <data type="unsignedByte"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="colors">
+ <data type="positiveInteger"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="color">
+ <ref name="colorValue"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="bgColor">
+ <ref name="colorValue"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="maskColor">
+ <ref name="colorValue"/>
+ </attribute>
+ </optional>
+ <attribute name="path">
+ <data type="string">
+ <param name="minLength">1</param>
+ </data>
+ </attribute>
+ </element>
+ </define>
+
+ <define name="itemElement">
+ <element name="item">
+ <ref name="commonAttributes"/>
+ <optional>
+ <attribute name="height">
+ <data type="positiveInteger"/>
+ </attribute>
+ </optional>
+ </element>
+ </define>
+
+ <define name="listElement">
+ <element name="list">
+ <ref name="positionAttributes"/>
+ <ref name="commonAttributes"/>
+ <ref name="widthHeightAttributes"/>
+ <ref name="itemElement"/>
+ <interleave>
+ <zeroOrMore>
+ <ref name="blinkElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="blockElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="ellipseElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="imageElement"/>
+ </zeroOrMore>
+ <!-- TODO: is list allowed here (nested lists)? -->
+ <zeroOrMore>
+ <ref name="marqueeElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="progressElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="rectangleElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="scrollbarElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="scrolltextElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="slopeElement"/>
+ </zeroOrMore>
+ <zeroOrMore>
+ <ref name="textElement"/>
+ </zeroOrMore>
+ </interleave>
+ </element>
+ </define>
+
+ <define name="marqueeElement">
+ <element name="marquee">
+ <ref name="textAttributes"/>
+ <ref name="delayAttribute"/>
+ <ref name="nonEmptyStringValue"/>
+ </element>
+ </define>
+
+ <define name="progressElement">
+ <element name="progress">
+ <ref name="positionAttributes"/>
+ <ref name="commonAttributes"/>
+ <optional>
+ <attribute name="color">
+ <ref name="colorValue"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="bgColor">
+ <ref name="colorValue"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="mark">
+ <ref name="colorValue"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="active">
+ <ref name="colorValue"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="keep">
+ <ref name="colorValue"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="current">
+ <ref name="nonEmptyNormalizedStringValue"/>
+ </attribute>
+ <attribute name="total">
+ <ref name="nonEmptyNormalizedStringValue"/>
+ </attribute>
+ </optional>
+ </element>
+ </define>
+
+ <define name="rectangleElement">
+ <element name="rectangle">
+ <ref name="positionAttributes"/>
+ <ref name="commonAttributes"/>
+ <attribute name="color">
+ <ref name="colorValue"/>
+ </attribute>
+ </element>
+ </define>
+
+ <define name="scrollbarElement">
+ <element name="scrollbar">
+ <ref name="positionAttributes"/>
+ <ref name="commonAttributes"/>
+ <optional>
+ <attribute name="color">
+ <ref name="colorValue"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="bgColor">
+ <ref name="colorValue"/>
+ </attribute>
+ </optional>
+ </element>
+ </define>
+
+ <define name="scrolltextElement">
+ <element name="scrolltext">
+ <ref name="textAttributes"/>
+ <ref name="nonEmptyStringValue"/>
+ </element>
+ </define>
+
+ <define name="slopeElement">
+ <element name="slope">
+ <ref name="positionAttributes"/>
+ <ref name="commonAttributes"/>
+ <attribute name="color">
+ <ref name="colorValue"/>
+ </attribute>
+ <ref name="arcAttribute"/>
+ </element>
+ </define>
+
+ <define name="textElement">
+ <element name="text">
+ <ref name="textAttributes"/>
+ <ref name="nonEmptyStringValue"/>
+ </element>
+ </define>
+
+ <define name="windowElement">
+ <element name="window">
+ <ref name="positionAttributes"/>
+ <attribute name="bpp">
+ <data type="positiveInteger">
+ <param name="maxInclusive">32</param>
+ </data>
+ </attribute>
+ </element>
+ </define>
+
+ <!-- Individual attributes -->
+
+ <define name="arcAttribute">
+ <optional>
+ <attribute name="arc">
+ <data type="byte">
+ <param name="minInclusive">-8</param>
+ <param name="maxInclusive">8</param>
+ </data>
+ </attribute>
+ </optional>
+ </define>
+
+ <define name="delayAttribute">
+ <optional>
+ <attribute name="delay">
+ <data type="positiveInteger"/>
+ </attribute>
+ </optional>
+ </define>
+
+ <define name="refreshAttribute">
+ <optional>
+ <attribute name="refresh">
+ <choice>
+ <value>always</value>
+ <value>full</value>
+ <value>force</value>
+ <!-- TODO: *cough*... but for now generated with Python:
+ from itertools import permutations
+ refresh = ("all", "timeout", "update", "list", "scroll")
+ for i in range(1, len(refresh)+1):
+ for j in permutations(refresh, i):
+ print " <value>%s</value>" % ",".join(j)
+ -->
+ <value>all</value>
+ <value>timeout</value>
+ <value>update</value>
+ <value>list</value>
+ <value>scroll</value>
+ <value>all,timeout</value>
+ <value>all,update</value>
+ <value>all,list</value>
+ <value>all,scroll</value>
+ <value>timeout,all</value>
+ <value>timeout,update</value>
+ <value>timeout,list</value>
+ <value>timeout,scroll</value>
+ <value>update,all</value>
+ <value>update,timeout</value>
+ <value>update,list</value>
+ <value>update,scroll</value>
+ <value>list,all</value>
+ <value>list,timeout</value>
+ <value>list,update</value>
+ <value>list,scroll</value>
+ <value>scroll,all</value>
+ <value>scroll,timeout</value>
+ <value>scroll,update</value>
+ <value>scroll,list</value>
+ <value>all,timeout,update</value>
+ <value>all,timeout,list</value>
+ <value>all,timeout,scroll</value>
+ <value>all,update,timeout</value>
+ <value>all,update,list</value>
+ <value>all,update,scroll</value>
+ <value>all,list,timeout</value>
+ <value>all,list,update</value>
+ <value>all,list,scroll</value>
+ <value>all,scroll,timeout</value>
+ <value>all,scroll,update</value>
+ <value>all,scroll,list</value>
+ <value>timeout,all,update</value>
+ <value>timeout,all,list</value>
+ <value>timeout,all,scroll</value>
+ <value>timeout,update,all</value>
+ <value>timeout,update,list</value>
+ <value>timeout,update,scroll</value>
+ <value>timeout,list,all</value>
+ <value>timeout,list,update</value>
+ <value>timeout,list,scroll</value>
+ <value>timeout,scroll,all</value>
+ <value>timeout,scroll,update</value>
+ <value>timeout,scroll,list</value>
+ <value>update,all,timeout</value>
+ <value>update,all,list</value>
+ <value>update,all,scroll</value>
+ <value>update,timeout,all</value>
+ <value>update,timeout,list</value>
+ <value>update,timeout,scroll</value>
+ <value>update,list,all</value>
+ <value>update,list,timeout</value>
+ <value>update,list,scroll</value>
+ <value>update,scroll,all</value>
+ <value>update,scroll,timeout</value>
+ <value>update,scroll,list</value>
+ <value>list,all,timeout</value>
+ <value>list,all,update</value>
+ <value>list,all,scroll</value>
+ <value>list,timeout,all</value>
+ <value>list,timeout,update</value>
+ <value>list,timeout,scroll</value>
+ <value>list,update,all</value>
+ <value>list,update,timeout</value>
+ <value>list,update,scroll</value>
+ <value>list,scroll,all</value>
+ <value>list,scroll,timeout</value>
+ <value>list,scroll,update</value>
+ <value>scroll,all,timeout</value>
+ <value>scroll,all,update</value>
+ <value>scroll,all,list</value>
+ <value>scroll,timeout,all</value>
+ <value>scroll,timeout,update</value>
+ <value>scroll,timeout,list</value>
+ <value>scroll,update,all</value>
+ <value>scroll,update,timeout</value>
+ <value>scroll,update,list</value>
+ <value>scroll,list,all</value>
+ <value>scroll,list,timeout</value>
+ <value>scroll,list,update</value>
+ <value>all,timeout,update,list</value>
+ <value>all,timeout,update,scroll</value>
+ <value>all,timeout,list,update</value>
+ <value>all,timeout,list,scroll</value>
+ <value>all,timeout,scroll,update</value>
+ <value>all,timeout,scroll,list</value>
+ <value>all,update,timeout,list</value>
+ <value>all,update,timeout,scroll</value>
+ <value>all,update,list,timeout</value>
+ <value>all,update,list,scroll</value>
+ <value>all,update,scroll,timeout</value>
+ <value>all,update,scroll,list</value>
+ <value>all,list,timeout,update</value>
+ <value>all,list,timeout,scroll</value>
+ <value>all,list,update,timeout</value>
+ <value>all,list,update,scroll</value>
+ <value>all,list,scroll,timeout</value>
+ <value>all,list,scroll,update</value>
+ <value>all,scroll,timeout,update</value>
+ <value>all,scroll,timeout,list</value>
+ <value>all,scroll,update,timeout</value>
+ <value>all,scroll,update,list</value>
+ <value>all,scroll,list,timeout</value>
+ <value>all,scroll,list,update</value>
+ <value>timeout,all,update,list</value>
+ <value>timeout,all,update,scroll</value>
+ <value>timeout,all,list,update</value>
+ <value>timeout,all,list,scroll</value>
+ <value>timeout,all,scroll,update</value>
+ <value>timeout,all,scroll,list</value>
+ <value>timeout,update,all,list</value>
+ <value>timeout,update,all,scroll</value>
+ <value>timeout,update,list,all</value>
+ <value>timeout,update,list,scroll</value>
+ <value>timeout,update,scroll,all</value>
+ <value>timeout,update,scroll,list</value>
+ <value>timeout,list,all,update</value>
+ <value>timeout,list,all,scroll</value>
+ <value>timeout,list,update,all</value>
+ <value>timeout,list,update,scroll</value>
+ <value>timeout,list,scroll,all</value>
+ <value>timeout,list,scroll,update</value>
+ <value>timeout,scroll,all,update</value>
+ <value>timeout,scroll,all,list</value>
+ <value>timeout,scroll,update,all</value>
+ <value>timeout,scroll,update,list</value>
+ <value>timeout,scroll,list,all</value>
+ <value>timeout,scroll,list,update</value>
+ <value>update,all,timeout,list</value>
+ <value>update,all,timeout,scroll</value>
+ <value>update,all,list,timeout</value>
+ <value>update,all,list,scroll</value>
+ <value>update,all,scroll,timeout</value>
+ <value>update,all,scroll,list</value>
+ <value>update,timeout,all,list</value>
+ <value>update,timeout,all,scroll</value>
+ <value>update,timeout,list,all</value>
+ <value>update,timeout,list,scroll</value>
+ <value>update,timeout,scroll,all</value>
+ <value>update,timeout,scroll,list</value>
+ <value>update,list,all,timeout</value>
+ <value>update,list,all,scroll</value>
+ <value>update,list,timeout,all</value>
+ <value>update,list,timeout,scroll</value>
+ <value>update,list,scroll,all</value>
+ <value>update,list,scroll,timeout</value>
+ <value>update,scroll,all,timeout</value>
+ <value>update,scroll,all,list</value>
+ <value>update,scroll,timeout,all</value>
+ <value>update,scroll,timeout,list</value>
+ <value>update,scroll,list,all</value>
+ <value>update,scroll,list,timeout</value>
+ <value>list,all,timeout,update</value>
+ <value>list,all,timeout,scroll</value>
+ <value>list,all,update,timeout</value>
+ <value>list,all,update,scroll</value>
+ <value>list,all,scroll,timeout</value>
+ <value>list,all,scroll,update</value>
+ <value>list,timeout,all,update</value>
+ <value>list,timeout,all,scroll</value>
+ <value>list,timeout,update,all</value>
+ <value>list,timeout,update,scroll</value>
+ <value>list,timeout,scroll,all</value>
+ <value>list,timeout,scroll,update</value>
+ <value>list,update,all,timeout</value>
+ <value>list,update,all,scroll</value>
+ <value>list,update,timeout,all</value>
+ <value>list,update,timeout,scroll</value>
+ <value>list,update,scroll,all</value>
+ <value>list,update,scroll,timeout</value>
+ <value>list,scroll,all,timeout</value>
+ <value>list,scroll,all,update</value>
+ <value>list,scroll,timeout,all</value>
+ <value>list,scroll,timeout,update</value>
+ <value>list,scroll,update,all</value>
+ <value>list,scroll,update,timeout</value>
+ <value>scroll,all,timeout,update</value>
+ <value>scroll,all,timeout,list</value>
+ <value>scroll,all,update,timeout</value>
+ <value>scroll,all,update,list</value>
+ <value>scroll,all,list,timeout</value>
+ <value>scroll,all,list,update</value>
+ <value>scroll,timeout,all,update</value>
+ <value>scroll,timeout,all,list</value>
+ <value>scroll,timeout,update,all</value>
+ <value>scroll,timeout,update,list</value>
+ <value>scroll,timeout,list,all</value>
+ <value>scroll,timeout,list,update</value>
+ <value>scroll,update,all,timeout</value>
+ <value>scroll,update,all,list</value>
+ <value>scroll,update,timeout,all</value>
+ <value>scroll,update,timeout,list</value>
+ <value>scroll,update,list,all</value>
+ <value>scroll,update,list,timeout</value>
+ <value>scroll,list,all,timeout</value>
+ <value>scroll,list,all,update</value>
+ <value>scroll,list,timeout,all</value>
+ <value>scroll,list,timeout,update</value>
+ <value>scroll,list,update,all</value>
+ <value>scroll,list,update,timeout</value>
+ <value>all,timeout,update,list,scroll</value>
+ <value>all,timeout,update,scroll,list</value>
+ <value>all,timeout,list,update,scroll</value>
+ <value>all,timeout,list,scroll,update</value>
+ <value>all,timeout,scroll,update,list</value>
+ <value>all,timeout,scroll,list,update</value>
+ <value>all,update,timeout,list,scroll</value>
+ <value>all,update,timeout,scroll,list</value>
+ <value>all,update,list,timeout,scroll</value>
+ <value>all,update,list,scroll,timeout</value>
+ <value>all,update,scroll,timeout,list</value>
+ <value>all,update,scroll,list,timeout</value>
+ <value>all,list,timeout,update,scroll</value>
+ <value>all,list,timeout,scroll,update</value>
+ <value>all,list,update,timeout,scroll</value>
+ <value>all,list,update,scroll,timeout</value>
+ <value>all,list,scroll,timeout,update</value>
+ <value>all,list,scroll,update,timeout</value>
+ <value>all,scroll,timeout,update,list</value>
+ <value>all,scroll,timeout,list,update</value>
+ <value>all,scroll,update,timeout,list</value>
+ <value>all,scroll,update,list,timeout</value>
+ <value>all,scroll,list,timeout,update</value>
+ <value>all,scroll,list,update,timeout</value>
+ <value>timeout,all,update,list,scroll</value>
+ <value>timeout,all,update,scroll,list</value>
+ <value>timeout,all,list,update,scroll</value>
+ <value>timeout,all,list,scroll,update</value>
+ <value>timeout,all,scroll,update,list</value>
+ <value>timeout,all,scroll,list,update</value>
+ <value>timeout,update,all,list,scroll</value>
+ <value>timeout,update,all,scroll,list</value>
+ <value>timeout,update,list,all,scroll</value>
+ <value>timeout,update,list,scroll,all</value>
+ <value>timeout,update,scroll,all,list</value>
+ <value>timeout,update,scroll,list,all</value>
+ <value>timeout,list,all,update,scroll</value>
+ <value>timeout,list,all,scroll,update</value>
+ <value>timeout,list,update,all,scroll</value>
+ <value>timeout,list,update,scroll,all</value>
+ <value>timeout,list,scroll,all,update</value>
+ <value>timeout,list,scroll,update,all</value>
+ <value>timeout,scroll,all,update,list</value>
+ <value>timeout,scroll,all,list,update</value>
+ <value>timeout,scroll,update,all,list</value>
+ <value>timeout,scroll,update,list,all</value>
+ <value>timeout,scroll,list,all,update</value>
+ <value>timeout,scroll,list,update,all</value>
+ <value>update,all,timeout,list,scroll</value>
+ <value>update,all,timeout,scroll,list</value>
+ <value>update,all,list,timeout,scroll</value>
+ <value>update,all,list,scroll,timeout</value>
+ <value>update,all,scroll,timeout,list</value>
+ <value>update,all,scroll,list,timeout</value>
+ <value>update,timeout,all,list,scroll</value>
+ <value>update,timeout,all,scroll,list</value>
+ <value>update,timeout,list,all,scroll</value>
+ <value>update,timeout,list,scroll,all</value>
+ <value>update,timeout,scroll,all,list</value>
+ <value>update,timeout,scroll,list,all</value>
+ <value>update,list,all,timeout,scroll</value>
+ <value>update,list,all,scroll,timeout</value>
+ <value>update,list,timeout,all,scroll</value>
+ <value>update,list,timeout,scroll,all</value>
+ <value>update,list,scroll,all,timeout</value>
+ <value>update,list,scroll,timeout,all</value>
+ <value>update,scroll,all,timeout,list</value>
+ <value>update,scroll,all,list,timeout</value>
+ <value>update,scroll,timeout,all,list</value>
+ <value>update,scroll,timeout,list,all</value>
+ <value>update,scroll,list,all,timeout</value>
+ <value>update,scroll,list,timeout,all</value>
+ <value>list,all,timeout,update,scroll</value>
+ <value>list,all,timeout,scroll,update</value>
+ <value>list,all,update,timeout,scroll</value>
+ <value>list,all,update,scroll,timeout</value>
+ <value>list,all,scroll,timeout,update</value>
+ <value>list,all,scroll,update,timeout</value>
+ <value>list,timeout,all,update,scroll</value>
+ <value>list,timeout,all,scroll,update</value>
+ <value>list,timeout,update,all,scroll</value>
+ <value>list,timeout,update,scroll,all</value>
+ <value>list,timeout,scroll,all,update</value>
+ <value>list,timeout,scroll,update,all</value>
+ <value>list,update,all,timeout,scroll</value>
+ <value>list,update,all,scroll,timeout</value>
+ <value>list,update,timeout,all,scroll</value>
+ <value>list,update,timeout,scroll,all</value>
+ <value>list,update,scroll,all,timeout</value>
+ <value>list,update,scroll,timeout,all</value>
+ <value>list,scroll,all,timeout,update</value>
+ <value>list,scroll,all,update,timeout</value>
+ <value>list,scroll,timeout,all,update</value>
+ <value>list,scroll,timeout,update,all</value>
+ <value>list,scroll,update,all,timeout</value>
+ <value>list,scroll,update,timeout,all</value>
+ <value>scroll,all,timeout,update,list</value>
+ <value>scroll,all,timeout,list,update</value>
+ <value>scroll,all,update,timeout,list</value>
+ <value>scroll,all,update,list,timeout</value>
+ <value>scroll,all,list,timeout,update</value>
+ <value>scroll,all,list,update,timeout</value>
+ <value>scroll,timeout,all,update,list</value>
+ <value>scroll,timeout,all,list,update</value>
+ <value>scroll,timeout,update,all,list</value>
+ <value>scroll,timeout,update,list,all</value>
+ <value>scroll,timeout,list,all,update</value>
+ <value>scroll,timeout,list,update,all</value>
+ <value>scroll,update,all,timeout,list</value>
+ <value>scroll,update,all,list,timeout</value>
+ <value>scroll,update,timeout,all,list</value>
+ <value>scroll,update,timeout,list,all</value>
+ <value>scroll,update,list,all,timeout</value>
+ <value>scroll,update,list,timeout,all</value>
+ <value>scroll,list,all,timeout,update</value>
+ <value>scroll,list,all,update,timeout</value>
+ <value>scroll,list,timeout,all,update</value>
+ <value>scroll,list,timeout,update,all</value>
+ <value>scroll,list,update,all,timeout</value>
+ <value>scroll,list,update,timeout,all</value>
+ </choice>
+ </attribute>
+ </optional>
+ </define>
+
+ <!-- Attribute collections -->
+
+ <define name="commonAttributes">
+ <optional>
+ <attribute name="condition">
+ <ref name="nonEmptyNormalizedStringValue"/>
+ </attribute>
+ </optional>
+ <ref name="refreshAttribute"/>
+ <optional>
+ <attribute name="changed">
+ <ref name="nonEmptyNormalizedStringValue"/>
+ </attribute>
+ </optional>
+ </define>
+
+ <define name="positionAttributes">
+ <optional>
+ <attribute name="x1">
+ <ref name="xValue"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="y1">
+ <ref name="yValue"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="x2">
+ <ref name="xValue"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="y2">
+ <ref name="yValue"/>
+ </attribute>
+ </optional>
+ </define>
+
+ <define name="textAttributes">
+ <ref name="positionAttributes"/>
+ <ref name="commonAttributes"/>
+ <optional>
+ <attribute name="color">
+ <ref name="colorValue"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="bgColor">
+ <ref name="colorValue"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="align">
+ <choice>
+ <value>center</value>
+ <value>right</value>
+ <value>left</value>
+ </choice>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="font">
+ <data type="normalizedString">
+ <param name="pattern">[^@]+(@\d+(,\d+)?)?</param>
+ </data>
+ </attribute>
+ </optional>
+ </define>
+
+ <define name="widthHeightAttributes">
+ <optional>
+ <attribute name="w">
+ <!-- TODO -->
+ <ref name="xValue"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="h">
+ <!-- TODO -->
+ <ref name="yValue"/>
+ </attribute>
+ </optional>
+ </define>
+
+ <!-- Values -->
+
+ <define name="colorValue">
+ <!-- #AARRGGBB (hex) or symbolic name from *.colors (can't check) -->
+ <ref name="nonEmptyNormalizedStringValue"/>
+ </define>
+
+ <define name="nonEmptyNormalizedStringValue">
+ <data type="normalizedString">
+ <param name="minLength">1</param>
+ </data>
+ </define>
+
+ <define name="nonEmptyStringValue">
+ <data type="string">
+ <param name="minLength">1</param>
+ </data>
+ </define>
+
+ <define name="xValue">
+ <data type="integer">
+ <!-- TODO -->
+ <param name="minInclusive">-2000</param>
+ <param name="maxInclusive">2000</param>
+ </data>
+ </define>
+
+ <define name="yValue">
+ <data type="integer">
+ <!-- TODO -->
+ <param name="minInclusive">-2000</param>
+ <param name="maxInclusive">2000</param>
+ </data>
+ </define>
+
+</grammar>
diff --git a/HISTORY b/HISTORY
index d68ae1c..c3ba46b 100644
--- a/HISTORY
+++ b/HISTORY
@@ -5,6 +5,7 @@ VDR Plugin 'text2skin' Revision History
- Fix build with ImageMagick >= 6.6.2 (thanks to Anssi Hannula / closes #409)
- Documentation spelling fixes.
+- Added experimental RELAX NG schema for skin XML files.
2010-06-21: Version 1.3.1