nodes which have
node(s) and append them into the `nodes` variable. // Some articles' DOM structures might look like //
// Sentences
//
// Sentences
//
var brNodes = doc.querySelectorAll("div > br"); if (brNodes.length) { var set = new Set(nodes); [].forEach.call(brNodes, function (node) { set.add(node.parentNode); }); nodes = Array.from(set); } var score = 0; // This is a little cheeky, we use the accumulator 'score' to decide what to return from // this callback: return [].some.call(nodes, function (node) { if (!options.visibilityChecker(node)) { return false; } var matchString = node.className + " " + node.id; if ( REGEXPS.unlikelyCandidates.test(matchString) && !REGEXPS.okMaybeItsACandidate.test(matchString) ) { return false; } if (node.matches("li p")) { return false; } var textContentLength = node.textContent.trim().length; if (textContentLength < options.minContentLength) { return false; } score += Math.sqrt(textContentLength - options.minContentLength); if (score > options.minScore) { return true; } return false; }); } if (typeof module === "object") { /* eslint-disable-next-line no-redeclare */ /* global module */ module.exports = isProbablyReaderable; } //@line 1 "$SRCDIR/toolkit/components/reader/Readerable.js" // -*- indent-tabs-mode: nil; js-indent-level: 2 -*- /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; // This file and Readability-readerable.js are merged together into // Readerable.sys.mjs. /* exported Readerable */ /* import-globals-from readability/Readability-readerable.js */ const { XPCOMUtils } = ChromeUtils.importESModule( "resource://gre/modules/XPCOMUtils.sys.mjs" ); var Readerable = { get isEnabledForParseOnLoad() { return this.isEnabled; }, /** * Decides whether or not a document is reader-able without parsing the whole thing. * * @param doc A document to parse. * @return boolean Whether or not we should show the reader mode button. */ isProbablyReaderable(doc) { // Only care about 'real' HTML documents: if ( doc.mozSyntheticDocument || !doc.defaultView.HTMLDocument.isInstance(doc) || doc.contentType == "application/pdf" ) { return false; } let uri = Services.io.newURI(doc.location.href); if (!this.shouldCheckUri(uri)) { return false; } return isProbablyReaderable(doc, this._isNodeVisible); }, _isNodeVisible(node) { return node.clientHeight > 0 && node.clientWidth > 0; }, _blockedHosts: [ "amazon.com", "github.com", "mail.google.com", "pinterest.com", "reddit.com", "twitter.com", "youtube.com", "app.slack.com", ], shouldCheckUri(uri, isBaseUri = false) { if (!["http", "https", "file", "moz-nullprincipal"].includes(uri.scheme)) { return false; } if (!isBaseUri && uri.scheme.startsWith("http")) { // Sadly, some high-profile pages have false positives, so bail early for those: let { host } = uri; if (this._blockedHosts.some(blockedHost => host.endsWith(blockedHost))) { // Allow github on non-project pages if ( host == "github.com" && !uri.filePath.includes("/projects") && !uri.filePath.includes("/issues") ) { return true; } return false; } if (uri.filePath == "/") { return false; } } return true; }, }; XPCOMUtils.defineLazyPreferenceGetter( Readerable, "isEnabled", "reader.parse-on-load.enabled", true ); //@line 8 "$SRCDIR/toolkit/components/reader/Readerable.sys.mjs" export { Readerable, isProbablyReaderable }; PK