summaryrefslogtreecommitdiff
path: root/app/src/main/java/org/terst/feedreader
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/org/terst/feedreader')
-rw-r--r--app/src/main/java/org/terst/feedreader/readability/ReaderExtractor.kt19
1 files changed, 19 insertions, 0 deletions
diff --git a/app/src/main/java/org/terst/feedreader/readability/ReaderExtractor.kt b/app/src/main/java/org/terst/feedreader/readability/ReaderExtractor.kt
index 286588a..28c762c 100644
--- a/app/src/main/java/org/terst/feedreader/readability/ReaderExtractor.kt
+++ b/app/src/main/java/org/terst/feedreader/readability/ReaderExtractor.kt
@@ -69,6 +69,25 @@ object ReaderExtractor {
val script = """
(function() {
try {
+ // Some "soft" paywalls deliver the full article in the initial HTML
+ // response to every visitor, then hide it with CSS (inline or via a
+ // stylesheet rule) pending a client-side subscription check -- the
+ // content itself isn't withheld by the server, only its visibility is.
+ // Readability has a built-in heuristic that skips anything hidden this
+ // way (treating it as boilerplate to discard), which is exactly what
+ // was throwing away real, already-delivered article text and leaving
+ // only the visible teaser/subscribe prompt. Un-hide before extracting --
+ // this must run on the live document (getComputedStyle needs a node
+ // attached to the render tree), so it happens before the clone below.
+ var all = document.querySelectorAll('*');
+ for (var i = 0; i < all.length; i++) {
+ var el = all[i];
+ var cs = window.getComputedStyle(el);
+ if (cs.display === 'none' || cs.visibility === 'hidden') {
+ el.style.setProperty('display', 'block', 'important');
+ el.style.setProperty('visibility', 'visible', 'important');
+ }
+ }
$readabilityJs
var article = new Readability(document.cloneNode(true)).parse();
return JSON.stringify(article);