summaryrefslogtreecommitdiff
path: root/app/src/main/java/org/terst/feedreader/data/FeedParser.kt
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/org/terst/feedreader/data/FeedParser.kt')
-rw-r--r--app/src/main/java/org/terst/feedreader/data/FeedParser.kt14
1 files changed, 12 insertions, 2 deletions
diff --git a/app/src/main/java/org/terst/feedreader/data/FeedParser.kt b/app/src/main/java/org/terst/feedreader/data/FeedParser.kt
index 735a707..629afe6 100644
--- a/app/src/main/java/org/terst/feedreader/data/FeedParser.kt
+++ b/app/src/main/java/org/terst/feedreader/data/FeedParser.kt
@@ -1,5 +1,6 @@
package org.terst.feedreader.data
+import android.text.Html
import android.util.Xml
import org.xmlpull.v1.XmlPullParser
import java.io.InputStream
@@ -33,6 +34,15 @@ data class ParsedFeed(
*/
object FeedParser {
+ // Some feeds (kottke.org among them) double-encode titles: the XML pull parser already
+ // resolves the outer XML escaping (& -> &), but what's left can itself still be
+ // HTML-entity-encoded text (e.g. a literal "“" or "’") that the feed author
+ // encoded as if for direct HTML embedding. Titles are shown as plain text (Compose Text,
+ // not a WebView), so that residual entity needs a second, explicit decode pass or it
+ // shows up on-screen literally as "“" instead of the curly quote it's meant to be.
+ private fun decodeTitleEntities(text: String): String =
+ Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY).toString()
+
fun parse(input: InputStream): ParsedFeed {
val parser = Xml.newPullParser()
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false)
@@ -79,7 +89,7 @@ object FeedParser {
itemDate = null; itemContent = null; itemDescription = null; itemImageUrl = null
}
"title" -> {
- val text = parser.nextText()
+ val text = decodeTitleEntities(parser.nextText())
if (inItem) itemTitle = text else feedTitle = text
}
"link" -> {
@@ -154,7 +164,7 @@ object FeedParser {
entryDate = null; entryContent = null; entrySummary = null; entryImageUrl = null
}
"title" -> {
- val text = parser.nextText()
+ val text = decodeTitleEntities(parser.nextText())
if (inEntry) entryTitle = text else feedTitle = text
}
"link" -> {