Skip to content

Commit ef5b94c

Browse files
mattgarrishrdeltour
authored andcommitted
fix: improve RelaxNG datatypes of date/time/duration attributes
Updates the date/times/duration RelaxNG types to better align with the HTML definitions: - adds support for yearless dates, year-only dates, and durations for time/datetime - allows a space in addition to 'T' for separating dates and times - makes the colon optional in timezone offsets - limits seconds to three digits after a period Note: the handling of dates and times is much more limited in epubcheck than HTML allows. Some checks can really only be programmed; this change is more an interim step to future integration. Fix #775
1 parent 02397ec commit ef5b94c

File tree

4 files changed

+103
-4
lines changed

4 files changed

+103
-4
lines changed

src/main/resources/com/adobe/epubcheck/schema/30/mod/datatypes.rnc

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,19 +101,22 @@ div {
101101
datatype.html5.name = xsd:string
102102
datatype.html5.name.reference = xsd:string { pattern = "#.+" }
103103

104+
datatype.html5.year = xsd:token { pattern ='[0-9]{4}' }
105+
datatype.html5.yearless = xsd:token { pattern ='(--)?(0[0-9]|1[0-2])-(0[0-9]|[1-2][0-9]|3[0-1])' }
106+
datatype.html5.duration = xsd:token { pattern ='(((P[0-9]+D)|(P([0-9]+D)?T((([0-9]+H)([0-9]+M)?([0-9]+(\.[0-9]{1,3})?S)?)|(([0-9]+H)?([0-9]+M)([0-9]+(\.[0-9]{1,3})?S)?)|(([0-9]+H)?([0-9]+M)?([0-9]+(\.[0-9]{1,3})?S)))))|( *(([0-9]+ *[WDHM])|([0-9]+(\.[0-9]{1,3})? *S)) *)+)' }
104107
# http://www.w3.org/TR/html5/common-microsyntaxes.html#months
105108
datatype.html5.month = xsd:token { pattern ='([0-9]{4,})-([0-9]{2})' }
106109
# http://www.w3.org/TR/html5/common-microsyntaxes.html#dates
107110
datatype.html5.date = xsd:token { pattern ='([0-9]{4,})-([0-9]{2})-([0-9]{2})'}
108111
# http://www.w3.org/TR/html5/common-microsyntaxes.html#times
109-
datatype.html5.time = xsd:token { pattern ='([0-9]{2}):([0-9]{2})(:[0-9]{2}(\.[0-9]+)?)?'}
112+
datatype.html5.time = xsd:token { pattern ='([0-9]{2}):([0-9]{2})(:[0-9]{2}(\.[0-9]{1,3})?)?'}
110113
# http://www.w3.org/TR/html5/common-microsyntaxes.html#local-dates-and-times
111-
datatype.html5.datetime.local = xsd:token { pattern = '([0-9]{4,})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2})(:[0-9]{2}(\.[0-9]+)?)?' }
114+
datatype.html5.datetime.local = xsd:token { pattern = '([0-9]{4,})-([0-9]{2})-([0-9]{2})([T ])([0-9]{2}):([0-9]{2})(:[0-9]{2}(\.[0-9]{1,3})?)?' }
112115
# http://www.w3.org/TR/html5/common-microsyntaxes.html#global-dates-and-times
113-
datatype.html5.datetime.global = xsd:token { pattern = '([0-9]{4,})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2})(:[0-9]{2}(\.[0-9]+)?)?(Z|((\+|-)([0-9]{2}):([0-9]{2})))' }
116+
datatype.html5.datetime.global = xsd:token { pattern = '([0-9]{4,})-([0-9]{2})-([0-9]{2})([T ])([0-9]{2}):([0-9]{2})(:[0-9]{2}(\.[0-9]{1,3})?)?(Z|((\+|-)([0-9]{2}):?([0-9]{2})))?' }
114117
datatype.html5.datetime = datatype.html5.datetime.global
115118
# http://www.w3.org/TR/html5/common-microsyntaxes.html#vaguer-moments-in-time
116-
datatype.html5.date.or.time = datatype.html5.date | datatype.html5.month | datatype.html5.time | datatype.html5.datetime.global
119+
datatype.html5.date.or.time = datatype.html5.year | datatype.html5.yearless | datatype.html5.week | datatype.html5.date | datatype.html5.month | datatype.html5.time | datatype.html5.datetime.global | datatype.html5.duration
117120
# http://www.w3.org/TR/html5/common-microsyntaxes.html#vaguer-moments-in-time
118121
datatype.html5.date.optional.time = datatype.html5.date | datatype.html5.datetime.global
119122
datatype.html5.week = xsd:token { pattern ='([0-9]{4,})-W([0-9]{2})' }

src/test/java/com/adobe/epubcheck/ops/OPSCheckerTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1184,6 +1184,25 @@ public void testContentModel_TimeInTime()
11841184
testValidateDocument("xhtml/invalid/time-in-time.xhtml", "application/xhtml+xml",
11851185
EPUBVersion.VERSION_3);
11861186
}
1187+
1188+
@Test
1189+
public void testValidTimes()
1190+
{
1191+
testValidateDocument("xhtml/valid/times.xhtml", "application/xhtml+xml",
1192+
EPUBVersion.VERSION_3);
1193+
}
1194+
1195+
@Test
1196+
public void testInvalidTimes()
1197+
{
1198+
// tests that one error is raised for each invalid time attribute in the test file
1199+
for (int i = 0; i < 25; i++)
1200+
{
1201+
expectedErrors.add(MessageId.RSC_005);
1202+
}
1203+
testValidateDocument("xhtml/invalid/times.xhtml", "application/xhtml+xml",
1204+
EPUBVersion.VERSION_3);
1205+
}
11871206

11881207
@Test
11891208
public void testEntitiesValid()
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
3+
<head>
4+
<title>times</title>
5+
</head>
6+
<body>
7+
<ul>
8+
<li><time datetime="201">test</time></li>
9+
<li><time datetime="09999001">test</time></li>
10+
<li><time datetime="01--31">test</time></li>
11+
<li><time datetime="---12-31">test</time></li>
12+
<li><time datetime="3123-05-31-12">test</time></li>
13+
<li><time datetime="2019-01-25T 12:12:12Z">test</time></li>
14+
<li><time datetime="2019-01-2512:12:12">test</time></li>
15+
<li><time datetime="2019-01-25A12:12:12Z">test</time></li>
16+
<li><time datetime="2019-01-25T12:12:12-0500Z">test</time></li>
17+
<li><time datetime="2019-01-25 12:12:12-05 00">test</time></li>
18+
<li><time datetime="2019-01-25 12:12:12.33777">test</time></li>
19+
<li><time datetime="2018-W522">test</time></li>
20+
<li><time datetime="2019W01">test</time></li>
21+
<li><time datetime="08::40">test</time></li>
22+
<li><time datetime="19:24:291">test</time></li>
23+
<li><time datetime="14:08:59.999999">test</time></li>
24+
<li><time datetime="P32DT">test</time></li>
25+
<li><time datetime="P32D223T12H">test</time></li>
26+
<li><time datetime="P23DT32M12H">test</time></li>
27+
<li><time datetime="PT2.1112S">test</time></li>
28+
<li><time datetime="PT12H9">test</time></li>
29+
<li><time datetime="P12T431M">test</time></li>
30+
<li><time datetime="9123W12">test</time></li>
31+
<li><time datetime=" 1231 23D ">test</time></li>
32+
<li><time datetime="343HD">test</time></li>
33+
</ul>
34+
</body>
35+
</html>
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
3+
<head>
4+
<title>times</title>
5+
</head>
6+
<body>
7+
<ul>
8+
<li><time datetime="2019">test</time></li>
9+
<li><time datetime="0001">test</time></li>
10+
<li><time datetime="01-31">test</time></li>
11+
<li><time datetime="02-28">test</time></li>
12+
<li><time datetime="--12-31">test</time></li>
13+
<li><time datetime="3123-05-31">test</time></li>
14+
<li><time datetime="1200-08">test</time></li>
15+
<li><time datetime="2019-01-25T12:12:12Z">test</time></li>
16+
<li><time datetime="2019-01-25 12:12:12">test</time></li>
17+
<li><time datetime="2019-01-25 12:12:12Z">test</time></li>
18+
<li><time datetime="2019-01-25 12:12:12-0500">test</time></li>
19+
<li><time datetime="2019-01-25 12:12:12-05:00">test</time></li>
20+
<li><time datetime="2019-01-25 12:12:12.777">test</time></li>
21+
<li><time datetime="2018-W52">test</time></li>
22+
<li><time datetime="2019-W01">test</time></li>
23+
<li><time datetime="08:40">test</time></li>
24+
<li><time datetime="19:24:29">test</time></li>
25+
<li><time datetime="14:08:59.999">test</time></li>
26+
<li><time datetime="P32D">test</time></li>
27+
<li><time datetime="P32DT12H">test</time></li>
28+
<li><time datetime="P23DT12H32M1231S">test</time></li>
29+
<li><time datetime="PT12H23M12.112S">test</time></li>
30+
<li><time datetime="PT12H">test</time></li>
31+
<li><time datetime="PT431M">test</time></li>
32+
<li><time datetime="PT12.433S">test</time></li>
33+
<li><time datetime="9123W">test</time></li>
34+
<li><time datetime=" 123123D ">test</time></li>
35+
<li><time datetime="343H">test</time></li>
36+
<li><time datetime="1M">test</time></li>
37+
<li><time datetime="12S">test</time></li>
38+
<li><time datetime="12.12S">test</time></li>
39+
<li><time datetime="123W 123H 32D 12S">test</time></li>
40+
</ul>
41+
</body>
42+
</html>

0 commit comments

Comments
 (0)