Skip to content

Commit bfb7239

Browse files
committed
feat: disallow epub:type on head and metadata content
This PR implements the latest post-CR update on where `epub:type` is allowed in HTML content (i.e. everywhere but the `head` element and metadata content). See w3c/epub-specs#2493 Fix #1444, Fix #1445
1 parent c8e9f45 commit bfb7239

File tree

8 files changed

+148
-88
lines changed

8 files changed

+148
-88
lines changed

src/main/resources/com/adobe/epubcheck/schema/30/mod/epub-mathml3-inc.rnc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ namespace local = ""
33
namespace x = "http://www.w3.org/1999/xhtml"
44
namespace ev = "http://www.w3.org/2001/xml-events"
55
namespace ssml = "http://www.w3.org/2001/10/synthesis"
6+
namespace epub = "http://www.idpf.org/2007/ops"
67

78
# #####################################################################
89
#
@@ -19,7 +20,7 @@ include "mathml/mathml3-inc.rnc" {
1920

2021
# extend to circumvent datatype collisions
2122
NonMathMLAtt =
22-
attribute * - (local:* | m:* | xml:* | x:* | ev:* | ssml:*) {
23+
attribute * - (local:* | m:* | xml:* | x:* | ev:* | ssml:* | epub:*) {
2324
datatype.string
2425
}
2526

@@ -30,6 +31,8 @@ include "mathml/mathml3-inc.rnc" {
3031
annotation-xml = epub.annotation-xml
3132
}
3233
# Common attribute extensions
34+
# - epub:type
35+
CommonAtt &= epub.type.attr?
3336
# - SSML attributes
3437
CommonAtt &= epub.ssml.ph.attr?
3538
# - xml:base

src/main/resources/com/adobe/epubcheck/schema/30/mod/epub-xhtml-integration.rnc

Lines changed: 119 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -7,89 +7,141 @@
77

88
## combine `epub:type`
99

10-
# Allow `epub:type` on the `body` element (even though
11-
# it is not defined as palpable content)
12-
body.attrs &= epub.type.attr?
13-
14-
# Allow `epub:type` on palpable content
10+
# Allow `epub:type` on all elements except:
11+
# - the `head` element
12+
# - metadata content (base, link, meta, noscript, script, style, template, title)
1513
#
1614
# Note:
1715
# We can't use a common category since none is defined
18-
# for palpable content. So we add it for each element.
19-
#
20-
# Some elements are only considered palpable under some
21-
# conditions; we do not support that at the moment.
22-
#
23-
a.attrs &= epub.type.attr?
24-
abbr.attrs &= epub.type.attr?
25-
address.attrs &= epub.type.attr?
26-
article.attrs &= epub.type.attr?
27-
aside.attrs &= epub.type.attr?
28-
audio.attrs &= epub.type.attr?
29-
b.attrs &= epub.type.attr?
30-
bdi.attrs &= epub.type.attr?
31-
bdo.attrs &= epub.type.attr?
32-
blockquote.attrs &= epub.type.attr?
33-
button.attrs &= epub.type.attr?
16+
# for non-metadata content. So we add it for each element.
17+
18+
# from applications.rnc
19+
progress.attrs &= epub.type.attr?
20+
dialog.attrs &= epub.type.attr?
21+
menu.attrs &= epub.type.attr?
22+
mli.attrs &= epub.type.attr?
3423
canvas.attrs &= epub.type.attr?
35-
cite.attrs &= epub.type.attr?
36-
code.attrs &= epub.type.attr?
37-
data.attrs &= epub.type.attr?
3824
details.attrs &= epub.type.attr?
39-
dfn.attrs &= epub.type.attr?
40-
div.attrs &= epub.type.attr?
25+
summary.attrs &= epub.type.attr?
26+
27+
# from block.rnc
28+
p.attrs &= epub.type.attr?
29+
hr.attrs &= epub.type.attr?
30+
pre.attrs &= epub.type.attr?
31+
ul.attrs &= epub.type.attr?
32+
li.attrs &= epub.type.attr?
33+
ol.attrs &= epub.type.attr?
34+
oli.attrs &= epub.type.attr?
4135
dl.attrs &= epub.type.attr?
42-
emembed.attrs &= epub.type.attr?
43-
fieldset.attrs &= epub.type.attr?
36+
dt.attrs &= epub.type.attr?
37+
dd.attrs &= epub.type.attr?
38+
div.attrs &= epub.type.attr?
39+
legend.attrs &= epub.type.attr?
40+
41+
# from data.rnc
42+
time.attrs &= epub.type.attr?
43+
time.datetime.attrs &= epub.type.attr?
44+
data.attrs &= epub.type.attr?
45+
meter.attrs &= epub.type.attr?
46+
47+
# from embed.rnc
48+
img.attrs &= epub.type.attr?
49+
picture.attrs &= epub.type.attr?
50+
embed.attrs &= epub.type.attr?
51+
object.attrs &= epub.type.attr?
52+
param.attrs &= epub.type.attr?
53+
iframe.attrs &= epub.type.attr?
54+
map.attrs &= epub.type.attr?
55+
area.attrs &= epub.type.attr?
56+
57+
# from media.rnc
58+
source.attrs &= epub.type.attr?
59+
video.attrs &= epub.type.attr?
60+
audio.attrs &= epub.type.attr?
61+
track.attrs &= epub.type.attr?
4462
figure.attrs &= epub.type.attr?
45-
footer.attrs &= epub.type.attr?
46-
form.attrs &= epub.type.attr?
63+
figcaption.attrs &= epub.type.attr?
64+
65+
# from meta.rnc
66+
html.attrs &= epub.type.attr?
67+
body.attrs &= epub.type.attr?
68+
69+
# from phrase.rnc
70+
a.href.attrs &= epub.type.attr?
71+
a.nohref.attrs &= epub.type.attr?
72+
em.attrs &= epub.type.attr?
73+
strong.attrs &= epub.type.attr?
74+
small.attrs &= epub.type.attr?
75+
mark.attrs &= epub.type.attr?
76+
abbr.attrs &= epub.type.attr?
77+
dfn.attrs &= epub.type.attr?
78+
i.attrs &= epub.type.attr?
79+
b.attrs &= epub.type.attr?
80+
s.attrs &= epub.type.attr?
81+
u.attrs &= epub.type.attr?
82+
code.attrs &= epub.type.attr?
83+
var.attrs &= epub.type.attr?
84+
samp.attrs &= epub.type.attr?
85+
kbd.attrs &= epub.type.attr?
86+
sup.attrs &= epub.type.attr?
87+
sub.attrs &= epub.type.attr?
88+
q.attrs &= epub.type.attr?
89+
cite.attrs &= epub.type.attr?
90+
span.attrs &= epub.type.attr?
91+
bdo.attrs &= epub.type.attr?
92+
bdi.attrs &= epub.type.attr?
93+
br.attrs &= epub.type.attr?
94+
wbr.attrs &= epub.type.attr?
95+
96+
# from revision.rnc
97+
ins.attrs &= epub.type.attr?
98+
del.attrs &= epub.type.attr?
99+
100+
# from ruby.rnc
101+
ruby.attrs &= epub.type.attr?
102+
rt.attrs &= epub.type.attr?
103+
rp.attrs &= epub.type.attr?
104+
105+
# from sectional.rnc
47106
h1.attrs &= epub.type.attr?
48107
h2.attrs &= epub.type.attr?
49108
h3.attrs &= epub.type.attr?
50109
h4.attrs &= epub.type.attr?
51110
h5.attrs &= epub.type.attr?
52111
h6.attrs &= epub.type.attr?
53-
header.attrs &= epub.type.attr?
54112
hgroup.attrs &= epub.type.attr?
55-
i.attrs &= epub.type.attr?
56-
iframe.attrs &= epub.type.attr?
57-
img.attrs &= epub.type.attr?
58-
input.attrs &= epub.type.attr?
59-
ins.attrs &= epub.type.attr?
60-
kbd.attrs &= epub.type.attr?
61-
label.attrs &= epub.type.attr?
62-
main.attrs &= epub.type.attr?
63-
map.attrs &= epub.type.attr?
64-
mark.attrs &= epub.type.attr?
65-
menu.attrs &= epub.type.attr?
66-
meter.attrs &= epub.type.attr?
67-
nav.attrs &= epub.type.attr?
68-
object.attrs &= epub.type.attr?
69-
ol.attrs &= epub.type.attr?
70-
output.attrs &= epub.type.attr?
71-
p.attrs &= epub.type.attr?
72-
pre.attrs &= epub.type.attr?
73-
progress.attrs &= epub.type.attr?
74-
q.attrs &= epub.type.attr?
75-
ruby.attrs &= epub.type.attr?
76-
s.attrs &= epub.type.attr?
77-
samp.attrs &= epub.type.attr?
113+
address.attrs &= epub.type.attr?
114+
blockquote.attrs &= epub.type.attr?
115+
116+
# from structural.rnc
78117
section.attrs &= epub.type.attr?
79-
select.attrs &= epub.type.attr?
80-
small.attrs &= epub.type.attr?
81-
span.attrs &= epub.type.attr?
82-
strong.attrs &= epub.type.attr?
83-
sub.attrs &= epub.type.attr?
84-
sup.attrs &= epub.type.attr?
118+
nav.attrs &= epub.type.attr?
119+
article.attrs &= epub.type.attr?
120+
aside.attrs &= epub.type.attr?
121+
header.attrs &= epub.type.attr?
122+
footer.attrs &= epub.type.attr?
123+
main.attrs &= epub.type.attr?
124+
125+
# from tables.rnc
85126
table.attrs &= epub.type.attr?
86-
text.attrs &= epub.type.attr?
87-
area.attrs &= epub.type.attr?
88-
time.attrs &= epub.type.attr?
89-
u.attrs &= epub.type.attr?
90-
ul.attrs &= epub.type.attr?
91-
var.attrs &= epub.type.attr?
92-
video.attrs &= epub.type.attr?
127+
caption.attrs &= epub.type.attr?
128+
colgroup.attrs &= epub.type.attr?
129+
thead.attrs &= epub.type.attr?
130+
tfoot.attrs &= epub.type.attr?
131+
tbody.attrs &= epub.type.attr?
132+
tr.attrs &= epub.type.attr?
133+
td.attrs &= epub.type.attr?
134+
th.attrs &= epub.type.attr?
135+
136+
# from web-forms.rnc and web-forms2.rnc
137+
common-form.attrs &= epub.type.attr?
138+
option.attrs &= epub.type.attr?
139+
optgroup.attrs &= epub.type.attr?
140+
form.attrs &= epub.type.attr?
141+
label.attrs &= epub.type.attr?
142+
output.attrs &= epub.type.attr?
143+
datalist.attrs &= epub.type.attr?
144+
93145

94146
## combine prefix attributes
95147

src/test/resources/epub-region-nav/region-nav-publication.feature

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,5 +91,4 @@ Feature: EPUB Region-Based Navigation ▸ Full Publication Checks
9191

9292
Scenario: Verify subregion navigation using comics semantics
9393
When checking EPUB 'region-based-nav-comics-valid'
94-
Then error RSC-005 is reported 4 times (non-palpable content)
9594
Then no errors or warnings are reported

src/test/resources/epub3/06-content-document/content-document-xhtml.feature

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -645,14 +645,15 @@ Feature: EPUB 3 — Content Documents — XHTML
645645

646646
#### 6.1.3.1 Structural semantics
647647

648-
Scenario: Verify `epub:type` attribute with valid semantic
648+
@spec @xref:sec-xhtml-structural-semantics
649+
Scenario: Verify `epub:type` attribute on allowed content
649650
When checking document 'epubtype-valid.xhtml'
650651
Then no errors or warnings are reported
651652

652653
@spec @xref:sec-xhtml-structural-semantics
653-
Scenario: Report `epub:type` attribute on non-palpable content
654-
When checking document 'epubtype-on-non-palpable-content-error.xhtml'
655-
Then error RSC-005 is reported 2 times
654+
Scenario: Report `epub:type` attribute on 'head' or metadata content
655+
When checking document 'epubtype-disallowed-error.xhtml'
656+
Then error RSC-005 is reported 8 times
656657
And no other errors or warnings are reported
657658

658659
Scenario: Verify `epub:type` attribute with reserved vocabulary
@@ -678,8 +679,7 @@ Feature: EPUB 3 — Content Documents — XHTML
678679

679680
Scenario: Verify `epub:type` attribute that does not follow usage suggestions
680681
Given the reporting level set to usage
681-
When checking document 'epubtype-disallowed-usage.xhtml'
682-
Then error RSC-005 is reported 3 times (non-palpable content)
682+
When checking document 'epubtype-misuse-usage.xhtml'
683683
Then usage OPF-087 is reported 7 times
684684
And no other errors or warnings are reported
685685

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<!DOCTYPE html>
2+
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops"
3+
epub:prefix="test: https://example.org/vocab/#" xml:lang="en" lang="en">
4+
<head epub:type="test:invalid">
5+
<meta epub:type="test:invalid" charset="utf-8" />
6+
<title epub:type="test:invalid">epub:type in head element</title>
7+
<meta epub:type="test:invalid" name="creator" content="Herman Melville" />
8+
<style epub:type="test:invalid"></style>
9+
<link epub:type="test:invalid" type="text/css" rel="stylesheet" href="style.css" />
10+
</head>
11+
<body>
12+
<script epub:type="test:invalid" src="script.js"></script>
13+
<noscript epub:type="test:invalid">text</noscript>
14+
<h1>Test</h1>
15+
<div></div>
16+
</body>
17+
</html>

src/test/resources/epub3/06-content-document/files/epubtype-on-non-palpable-content-error.xhtml

Lines changed: 0 additions & 13 deletions
This file was deleted.

src/test/resources/epub3/06-content-document/files/epubtype-valid.xhtml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,7 @@
1212
<h2>endnotes</h2>
1313
<div epub:type="endnote">endnote</div>
1414
</section>
15+
<a href="link.xhtml" epub:type="tip">link</a>
16+
<a epub:type="glossref">anchor</a>
1517
</body>
1618
</html>

0 commit comments

Comments
 (0)