Skip to content

Commit e35bd05

Browse files
committed
feat: check reading order of Media Overlays text elements
Report new error MED-015 when the order of text elements in a Media Overlay does not match the DOM order of the referenced elements in the corresponding content document(s). Applies PR #1180
1 parent 620e8ee commit e35bd05

File tree

13 files changed

+123
-12
lines changed

13 files changed

+123
-12
lines changed

src/main/java/com/adobe/epubcheck/messages/DefaultSeverities.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ private void initialize()
151151
severities.put(MessageId.MED_012, Severity.ERROR);
152152
severities.put(MessageId.MED_013, Severity.ERROR);
153153
severities.put(MessageId.MED_014, Severity.ERROR);
154+
severities.put(MessageId.MED_015, Severity.ERROR);
154155

155156
// NAV
156157
severities.put(MessageId.NAV_001, Severity.ERROR);

src/main/java/com/adobe/epubcheck/messages/MessageId.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ public enum MessageId implements Comparable<MessageId>
145145
MED_012("MED_012"),
146146
MED_013("MED_013"),
147147
MED_014("MED_014"),
148+
MED_015("MED_015"),
148149

149150
// Epub3 based table of content errors
150151
NAV_001("NAV-001"),

src/main/java/com/adobe/epubcheck/opf/XRefChecker.java

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ public static enum Type
6969
SEARCH_KEY,
7070
NAV_TOC_LINK,
7171
NAV_PAGELIST_LINK,
72+
OVERLAY_TEXT_LINK,
7273
PICTURE_SOURCE,
7374
PICTURE_SOURCE_FOREIGN;
7475
}
@@ -286,6 +287,7 @@ public void checkReferences()
286287
// if (checkReference(reference)) checkReferenceSubtypes(reference);
287288
Queue<Reference> tocLinks = new LinkedList<>();
288289
Queue<Reference> pageListLinks = new LinkedList<>();
290+
Queue<Reference> overlayLinks = new LinkedList<>();
289291
for (Reference reference : references)
290292
{
291293
switch (reference.type)
@@ -299,13 +301,17 @@ public void checkReferences()
299301
case NAV_PAGELIST_LINK:
300302
pageListLinks.add(reference);
301303
break;
304+
case OVERLAY_TEXT_LINK:
305+
overlayLinks.add(reference);
306+
break;
302307
default:
303308
checkReference(reference);
304309
break;
305310
}
306311
}
307312
checkReadingOrder(tocLinks, -1, -1);
308313
checkReadingOrder(pageListLinks, -1, -1);
314+
checkReadingOrder(overlayLinks, -1, -1);
309315
}
310316

311317
private void checkReference(Reference ref)
@@ -533,7 +539,7 @@ private void checkReadingOrder(Queue<Reference> references, int lastSpinePositio
533539
if (ref == null) return;
534540

535541
Preconditions
536-
.checkArgument(ref.type == Type.NAV_PAGELIST_LINK || ref.type == Type.NAV_TOC_LINK);
542+
.checkArgument(ref.type == Type.NAV_PAGELIST_LINK || ref.type == Type.NAV_TOC_LINK || ref.type == Type.OVERLAY_TEXT_LINK);
537543
Resource res = resources.get(ref.refResource);
538544

539545
// abort early if the link target is not a spine item (checked elsewhere)
@@ -545,11 +551,18 @@ private void checkReadingOrder(Queue<Reference> references, int lastSpinePositio
545551
{
546552
String orderContext = LocalizedMessages.getInstance(locale).getSuggestion(MessageId.NAV_011,
547553
"spine");
548-
report.message(MessageId.NAV_011,
549-
EPUBLocation.create(ref.source, ref.lineNumber, ref.columnNumber),
550-
(ref.type == Type.NAV_TOC_LINK) ? "toc" : "page-list", ref.value, orderContext);
551-
report.message(MessageId.INF_001,
552-
EPUBLocation.create(ref.source, ref.lineNumber, ref.columnNumber), "https://github.com/w3c/publ-epub-revision/issues/1283");
554+
555+
if (ref.type == Type.OVERLAY_TEXT_LINK) {
556+
report.message(MessageId.MED_015,
557+
EPUBLocation.create(ref.source, ref.lineNumber, ref.columnNumber), ref.value, orderContext);
558+
}
559+
else {
560+
report.message(MessageId.NAV_011,
561+
EPUBLocation.create(ref.source, ref.lineNumber, ref.columnNumber),
562+
(ref.type == Type.NAV_TOC_LINK) ? "toc" : "page-list", ref.value, orderContext);
563+
report.message(MessageId.INF_001,
564+
EPUBLocation.create(ref.source, ref.lineNumber, ref.columnNumber), "https://github.com/w3c/publ-epub-revision/issues/1283");
565+
}
553566
lastSpinePosition = targetSpinePosition;
554567
lastAnchorPosition = -1;
555568
}
@@ -569,11 +582,17 @@ private void checkReadingOrder(Queue<Reference> references, int lastSpinePositio
569582
{
570583
String orderContext = LocalizedMessages.getInstance(locale).getSuggestion(MessageId.NAV_011,
571584
"document");
572-
report.message(MessageId.NAV_011,
573-
EPUBLocation.create(ref.source, ref.lineNumber, ref.columnNumber),
574-
(ref.type == Type.NAV_TOC_LINK) ? "toc" : "page-list", ref.value, orderContext);
575-
report.message(MessageId.INF_001,
576-
EPUBLocation.create(ref.source, ref.lineNumber, ref.columnNumber), "https://github.com/w3c/publ-epub-revision/issues/1283");
585+
if (ref.type == Type.OVERLAY_TEXT_LINK) {
586+
report.message(MessageId.MED_015,
587+
EPUBLocation.create(ref.source, ref.lineNumber, ref.columnNumber), ref.value, orderContext);
588+
}
589+
else {
590+
report.message(MessageId.NAV_011,
591+
EPUBLocation.create(ref.source, ref.lineNumber, ref.columnNumber),
592+
(ref.type == Type.NAV_TOC_LINK) ? "toc" : "page-list", ref.value, orderContext);
593+
report.message(MessageId.INF_001,
594+
EPUBLocation.create(ref.source, ref.lineNumber, ref.columnNumber), "https://github.com/w3c/publ-epub-revision/issues/1283");
595+
}
577596
}
578597
lastAnchorPosition = targetAnchorPosition;
579598
}

src/main/java/com/adobe/epubcheck/overlay/OverlayHandler.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,17 @@ private void checkType(String type)
150150

151151
private void processTextSrc(XMLElement e)
152152
{
153-
processRef(e.getAttribute("src"), XRefChecker.Type.HYPERLINK);
153+
String src = e.getAttribute("src");
154+
155+
processRef(src, XRefChecker.Type.HYPERLINK);
156+
157+
String resolvedSrc = PathUtil.resolveRelativeReference(path, src);
158+
159+
if (context.xrefChecker.isPresent())
160+
{
161+
context.xrefChecker.get().registerReference(path, parser.getLineNumber(),
162+
parser.getColumnNumber(), resolvedSrc, XRefChecker.Type.OVERLAY_TEXT_LINK);
163+
}
154164
}
155165

156166
private void processAudioSrc(XMLElement e) {
@@ -163,6 +173,7 @@ private void processAudioSrc(XMLElement e) {
163173
{
164174
requiredProperties.add(ITEM_PROPERTIES.REMOTE_RESOURCES);
165175
}
176+
166177
}
167178

168179
private void processRef(String ref, XRefChecker.Type type)

src/main/resources/com/adobe/epubcheck/messages/MessageBundle.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ MED_011=EPUB Content Document referenced from multiple Media Overlay Documents.
138138
MED_012=The "media-overlay" attribute does not match the ID of the Media Overlay that refers to this document.
139139
MED_013=Media Overlay Document referenced from the "media-overlay" attribute does not contain a reference to this Content Document.
140140
MED_014=A non-empty fragment identifier is required.
141+
MED_015=Media overlay text references must be in reading order. Text target "%1$s" is before the previous link target in %2$s order.
141142

142143
#NAV EPUB v3 Table of contents
143144
NAV_001=The nav file is not supported for EPUB v2.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<smil xmlns="http://www.w3.org/ns/SMIL" xmlns:epub="http://www.idpf.org/2007/ops" version="3.0">
3+
<body>
4+
<par id="par1">
5+
<text src="content_001.xhtml#c01"/>
6+
<audio src="content_001.mp3"/>
7+
</par>
8+
<par id="par2">
9+
<text src="content_001.xhtml#c03"/>
10+
<audio src="content_001.mp3"/>
11+
</par>
12+
<par id="par3">
13+
<text src="content_001.xhtml#c02"/>
14+
<audio src="content_001.mp3"/>
15+
</par>
16+
</body>
17+
</smil>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<!DOCTYPE html>
2+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
3+
<head>
4+
<meta charset="utf-8" />
5+
<title>Minimal EPUB</title>
6+
</head>
7+
<body>
8+
<h1 id="c01">Loomings</h1>
9+
<h2 id="c02">Roomings</h2>
10+
<h2 id="c03">Zoomings</h2>
11+
</body>
12+
</html>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<!DOCTYPE html>
2+
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="en" lang="en">
3+
<head>
4+
<meta charset="utf-8"/>
5+
<title>Minimal Nav</title>
6+
</head>
7+
<body>
8+
<nav epub:type="toc">
9+
<ol>
10+
<li><a href="content_001.xhtml">content 001</a></li>
11+
</ol>
12+
</nav>
13+
</body>
14+
</html>
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<package xmlns="http://www.idpf.org/2007/opf" version="3.0" xml:lang="en" unique-identifier="q">
3+
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
4+
<dc:title id="title">Minimal EPUB 3.0</dc:title>
5+
<dc:language>en</dc:language>
6+
<dc:identifier id="q">NOID</dc:identifier>
7+
<meta property="dcterms:modified">2017-06-14T00:00:01Z</meta>
8+
<meta property="media:duration">2.5s</meta>
9+
<meta property="media:duration" refines="#mo_001">2.5s</meta>
10+
</metadata>
11+
<manifest>
12+
<item id="content_001" href="content_001.xhtml" media-type="application/xhtml+xml" media-overlay="mo_001"/>
13+
<item id="mo_001" href="content_001.smil" media-type="application/smil+xml"/>
14+
<item id="audio_001" href="content_001.mp3" media-type="audio/mpeg"/>
15+
<item id="nav" href="nav.xhtml" media-type="application/xhtml+xml" properties="nav"/>
16+
</manifest>
17+
<spine>
18+
<itemref idref="content_001" />
19+
</spine>
20+
</package>

0 commit comments

Comments
 (0)