Skip to content

Commit e7f21d6

Browse files
committed
Only normalize when comparing
1 parent 96963bd commit e7f21d6

File tree

13 files changed

+41
-15
lines changed

13 files changed

+41
-15
lines changed

readium/lcp/src/main/java/org/readium/r2/lcp/LcpDecryptor.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import org.readium.r2.shared.util.Try
2222
import org.readium.r2.shared.util.Url
2323
import org.readium.r2.shared.util.data.ReadError
2424
import org.readium.r2.shared.util.flatMap
25+
import org.readium.r2.shared.util.getEquivalent
2526
import org.readium.r2.shared.util.getOrElse
2627
import org.readium.r2.shared.util.resource.FailureResource
2728
import org.readium.r2.shared.util.resource.Resource
@@ -38,7 +39,7 @@ internal class LcpDecryptor(
3839

3940
fun transform(url: Url, resource: Resource): Resource {
4041
return resource.flatMap {
41-
val encryption = encryptionData[url]
42+
val encryption = encryptionData.getEquivalent(url)
4243

4344
// Checks if the resource is encrypted and whether the encryption schemes of the resource
4445
// and the DRM license are the same.

readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorFragment.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -615,13 +615,13 @@ public class EpubNavigatorFragment internal constructor(
615615

616616
listener?.onJumpToLocator(locator)
617617

618-
val href = locator.href.removeFragment().normalize()
618+
val href = locator.href.removeFragment()
619619

620620
fun setCurrent(resources: List<PageResource>) {
621621
val page = resources.withIndex().firstOrNull { (_, res) ->
622622
when (res) {
623623
is PageResource.EpubReflowable ->
624-
res.link.url() == href
624+
res.link.url().isEquivalent(href)
625625
is PageResource.EpubFxl ->
626626
res.leftUrl?.toString()?.endsWith(href.toString()) == true || res.rightUrl?.toString()?.endsWith(
627627
href.toString()

readium/navigator/src/main/java/org/readium/r2/navigator/extensions/Publication.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,12 @@ public fun Publication.normalizeLocator(locator: Locator): Locator {
3636

3737
return if (self == null) { // Packaged publication
3838
locator.copy(
39-
href = Url(locator.href.toString().removePrefix("/"))?.normalize()
39+
href = Url(locator.href.toString().removePrefix("/"))
4040
?: return locator
4141
)
4242
} else { // Remote publication
43-
// Check that the locator HREF relative to `self` exists int he manifest.
44-
val relativeHref = self.relativize(locator.href).normalize()
43+
// Check that the locator HREF relative to `self` exists in the manifest.
44+
val relativeHref = self.relativize(locator.href)
4545
if (linkWithHref(relativeHref) != null) {
4646
locator.copy(href = relativeHref)
4747
} else {

readium/shared/src/main/java/org/readium/r2/shared/publication/Href.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public class Href private constructor(private val href: Url) : Parcelable {
4848
public fun resolve(
4949
base: SharedUrl? = null,
5050
parameters: Map<String, String> = emptyMap()
51-
): SharedUrl = href.resolve(base, parameters).normalize()
51+
): SharedUrl = href.resolve(base, parameters)
5252

5353
/**
5454
* Indicates whether this HREF is templated.

readium/shared/src/main/java/org/readium/r2/shared/publication/Link.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public data class Link(
9292
public fun url(
9393
base: Url? = null,
9494
parameters: Map<String, String> = emptyMap()
95-
): Url = href.resolve(base, parameters).normalize()
95+
): Url = href.resolve(base, parameters)
9696

9797
/**
9898
* List of URI template parameter keys, if the [Link] is templated.

readium/shared/src/main/java/org/readium/r2/shared/publication/Manifest.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public data class Manifest(
6969
public fun linkWithHref(href: Url): Link? {
7070
fun List<Link>.deepLinkWithHref(href: Url): Link? {
7171
for (l in this) {
72-
if (l.url() == href) {
72+
if (l.url().normalize() == href) {
7373
return l
7474
} else {
7575
l.alternates.deepLinkWithHref(href)?.let { return it }

readium/shared/src/main/java/org/readium/r2/shared/util/Url.kt

+16
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,12 @@ public sealed class Url : Parcelable {
210210
return true
211211
}
212212

213+
/**
214+
* Returns whether the receiver is equivalent to the given `url` after normalization.
215+
*/
216+
public fun isEquivalent(url: Url): Boolean =
217+
normalize() == url.normalize()
218+
213219
override fun hashCode(): Int =
214220
uri.toString().hashCode()
215221

@@ -414,3 +420,13 @@ public value class FileExtension(
414420
*/
415421
public fun FileExtension?.appendToFilename(filename: String): String =
416422
this?.let { "$filename.$value" } ?: filename
423+
424+
/**
425+
* Returns the value of the first key matching `key` after normalization.
426+
*/
427+
public fun <T> Map<Url, T>.getEquivalent(key: Url): T? =
428+
get(key) ?: run {
429+
val url = key.normalize()
430+
keys.firstOrNull { it.normalize() == url }
431+
?.let { get(it) }
432+
}

readium/shared/src/main/java/org/readium/r2/shared/util/data/Caching.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package org.readium.r2.shared.util.data
88

99
import org.readium.r2.shared.util.Try
1010
import org.readium.r2.shared.util.Url
11+
import org.readium.r2.shared.util.getEquivalent
1112

1213
internal class CachingReadable(
1314
private val source: Readable
@@ -69,7 +70,7 @@ internal class CachingContainer(
6970
mutableMapOf()
7071

7172
override fun get(url: Url): Readable? {
72-
cache[url]?.let { return it }
73+
cache.getEquivalent(url)?.let { return it }
7374

7475
val entry = container[url]
7576
?: return null

readium/shared/src/main/java/org/readium/r2/shared/util/resource/SingleResourceContainer.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class SingleResourceContainer(
1818
override val entries: Set<Url> = setOf(entryUrl)
1919

2020
override fun get(url: Url): Resource? {
21-
if (url.removeFragment().removeQuery() != entryUrl) {
21+
if (!url.removeFragment().removeQuery().isEquivalent(entryUrl)) {
2222
return null
2323
}
2424

readium/shared/src/test/java/org/readium/r2/shared/util/format/TestContainer.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package org.readium.r2.shared.util.format
88

99
import org.readium.r2.shared.util.Url
1010
import org.readium.r2.shared.util.data.Container
11+
import org.readium.r2.shared.util.getEquivalent
1112
import org.readium.r2.shared.util.resource.Resource
1213
import org.readium.r2.shared.util.resource.StringResource
1314

@@ -25,7 +26,7 @@ class TestContainer(
2526
resources.keys
2627

2728
override fun get(url: Url): Resource? =
28-
resources[url]?.let { StringResource(it) }
29+
resources.getEquivalent(url)?.let { StringResource(it) }
2930

3031
override fun close() {}
3132
}

readium/streamer/src/main/java/org/readium/r2/streamer/parser/audio/AudioParser.kt

+4-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
package org.readium.r2.streamer.parser.audio
88

9+
import org.readium.r2.shared.InternalReadiumApi
910
import org.readium.r2.shared.publication.Link
1011
import org.readium.r2.shared.publication.LocalizedString
1112
import org.readium.r2.shared.publication.Manifest
@@ -22,6 +23,7 @@ import org.readium.r2.shared.util.data.Container
2223
import org.readium.r2.shared.util.data.ReadError
2324
import org.readium.r2.shared.util.format.Format
2425
import org.readium.r2.shared.util.format.Specification
26+
import org.readium.r2.shared.util.getEquivalent
2527
import org.readium.r2.shared.util.getOrElse
2628
import org.readium.r2.shared.util.logging.WarningLogger
2729
import org.readium.r2.shared.util.resource.Resource
@@ -66,6 +68,7 @@ public class AudioParser(
6668
return finalizeParsing(container, readingOrderWithFormat, null)
6769
}
6870

71+
@OptIn(InternalReadiumApi::class)
6972
private suspend fun parseContainerAsset(
7073
asset: ContainerAsset
7174
): Try<Publication.Builder, PublicationParser.ParseError> {
@@ -79,7 +82,7 @@ public class AudioParser(
7982

8083
val readingOrderWithFormat =
8184
asset.container
82-
.mapNotNull { url -> entryFormats[url]?.let { url to it } }
85+
.mapNotNull { url -> entryFormats.getEquivalent(url)?.let { url to it } }
8386
.filter { (_, format) -> format.specification.specifications.any { it in audioSpecifications } }
8487
.sortedBy { it.first.toString() }
8588

readium/streamer/src/main/java/org/readium/r2/streamer/parser/epub/EpubDeobfuscator.kt

+4-1
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77
package org.readium.r2.streamer.parser.epub
88

99
import kotlin.experimental.xor
10+
import org.readium.r2.shared.InternalReadiumApi
1011
import org.readium.r2.shared.publication.encryption.Encryption
1112
import org.readium.r2.shared.util.Try
1213
import org.readium.r2.shared.util.Url
1314
import org.readium.r2.shared.util.data.ReadError
1415
import org.readium.r2.shared.util.data.ReadTry
16+
import org.readium.r2.shared.util.getEquivalent
1517
import org.readium.r2.shared.util.resource.Resource
1618
import org.readium.r2.shared.util.resource.TransformingResource
1719
import org.readium.r2.shared.util.resource.flatMap
@@ -26,10 +28,11 @@ internal class EpubDeobfuscator(
2628
private val encryptionData: Map<Url, Encryption>
2729
) {
2830

31+
@OptIn(InternalReadiumApi::class)
2932
@Suppress("Unused_parameter")
3033
fun transform(url: Url, resource: Resource): Resource =
3134
resource.flatMap {
32-
val algorithm = encryptionData[url]?.algorithm
35+
val algorithm = encryptionData.getEquivalent(url)?.algorithm
3336
if (algorithm != null && algorithm2length.containsKey(algorithm)) {
3437
DeobfuscatingResource(resource, algorithm)
3538
} else {

readium/streamer/src/main/java/org/readium/r2/streamer/parser/image/ImageParser.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import org.readium.r2.shared.util.data.Container
2323
import org.readium.r2.shared.util.data.ReadError
2424
import org.readium.r2.shared.util.format.Format
2525
import org.readium.r2.shared.util.format.Specification
26+
import org.readium.r2.shared.util.getEquivalent
2627
import org.readium.r2.shared.util.getOrElse
2728
import org.readium.r2.shared.util.logging.WarningLogger
2829
import org.readium.r2.shared.util.mediatype.MediaType
@@ -81,7 +82,7 @@ public class ImageParser(
8182

8283
val readingOrderWithFormat =
8384
asset.container
84-
.mapNotNull { url -> entryFormats[url]?.let { url to it } }
85+
.mapNotNull { url -> entryFormats.getEquivalent(url)?.let { url to it } }
8586
.filter { (_, format) -> format.specification.specifications.any { it in bitmapSpecifications } }
8687
.sortedBy { it.first.toString() }
8788

0 commit comments

Comments
 (0)