diff --git a/src/main/java/com/adobe/epubcheck/messages/DefaultSeverities.java b/src/main/java/com/adobe/epubcheck/messages/DefaultSeverities.java index 3a242e949..0aa86617a 100644 --- a/src/main/java/com/adobe/epubcheck/messages/DefaultSeverities.java +++ b/src/main/java/com/adobe/epubcheck/messages/DefaultSeverities.java @@ -296,7 +296,7 @@ private void initialize() severities.put(MessageId.RSC_007, Severity.ERROR); severities.put(MessageId.RSC_007w, Severity.WARNING); severities.put(MessageId.RSC_008, Severity.ERROR); - severities.put(MessageId.RSC_009, Severity.ERROR); + severities.put(MessageId.RSC_009, Severity.WARNING); severities.put(MessageId.RSC_010, Severity.ERROR); severities.put(MessageId.RSC_011, Severity.ERROR); severities.put(MessageId.RSC_012, Severity.ERROR); diff --git a/src/main/java/com/adobe/epubcheck/opf/XRefChecker.java b/src/main/java/com/adobe/epubcheck/opf/XRefChecker.java index 2b74f671c..d077fe117 100755 --- a/src/main/java/com/adobe/epubcheck/opf/XRefChecker.java +++ b/src/main/java/com/adobe/epubcheck/opf/XRefChecker.java @@ -333,7 +333,7 @@ else if (!undeclared.contains(ref.refResource) } break; case IMAGE: - if (ref.fragment != null) + if (ref.fragment != null && !res.item.getMimeType().equals("image/svg+xml")) { report.message(MessageId.RSC_009, EPUBLocation.create(ref.source, ref.lineNumber, ref.columnNumber, ref.refResource + "#" + ref.fragment)); diff --git a/src/main/resources/com/adobe/epubcheck/messages/MessageBundle.properties b/src/main/resources/com/adobe/epubcheck/messages/MessageBundle.properties index 33fd778d7..0fb8ce790 100644 --- a/src/main/resources/com/adobe/epubcheck/messages/MessageBundle.properties +++ b/src/main/resources/com/adobe/epubcheck/messages/MessageBundle.properties @@ -305,7 +305,7 @@ RSC_006b=Resource '%1$s' is located outside the EPUB Container; please check the RSC_007=Referenced resource '%1$s' could not be found in the EPUB. RSC_007w=Referenced resource '%1$s' could not be found in the EPUB. RSC_008=Referenced resource '%1$s' is not declared in the OPF manifest. -RSC_009=A fragment identifier should not be used with an img src attribute. +RSC_009=A non-SVG image resource should not be defined with a fragment identifier. RSC_010=Reference to non-standard resource type found. RSC_011=Found a reference to a resource that is not a spine item. RSC_012=Fragment identifier is not defined. diff --git a/src/test/java/com/adobe/epubcheck/api/Epub30CheckExpandedTest.java b/src/test/java/com/adobe/epubcheck/api/Epub30CheckExpandedTest.java index b07991b0b..33c2c0f75 100644 --- a/src/test/java/com/adobe/epubcheck/api/Epub30CheckExpandedTest.java +++ b/src/test/java/com/adobe/epubcheck/api/Epub30CheckExpandedTest.java @@ -554,6 +554,22 @@ public void testValidateEPUB30_svgSwitch() testValidateDocument("valid/svg-switch/"); } + @Test + public void testValidateEPUB30_ImageFragmentIsSVG() + { + // tests that images can point to SVG fragments + testValidateDocument("valid/image-fragment-svg/"); + } + + @Test + public void testValidateEPUB30_ImageFragmentNotSVG() + { + // tests that non-SVG images defined as fragments are reported as WARNING + // (1 warning for an SVG 'image' element, 1 warning for an HTML 'img' element) + Collections.addAll(expectedWarnings, MessageId.RSC_009, MessageId.RSC_009); + testValidateDocument("invalid/image-fragment-non-svg/"); + } + @Test public void testValidateEPUB30_InvalidLinks() { diff --git a/src/test/java/com/adobe/epubcheck/ops/OPSCheckerTest.java b/src/test/java/com/adobe/epubcheck/ops/OPSCheckerTest.java index 2b3696303..2643162d6 100644 --- a/src/test/java/com/adobe/epubcheck/ops/OPSCheckerTest.java +++ b/src/test/java/com/adobe/epubcheck/ops/OPSCheckerTest.java @@ -756,6 +756,13 @@ public void testValidateSVG_DuplicateIds() Collections.addAll(expectedErrors, MessageId.RSC_005, MessageId.RSC_005); testValidateDocument("svg/invalid/duplicate-ids.svg", "image/svg+xml", EPUBVersion.VERSION_3); } + + @Test + public void testValidateSVG_ImageHrefWithAFragment() + { + // tests that SVG 'image' elements can have an 'xlink:href' URL pointing to a fragment + testValidateDocument("svg/valid/svg-image-fragment.svg", "image/svg+xml", EPUBVersion.VERSION_3); + } @Test diff --git a/src/test/resources/30/expanded/invalid/image-fragment-non-svg/META-INF/container.xml b/src/test/resources/30/expanded/invalid/image-fragment-non-svg/META-INF/container.xml new file mode 100644 index 000000000..cd9945b48 --- /dev/null +++ b/src/test/resources/30/expanded/invalid/image-fragment-non-svg/META-INF/container.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/test/resources/30/expanded/invalid/image-fragment-non-svg/OPS/content_001.xhtml b/src/test/resources/30/expanded/invalid/image-fragment-non-svg/OPS/content_001.xhtml new file mode 100644 index 000000000..1309e5b25 --- /dev/null +++ b/src/test/resources/30/expanded/invalid/image-fragment-non-svg/OPS/content_001.xhtml @@ -0,0 +1,18 @@ + + + + + Minimal EPUB + + +

Loomings

+

Call me Ishmael.

+ + Test + Image + + + rect + + diff --git a/src/test/resources/30/expanded/invalid/image-fragment-non-svg/OPS/image.jpg b/src/test/resources/30/expanded/invalid/image-fragment-non-svg/OPS/image.jpg new file mode 100644 index 000000000..ff336a51f Binary files /dev/null and b/src/test/resources/30/expanded/invalid/image-fragment-non-svg/OPS/image.jpg differ diff --git a/src/test/resources/30/expanded/invalid/image-fragment-non-svg/OPS/nav.xhtml b/src/test/resources/30/expanded/invalid/image-fragment-non-svg/OPS/nav.xhtml new file mode 100644 index 000000000..fb044b8c6 --- /dev/null +++ b/src/test/resources/30/expanded/invalid/image-fragment-non-svg/OPS/nav.xhtml @@ -0,0 +1,19 @@ + + + + + Minimal Nav + + + + + + diff --git a/src/test/resources/30/expanded/invalid/image-fragment-non-svg/OPS/package.opf b/src/test/resources/30/expanded/invalid/image-fragment-non-svg/OPS/package.opf new file mode 100644 index 000000000..5f667ce51 --- /dev/null +++ b/src/test/resources/30/expanded/invalid/image-fragment-non-svg/OPS/package.opf @@ -0,0 +1,17 @@ + + + + Minimal EPUB 3.0 + en + NOID + 2017-06-14T00:00:01Z + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/30/expanded/invalid/image-fragment-non-svg/mimetype b/src/test/resources/30/expanded/invalid/image-fragment-non-svg/mimetype new file mode 100644 index 000000000..57ef03f24 --- /dev/null +++ b/src/test/resources/30/expanded/invalid/image-fragment-non-svg/mimetype @@ -0,0 +1 @@ +application/epub+zip \ No newline at end of file diff --git a/src/test/resources/30/expanded/valid/image-fragment-svg/META-INF/container.xml b/src/test/resources/30/expanded/valid/image-fragment-svg/META-INF/container.xml new file mode 100644 index 000000000..cd9945b48 --- /dev/null +++ b/src/test/resources/30/expanded/valid/image-fragment-svg/META-INF/container.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/test/resources/30/expanded/valid/image-fragment-svg/OPS/content_001.xhtml b/src/test/resources/30/expanded/valid/image-fragment-svg/OPS/content_001.xhtml new file mode 100644 index 000000000..9db4b3c81 --- /dev/null +++ b/src/test/resources/30/expanded/valid/image-fragment-svg/OPS/content_001.xhtml @@ -0,0 +1,18 @@ + + + + + Minimal EPUB + + +

Loomings

+

Call me Ishmael.

+ + Test + Image + + + rect + + diff --git a/src/test/resources/30/expanded/valid/image-fragment-svg/OPS/images.svg b/src/test/resources/30/expanded/valid/image-fragment-svg/OPS/images.svg new file mode 100644 index 000000000..deb18b7dd --- /dev/null +++ b/src/test/resources/30/expanded/valid/image-fragment-svg/OPS/images.svg @@ -0,0 +1,8 @@ + + + Test + Images + + + + diff --git a/src/test/resources/30/expanded/valid/image-fragment-svg/OPS/nav.xhtml b/src/test/resources/30/expanded/valid/image-fragment-svg/OPS/nav.xhtml new file mode 100644 index 000000000..fb044b8c6 --- /dev/null +++ b/src/test/resources/30/expanded/valid/image-fragment-svg/OPS/nav.xhtml @@ -0,0 +1,19 @@ + + + + + Minimal Nav + + + + + + diff --git a/src/test/resources/30/expanded/valid/image-fragment-svg/OPS/package.opf b/src/test/resources/30/expanded/valid/image-fragment-svg/OPS/package.opf new file mode 100644 index 000000000..bf01d7965 --- /dev/null +++ b/src/test/resources/30/expanded/valid/image-fragment-svg/OPS/package.opf @@ -0,0 +1,17 @@ + + + + Minimal EPUB 3.0 + en + NOID + 2017-06-14T00:00:01Z + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/30/expanded/valid/image-fragment-svg/mimetype b/src/test/resources/30/expanded/valid/image-fragment-svg/mimetype new file mode 100644 index 000000000..57ef03f24 --- /dev/null +++ b/src/test/resources/30/expanded/valid/image-fragment-svg/mimetype @@ -0,0 +1 @@ +application/epub+zip \ No newline at end of file diff --git a/src/test/resources/30/single/svg/valid/svg-image-fragment.svg b/src/test/resources/30/single/svg/valid/svg-image-fragment.svg new file mode 100644 index 000000000..dca0194c9 --- /dev/null +++ b/src/test/resources/30/single/svg/valid/svg-image-fragment.svg @@ -0,0 +1,7 @@ + + + Test + Image + + diff --git a/src/test/resources/com/adobe/epubcheck/test/xhtml/hyperlinks_expected_results.json b/src/test/resources/com/adobe/epubcheck/test/xhtml/hyperlinks_expected_results.json index ddf3393e0..488b12a9e 100644 --- a/src/test/resources/com/adobe/epubcheck/test/xhtml/hyperlinks_expected_results.json +++ b/src/test/resources/com/adobe/epubcheck/test/xhtml/hyperlinks_expected_results.json @@ -239,8 +239,8 @@ "suggestion" : null }, { "ID" : "RSC-009", - "severity" : "ERROR", - "message" : "A fragment identifier should not be used with an img src attribute.", + "severity" : "WARNING", + "message" : "A non-SVG image resource should not be defined with a fragment identifier.", "additionalLocations" : 0, "locations" : [ { "path" : "OPS/links.xhtml", @@ -323,8 +323,8 @@ "checkDate" : "02-05-2019 15:52:58", "elapsedTime" : 74, "nFatal" : 0, - "nError" : 7, - "nWarning" : 2, + "nError" : 6, + "nWarning" : 3, "nUsage" : 6 }, "publication" : {