mirror of
https://github.com/postlight/mercury-parser
synced 2024-10-31 03:20:40 +00:00
1 line
434 KiB
Plaintext
1 line
434 KiB
Plaintext
{"version":3,"file":null,"sources":["../src/utils/dom/constants.js","../src/utils/dom/brs-to-ps.js","../src/utils/dom/paragraphize.js","../src/utils/dom/convert-to-paragraphs.js","../src/utils/dom/convert-node-to.js","../src/utils/dom/clean-images.js","../src/utils/dom/strip-junk-tags.js","../src/utils/dom/clean-attributes.js","../src/extractors/generic/content/scoring/constants.js","../src/extractors/generic/content/scoring/get-weight.js","../src/extractors/generic/content/scoring/get-score.js","../src/extractors/generic/content/scoring/score-commas.js","../src/extractors/generic/content/scoring/score-length.js","../src/extractors/generic/content/scoring/score-paragraph.js","../src/extractors/generic/content/scoring/set-score.js","../src/extractors/generic/content/scoring/add-score.js","../src/extractors/generic/content/scoring/add-to-parent.js","../src/extractors/generic/content/scoring/get-or-init-score.js","../src/extractors/generic/content/scoring/score-node.js","../src/extractors/generic/content/scoring/score-content.js","../src/utils/text/normalize-spaces.js","../src/utils/text/extract-from-url.js","../src/utils/text/constants.js","../src/utils/text/article-base-url.js","../src/utils/text/has-sentence-end.js","../src/extractors/generic/content/scoring/merge-siblings.js","../src/extractors/generic/content/scoring/index.js","../src/utils/dom/clean-tags.js","../src/utils/dom/make-links-absolute.js","../src/utils/dom/link-density.js","../src/utils/dom/extract-from-selectors.js","../src/utils/dom/strip-tags.js","../src/utils/dom/within-comment.js","../src/utils/dom/node-is-sufficient.js","../src/utils/dom/get-attrs.js","../src/utils/dom/set-attr.js","../src/utils/dom/set-attrs.js","../src/utils/dom/index.js","mercury.js","../scripts/templates/insert-values.js","../scripts/templates/index.js","../scripts/templates/custom-extractor.js","../scripts/templates/custom-extractor-test.js","../scripts/generate-custom-parser.js"],"sourcesContent":["// Spacer images to be removed\nexport const SPACER_RE = new RegExp('transparent|spacer|blank', 'i');\n\n// The class we will use to mark elements we want to keep\n// but would normally remove\nexport const KEEP_CLASS = 'mercury-parser-keep';\n\nexport const KEEP_SELECTORS = [\n 'iframe[src^=\"https://www.youtube.com\"]',\n 'iframe[src^=\"https://www.youtube-nocookie.com\"]',\n 'iframe[src^=\"http://www.youtube.com\"]',\n 'iframe[src^=\"https://player.vimeo\"]',\n 'iframe[src^=\"http://player.vimeo\"]',\n];\n\n// A list of tags to strip from the output if we encounter them.\nexport const STRIP_OUTPUT_TAGS = [\n 'title',\n 'script',\n 'noscript',\n 'link',\n 'style',\n 'hr',\n 'embed',\n 'iframe',\n 'object',\n];\n\n// cleanAttributes\nexport const REMOVE_ATTRS = ['style', 'align'];\nexport const REMOVE_ATTR_SELECTORS = REMOVE_ATTRS.map(selector => `[${selector}]`);\nexport const REMOVE_ATTR_LIST = REMOVE_ATTRS.join(',');\nexport const WHITELIST_ATTRS = [\n 'src',\n 'srcset',\n 'href',\n 'class',\n 'id',\n 'alt',\n 'xlink:href',\n 'width',\n 'height',\n];\n\nexport const WHITELIST_ATTRS_RE = new RegExp(`^(${WHITELIST_ATTRS.join('|')})$`, 'i');\n\n// removeEmpty\nexport const REMOVE_EMPTY_TAGS = ['p'];\nexport const REMOVE_EMPTY_SELECTORS = REMOVE_EMPTY_TAGS.map(tag => `${tag}:empty`).join(',');\n\n// cleanTags\nexport const CLEAN_CONDITIONALLY_TAGS = ['ul', 'ol', 'table', 'div', 'button', 'form'].join(',');\n\n// cleanHeaders\nconst HEADER_TAGS = ['h2', 'h3', 'h4', 'h5', 'h6'];\nexport const HEADER_TAG_LIST = HEADER_TAGS.join(',');\n\n// // CONTENT FETCHING CONSTANTS ////\n\n// A list of strings that can be considered unlikely candidates when\n// extracting content from a resource. These strings are joined together\n// and then tested for existence using re:test, so may contain simple,\n// non-pipe style regular expression queries if necessary.\nexport const UNLIKELY_CANDIDATES_BLACKLIST = [\n 'ad-break',\n 'adbox',\n 'advert',\n 'addthis',\n 'agegate',\n 'aux',\n 'blogger-labels',\n 'combx',\n 'comment',\n 'conversation',\n 'disqus',\n 'entry-unrelated',\n 'extra',\n 'foot',\n // 'form', // This is too generic, has too many false positives\n 'header',\n 'hidden',\n 'loader',\n 'login', // Note: This can hit 'blogindex'.\n 'menu',\n 'meta',\n 'nav',\n 'outbrain',\n 'pager',\n 'pagination',\n 'predicta', // readwriteweb inline ad box\n 'presence_control_external', // lifehacker.com container full of false positives\n 'popup',\n 'printfriendly',\n 'related',\n 'remove',\n 'remark',\n 'rss',\n 'share',\n 'shoutbox',\n 'sidebar',\n 'sociable',\n 'sponsor',\n 'taboola',\n 'tools',\n];\n\n// A list of strings that can be considered LIKELY candidates when\n// extracting content from a resource. Essentially, the inverse of the\n// blacklist above - if something matches both blacklist and whitelist,\n// it is kept. This is useful, for example, if something has a className\n// of \"rss-content entry-content\". It matched 'rss', so it would normally\n// be removed, however, it's also the entry content, so it should be left\n// alone.\n//\n// These strings are joined together and then tested for existence using\n// re:test, so may contain simple, non-pipe style regular expression queries\n// if necessary.\nexport const UNLIKELY_CANDIDATES_WHITELIST = [\n 'and',\n 'article',\n 'body',\n 'blogindex',\n 'column',\n 'content',\n 'entry-content-asset',\n 'format', // misuse of form\n 'hfeed',\n 'hentry',\n 'hatom',\n 'main',\n 'page',\n 'posts',\n 'shadow',\n];\n\n// A list of tags which, if found inside, should cause a <div /> to NOT\n// be turned into a paragraph tag. Shallow div tags without these elements\n// should be turned into <p /> tags.\nexport const DIV_TO_P_BLOCK_TAGS = [\n 'a',\n 'blockquote',\n 'dl',\n 'div',\n 'img',\n 'p',\n 'pre',\n 'table',\n].join(',');\n\n// A list of tags that should be ignored when trying to find the top candidate\n// for a document.\nexport const NON_TOP_CANDIDATE_TAGS = [\n 'br',\n 'b',\n 'i',\n 'label',\n 'hr',\n 'area',\n 'base',\n 'basefont',\n 'input',\n 'img',\n 'link',\n 'meta',\n];\n\nexport const NON_TOP_CANDIDATE_TAGS_RE =\n new RegExp(`^(${NON_TOP_CANDIDATE_TAGS.join('|')})$`, 'i');\n\n// A list of selectors that specify, very clearly, either hNews or other\n// very content-specific style content, like Blogger templates.\n// More examples here: http://microformats.org/wiki/blog-post-formats\nexport const HNEWS_CONTENT_SELECTORS = [\n ['.hentry', '.entry-content'],\n ['entry', '.entry-content'],\n ['.entry', '.entry_content'],\n ['.post', '.postbody'],\n ['.post', '.post_body'],\n ['.post', '.post-body'],\n];\n\nexport const PHOTO_HINTS = [\n 'figure',\n 'photo',\n 'image',\n 'caption',\n];\nexport const PHOTO_HINTS_RE = new RegExp(PHOTO_HINTS.join('|'), 'i');\n\n// A list of strings that denote a positive scoring for this content as being\n// an article container. Checked against className and id.\n//\n// TODO: Perhaps have these scale based on their odds of being quality?\nexport const POSITIVE_SCORE_HINTS = [\n 'article',\n 'articlecontent',\n 'instapaper_body',\n 'blog',\n 'body',\n 'content',\n 'entry-content-asset',\n 'entry',\n 'hentry',\n 'main',\n 'Normal',\n 'page',\n 'pagination',\n 'permalink',\n 'post',\n 'story',\n 'text',\n '[-_]copy', // usatoday\n '\\\\Bcopy',\n];\n\n// The above list, joined into a matching regular expression\nexport const POSITIVE_SCORE_RE = new RegExp(POSITIVE_SCORE_HINTS.join('|'), 'i');\n\n// Readability publisher-specific guidelines\nexport const READABILITY_ASSET = new RegExp('entry-content-asset', 'i');\n\n// A list of strings that denote a negative scoring for this content as being\n// an article container. Checked against className and id.\n//\n// TODO: Perhaps have these scale based on their odds of being quality?\nexport const NEGATIVE_SCORE_HINTS = [\n 'adbox',\n 'advert',\n 'author',\n 'bio',\n 'bookmark',\n 'bottom',\n 'byline',\n 'clear',\n 'com-',\n 'combx',\n 'comment',\n 'comment\\\\B',\n 'contact',\n 'copy',\n 'credit',\n 'crumb',\n 'date',\n 'deck',\n 'excerpt',\n 'featured', // tnr.com has a featured_content which throws us off\n 'foot',\n 'footer',\n 'footnote',\n 'graf',\n 'head',\n 'info',\n 'infotext', // newscientist.com copyright\n 'instapaper_ignore',\n 'jump',\n 'linebreak',\n 'link',\n 'masthead',\n 'media',\n 'meta',\n 'modal',\n 'outbrain', // slate.com junk\n 'promo',\n 'pr_', // autoblog - press release\n 'related',\n 'respond',\n 'roundcontent', // lifehacker restricted content warning\n 'scroll',\n 'secondary',\n 'share',\n 'shopping',\n 'shoutbox',\n 'side',\n 'sidebar',\n 'sponsor',\n 'stamp',\n 'sub',\n 'summary',\n 'tags',\n 'tools',\n 'widget',\n];\n// The above list, joined into a matching regular expression\nexport const NEGATIVE_SCORE_RE = new RegExp(NEGATIVE_SCORE_HINTS.join('|'), 'i');\n\n// XPath to try to determine if a page is wordpress. Not always successful.\nexport const IS_WP_SELECTOR = 'meta[name=generator][value^=WordPress]';\n\n// Match a digit. Pretty clear.\nexport const DIGIT_RE = new RegExp('[0-9]');\n\n// A list of words that, if found in link text or URLs, likely mean that\n// this link is not a next page link.\nexport const EXTRANEOUS_LINK_HINTS = [\n 'print',\n 'archive',\n 'comment',\n 'discuss',\n 'e-mail',\n 'email',\n 'share',\n 'reply',\n 'all',\n 'login',\n 'sign',\n 'single',\n 'adx',\n 'entry-unrelated',\n];\nexport const EXTRANEOUS_LINK_HINTS_RE = new RegExp(EXTRANEOUS_LINK_HINTS.join('|'), 'i');\n\n// Match any phrase that looks like it could be page, or paging, or pagination\nexport const PAGE_RE = new RegExp('pag(e|ing|inat)', 'i');\n\n// Match any link text/classname/id that looks like it could mean the next\n// page. Things like: next, continue, >, >>, » but not >|, »| as those can\n// mean last page.\n// export const NEXT_LINK_TEXT_RE = new RegExp('(next|weiter|continue|>([^\\|]|$)|»([^\\|]|$))', 'i');\nexport const NEXT_LINK_TEXT_RE = /(next|weiter|continue|>([^|]|$)|»([^|]|$))/i;\n\n// Match any link text/classname/id that looks like it is an end link: things\n// like \"first\", \"last\", \"end\", etc.\nexport const CAP_LINK_TEXT_RE = new RegExp('(first|last|end)', 'i');\n\n// Match any link text/classname/id that looks like it means the previous\n// page.\nexport const PREV_LINK_TEXT_RE = new RegExp('(prev|earl|old|new|<|«)', 'i');\n\n// Match 2 or more consecutive <br> tags\nexport const BR_TAGS_RE = new RegExp('(<br[^>]*>[ \\n\\r\\t]*){2,}', 'i');\n\n// Match 1 BR tag.\nexport const BR_TAG_RE = new RegExp('<br[^>]*>', 'i');\n\n// A list of all of the block level tags known in HTML5 and below. Taken from\n// http://bit.ly/qneNIT\nexport const BLOCK_LEVEL_TAGS = [\n 'article',\n 'aside',\n 'blockquote',\n 'body',\n 'br',\n 'button',\n 'canvas',\n 'caption',\n 'col',\n 'colgroup',\n 'dd',\n 'div',\n 'dl',\n 'dt',\n 'embed',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'header',\n 'hgroup',\n 'hr',\n 'li',\n 'map',\n 'object',\n 'ol',\n 'output',\n 'p',\n 'pre',\n 'progress',\n 'section',\n 'table',\n 'tbody',\n 'textarea',\n 'tfoot',\n 'th',\n 'thead',\n 'tr',\n 'ul',\n 'video',\n];\nexport const BLOCK_LEVEL_TAGS_RE = new RegExp(`^(${BLOCK_LEVEL_TAGS.join('|')})$`, 'i');\n\n// The removal is implemented as a blacklist and whitelist, this test finds\n// blacklisted elements that aren't whitelisted. We do this all in one\n// expression-both because it's only one pass, and because this skips the\n// serialization for whitelisted nodes.\nconst candidatesBlacklist = UNLIKELY_CANDIDATES_BLACKLIST.join('|');\nexport const CANDIDATES_BLACKLIST = new RegExp(candidatesBlacklist, 'i');\n\nconst candidatesWhitelist = UNLIKELY_CANDIDATES_WHITELIST.join('|');\nexport const CANDIDATES_WHITELIST = new RegExp(candidatesWhitelist, 'i');\n\nexport const UNLIKELY_RE = new RegExp(`!(${candidatesWhitelist})|(${candidatesBlacklist})`, 'i');\n\nexport const PARAGRAPH_SCORE_TAGS = new RegExp('^(p|li|span|pre)$', 'i');\nexport const CHILD_CONTENT_TAGS = new RegExp('^(td|blockquote|ol|ul|dl)$', 'i');\nexport const BAD_TAGS = new RegExp('^(address|form)$', 'i');\n\nexport const HTML_OR_BODY_RE = new RegExp('^(html|body)$', 'i');\n","import { paragraphize } from './index';\n\n// ## NOTES:\n// Another good candidate for refactoring/optimizing.\n// Very imperative code, I don't love it. - AP\n\n// Given cheerio object, convert consecutive <br /> tags into\n// <p /> tags instead.\n//\n// :param $: A cheerio object\n\nexport default function brsToPs($) {\n let collapsing = false;\n $('br').each((index, element) => {\n const $element = $(element);\n const nextElement = $element.next().get(0);\n\n if (nextElement && nextElement.tagName.toLowerCase() === 'br') {\n collapsing = true;\n $element.remove();\n } else if (collapsing) {\n collapsing = false;\n // $(element).replaceWith('<p />')\n paragraphize(element, $, true);\n }\n });\n\n return $;\n}\n","import { BLOCK_LEVEL_TAGS_RE } from './constants';\n\n// Given a node, turn it into a P if it is not already a P, and\n// make sure it conforms to the constraints of a P tag (I.E. does\n// not contain any other block tags.)\n//\n// If the node is a <br />, it treats the following inline siblings\n// as if they were its children.\n//\n// :param node: The node to paragraphize; this is a raw node\n// :param $: The cheerio object to handle dom manipulation\n// :param br: Whether or not the passed node is a br\n\nexport default function paragraphize(node, $, br = false) {\n const $node = $(node);\n\n if (br) {\n let sibling = node.nextSibling;\n const p = $('<p></p>');\n\n // while the next node is text or not a block level element\n // append it to a new p node\n while (sibling && !(sibling.tagName && BLOCK_LEVEL_TAGS_RE.test(sibling.tagName))) {\n const nextSibling = sibling.nextSibling;\n $(sibling).appendTo(p);\n sibling = nextSibling;\n }\n\n $node.replaceWith(p);\n $node.remove();\n return $;\n }\n\n return $;\n}\n","import { brsToPs, convertNodeTo } from 'utils/dom';\n\nimport { DIV_TO_P_BLOCK_TAGS } from './constants';\n\nfunction convertDivs($) {\n $('div').each((index, div) => {\n const $div = $(div);\n const convertable = $div.children(DIV_TO_P_BLOCK_TAGS).length === 0;\n\n if (convertable) {\n convertNodeTo($div, $, 'p');\n }\n });\n\n return $;\n}\n\nfunction convertSpans($) {\n $('span').each((index, span) => {\n const $span = $(span);\n const convertable = $span.parents('p, div').length === 0;\n if (convertable) {\n convertNodeTo($span, $, 'p');\n }\n });\n\n return $;\n}\n\n// Loop through the provided doc, and convert any p-like elements to\n// actual paragraph tags.\n//\n// Things fitting this criteria:\n// * Multiple consecutive <br /> tags.\n// * <div /> tags without block level elements inside of them\n// * <span /> tags who are not children of <p /> or <div /> tags.\n//\n// :param $: A cheerio object to search\n// :return cheerio object with new p elements\n// (By-reference mutation, though. Returned just for convenience.)\n\nexport default function convertToParagraphs($) {\n $ = brsToPs($);\n $ = convertDivs($);\n $ = convertSpans($);\n\n return $;\n}\n","import { getAttrs } from 'utils/dom';\n\nexport default function convertNodeTo($node, $, tag = 'p') {\n const node = $node.get(0);\n if (!node) {\n return $;\n }\n const attrs = getAttrs(node) || {};\n // console.log(attrs)\n\n const attribString = Reflect.ownKeys(attrs)\n .map(key => `${key}=${attrs[key]}`)\n .join(' ');\n let html;\n\n if ($.browser) {\n // In the browser, the contents of noscript tags aren't rendered, therefore\n // transforms on the noscript tag (commonly used for lazy-loading) don't work\n // as expected. This test case handles that\n html = node.tagName.toLowerCase() === 'noscript' ? $node.text() : $node.html();\n } else {\n html = $node.contents();\n }\n $node.replaceWith(\n `<${tag} ${attribString}>${html}</${tag}>`\n );\n return $;\n}\n","import { SPACER_RE } from './constants';\n\nfunction cleanForHeight($img, $) {\n const height = parseInt($img.attr('height'), 10);\n const width = parseInt($img.attr('width'), 10) || 20;\n\n // Remove images that explicitly have very small heights or\n // widths, because they are most likely shims or icons,\n // which aren't very useful for reading.\n if ((height || 20) < 10 || width < 10) {\n $img.remove();\n } else if (height) {\n // Don't ever specify a height on images, so that we can\n // scale with respect to width without screwing up the\n // aspect ratio.\n $img.removeAttr('height');\n }\n\n return $;\n}\n\n// Cleans out images where the source string matches transparent/spacer/etc\n// TODO This seems very aggressive - AP\nfunction removeSpacers($img, $) {\n if (SPACER_RE.test($img.attr('src'))) {\n $img.remove();\n }\n\n return $;\n}\n\nexport default function cleanImages($article, $) {\n $article.find('img').each((index, img) => {\n const $img = $(img);\n\n cleanForHeight($img, $);\n removeSpacers($img, $);\n });\n\n return $;\n}\n","import {\n STRIP_OUTPUT_TAGS,\n KEEP_CLASS,\n} from './constants';\n\nexport default function stripJunkTags(article, $, tags = []) {\n if (tags.length === 0) {\n tags = STRIP_OUTPUT_TAGS;\n }\n\n // Remove matching elements, but ignore\n // any element with a class of mercury-parser-keep\n $(tags.join(','), article).not(`.${KEEP_CLASS}`).remove();\n\n return $;\n}\n","import {\n getAttrs,\n setAttrs,\n} from 'utils/dom';\n\nimport {\n WHITELIST_ATTRS_RE,\n KEEP_CLASS,\n} from './constants';\n\nfunction removeAllButWhitelist($article, $) {\n $article.find('*').each((index, node) => {\n const attrs = getAttrs(node);\n\n setAttrs(node, Reflect.ownKeys(attrs).reduce((acc, attr) => {\n if (WHITELIST_ATTRS_RE.test(attr)) {\n return { ...acc, [attr]: attrs[attr] };\n }\n\n return acc;\n }, {}));\n });\n\n // Remove the mercury-parser-keep class from result\n $(`.${KEEP_CLASS}`, $article).removeClass(KEEP_CLASS);\n\n return $article;\n}\n\n// function removeAttrs(article, $) {\n// REMOVE_ATTRS.forEach((attr) => {\n// $(`[${attr}]`, article).removeAttr(attr);\n// });\n// }\n\n// Remove attributes like style or align\nexport default function cleanAttributes($article, $) {\n // Grabbing the parent because at this point\n // $article will be wrapped in a div which will\n // have a score set on it.\n return removeAllButWhitelist(\n $article.parent().length ? $article.parent() : $article,\n $,\n );\n}\n","// // CONTENT FETCHING CONSTANTS ////\n\n// A list of strings that can be considered unlikely candidates when\n// extracting content from a resource. These strings are joined together\n// and then tested for existence using re:test, so may contain simple,\n// non-pipe style regular expression queries if necessary.\nexport const UNLIKELY_CANDIDATES_BLACKLIST = [\n 'ad-break',\n 'adbox',\n 'advert',\n 'addthis',\n 'agegate',\n 'aux',\n 'blogger-labels',\n 'combx',\n 'comment',\n 'conversation',\n 'disqus',\n 'entry-unrelated',\n 'extra',\n 'foot',\n 'form',\n 'header',\n 'hidden',\n 'loader',\n 'login', // Note: This can hit 'blogindex'.\n 'menu',\n 'meta',\n 'nav',\n 'pager',\n 'pagination',\n 'predicta', // readwriteweb inline ad box\n 'presence_control_external', // lifehacker.com container full of false positives\n 'popup',\n 'printfriendly',\n 'related',\n 'remove',\n 'remark',\n 'rss',\n 'share',\n 'shoutbox',\n 'sidebar',\n 'sociable',\n 'sponsor',\n 'tools',\n];\n\n// A list of strings that can be considered LIKELY candidates when\n// extracting content from a resource. Essentially, the inverse of the\n// blacklist above - if something matches both blacklist and whitelist,\n// it is kept. This is useful, for example, if something has a className\n// of \"rss-content entry-content\". It matched 'rss', so it would normally\n// be removed, however, it's also the entry content, so it should be left\n// alone.\n//\n// These strings are joined together and then tested for existence using\n// re:test, so may contain simple, non-pipe style regular expression queries\n// if necessary.\nexport const UNLIKELY_CANDIDATES_WHITELIST = [\n 'and',\n 'article',\n 'body',\n 'blogindex',\n 'column',\n 'content',\n 'entry-content-asset',\n 'format', // misuse of form\n 'hfeed',\n 'hentry',\n 'hatom',\n 'main',\n 'page',\n 'posts',\n 'shadow',\n];\n\n// A list of tags which, if found inside, should cause a <div /> to NOT\n// be turned into a paragraph tag. Shallow div tags without these elements\n// should be turned into <p /> tags.\nexport const DIV_TO_P_BLOCK_TAGS = [\n 'a',\n 'blockquote',\n 'dl',\n 'div',\n 'img',\n 'p',\n 'pre',\n 'table',\n].join(',');\n\n// A list of tags that should be ignored when trying to find the top candidate\n// for a document.\nexport const NON_TOP_CANDIDATE_TAGS = [\n 'br',\n 'b',\n 'i',\n 'label',\n 'hr',\n 'area',\n 'base',\n 'basefont',\n 'input',\n 'img',\n 'link',\n 'meta',\n];\n\nexport const NON_TOP_CANDIDATE_TAGS_RE =\n new RegExp(`^(${NON_TOP_CANDIDATE_TAGS.join('|')})$`, 'i');\n\n// A list of selectors that specify, very clearly, either hNews or other\n// very content-specific style content, like Blogger templates.\n// More examples here: http://microformats.org/wiki/blog-post-formats\nexport const HNEWS_CONTENT_SELECTORS = [\n ['.hentry', '.entry-content'],\n ['entry', '.entry-content'],\n ['.entry', '.entry_content'],\n ['.post', '.postbody'],\n ['.post', '.post_body'],\n ['.post', '.post-body'],\n];\n\nexport const PHOTO_HINTS = [\n 'figure',\n 'photo',\n 'image',\n 'caption',\n];\nexport const PHOTO_HINTS_RE = new RegExp(PHOTO_HINTS.join('|'), 'i');\n\n// A list of strings that denote a positive scoring for this content as being\n// an article container. Checked against className and id.\n//\n// TODO: Perhaps have these scale based on their odds of being quality?\nexport const POSITIVE_SCORE_HINTS = [\n 'article',\n 'articlecontent',\n 'instapaper_body',\n 'blog',\n 'body',\n 'content',\n 'entry-content-asset',\n 'entry',\n 'hentry',\n 'main',\n 'Normal',\n 'page',\n 'pagination',\n 'permalink',\n 'post',\n 'story',\n 'text',\n '[-_]copy', // usatoday\n '\\\\Bcopy',\n];\n\n// The above list, joined into a matching regular expression\nexport const POSITIVE_SCORE_RE = new RegExp(POSITIVE_SCORE_HINTS.join('|'), 'i');\n\n// Readability publisher-specific guidelines\nexport const READABILITY_ASSET = new RegExp('entry-content-asset', 'i');\n\n// A list of strings that denote a negative scoring for this content as being\n// an article container. Checked against className and id.\n//\n// TODO: Perhaps have these scale based on their odds of being quality?\nexport const NEGATIVE_SCORE_HINTS = [\n 'adbox',\n 'advert',\n 'author',\n 'bio',\n 'bookmark',\n 'bottom',\n 'byline',\n 'clear',\n 'com-',\n 'combx',\n 'comment',\n 'comment\\\\B',\n 'contact',\n 'copy',\n 'credit',\n 'crumb',\n 'date',\n 'deck',\n 'excerpt',\n 'featured', // tnr.com has a featured_content which throws us off\n 'foot',\n 'footer',\n 'footnote',\n 'graf',\n 'head',\n 'info',\n 'infotext', // newscientist.com copyright\n 'instapaper_ignore',\n 'jump',\n 'linebreak',\n 'link',\n 'masthead',\n 'media',\n 'meta',\n 'modal',\n 'outbrain', // slate.com junk\n 'promo',\n 'pr_', // autoblog - press release\n 'related',\n 'respond',\n 'roundcontent', // lifehacker restricted content warning\n 'scroll',\n 'secondary',\n 'share',\n 'shopping',\n 'shoutbox',\n 'side',\n 'sidebar',\n 'sponsor',\n 'stamp',\n 'sub',\n 'summary',\n 'tags',\n 'tools',\n 'widget',\n];\n// The above list, joined into a matching regular expression\nexport const NEGATIVE_SCORE_RE = new RegExp(NEGATIVE_SCORE_HINTS.join('|'), 'i');\n\n// Match a digit. Pretty clear.\nexport const DIGIT_RE = new RegExp('[0-9]');\n\n// Match 2 or more consecutive <br> tags\nexport const BR_TAGS_RE = new RegExp('(<br[^>]*>[ \\n\\r\\t]*){2,}', 'i');\n\n// Match 1 BR tag.\nexport const BR_TAG_RE = new RegExp('<br[^>]*>', 'i');\n\n// A list of all of the block level tags known in HTML5 and below. Taken from\n// http://bit.ly/qneNIT\nexport const BLOCK_LEVEL_TAGS = [\n 'article',\n 'aside',\n 'blockquote',\n 'body',\n 'br',\n 'button',\n 'canvas',\n 'caption',\n 'col',\n 'colgroup',\n 'dd',\n 'div',\n 'dl',\n 'dt',\n 'embed',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'header',\n 'hgroup',\n 'hr',\n 'li',\n 'map',\n 'object',\n 'ol',\n 'output',\n 'p',\n 'pre',\n 'progress',\n 'section',\n 'table',\n 'tbody',\n 'textarea',\n 'tfoot',\n 'th',\n 'thead',\n 'tr',\n 'ul',\n 'video',\n];\nexport const BLOCK_LEVEL_TAGS_RE = new RegExp(`^(${BLOCK_LEVEL_TAGS.join('|')})$`, 'i');\n\n// The removal is implemented as a blacklist and whitelist, this test finds\n// blacklisted elements that aren't whitelisted. We do this all in one\n// expression-both because it's only one pass, and because this skips the\n// serialization for whitelisted nodes.\nconst candidatesBlacklist = UNLIKELY_CANDIDATES_BLACKLIST.join('|');\nexport const CANDIDATES_BLACKLIST = new RegExp(candidatesBlacklist, 'i');\n\nconst candidatesWhitelist = UNLIKELY_CANDIDATES_WHITELIST.join('|');\nexport const CANDIDATES_WHITELIST = new RegExp(candidatesWhitelist, 'i');\n\nexport const UNLIKELY_RE = new RegExp(`!(${candidatesWhitelist})|(${candidatesBlacklist})`, 'i');\n\nexport const PARAGRAPH_SCORE_TAGS = new RegExp('^(p|li|span|pre)$', 'i');\nexport const CHILD_CONTENT_TAGS = new RegExp('^(td|blockquote|ol|ul|dl)$', 'i');\nexport const BAD_TAGS = new RegExp('^(address|form)$', 'i');\n\nexport const HTML_OR_BODY_RE = new RegExp('^(html|body)$', 'i');\n","import {\n NEGATIVE_SCORE_RE,\n POSITIVE_SCORE_RE,\n PHOTO_HINTS_RE,\n READABILITY_ASSET,\n} from './constants';\n\n// Get the score of a node based on its className and id.\nexport default function getWeight(node) {\n const classes = node.attr('class');\n const id = node.attr('id');\n let score = 0;\n\n if (id) {\n // if id exists, try to score on both positive and negative\n if (POSITIVE_SCORE_RE.test(id)) {\n score += 25;\n }\n if (NEGATIVE_SCORE_RE.test(id)) {\n score -= 25;\n }\n }\n\n if (classes) {\n if (score === 0) {\n // if classes exist and id did not contribute to score\n // try to score on both positive and negative\n if (POSITIVE_SCORE_RE.test(classes)) {\n score += 25;\n }\n if (NEGATIVE_SCORE_RE.test(classes)) {\n score -= 25;\n }\n }\n\n // even if score has been set by id, add score for\n // possible photo matches\n // \"try to keep photos if we can\"\n if (PHOTO_HINTS_RE.test(classes)) {\n score += 10;\n }\n\n // add 25 if class matches entry-content-asset,\n // a class apparently instructed for use in the\n // Readability publisher guidelines\n // https://www.readability.com/developers/guidelines\n if (READABILITY_ASSET.test(classes)) {\n score += 25;\n }\n }\n\n return score;\n}\n","// returns the score of a node based on\n// the node's score attribute\n// returns null if no score set\nexport default function getScore($node) {\n return parseFloat($node.attr('score')) || null;\n}\n","// return 1 for every comma in text\nexport default function scoreCommas(text) {\n return (text.match(/,/g) || []).length;\n}\n","const idkRe = new RegExp('^(p|pre)$', 'i');\n\nexport default function scoreLength(textLength, tagName = 'p') {\n const chunks = textLength / 50;\n\n if (chunks > 0) {\n let lengthBonus;\n\n // No idea why p or pre are being tamped down here\n // but just following the source for now\n // Not even sure why tagName is included here,\n // since this is only being called from the context\n // of scoreParagraph\n if (idkRe.test(tagName)) {\n lengthBonus = chunks - 2;\n } else {\n lengthBonus = chunks - 1.25;\n }\n\n return Math.min(Math.max(lengthBonus, 0), 3);\n }\n\n return 0;\n}\n","import {\n scoreCommas,\n scoreLength,\n} from './index';\n\n// Score a paragraph using various methods. Things like number of\n// commas, etc. Higher is better.\nexport default function scoreParagraph(node) {\n let score = 1;\n const text = node.text().trim();\n const textLength = text.length;\n\n // If this paragraph is less than 25 characters, don't count it.\n if (textLength < 25) {\n return 0;\n }\n\n // Add points for any commas within this paragraph\n score += scoreCommas(text);\n\n // For every 50 characters in this paragraph, add another point. Up\n // to 3 points.\n score += scoreLength(textLength);\n\n // Articles can end with short paragraphs when people are being clever\n // but they can also end with short paragraphs setting up lists of junk\n // that we strip. This negative tweaks junk setup paragraphs just below\n // the cutoff threshold.\n if (text.slice(-1) === ':') {\n score -= 1;\n }\n\n return score;\n}\n","export default function setScore($node, $, score) {\n $node.attr('score', score);\n return $node;\n}\n","import {\n getOrInitScore,\n setScore,\n} from './index';\n\nexport default function addScore($node, $, amount) {\n try {\n const score = getOrInitScore($node, $) + amount;\n setScore($node, $, score);\n } catch (e) {\n // Ignoring; error occurs in scoreNode\n }\n\n return $node;\n}\n","import { addScore } from './index';\n\n// Adds 1/4 of a child's score to its parent\nexport default function addToParent(node, $, score) {\n const parent = node.parent();\n if (parent) {\n addScore(parent, $, score * 0.25);\n }\n\n return node;\n}\n","import {\n getScore,\n scoreNode,\n getWeight,\n addToParent,\n} from './index';\n\n// gets and returns the score if it exists\n// if not, initializes a score based on\n// the node's tag type\nexport default function getOrInitScore($node, $, weightNodes = true) {\n let score = getScore($node);\n\n if (score) {\n return score;\n }\n\n score = scoreNode($node);\n\n if (weightNodes) {\n score += getWeight($node);\n }\n\n addToParent($node, $, score);\n\n return score;\n}\n","import { scoreParagraph } from './index';\nimport {\n PARAGRAPH_SCORE_TAGS,\n CHILD_CONTENT_TAGS,\n BAD_TAGS,\n} from './constants';\n\n// Score an individual node. Has some smarts for paragraphs, otherwise\n// just scores based on tag.\nexport default function scoreNode($node) {\n const { tagName } = $node.get(0);\n\n // TODO: Consider ordering by most likely.\n // E.g., if divs are a more common tag on a page,\n // Could save doing that regex test on every node – AP\n if (PARAGRAPH_SCORE_TAGS.test(tagName)) {\n return scoreParagraph($node);\n } else if (tagName.toLowerCase() === 'div') {\n return 5;\n } else if (CHILD_CONTENT_TAGS.test(tagName)) {\n return 3;\n } else if (BAD_TAGS.test(tagName)) {\n return -3;\n } else if (tagName.toLowerCase() === 'th') {\n return -5;\n }\n\n return 0;\n}\n","import { convertNodeTo } from 'utils/dom';\n\nimport { HNEWS_CONTENT_SELECTORS } from './constants';\nimport {\n scoreNode,\n setScore,\n getOrInitScore,\n addScore,\n} from './index';\n\nfunction convertSpans($node, $) {\n if ($node.get(0)) {\n const { tagName } = $node.get(0);\n\n if (tagName === 'span') {\n // convert spans to divs\n convertNodeTo($node, $, 'div');\n }\n }\n}\n\nfunction addScoreTo($node, $, score) {\n if ($node) {\n convertSpans($node, $);\n addScore($node, $, score);\n }\n}\n\nfunction scorePs($, weightNodes) {\n $('p, pre').not('[score]').each((index, node) => {\n // The raw score for this paragraph, before we add any parent/child\n // scores.\n let $node = $(node);\n $node = setScore($node, $, getOrInitScore($node, $, weightNodes));\n\n const $parent = $node.parent();\n const rawScore = scoreNode($node);\n\n addScoreTo($parent, $, rawScore, weightNodes);\n if ($parent) {\n // Add half of the individual content score to the\n // grandparent\n addScoreTo($parent.parent(), $, rawScore / 2, weightNodes);\n }\n });\n\n return $;\n}\n\n// score content. Parents get the full value of their children's\n// content score, grandparents half\nexport default function scoreContent($, weightNodes = true) {\n // First, look for special hNews based selectors and give them a big\n // boost, if they exist\n HNEWS_CONTENT_SELECTORS.forEach(([parentSelector, childSelector]) => {\n $(`${parentSelector} ${childSelector}`).each((index, node) => {\n addScore($(node).parent(parentSelector), $, 80);\n });\n });\n\n // Doubling this again\n // Previous solution caused a bug\n // in which parents weren't retaining\n // scores. This is not ideal, and\n // should be fixed.\n scorePs($, weightNodes);\n scorePs($, weightNodes);\n\n return $;\n}\n","const NORMALIZE_RE = /\\s{2,}/g;\n\nexport default function normalizeSpaces(text) {\n return text.replace(NORMALIZE_RE, ' ').trim();\n}\n","// Given a node type to search for, and a list of regular expressions,\n// look to see if this extraction can be found in the URL. Expects\n// that each expression in r_list will return group(1) as the proper\n// string to be cleaned.\n// Only used for date_published currently.\nexport default function extractFromUrl(url, regexList) {\n const matchRe = regexList.find(re => re.test(url));\n if (matchRe) {\n return matchRe.exec(url)[1];\n }\n\n return null;\n}\n","// An expression that looks to try to find the page digit within a URL, if\n// it exists.\n// Matches:\n// page=1\n// pg=1\n// p=1\n// paging=12\n// pag=7\n// pagination/1\n// paging/88\n// pa/83\n// p/11\n//\n// Does not match:\n// pg=102\n// page:2\nexport const PAGE_IN_HREF_RE = new RegExp('(page|paging|(p(a|g|ag)?(e|enum|ewanted|ing|ination)))?(=|/)([0-9]{1,3})', 'i');\n\nexport const HAS_ALPHA_RE = /[a-z]/i;\n\nexport const IS_ALPHA_RE = /^[a-z]+$/i;\nexport const IS_DIGIT_RE = /^[0-9]+$/i;\n\nexport const ENCODING_RE = /charset=([\\w-]+)\\b/;\nexport const DEFAULT_ENCODING = 'utf-8';\n","import URL from 'url';\n\nimport {\n HAS_ALPHA_RE,\n IS_ALPHA_RE,\n IS_DIGIT_RE,\n PAGE_IN_HREF_RE,\n} from './constants';\n\nfunction isGoodSegment(segment, index, firstSegmentHasLetters) {\n let goodSegment = true;\n\n // If this is purely a number, and it's the first or second\n // url_segment, it's probably a page number. Remove it.\n if (index < 2 && IS_DIGIT_RE.test(segment) && segment.length < 3) {\n goodSegment = true;\n }\n\n // If this is the first url_segment and it's just \"index\",\n // remove it\n if (index === 0 && segment.toLowerCase() === 'index') {\n goodSegment = false;\n }\n\n // If our first or second url_segment is smaller than 3 characters,\n // and the first url_segment had no alphas, remove it.\n if (index < 2 && segment.length < 3 && !firstSegmentHasLetters) {\n goodSegment = false;\n }\n\n return goodSegment;\n}\n\n// Take a URL, and return the article base of said URL. That is, no\n// pagination data exists in it. Useful for comparing to other links\n// that might have pagination data within them.\nexport default function articleBaseUrl(url, parsed) {\n const parsedUrl = parsed || URL.parse(url);\n const { protocol, host, path } = parsedUrl;\n\n let firstSegmentHasLetters = false;\n const cleanedSegments = path.split('/')\n .reverse()\n .reduce((acc, rawSegment, index) => {\n let segment = rawSegment;\n\n // Split off and save anything that looks like a file type.\n if (segment.includes('.')) {\n const [possibleSegment, fileExt] = segment.split('.');\n if (IS_ALPHA_RE.test(fileExt)) {\n segment = possibleSegment;\n }\n }\n\n // If our first or second segment has anything looking like a page\n // number, remove it.\n if (PAGE_IN_HREF_RE.test(segment) && index < 2) {\n segment = segment.replace(PAGE_IN_HREF_RE, '');\n }\n\n // If we're on the first segment, check to see if we have any\n // characters in it. The first segment is actually the last bit of\n // the URL, and this will be helpful to determine if we're on a URL\n // segment that looks like \"/2/\" for example.\n if (index === 0) {\n firstSegmentHasLetters = HAS_ALPHA_RE.test(segment);\n }\n\n // If it's not marked for deletion, push it to cleaned_segments.\n if (isGoodSegment(segment, index, firstSegmentHasLetters)) {\n acc.push(segment);\n }\n\n return acc;\n }, []);\n\n return `${protocol}//${host}${cleanedSegments.reverse().join('/')}`;\n}\n","// Given a string, return True if it appears to have an ending sentence\n// within it, false otherwise.\nconst SENTENCE_END_RE = new RegExp('.( |$)');\nexport default function hasSentenceEnd(text) {\n return SENTENCE_END_RE.test(text);\n}\n","import {\n textLength,\n linkDensity,\n} from 'utils/dom';\nimport { hasSentenceEnd } from 'utils/text';\n\nimport { NON_TOP_CANDIDATE_TAGS_RE } from './constants';\nimport { getScore } from './index';\n\n// Now that we have a top_candidate, look through the siblings of\n// it to see if any of them are decently scored. If they are, they\n// may be split parts of the content (Like two divs, a preamble and\n// a body.) Example:\n// http://articles.latimes.com/2009/oct/14/business/fi-bigtvs14\nexport default function mergeSiblings($candidate, topScore, $) {\n if (!$candidate.parent().length) {\n return $candidate;\n }\n\n const siblingScoreThreshold = Math.max(10, topScore * 0.25);\n const wrappingDiv = $('<div></div>');\n\n $candidate.parent().children().each((index, sibling) => {\n const $sibling = $(sibling);\n // Ignore tags like BR, HR, etc\n if (NON_TOP_CANDIDATE_TAGS_RE.test(sibling.tagName)) {\n return null;\n }\n\n const siblingScore = getScore($sibling);\n if (siblingScore) {\n if ($sibling.get(0) === $candidate.get(0)) {\n wrappingDiv.append($sibling);\n } else {\n let contentBonus = 0;\n const density = linkDensity($sibling);\n\n // If sibling has a very low link density,\n // give it a small bonus\n if (density < 0.05) {\n contentBonus += 20;\n }\n\n // If sibling has a high link density,\n // give it a penalty\n if (density >= 0.5) {\n contentBonus -= 20;\n }\n\n // If sibling node has the same class as\n // candidate, give it a bonus\n if ($sibling.attr('class') === $candidate.attr('class')) {\n contentBonus += topScore * 0.2;\n }\n\n const newScore = siblingScore + contentBonus;\n\n if (newScore >= siblingScoreThreshold) {\n return wrappingDiv.append($sibling);\n } else if (sibling.tagName === 'p') {\n const siblingContent = $sibling.text();\n const siblingContentLength = textLength(siblingContent);\n\n if (siblingContentLength > 80 && density < 0.25) {\n return wrappingDiv.append($sibling);\n } else if (siblingContentLength <= 80 && density === 0 &&\n hasSentenceEnd(siblingContent)) {\n return wrappingDiv.append($sibling);\n }\n }\n }\n }\n\n return null;\n });\n\n if (wrappingDiv.children().length === 1 &&\n wrappingDiv.children().first().get(0) === $candidate.get(0)) {\n return $candidate;\n }\n\n return wrappingDiv;\n}\n","// Scoring\nexport { default as getWeight } from './get-weight';\nexport { default as getScore } from './get-score';\nexport { default as scoreCommas } from './score-commas';\nexport { default as scoreLength } from './score-length';\nexport { default as scoreParagraph } from './score-paragraph';\nexport { default as setScore } from './set-score';\nexport { default as addScore } from './add-score';\nexport { default as addToParent } from './add-to-parent';\nexport { default as getOrInitScore } from './get-or-init-score';\nexport { default as scoreNode } from './score-node';\nexport { default as scoreContent } from './score-content';\nexport { default as findTopCandidate } from './find-top-candidate';\n","import {\n getScore,\n setScore,\n getOrInitScore,\n scoreCommas,\n} from 'extractors/generic/content/scoring';\n\nimport {\n CLEAN_CONDITIONALLY_TAGS,\n KEEP_CLASS,\n} from './constants';\nimport { normalizeSpaces } from '../text';\nimport { linkDensity } from './index';\n\nfunction removeUnlessContent($node, $, weight) {\n // Explicitly save entry-content-asset tags, which are\n // noted as valuable in the Publisher guidelines. For now\n // this works everywhere. We may want to consider making\n // this less of a sure-thing later.\n if ($node.hasClass('entry-content-asset')) {\n return;\n }\n\n const content = normalizeSpaces($node.text());\n\n if (scoreCommas(content) < 10) {\n const pCount = $('p', $node).length;\n const inputCount = $('input', $node).length;\n\n // Looks like a form, too many inputs.\n if (inputCount > (pCount / 3)) {\n $node.remove();\n return;\n }\n\n const contentLength = content.length;\n const imgCount = $('img', $node).length;\n\n // Content is too short, and there are no images, so\n // this is probably junk content.\n if (contentLength < 25 && imgCount === 0) {\n $node.remove();\n return;\n }\n\n const density = linkDensity($node);\n\n // Too high of link density, is probably a menu or\n // something similar.\n // console.log(weight, density, contentLength)\n if (weight < 25 && density > 0.2 && contentLength > 75) {\n $node.remove();\n return;\n }\n\n // Too high of a link density, despite the score being\n // high.\n if (weight >= 25 && density > 0.5) {\n // Don't remove the node if it's a list and the\n // previous sibling starts with a colon though. That\n // means it's probably content.\n const tagName = $node.get(0).tagName.toLowerCase();\n const nodeIsList = tagName === 'ol' || tagName === 'ul';\n if (nodeIsList) {\n const previousNode = $node.prev();\n if (previousNode && normalizeSpaces(previousNode.text()).slice(-1) === ':') {\n return;\n }\n }\n\n $node.remove();\n return;\n }\n\n const scriptCount = $('script', $node).length;\n\n // Too many script tags, not enough content.\n if (scriptCount > 0 && contentLength < 150) {\n $node.remove();\n return;\n }\n }\n}\n\n// Given an article, clean it of some superfluous content specified by\n// tags. Things like forms, ads, etc.\n//\n// Tags is an array of tag name's to search through. (like div, form,\n// etc)\n//\n// Return this same doc.\nexport default function cleanTags($article, $) {\n $(CLEAN_CONDITIONALLY_TAGS, $article).each((index, node) => {\n const $node = $(node);\n // If marked to keep, skip it\n if ($node.hasClass(KEEP_CLASS) || $node.find(`.${KEEP_CLASS}`).length > 0) return;\n\n let weight = getScore($node);\n if (!weight) {\n weight = getOrInitScore($node, $);\n setScore($node, $, weight);\n }\n\n // drop node if its weight is < 0\n if (weight < 0) {\n $node.remove();\n } else {\n // deteremine if node seems like content\n removeUnlessContent($node, $, weight);\n }\n });\n\n return $;\n}\n","import URL from 'url';\n\nimport {\n getAttrs,\n setAttr,\n} from 'utils/dom';\n\nfunction absolutize($, rootUrl, attr, $content) {\n $(`[${attr}]`, $content).each((_, node) => {\n const attrs = getAttrs(node);\n const url = attrs[attr];\n\n if (url) {\n const absoluteUrl = URL.resolve(rootUrl, url);\n setAttr(node, attr, absoluteUrl);\n }\n });\n}\n\nexport default function makeLinksAbsolute($content, $, url) {\n ['href', 'src'].forEach(attr => absolutize($, url, attr, $content));\n\n return $content;\n}\n","export function textLength(text) {\n return text.trim()\n .replace(/\\s+/g, ' ')\n .length;\n}\n\n// Determines what percentage of the text\n// in a node is link text\n// Takes a node, returns a float\nexport function linkDensity($node) {\n const totalTextLength = textLength($node.text());\n\n const linkText = $node.find('a').text();\n const linkLength = textLength(linkText);\n\n if (totalTextLength > 0) {\n return linkLength / totalTextLength;\n } else if (totalTextLength === 0 && linkLength > 0) {\n return 1;\n }\n\n return 0;\n}\n","import { withinComment } from 'utils/dom';\n\nfunction isGoodNode($node, maxChildren) {\n // If it has a number of children, it's more likely a container\n // element. Skip it.\n if ($node.children().length > maxChildren) {\n return false;\n }\n // If it looks to be within a comment, skip it.\n if (withinComment($node)) {\n return false;\n }\n\n return true;\n}\n\n// Given a a list of selectors find content that may\n// be extractable from the document. This is for flat\n// meta-information, like author, title, date published, etc.\nexport default function extractFromSelectors(\n $,\n selectors,\n maxChildren = 1,\n textOnly = true\n) {\n for (const selector of selectors) {\n const nodes = $(selector);\n\n // If we didn't get exactly one of this selector, this may be\n // a list of articles or comments. Skip it.\n if (nodes.length === 1) {\n const $node = $(nodes[0]);\n\n if (isGoodNode($node, maxChildren)) {\n let content;\n if (textOnly) {\n content = $node.text();\n } else {\n content = $node.html();\n }\n\n if (content) {\n return content;\n }\n }\n }\n }\n\n return null;\n}\n","// strips all tags from a string of text\nexport default function stripTags(text, $) {\n // Wrapping text in html element prevents errors when text\n // has no html\n const cleanText = $(`<span>${text}</span>`).text();\n return cleanText === '' ? text : cleanText;\n}\n","import { getAttrs } from 'utils/dom';\n\nexport default function withinComment($node) {\n const parents = $node.parents().toArray();\n const commentParent = parents.find((parent) => {\n const attrs = getAttrs(parent);\n const { class: nodeClass, id } = attrs;\n const classAndId = `${nodeClass} ${id}`;\n return classAndId.includes('comment');\n });\n\n return commentParent !== undefined;\n}\n","// Given a node, determine if it's article-like enough to return\n// param: node (a cheerio node)\n// return: boolean\n\nexport default function nodeIsSufficient($node) {\n return $node.text().trim().length >= 100;\n}\n","export default function getAttrs(node) {\n const { attribs, attributes } = node;\n\n if (!attribs && attributes) {\n const attrs = Reflect.ownKeys(attributes).reduce((acc, index) => {\n const attr = attributes[index];\n\n if (!attr.name || !attr.value) return acc;\n\n acc[attr.name] = attr.value;\n return acc;\n }, {});\n return attrs;\n }\n\n return attribs;\n}\n","export default function setAttr(node, attr, val) {\n if (node.attribs) {\n node.attribs[attr] = val;\n } else if (node.attributes) {\n node.setAttribute(attr, val);\n }\n\n return node;\n}\n","export default function setAttrs(node, attrs) {\n if (node.attribs) {\n node.attribs = attrs;\n } else if (node.attributes) {\n while (node.attributes.length > 0) {\n node.removeAttribute(node.attributes[0].name);\n }\n\n Reflect.ownKeys(attrs).forEach((key) => {\n node.setAttribute(key, attrs[key]);\n });\n }\n\n return node;\n}\n","// DOM manipulation\nexport { default as stripUnlikelyCandidates } from './strip-unlikely-candidates';\nexport { default as brsToPs } from './brs-to-ps';\nexport { default as paragraphize } from './paragraphize';\nexport { default as convertToParagraphs } from './convert-to-paragraphs';\nexport { default as convertNodeTo } from './convert-node-to';\nexport { default as cleanImages } from './clean-images';\nexport { default as markToKeep } from './mark-to-keep';\nexport { default as stripJunkTags } from './strip-junk-tags';\nexport { default as cleanHOnes } from './clean-h-ones';\nexport { default as cleanAttributes } from './clean-attributes';\nexport { default as removeEmpty } from './remove-empty';\nexport { default as cleanTags } from './clean-tags';\nexport { default as cleanHeaders } from './clean-headers';\nexport { default as rewriteTopLevel } from './rewrite-top-level';\nexport { default as makeLinksAbsolute } from './make-links-absolute';\nexport { textLength, linkDensity } from './link-density';\nexport { default as extractFromMeta } from './extract-from-meta';\nexport { default as extractFromSelectors } from './extract-from-selectors';\nexport { default as stripTags } from './strip-tags';\nexport { default as withinComment } from './within-comment';\nexport { default as nodeIsSufficient } from './node-is-sufficient';\nexport { default as isWordpress } from './is-wordpress';\nexport { default as getAttrs } from './get-attrs';\nexport { default as setAttr } from './set-attr';\nexport { default as setAttrs } from './set-attrs';\n","'use strict';\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nvar _regeneratorRuntime = _interopDefault(require('babel-runtime/regenerator'));\nvar _extends = _interopDefault(require('babel-runtime/helpers/extends'));\nvar _asyncToGenerator = _interopDefault(require('babel-runtime/helpers/asyncToGenerator'));\nvar URL = _interopDefault(require('url'));\nvar cheerio = _interopDefault(require('cheerio'));\nvar iconv = _interopDefault(require('iconv-lite'));\nvar _slicedToArray = _interopDefault(require('babel-runtime/helpers/slicedToArray'));\nvar _Promise = _interopDefault(require('babel-runtime/core-js/promise'));\nvar request = _interopDefault(require('request'));\nvar _Reflect$ownKeys = _interopDefault(require('babel-runtime/core-js/reflect/own-keys'));\nvar _toConsumableArray = _interopDefault(require('babel-runtime/helpers/toConsumableArray'));\nvar _defineProperty = _interopDefault(require('babel-runtime/helpers/defineProperty'));\nvar _typeof = _interopDefault(require('babel-runtime/helpers/typeof'));\nvar _getIterator = _interopDefault(require('babel-runtime/core-js/get-iterator'));\nvar _Object$keys = _interopDefault(require('babel-runtime/core-js/object/keys'));\nvar stringDirection = _interopDefault(require('string-direction'));\nvar validUrl = _interopDefault(require('valid-url'));\nvar moment = _interopDefault(require('moment-timezone'));\nvar parseFormat = _interopDefault(require('moment-parseformat'));\nvar wuzzy = _interopDefault(require('wuzzy'));\nvar difflib = _interopDefault(require('difflib'));\nvar _Array$from = _interopDefault(require('babel-runtime/core-js/array/from'));\nvar ellipsize = _interopDefault(require('ellipsize'));\n\nvar NORMALIZE_RE = /\\s{2,}/g;\n\nfunction normalizeSpaces(text) {\n return text.replace(NORMALIZE_RE, ' ').trim();\n}\n\n// Given a node type to search for, and a list of regular expressions,\n// look to see if this extraction can be found in the URL. Expects\n// that each expression in r_list will return group(1) as the proper\n// string to be cleaned.\n// Only used for date_published currently.\nfunction extractFromUrl(url, regexList) {\n var matchRe = regexList.find(function (re) {\n return re.test(url);\n });\n if (matchRe) {\n return matchRe.exec(url)[1];\n }\n\n return null;\n}\n\n// An expression that looks to try to find the page digit within a URL, if\n// it exists.\n// Matches:\n// page=1\n// pg=1\n// p=1\n// paging=12\n// pag=7\n// pagination/1\n// paging/88\n// pa/83\n// p/11\n//\n// Does not match:\n// pg=102\n// page:2\nvar PAGE_IN_HREF_RE = new RegExp('(page|paging|(p(a|g|ag)?(e|enum|ewanted|ing|ination)))?(=|/)([0-9]{1,3})', 'i');\n\nvar HAS_ALPHA_RE = /[a-z]/i;\n\nvar IS_ALPHA_RE = /^[a-z]+$/i;\nvar IS_DIGIT_RE = /^[0-9]+$/i;\n\nvar ENCODING_RE = /charset=([\\w-]+)\\b/;\nvar DEFAULT_ENCODING = 'utf-8';\n\nfunction pageNumFromUrl(url) {\n var matches = url.match(PAGE_IN_HREF_RE);\n if (!matches) return null;\n\n var pageNum = parseInt(matches[6], 10);\n\n // Return pageNum < 100, otherwise\n // return null\n return pageNum < 100 ? pageNum : null;\n}\n\nfunction removeAnchor(url) {\n return url.split('#')[0].replace(/\\/$/, '');\n}\n\nfunction isGoodSegment(segment, index, firstSegmentHasLetters) {\n var goodSegment = true;\n\n // If this is purely a number, and it's the first or second\n // url_segment, it's probably a page number. Remove it.\n if (index < 2 && IS_DIGIT_RE.test(segment) && segment.length < 3) {\n goodSegment = true;\n }\n\n // If this is the first url_segment and it's just \"index\",\n // remove it\n if (index === 0 && segment.toLowerCase() === 'index') {\n goodSegment = false;\n }\n\n // If our first or second url_segment is smaller than 3 characters,\n // and the first url_segment had no alphas, remove it.\n if (index < 2 && segment.length < 3 && !firstSegmentHasLetters) {\n goodSegment = false;\n }\n\n return goodSegment;\n}\n\n// Take a URL, and return the article base of said URL. That is, no\n// pagination data exists in it. Useful for comparing to other links\n// that might have pagination data within them.\nfunction articleBaseUrl(url, parsed) {\n var parsedUrl = parsed || URL.parse(url);\n var protocol = parsedUrl.protocol,\n host = parsedUrl.host,\n path = parsedUrl.path;\n\n\n var firstSegmentHasLetters = false;\n var cleanedSegments = path.split('/').reverse().reduce(function (acc, rawSegment, index) {\n var segment = rawSegment;\n\n // Split off and save anything that looks like a file type.\n if (segment.includes('.')) {\n var _segment$split = segment.split('.'),\n _segment$split2 = _slicedToArray(_segment$split, 2),\n possibleSegment = _segment$split2[0],\n fileExt = _segment$split2[1];\n\n if (IS_ALPHA_RE.test(fileExt)) {\n segment = possibleSegment;\n }\n }\n\n // If our first or second segment has anything looking like a page\n // number, remove it.\n if (PAGE_IN_HREF_RE.test(segment) && index < 2) {\n segment = segment.replace(PAGE_IN_HREF_RE, '');\n }\n\n // If we're on the first segment, check to see if we have any\n // characters in it. The first segment is actually the last bit of\n // the URL, and this will be helpful to determine if we're on a URL\n // segment that looks like \"/2/\" for example.\n if (index === 0) {\n firstSegmentHasLetters = HAS_ALPHA_RE.test(segment);\n }\n\n // If it's not marked for deletion, push it to cleaned_segments.\n if (isGoodSegment(segment, index, firstSegmentHasLetters)) {\n acc.push(segment);\n }\n\n return acc;\n }, []);\n\n return protocol + '//' + host + cleanedSegments.reverse().join('/');\n}\n\n// Given a string, return True if it appears to have an ending sentence\n// within it, false otherwise.\nvar SENTENCE_END_RE = new RegExp('.( |$)');\nfunction hasSentenceEnd(text) {\n return SENTENCE_END_RE.test(text);\n}\n\nfunction excerptContent(content) {\n var words = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 10;\n\n return content.trim().split(/\\s+/).slice(0, words).join(' ');\n}\n\n// check a string for encoding; this is\n// used in our fetchResource function to\n// ensure correctly encoded responses\nfunction getEncoding(str) {\n var encoding = DEFAULT_ENCODING;\n if (ENCODING_RE.test(str)) {\n var testEncode = ENCODING_RE.exec(str)[1];\n if (iconv.encodingExists(testEncode)) {\n encoding = testEncode;\n }\n }\n return encoding;\n}\n\nvar _marked = [range].map(_regeneratorRuntime.mark);\n\nfunction range() {\n var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n var end = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n return _regeneratorRuntime.wrap(function range$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n if (!(start <= end)) {\n _context.next = 5;\n break;\n }\n\n _context.next = 3;\n return start += 1;\n\n case 3:\n _context.next = 0;\n break;\n\n case 5:\n case \"end\":\n return _context.stop();\n }\n }\n }, _marked[0], this);\n}\n\n// extremely simple url validation as a first step\nfunction validateUrl(_ref) {\n var hostname = _ref.hostname;\n\n // If this isn't a valid url, return an error message\n return !!hostname;\n}\n\nvar Errors = {\n badUrl: {\n error: true,\n messages: 'The url parameter passed does not look like a valid URL. Please check your data and try again.'\n }\n};\n\n// Browser does not like us setting user agent\nvar REQUEST_HEADERS = cheerio.browser ? {} : {\n 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'\n};\n\n// The number of milliseconds to attempt to fetch a resource before timing out.\nvar FETCH_TIMEOUT = 10000;\n\n// Content types that we do not extract content from\nvar BAD_CONTENT_TYPES = ['audio/mpeg', 'image/gif', 'image/jpeg', 'image/jpg'];\n\nvar BAD_CONTENT_TYPES_RE = new RegExp('^(' + BAD_CONTENT_TYPES.join('|') + ')$', 'i');\n\n// Use this setting as the maximum size an article can be\n// for us to attempt parsing. Defaults to 5 MB.\nvar MAX_CONTENT_LENGTH = 5242880;\n\n// Turn the global proxy on or off\n// Proxying is not currently enabled in Python source\n// so not implementing logic in port.\n\nfunction get(options) {\n return new _Promise(function (resolve, reject) {\n request(options, function (err, response, body) {\n if (err) {\n reject(err);\n } else {\n resolve({ body: body, response: response });\n }\n });\n });\n}\n\n// Evaluate a response to ensure it's something we should be keeping.\n// This does not validate in the sense of a response being 200 level or\n// not. Validation here means that we haven't found reason to bail from\n// further processing of this url.\n\nfunction validateResponse(response) {\n var parseNon2xx = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n // Check if we got a valid status code\n // This isn't great, but I'm requiring a statusMessage to be set\n // before short circuiting b/c nock doesn't set it in tests\n // statusMessage only not set in nock response, in which case\n // I check statusCode, which is currently only 200 for OK responses\n // in tests\n if (response.statusMessage && response.statusMessage !== 'OK' || response.statusCode !== 200) {\n if (!response.statusCode) {\n throw new Error('Unable to fetch content. Original exception was ' + response.error);\n } else if (!parseNon2xx) {\n throw new Error('Resource returned a response status code of ' + response.statusCode + ' and resource was instructed to reject non-2xx level status codes.');\n }\n }\n\n var _response$headers = response.headers,\n contentType = _response$headers['content-type'],\n contentLength = _response$headers['content-length'];\n\n // Check that the content is not in BAD_CONTENT_TYPES\n\n if (BAD_CONTENT_TYPES_RE.test(contentType)) {\n throw new Error('Content-type for this resource was ' + contentType + ' and is not allowed.');\n }\n\n // Check that the content length is below maximum\n if (contentLength > MAX_CONTENT_LENGTH) {\n throw new Error('Content for this resource was too large. Maximum content length is ' + MAX_CONTENT_LENGTH + '.');\n }\n\n return true;\n}\n\n// Grabs the last two pieces of the URL and joins them back together\n// This is to get the 'livejournal.com' from 'erotictrains.livejournal.com'\n\n\n// Set our response attribute to the result of fetching our URL.\n// TODO: This should gracefully handle timeouts and raise the\n// proper exceptions on the many failure cases of HTTP.\n// TODO: Ensure we are not fetching something enormous. Always return\n// unicode content for HTML, with charset conversion.\n\nvar fetchResource$1 = (function () {\n var _ref2 = _asyncToGenerator(_regeneratorRuntime.mark(function _callee(url, parsedUrl) {\n var options, _ref3, response, body;\n\n return _regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n parsedUrl = parsedUrl || URL.parse(encodeURI(url));\n\n options = {\n url: parsedUrl.href,\n headers: _extends({}, REQUEST_HEADERS),\n timeout: FETCH_TIMEOUT,\n // Accept cookies\n jar: true,\n // Set to null so the response returns as binary and body as buffer\n // https://github.com/request/request#requestoptions-callback\n encoding: null,\n // Accept and decode gzip\n gzip: true,\n // Follow any redirect\n followAllRedirects: true\n };\n _context.next = 4;\n return get(options);\n\n case 4:\n _ref3 = _context.sent;\n response = _ref3.response;\n body = _ref3.body;\n _context.prev = 7;\n\n validateResponse(response);\n return _context.abrupt('return', {\n body: body,\n response: response\n });\n\n case 12:\n _context.prev = 12;\n _context.t0 = _context['catch'](7);\n return _context.abrupt('return', Errors.badUrl);\n\n case 15:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this, [[7, 12]]);\n }));\n\n function fetchResource(_x2, _x3) {\n return _ref2.apply(this, arguments);\n }\n\n return fetchResource;\n})();\n\nfunction convertMetaProp($, from, to) {\n $('meta[' + from + ']').each(function (_, node) {\n var $node = $(node);\n\n var value = $node.attr(from);\n $node.attr(to, value);\n $node.removeAttr(from);\n });\n\n return $;\n}\n\n// For ease of use in extracting from meta tags,\n// replace the \"content\" attribute on meta tags with the\n// \"value\" attribute.\n//\n// In addition, normalize 'property' attributes to 'name' for ease of\n// querying later. See, e.g., og or twitter meta tags.\n\nfunction normalizeMetaTags($) {\n $ = convertMetaProp($, 'content', 'value');\n $ = convertMetaProp($, 'property', 'name');\n return $;\n}\n\n// Spacer images to be removed\nvar SPACER_RE = new RegExp('transparent|spacer|blank', 'i');\n\n// The class we will use to mark elements we want to keep\n// but would normally remove\nvar KEEP_CLASS = 'mercury-parser-keep';\n\nvar KEEP_SELECTORS = ['iframe[src^=\"https://www.youtube.com\"]', 'iframe[src^=\"https://www.youtube-nocookie.com\"]', 'iframe[src^=\"http://www.youtube.com\"]', 'iframe[src^=\"https://player.vimeo\"]', 'iframe[src^=\"http://player.vimeo\"]'];\n\n// A list of tags to strip from the output if we encounter them.\nvar STRIP_OUTPUT_TAGS = ['title', 'script', 'noscript', 'link', 'style', 'hr', 'embed', 'iframe', 'object'];\n\n// cleanAttributes\nvar REMOVE_ATTRS = ['style', 'align'];\nvar REMOVE_ATTR_SELECTORS = REMOVE_ATTRS.map(function (selector) {\n return '[' + selector + ']';\n});\nvar REMOVE_ATTR_LIST = REMOVE_ATTRS.join(',');\nvar WHITELIST_ATTRS = ['src', 'srcset', 'href', 'class', 'id', 'alt', 'xlink:href', 'width', 'height'];\n\nvar WHITELIST_ATTRS_RE = new RegExp('^(' + WHITELIST_ATTRS.join('|') + ')$', 'i');\n\n// removeEmpty\nvar REMOVE_EMPTY_TAGS = ['p'];\nvar REMOVE_EMPTY_SELECTORS = REMOVE_EMPTY_TAGS.map(function (tag) {\n return tag + ':empty';\n}).join(',');\n\n// cleanTags\nvar CLEAN_CONDITIONALLY_TAGS = ['ul', 'ol', 'table', 'div', 'button', 'form'].join(',');\n\n// cleanHeaders\nvar HEADER_TAGS = ['h2', 'h3', 'h4', 'h5', 'h6'];\nvar HEADER_TAG_LIST = HEADER_TAGS.join(',');\n\n// // CONTENT FETCHING CONSTANTS ////\n\n// A list of strings that can be considered unlikely candidates when\n// extracting content from a resource. These strings are joined together\n// and then tested for existence using re:test, so may contain simple,\n// non-pipe style regular expression queries if necessary.\nvar UNLIKELY_CANDIDATES_BLACKLIST = ['ad-break', 'adbox', 'advert', 'addthis', 'agegate', 'aux', 'blogger-labels', 'combx', 'comment', 'conversation', 'disqus', 'entry-unrelated', 'extra', 'foot',\n// 'form', // This is too generic, has too many false positives\n'header', 'hidden', 'loader', 'login', // Note: This can hit 'blogindex'.\n'menu', 'meta', 'nav', 'outbrain', 'pager', 'pagination', 'predicta', // readwriteweb inline ad box\n'presence_control_external', // lifehacker.com container full of false positives\n'popup', 'printfriendly', 'related', 'remove', 'remark', 'rss', 'share', 'shoutbox', 'sidebar', 'sociable', 'sponsor', 'taboola', 'tools'];\n\n// A list of strings that can be considered LIKELY candidates when\n// extracting content from a resource. Essentially, the inverse of the\n// blacklist above - if something matches both blacklist and whitelist,\n// it is kept. This is useful, for example, if something has a className\n// of \"rss-content entry-content\". It matched 'rss', so it would normally\n// be removed, however, it's also the entry content, so it should be left\n// alone.\n//\n// These strings are joined together and then tested for existence using\n// re:test, so may contain simple, non-pipe style regular expression queries\n// if necessary.\nvar UNLIKELY_CANDIDATES_WHITELIST = ['and', 'article', 'body', 'blogindex', 'column', 'content', 'entry-content-asset', 'format', // misuse of form\n'hfeed', 'hentry', 'hatom', 'main', 'page', 'posts', 'shadow'];\n\n// A list of tags which, if found inside, should cause a <div /> to NOT\n// be turned into a paragraph tag. Shallow div tags without these elements\n// should be turned into <p /> tags.\nvar DIV_TO_P_BLOCK_TAGS = ['a', 'blockquote', 'dl', 'div', 'img', 'p', 'pre', 'table'].join(',');\n\n// A list of tags that should be ignored when trying to find the top candidate\n// for a document.\n\n\n\n\n// A list of selectors that specify, very clearly, either hNews or other\n// very content-specific style content, like Blogger templates.\n// More examples here: http://microformats.org/wiki/blog-post-formats\n\n\n\n\n\n// A list of strings that denote a positive scoring for this content as being\n// an article container. Checked against className and id.\n//\n// TODO: Perhaps have these scale based on their odds of being quality?\nvar POSITIVE_SCORE_HINTS = ['article', 'articlecontent', 'instapaper_body', 'blog', 'body', 'content', 'entry-content-asset', 'entry', 'hentry', 'main', 'Normal', 'page', 'pagination', 'permalink', 'post', 'story', 'text', '[-_]copy', // usatoday\n'\\\\Bcopy'];\n\n// The above list, joined into a matching regular expression\nvar POSITIVE_SCORE_RE = new RegExp(POSITIVE_SCORE_HINTS.join('|'), 'i');\n\n// Readability publisher-specific guidelines\n\n\n// A list of strings that denote a negative scoring for this content as being\n// an article container. Checked against className and id.\n//\n// TODO: Perhaps have these scale based on their odds of being quality?\nvar NEGATIVE_SCORE_HINTS = ['adbox', 'advert', 'author', 'bio', 'bookmark', 'bottom', 'byline', 'clear', 'com-', 'combx', 'comment', 'comment\\\\B', 'contact', 'copy', 'credit', 'crumb', 'date', 'deck', 'excerpt', 'featured', // tnr.com has a featured_content which throws us off\n'foot', 'footer', 'footnote', 'graf', 'head', 'info', 'infotext', // newscientist.com copyright\n'instapaper_ignore', 'jump', 'linebreak', 'link', 'masthead', 'media', 'meta', 'modal', 'outbrain', // slate.com junk\n'promo', 'pr_', // autoblog - press release\n'related', 'respond', 'roundcontent', // lifehacker restricted content warning\n'scroll', 'secondary', 'share', 'shopping', 'shoutbox', 'side', 'sidebar', 'sponsor', 'stamp', 'sub', 'summary', 'tags', 'tools', 'widget'];\n// The above list, joined into a matching regular expression\nvar NEGATIVE_SCORE_RE = new RegExp(NEGATIVE_SCORE_HINTS.join('|'), 'i');\n\n// XPath to try to determine if a page is wordpress. Not always successful.\nvar IS_WP_SELECTOR = 'meta[name=generator][value^=WordPress]';\n\n// Match a digit. Pretty clear.\n\n\n// A list of words that, if found in link text or URLs, likely mean that\n// this link is not a next page link.\n\n\n\n// Match any phrase that looks like it could be page, or paging, or pagination\nvar PAGE_RE = new RegExp('pag(e|ing|inat)', 'i');\n\n// Match any link text/classname/id that looks like it could mean the next\n// page. Things like: next, continue, >, >>, » but not >|, »| as those can\n// mean last page.\n// export const NEXT_LINK_TEXT_RE = new RegExp('(next|weiter|continue|>([^\\|]|$)|»([^\\|]|$))', 'i');\n\n\n// Match any link text/classname/id that looks like it is an end link: things\n// like \"first\", \"last\", \"end\", etc.\n\n\n// Match any link text/classname/id that looks like it means the previous\n// page.\n\n\n// Match 2 or more consecutive <br> tags\n\n\n// Match 1 BR tag.\n\n\n// A list of all of the block level tags known in HTML5 and below. Taken from\n// http://bit.ly/qneNIT\nvar BLOCK_LEVEL_TAGS = ['article', 'aside', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'col', 'colgroup', 'dd', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'hgroup', 'hr', 'li', 'map', 'object', 'ol', 'output', 'p', 'pre', 'progress', 'section', 'table', 'tbody', 'textarea', 'tfoot', 'th', 'thead', 'tr', 'ul', 'video'];\nvar BLOCK_LEVEL_TAGS_RE = new RegExp('^(' + BLOCK_LEVEL_TAGS.join('|') + ')$', 'i');\n\n// The removal is implemented as a blacklist and whitelist, this test finds\n// blacklisted elements that aren't whitelisted. We do this all in one\n// expression-both because it's only one pass, and because this skips the\n// serialization for whitelisted nodes.\nvar candidatesBlacklist = UNLIKELY_CANDIDATES_BLACKLIST.join('|');\nvar CANDIDATES_BLACKLIST = new RegExp(candidatesBlacklist, 'i');\n\nvar candidatesWhitelist = UNLIKELY_CANDIDATES_WHITELIST.join('|');\nvar CANDIDATES_WHITELIST = new RegExp(candidatesWhitelist, 'i');\n\nfunction stripUnlikelyCandidates($) {\n // Loop through the provided document and remove any non-link nodes\n // that are unlikely candidates for article content.\n //\n // Links are ignored because there are very often links to content\n // that are identified as non-body-content, but may be inside\n // article-like content.\n //\n // :param $: a cheerio object to strip nodes from\n // :return $: the cleaned cheerio object\n $('*').not('a').each(function (index, node) {\n var $node = $(node);\n var classes = $node.attr('class');\n var id = $node.attr('id');\n if (!id && !classes) return;\n\n var classAndId = (classes || '') + ' ' + (id || '');\n if (CANDIDATES_WHITELIST.test(classAndId)) {\n return;\n } else if (CANDIDATES_BLACKLIST.test(classAndId)) {\n $node.remove();\n }\n });\n\n return $;\n}\n\n// ## NOTES:\n// Another good candidate for refactoring/optimizing.\n// Very imperative code, I don't love it. - AP\n\n// Given cheerio object, convert consecutive <br /> tags into\n// <p /> tags instead.\n//\n// :param $: A cheerio object\n\nfunction brsToPs$$1($) {\n var collapsing = false;\n $('br').each(function (index, element) {\n var $element = $(element);\n var nextElement = $element.next().get(0);\n\n if (nextElement && nextElement.tagName.toLowerCase() === 'br') {\n collapsing = true;\n $element.remove();\n } else if (collapsing) {\n collapsing = false;\n // $(element).replaceWith('<p />')\n paragraphize(element, $, true);\n }\n });\n\n return $;\n}\n\n// Given a node, turn it into a P if it is not already a P, and\n// make sure it conforms to the constraints of a P tag (I.E. does\n// not contain any other block tags.)\n//\n// If the node is a <br />, it treats the following inline siblings\n// as if they were its children.\n//\n// :param node: The node to paragraphize; this is a raw node\n// :param $: The cheerio object to handle dom manipulation\n// :param br: Whether or not the passed node is a br\n\nfunction paragraphize(node, $) {\n var br = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var $node = $(node);\n\n if (br) {\n var sibling = node.nextSibling;\n var p = $('<p></p>');\n\n // while the next node is text or not a block level element\n // append it to a new p node\n while (sibling && !(sibling.tagName && BLOCK_LEVEL_TAGS_RE.test(sibling.tagName))) {\n var nextSibling = sibling.nextSibling;\n $(sibling).appendTo(p);\n sibling = nextSibling;\n }\n\n $node.replaceWith(p);\n $node.remove();\n return $;\n }\n\n return $;\n}\n\nfunction convertDivs($) {\n $('div').each(function (index, div) {\n var $div = $(div);\n var convertable = $div.children(DIV_TO_P_BLOCK_TAGS).length === 0;\n\n if (convertable) {\n convertNodeTo$$1($div, $, 'p');\n }\n });\n\n return $;\n}\n\nfunction convertSpans($) {\n $('span').each(function (index, span) {\n var $span = $(span);\n var convertable = $span.parents('p, div').length === 0;\n if (convertable) {\n convertNodeTo$$1($span, $, 'p');\n }\n });\n\n return $;\n}\n\n// Loop through the provided doc, and convert any p-like elements to\n// actual paragraph tags.\n//\n// Things fitting this criteria:\n// * Multiple consecutive <br /> tags.\n// * <div /> tags without block level elements inside of them\n// * <span /> tags who are not children of <p /> or <div /> tags.\n//\n// :param $: A cheerio object to search\n// :return cheerio object with new p elements\n// (By-reference mutation, though. Returned just for convenience.)\n\nfunction convertToParagraphs$$1($) {\n $ = brsToPs$$1($);\n $ = convertDivs($);\n $ = convertSpans($);\n\n return $;\n}\n\nfunction convertNodeTo$$1($node, $) {\n var tag = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'p';\n\n var node = $node.get(0);\n if (!node) {\n return $;\n }\n var attrs = getAttrs(node) || {};\n // console.log(attrs)\n\n var attribString = _Reflect$ownKeys(attrs).map(function (key) {\n return key + '=' + attrs[key];\n }).join(' ');\n var html = void 0;\n\n if ($.browser) {\n // In the browser, the contents of noscript tags aren't rendered, therefore\n // transforms on the noscript tag (commonly used for lazy-loading) don't work\n // as expected. This test case handles that\n html = node.tagName.toLowerCase() === 'noscript' ? $node.text() : $node.html();\n } else {\n html = $node.contents();\n }\n $node.replaceWith('<' + tag + ' ' + attribString + '>' + html + '</' + tag + '>');\n return $;\n}\n\nfunction cleanForHeight($img, $) {\n var height = parseInt($img.attr('height'), 10);\n var width = parseInt($img.attr('width'), 10) || 20;\n\n // Remove images that explicitly have very small heights or\n // widths, because they are most likely shims or icons,\n // which aren't very useful for reading.\n if ((height || 20) < 10 || width < 10) {\n $img.remove();\n } else if (height) {\n // Don't ever specify a height on images, so that we can\n // scale with respect to width without screwing up the\n // aspect ratio.\n $img.removeAttr('height');\n }\n\n return $;\n}\n\n// Cleans out images where the source string matches transparent/spacer/etc\n// TODO This seems very aggressive - AP\nfunction removeSpacers($img, $) {\n if (SPACER_RE.test($img.attr('src'))) {\n $img.remove();\n }\n\n return $;\n}\n\nfunction cleanImages($article, $) {\n $article.find('img').each(function (index, img) {\n var $img = $(img);\n\n cleanForHeight($img, $);\n removeSpacers($img, $);\n });\n\n return $;\n}\n\nfunction markToKeep(article, $, url) {\n var tags = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n\n if (tags.length === 0) {\n tags = KEEP_SELECTORS;\n }\n\n if (url) {\n var _URL$parse = URL.parse(url),\n protocol = _URL$parse.protocol,\n hostname = _URL$parse.hostname;\n\n tags = [].concat(_toConsumableArray(tags), ['iframe[src^=\"' + protocol + '//' + hostname + '\"]']);\n }\n\n $(tags.join(','), article).addClass(KEEP_CLASS);\n\n return $;\n}\n\nfunction stripJunkTags(article, $) {\n var tags = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n\n if (tags.length === 0) {\n tags = STRIP_OUTPUT_TAGS;\n }\n\n // Remove matching elements, but ignore\n // any element with a class of mercury-parser-keep\n $(tags.join(','), article).not('.' + KEEP_CLASS).remove();\n\n return $;\n}\n\n// H1 tags are typically the article title, which should be extracted\n// by the title extractor instead. If there's less than 3 of them (<3),\n// strip them. Otherwise, turn 'em into H2s.\nfunction cleanHOnes$$1(article, $) {\n var $hOnes = $('h1', article);\n\n if ($hOnes.length < 3) {\n $hOnes.each(function (index, node) {\n return $(node).remove();\n });\n } else {\n $hOnes.each(function (index, node) {\n convertNodeTo$$1($(node), $, 'h2');\n });\n }\n\n return $;\n}\n\nfunction removeAllButWhitelist($article, $) {\n $article.find('*').each(function (index, node) {\n var attrs = getAttrs(node);\n\n setAttrs(node, _Reflect$ownKeys(attrs).reduce(function (acc, attr) {\n if (WHITELIST_ATTRS_RE.test(attr)) {\n return _extends({}, acc, _defineProperty({}, attr, attrs[attr]));\n }\n\n return acc;\n }, {}));\n });\n\n // Remove the mercury-parser-keep class from result\n $('.' + KEEP_CLASS, $article).removeClass(KEEP_CLASS);\n\n return $article;\n}\n\n// function removeAttrs(article, $) {\n// REMOVE_ATTRS.forEach((attr) => {\n// $(`[${attr}]`, article).removeAttr(attr);\n// });\n// }\n\n// Remove attributes like style or align\nfunction cleanAttributes$$1($article, $) {\n // Grabbing the parent because at this point\n // $article will be wrapped in a div which will\n // have a score set on it.\n return removeAllButWhitelist($article.parent().length ? $article.parent() : $article, $);\n}\n\nfunction removeEmpty($article, $) {\n $article.find('p').each(function (index, p) {\n var $p = $(p);\n if ($p.find('iframe, img').length === 0 && $p.text().trim() === '') $p.remove();\n });\n\n return $;\n}\n\n// // CONTENT FETCHING CONSTANTS ////\n\n// A list of strings that can be considered unlikely candidates when\n// extracting content from a resource. These strings are joined together\n// and then tested for existence using re:test, so may contain simple,\n// non-pipe style regular expression queries if necessary.\nvar UNLIKELY_CANDIDATES_BLACKLIST$1 = ['ad-break', 'adbox', 'advert', 'addthis', 'agegate', 'aux', 'blogger-labels', 'combx', 'comment', 'conversation', 'disqus', 'entry-unrelated', 'extra', 'foot', 'form', 'header', 'hidden', 'loader', 'login', // Note: This can hit 'blogindex'.\n'menu', 'meta', 'nav', 'pager', 'pagination', 'predicta', // readwriteweb inline ad box\n'presence_control_external', // lifehacker.com container full of false positives\n'popup', 'printfriendly', 'related', 'remove', 'remark', 'rss', 'share', 'shoutbox', 'sidebar', 'sociable', 'sponsor', 'tools'];\n\n// A list of strings that can be considered LIKELY candidates when\n// extracting content from a resource. Essentially, the inverse of the\n// blacklist above - if something matches both blacklist and whitelist,\n// it is kept. This is useful, for example, if something has a className\n// of \"rss-content entry-content\". It matched 'rss', so it would normally\n// be removed, however, it's also the entry content, so it should be left\n// alone.\n//\n// These strings are joined together and then tested for existence using\n// re:test, so may contain simple, non-pipe style regular expression queries\n// if necessary.\nvar UNLIKELY_CANDIDATES_WHITELIST$1 = ['and', 'article', 'body', 'blogindex', 'column', 'content', 'entry-content-asset', 'format', // misuse of form\n'hfeed', 'hentry', 'hatom', 'main', 'page', 'posts', 'shadow'];\n\n// A list of tags which, if found inside, should cause a <div /> to NOT\n// be turned into a paragraph tag. Shallow div tags without these elements\n// should be turned into <p /> tags.\nvar DIV_TO_P_BLOCK_TAGS$1 = ['a', 'blockquote', 'dl', 'div', 'img', 'p', 'pre', 'table'].join(',');\n\n// A list of tags that should be ignored when trying to find the top candidate\n// for a document.\nvar NON_TOP_CANDIDATE_TAGS$1 = ['br', 'b', 'i', 'label', 'hr', 'area', 'base', 'basefont', 'input', 'img', 'link', 'meta'];\n\nvar NON_TOP_CANDIDATE_TAGS_RE$1 = new RegExp('^(' + NON_TOP_CANDIDATE_TAGS$1.join('|') + ')$', 'i');\n\n// A list of selectors that specify, very clearly, either hNews or other\n// very content-specific style content, like Blogger templates.\n// More examples here: http://microformats.org/wiki/blog-post-formats\nvar HNEWS_CONTENT_SELECTORS$1 = [['.hentry', '.entry-content'], ['entry', '.entry-content'], ['.entry', '.entry_content'], ['.post', '.postbody'], ['.post', '.post_body'], ['.post', '.post-body']];\n\nvar PHOTO_HINTS$1 = ['figure', 'photo', 'image', 'caption'];\nvar PHOTO_HINTS_RE$1 = new RegExp(PHOTO_HINTS$1.join('|'), 'i');\n\n// A list of strings that denote a positive scoring for this content as being\n// an article container. Checked against className and id.\n//\n// TODO: Perhaps have these scale based on their odds of being quality?\nvar POSITIVE_SCORE_HINTS$1 = ['article', 'articlecontent', 'instapaper_body', 'blog', 'body', 'content', 'entry-content-asset', 'entry', 'hentry', 'main', 'Normal', 'page', 'pagination', 'permalink', 'post', 'story', 'text', '[-_]copy', // usatoday\n'\\\\Bcopy'];\n\n// The above list, joined into a matching regular expression\nvar POSITIVE_SCORE_RE$1 = new RegExp(POSITIVE_SCORE_HINTS$1.join('|'), 'i');\n\n// Readability publisher-specific guidelines\nvar READABILITY_ASSET$1 = new RegExp('entry-content-asset', 'i');\n\n// A list of strings that denote a negative scoring for this content as being\n// an article container. Checked against className and id.\n//\n// TODO: Perhaps have these scale based on their odds of being quality?\nvar NEGATIVE_SCORE_HINTS$1 = ['adbox', 'advert', 'author', 'bio', 'bookmark', 'bottom', 'byline', 'clear', 'com-', 'combx', 'comment', 'comment\\\\B', 'contact', 'copy', 'credit', 'crumb', 'date', 'deck', 'excerpt', 'featured', // tnr.com has a featured_content which throws us off\n'foot', 'footer', 'footnote', 'graf', 'head', 'info', 'infotext', // newscientist.com copyright\n'instapaper_ignore', 'jump', 'linebreak', 'link', 'masthead', 'media', 'meta', 'modal', 'outbrain', // slate.com junk\n'promo', 'pr_', // autoblog - press release\n'related', 'respond', 'roundcontent', // lifehacker restricted content warning\n'scroll', 'secondary', 'share', 'shopping', 'shoutbox', 'side', 'sidebar', 'sponsor', 'stamp', 'sub', 'summary', 'tags', 'tools', 'widget'];\n// The above list, joined into a matching regular expression\nvar NEGATIVE_SCORE_RE$1 = new RegExp(NEGATIVE_SCORE_HINTS$1.join('|'), 'i');\n\n// Match a digit. Pretty clear.\n\n\n// Match 2 or more consecutive <br> tags\n\n\n// Match 1 BR tag.\n\n\n// A list of all of the block level tags known in HTML5 and below. Taken from\n// http://bit.ly/qneNIT\n\n\n\n// The removal is implemented as a blacklist and whitelist, this test finds\n// blacklisted elements that aren't whitelisted. We do this all in one\n// expression-both because it's only one pass, and because this skips the\n// serialization for whitelisted nodes.\nvar candidatesBlacklist$1 = UNLIKELY_CANDIDATES_BLACKLIST$1.join('|');\n\n\nvar candidatesWhitelist$1 = UNLIKELY_CANDIDATES_WHITELIST$1.join('|');\n\n\n\n\nvar PARAGRAPH_SCORE_TAGS$1 = new RegExp('^(p|li|span|pre)$', 'i');\nvar CHILD_CONTENT_TAGS$1 = new RegExp('^(td|blockquote|ol|ul|dl)$', 'i');\nvar BAD_TAGS$1 = new RegExp('^(address|form)$', 'i');\n\n// Get the score of a node based on its className and id.\nfunction getWeight(node) {\n var classes = node.attr('class');\n var id = node.attr('id');\n var score = 0;\n\n if (id) {\n // if id exists, try to score on both positive and negative\n if (POSITIVE_SCORE_RE$1.test(id)) {\n score += 25;\n }\n if (NEGATIVE_SCORE_RE$1.test(id)) {\n score -= 25;\n }\n }\n\n if (classes) {\n if (score === 0) {\n // if classes exist and id did not contribute to score\n // try to score on both positive and negative\n if (POSITIVE_SCORE_RE$1.test(classes)) {\n score += 25;\n }\n if (NEGATIVE_SCORE_RE$1.test(classes)) {\n score -= 25;\n }\n }\n\n // even if score has been set by id, add score for\n // possible photo matches\n // \"try to keep photos if we can\"\n if (PHOTO_HINTS_RE$1.test(classes)) {\n score += 10;\n }\n\n // add 25 if class matches entry-content-asset,\n // a class apparently instructed for use in the\n // Readability publisher guidelines\n // https://www.readability.com/developers/guidelines\n if (READABILITY_ASSET$1.test(classes)) {\n score += 25;\n }\n }\n\n return score;\n}\n\n// returns the score of a node based on\n// the node's score attribute\n// returns null if no score set\nfunction getScore($node) {\n return parseFloat($node.attr('score')) || null;\n}\n\n// return 1 for every comma in text\nfunction scoreCommas(text) {\n return (text.match(/,/g) || []).length;\n}\n\nvar idkRe = new RegExp('^(p|pre)$', 'i');\n\nfunction scoreLength(textLength) {\n var tagName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'p';\n\n var chunks = textLength / 50;\n\n if (chunks > 0) {\n var lengthBonus = void 0;\n\n // No idea why p or pre are being tamped down here\n // but just following the source for now\n // Not even sure why tagName is included here,\n // since this is only being called from the context\n // of scoreParagraph\n if (idkRe.test(tagName)) {\n lengthBonus = chunks - 2;\n } else {\n lengthBonus = chunks - 1.25;\n }\n\n return Math.min(Math.max(lengthBonus, 0), 3);\n }\n\n return 0;\n}\n\n// Score a paragraph using various methods. Things like number of\n// commas, etc. Higher is better.\nfunction scoreParagraph$$1(node) {\n var score = 1;\n var text = node.text().trim();\n var textLength = text.length;\n\n // If this paragraph is less than 25 characters, don't count it.\n if (textLength < 25) {\n return 0;\n }\n\n // Add points for any commas within this paragraph\n score += scoreCommas(text);\n\n // For every 50 characters in this paragraph, add another point. Up\n // to 3 points.\n score += scoreLength(textLength);\n\n // Articles can end with short paragraphs when people are being clever\n // but they can also end with short paragraphs setting up lists of junk\n // that we strip. This negative tweaks junk setup paragraphs just below\n // the cutoff threshold.\n if (text.slice(-1) === ':') {\n score -= 1;\n }\n\n return score;\n}\n\nfunction setScore($node, $, score) {\n $node.attr('score', score);\n return $node;\n}\n\nfunction addScore$$1($node, $, amount) {\n try {\n var score = getOrInitScore$$1($node, $) + amount;\n setScore($node, $, score);\n } catch (e) {\n // Ignoring; error occurs in scoreNode\n }\n\n return $node;\n}\n\n// Adds 1/4 of a child's score to its parent\nfunction addToParent$$1(node, $, score) {\n var parent = node.parent();\n if (parent) {\n addScore$$1(parent, $, score * 0.25);\n }\n\n return node;\n}\n\n// gets and returns the score if it exists\n// if not, initializes a score based on\n// the node's tag type\nfunction getOrInitScore$$1($node, $) {\n var weightNodes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n var score = getScore($node);\n\n if (score) {\n return score;\n }\n\n score = scoreNode$$1($node);\n\n if (weightNodes) {\n score += getWeight($node);\n }\n\n addToParent$$1($node, $, score);\n\n return score;\n}\n\n// Score an individual node. Has some smarts for paragraphs, otherwise\n// just scores based on tag.\nfunction scoreNode$$1($node) {\n var _$node$get = $node.get(0),\n tagName = _$node$get.tagName;\n\n // TODO: Consider ordering by most likely.\n // E.g., if divs are a more common tag on a page,\n // Could save doing that regex test on every node – AP\n\n\n if (PARAGRAPH_SCORE_TAGS$1.test(tagName)) {\n return scoreParagraph$$1($node);\n } else if (tagName.toLowerCase() === 'div') {\n return 5;\n } else if (CHILD_CONTENT_TAGS$1.test(tagName)) {\n return 3;\n } else if (BAD_TAGS$1.test(tagName)) {\n return -3;\n } else if (tagName.toLowerCase() === 'th') {\n return -5;\n }\n\n return 0;\n}\n\nfunction convertSpans$1($node, $) {\n if ($node.get(0)) {\n var _$node$get = $node.get(0),\n tagName = _$node$get.tagName;\n\n if (tagName === 'span') {\n // convert spans to divs\n convertNodeTo$$1($node, $, 'div');\n }\n }\n}\n\nfunction addScoreTo($node, $, score) {\n if ($node) {\n convertSpans$1($node, $);\n addScore$$1($node, $, score);\n }\n}\n\nfunction scorePs($, weightNodes) {\n $('p, pre').not('[score]').each(function (index, node) {\n // The raw score for this paragraph, before we add any parent/child\n // scores.\n var $node = $(node);\n $node = setScore($node, $, getOrInitScore$$1($node, $, weightNodes));\n\n var $parent = $node.parent();\n var rawScore = scoreNode$$1($node);\n\n addScoreTo($parent, $, rawScore, weightNodes);\n if ($parent) {\n // Add half of the individual content score to the\n // grandparent\n addScoreTo($parent.parent(), $, rawScore / 2, weightNodes);\n }\n });\n\n return $;\n}\n\n// score content. Parents get the full value of their children's\n// content score, grandparents half\nfunction scoreContent$$1($) {\n var weightNodes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // First, look for special hNews based selectors and give them a big\n // boost, if they exist\n HNEWS_CONTENT_SELECTORS$1.forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n parentSelector = _ref2[0],\n childSelector = _ref2[1];\n\n $(parentSelector + ' ' + childSelector).each(function (index, node) {\n addScore$$1($(node).parent(parentSelector), $, 80);\n });\n });\n\n // Doubling this again\n // Previous solution caused a bug\n // in which parents weren't retaining\n // scores. This is not ideal, and\n // should be fixed.\n scorePs($, weightNodes);\n scorePs($, weightNodes);\n\n return $;\n}\n\n// Now that we have a top_candidate, look through the siblings of\n// it to see if any of them are decently scored. If they are, they\n// may be split parts of the content (Like two divs, a preamble and\n// a body.) Example:\n// http://articles.latimes.com/2009/oct/14/business/fi-bigtvs14\nfunction mergeSiblings($candidate, topScore, $) {\n if (!$candidate.parent().length) {\n return $candidate;\n }\n\n var siblingScoreThreshold = Math.max(10, topScore * 0.25);\n var wrappingDiv = $('<div></div>');\n\n $candidate.parent().children().each(function (index, sibling) {\n var $sibling = $(sibling);\n // Ignore tags like BR, HR, etc\n if (NON_TOP_CANDIDATE_TAGS_RE$1.test(sibling.tagName)) {\n return null;\n }\n\n var siblingScore = getScore($sibling);\n if (siblingScore) {\n if ($sibling.get(0) === $candidate.get(0)) {\n wrappingDiv.append($sibling);\n } else {\n var contentBonus = 0;\n var density = linkDensity($sibling);\n\n // If sibling has a very low link density,\n // give it a small bonus\n if (density < 0.05) {\n contentBonus += 20;\n }\n\n // If sibling has a high link density,\n // give it a penalty\n if (density >= 0.5) {\n contentBonus -= 20;\n }\n\n // If sibling node has the same class as\n // candidate, give it a bonus\n if ($sibling.attr('class') === $candidate.attr('class')) {\n contentBonus += topScore * 0.2;\n }\n\n var newScore = siblingScore + contentBonus;\n\n if (newScore >= siblingScoreThreshold) {\n return wrappingDiv.append($sibling);\n } else if (sibling.tagName === 'p') {\n var siblingContent = $sibling.text();\n var siblingContentLength = textLength(siblingContent);\n\n if (siblingContentLength > 80 && density < 0.25) {\n return wrappingDiv.append($sibling);\n } else if (siblingContentLength <= 80 && density === 0 && hasSentenceEnd(siblingContent)) {\n return wrappingDiv.append($sibling);\n }\n }\n }\n }\n\n return null;\n });\n\n if (wrappingDiv.children().length === 1 && wrappingDiv.children().first().get(0) === $candidate.get(0)) {\n return $candidate;\n }\n\n return wrappingDiv;\n}\n\n// After we've calculated scores, loop through all of the possible\n// candidate nodes we found and find the one with the highest score.\nfunction findTopCandidate$$1($) {\n var $candidate = void 0;\n var topScore = 0;\n\n $('[score]').each(function (index, node) {\n // Ignore tags like BR, HR, etc\n if (NON_TOP_CANDIDATE_TAGS_RE$1.test(node.tagName)) {\n return;\n }\n\n var $node = $(node);\n var score = getScore($node);\n\n if (score > topScore) {\n topScore = score;\n $candidate = $node;\n }\n });\n\n // If we don't have a candidate, return the body\n // or whatever the first element is\n if (!$candidate) {\n return $('body') || $('*').first();\n }\n\n $candidate = mergeSiblings($candidate, topScore, $);\n\n return $candidate;\n}\n\n// Scoring\n\nfunction removeUnlessContent($node, $, weight) {\n // Explicitly save entry-content-asset tags, which are\n // noted as valuable in the Publisher guidelines. For now\n // this works everywhere. We may want to consider making\n // this less of a sure-thing later.\n if ($node.hasClass('entry-content-asset')) {\n return;\n }\n\n var content = normalizeSpaces($node.text());\n\n if (scoreCommas(content) < 10) {\n var pCount = $('p', $node).length;\n var inputCount = $('input', $node).length;\n\n // Looks like a form, too many inputs.\n if (inputCount > pCount / 3) {\n $node.remove();\n return;\n }\n\n var contentLength = content.length;\n var imgCount = $('img', $node).length;\n\n // Content is too short, and there are no images, so\n // this is probably junk content.\n if (contentLength < 25 && imgCount === 0) {\n $node.remove();\n return;\n }\n\n var density = linkDensity($node);\n\n // Too high of link density, is probably a menu or\n // something similar.\n // console.log(weight, density, contentLength)\n if (weight < 25 && density > 0.2 && contentLength > 75) {\n $node.remove();\n return;\n }\n\n // Too high of a link density, despite the score being\n // high.\n if (weight >= 25 && density > 0.5) {\n // Don't remove the node if it's a list and the\n // previous sibling starts with a colon though. That\n // means it's probably content.\n var tagName = $node.get(0).tagName.toLowerCase();\n var nodeIsList = tagName === 'ol' || tagName === 'ul';\n if (nodeIsList) {\n var previousNode = $node.prev();\n if (previousNode && normalizeSpaces(previousNode.text()).slice(-1) === ':') {\n return;\n }\n }\n\n $node.remove();\n return;\n }\n\n var scriptCount = $('script', $node).length;\n\n // Too many script tags, not enough content.\n if (scriptCount > 0 && contentLength < 150) {\n $node.remove();\n return;\n }\n }\n}\n\n// Given an article, clean it of some superfluous content specified by\n// tags. Things like forms, ads, etc.\n//\n// Tags is an array of tag name's to search through. (like div, form,\n// etc)\n//\n// Return this same doc.\nfunction cleanTags$$1($article, $) {\n $(CLEAN_CONDITIONALLY_TAGS, $article).each(function (index, node) {\n var $node = $(node);\n // If marked to keep, skip it\n if ($node.hasClass(KEEP_CLASS) || $node.find('.' + KEEP_CLASS).length > 0) return;\n\n var weight = getScore($node);\n if (!weight) {\n weight = getOrInitScore$$1($node, $);\n setScore($node, $, weight);\n }\n\n // drop node if its weight is < 0\n if (weight < 0) {\n $node.remove();\n } else {\n // deteremine if node seems like content\n removeUnlessContent($node, $, weight);\n }\n });\n\n return $;\n}\n\nfunction cleanHeaders($article, $) {\n var title = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n $(HEADER_TAG_LIST, $article).each(function (index, header) {\n var $header = $(header);\n // Remove any headers that appear before all other p tags in the\n // document. This probably means that it was part of the title, a\n // subtitle or something else extraneous like a datestamp or byline,\n // all of which should be handled by other metadata handling.\n if ($($header, $article).prevAll('p').length === 0) {\n return $header.remove();\n }\n\n // Remove any headers that match the title exactly.\n if (normalizeSpaces($(header).text()) === title) {\n return $header.remove();\n }\n\n // If this header has a negative weight, it's probably junk.\n // Get rid of it.\n if (getWeight($(header)) < 0) {\n return $header.remove();\n }\n\n return $header;\n });\n\n return $;\n}\n\n// Rewrite the tag name to div if it's a top level node like body or\n// html to avoid later complications with multiple body tags.\nfunction rewriteTopLevel$$1(article, $) {\n // I'm not using context here because\n // it's problematic when converting the\n // top-level/root node - AP\n $ = convertNodeTo$$1($('html'), $, 'div');\n $ = convertNodeTo$$1($('body'), $, 'div');\n\n return $;\n}\n\nfunction absolutize($, rootUrl, attr, $content) {\n $('[' + attr + ']', $content).each(function (_, node) {\n var attrs = getAttrs(node);\n var url = attrs[attr];\n\n if (url) {\n var absoluteUrl = URL.resolve(rootUrl, url);\n setAttr(node, attr, absoluteUrl);\n }\n });\n}\n\nfunction makeLinksAbsolute$$1($content, $, url) {\n ['href', 'src'].forEach(function (attr) {\n return absolutize($, url, attr, $content);\n });\n\n return $content;\n}\n\nfunction textLength(text) {\n return text.trim().replace(/\\s+/g, ' ').length;\n}\n\n// Determines what percentage of the text\n// in a node is link text\n// Takes a node, returns a float\nfunction linkDensity($node) {\n var totalTextLength = textLength($node.text());\n\n var linkText = $node.find('a').text();\n var linkLength = textLength(linkText);\n\n if (totalTextLength > 0) {\n return linkLength / totalTextLength;\n } else if (totalTextLength === 0 && linkLength > 0) {\n return 1;\n }\n\n return 0;\n}\n\n// Given a node type to search for, and a list of meta tag names to\n// search for, find a meta tag associated.\nfunction extractFromMeta$$1($, metaNames, cachedNames) {\n var cleanTags$$1 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n\n var foundNames = metaNames.filter(function (name) {\n return cachedNames.indexOf(name) !== -1;\n });\n\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n var _loop = function _loop() {\n var name = _step.value;\n\n var type = 'name';\n var value = 'value';\n\n var nodes = $('meta[' + type + '=\"' + name + '\"]');\n\n // Get the unique value of every matching node, in case there\n // are two meta tags with the same name and value.\n // Remove empty values.\n var values = nodes.map(function (index, node) {\n return $(node).attr(value);\n }).toArray().filter(function (text) {\n return text !== '';\n });\n\n // If we have more than one value for the same name, we have a\n // conflict and can't trust any of them. Skip this name. If we have\n // zero, that means our meta tags had no values. Skip this name\n // also.\n if (values.length === 1) {\n var metaValue = void 0;\n // Meta values that contain HTML should be stripped, as they\n // weren't subject to cleaning previously.\n if (cleanTags$$1) {\n metaValue = stripTags(values[0], $);\n } else {\n metaValue = values[0];\n }\n\n return {\n v: metaValue\n };\n }\n };\n\n for (var _iterator = _getIterator(foundNames), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var _ret = _loop();\n\n if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === \"object\") return _ret.v;\n }\n\n // If nothing is found, return null\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n return null;\n}\n\nfunction isGoodNode($node, maxChildren) {\n // If it has a number of children, it's more likely a container\n // element. Skip it.\n if ($node.children().length > maxChildren) {\n return false;\n }\n // If it looks to be within a comment, skip it.\n if (withinComment$$1($node)) {\n return false;\n }\n\n return true;\n}\n\n// Given a a list of selectors find content that may\n// be extractable from the document. This is for flat\n// meta-information, like author, title, date published, etc.\nfunction extractFromSelectors$$1($, selectors) {\n var maxChildren = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n var textOnly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = _getIterator(selectors), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var selector = _step.value;\n\n var nodes = $(selector);\n\n // If we didn't get exactly one of this selector, this may be\n // a list of articles or comments. Skip it.\n if (nodes.length === 1) {\n var $node = $(nodes[0]);\n\n if (isGoodNode($node, maxChildren)) {\n var content = void 0;\n if (textOnly) {\n content = $node.text();\n } else {\n content = $node.html();\n }\n\n if (content) {\n return content;\n }\n }\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n return null;\n}\n\n// strips all tags from a string of text\nfunction stripTags(text, $) {\n // Wrapping text in html element prevents errors when text\n // has no html\n var cleanText = $('<span>' + text + '</span>').text();\n return cleanText === '' ? text : cleanText;\n}\n\nfunction withinComment$$1($node) {\n var parents = $node.parents().toArray();\n var commentParent = parents.find(function (parent) {\n var attrs = getAttrs(parent);\n var nodeClass = attrs.class,\n id = attrs.id;\n\n var classAndId = nodeClass + ' ' + id;\n return classAndId.includes('comment');\n });\n\n return commentParent !== undefined;\n}\n\n// Given a node, determine if it's article-like enough to return\n// param: node (a cheerio node)\n// return: boolean\n\nfunction nodeIsSufficient($node) {\n return $node.text().trim().length >= 100;\n}\n\nfunction isWordpress($) {\n return $(IS_WP_SELECTOR).length > 0;\n}\n\nfunction getAttrs(node) {\n var attribs = node.attribs,\n attributes = node.attributes;\n\n\n if (!attribs && attributes) {\n var attrs = _Reflect$ownKeys(attributes).reduce(function (acc, index) {\n var attr = attributes[index];\n\n if (!attr.name || !attr.value) return acc;\n\n acc[attr.name] = attr.value;\n return acc;\n }, {});\n return attrs;\n }\n\n return attribs;\n}\n\nfunction setAttr(node, attr, val) {\n if (node.attribs) {\n node.attribs[attr] = val;\n } else if (node.attributes) {\n node.setAttribute(attr, val);\n }\n\n return node;\n}\n\nfunction setAttrs(node, attrs) {\n if (node.attribs) {\n node.attribs = attrs;\n } else if (node.attributes) {\n while (node.attributes.length > 0) {\n node.removeAttribute(node.attributes[0].name);\n }\n\n _Reflect$ownKeys(attrs).forEach(function (key) {\n node.setAttribute(key, attrs[key]);\n });\n }\n\n return node;\n}\n\n// DOM manipulation\n\nvar IS_LINK = new RegExp('https?://', 'i');\nvar IS_IMAGE = new RegExp('.(png|gif|jpe?g)', 'i');\n\nvar TAGS_TO_REMOVE = ['script', 'style', 'form'].join(',');\n\n// Convert all instances of images with potentially\n// lazy loaded images into normal images.\n// Many sites will have img tags with no source, or an image tag with a src\n// attribute that a is a placeholer. We need to be able to properly fill in\n// the src attribute so the images are no longer lazy loaded.\nfunction convertLazyLoadedImages($) {\n $('img').each(function (_, img) {\n var attrs = getAttrs(img);\n\n _Reflect$ownKeys(attrs).forEach(function (attr) {\n var value = attrs[attr];\n\n if (attr !== 'src' && IS_LINK.test(value) && IS_IMAGE.test(value)) {\n $(img).attr('src', value);\n }\n });\n });\n\n return $;\n}\n\nfunction isComment(index, node) {\n return node.type === 'comment';\n}\n\nfunction cleanComments($) {\n $.root().find('*').contents().filter(isComment).remove();\n\n return $;\n}\n\nfunction clean($) {\n $(TAGS_TO_REMOVE).remove();\n\n $ = cleanComments($);\n return $;\n}\n\nvar Resource = {\n\n // Create a Resource.\n //\n // :param url: The URL for the document we should retrieve.\n // :param response: If set, use as the response rather than\n // attempting to fetch it ourselves. Expects a\n // string.\n create: function create(url, preparedResponse, parsedUrl) {\n var _this = this;\n\n return _asyncToGenerator(_regeneratorRuntime.mark(function _callee() {\n var result, validResponse;\n return _regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n result = void 0;\n\n if (!preparedResponse) {\n _context.next = 6;\n break;\n }\n\n validResponse = {\n statusMessage: 'OK',\n statusCode: 200,\n headers: {\n 'content-type': 'text/html',\n 'content-length': 500\n }\n };\n\n\n result = { body: preparedResponse, response: validResponse };\n _context.next = 9;\n break;\n\n case 6:\n _context.next = 8;\n return fetchResource$1(url, parsedUrl);\n\n case 8:\n result = _context.sent;\n\n case 9:\n if (!result.error) {\n _context.next = 12;\n break;\n }\n\n result.failed = true;\n return _context.abrupt('return', result);\n\n case 12:\n return _context.abrupt('return', _this.generateDoc(result));\n\n case 13:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, _this);\n }))();\n },\n generateDoc: function generateDoc(_ref) {\n var content = _ref.body,\n response = _ref.response;\n var contentType = response.headers['content-type'];\n\n // TODO: Implement is_text function from\n // https://github.com/ReadabilityHoldings/readability/blob/8dc89613241d04741ebd42fa9fa7df1b1d746303/readability/utils/text.py#L57\n\n if (!contentType.includes('html') && !contentType.includes('text')) {\n throw new Error('Content does not appear to be text.');\n }\n\n var $ = this.encodeDoc({ content: content, contentType: contentType });\n\n if ($.root().children().length === 0) {\n throw new Error('No children, likely a bad parse.');\n }\n\n $ = normalizeMetaTags($);\n $ = convertLazyLoadedImages($);\n $ = clean($);\n\n return $;\n },\n encodeDoc: function encodeDoc(_ref2) {\n var content = _ref2.content,\n contentType = _ref2.contentType;\n\n var encoding = getEncoding(contentType);\n var decodedContent = iconv.decode(content, encoding);\n var $ = cheerio.load(decodedContent);\n\n // after first cheerio.load, check to see if encoding matches\n var metaContentType = $('meta[http-equiv=content-type]').attr('content');\n var properEncoding = getEncoding(metaContentType);\n\n // if encodings in the header/body dont match, use the one in the body\n if (properEncoding !== encoding) {\n decodedContent = iconv.decode(content, properEncoding);\n $ = cheerio.load(decodedContent);\n }\n\n return $;\n }\n};\n\nvar merge = function merge(extractor, domains) {\n return domains.reduce(function (acc, domain) {\n acc[domain] = extractor;\n return acc;\n }, {});\n};\n\nfunction mergeSupportedDomains(extractor) {\n return extractor.supportedDomains ? merge(extractor, [extractor.domain].concat(_toConsumableArray(extractor.supportedDomains))) : merge(extractor, [extractor.domain]);\n}\n\nvar BloggerExtractor = {\n domain: 'blogspot.com',\n content: {\n // Blogger is insane and does not load its content\n // initially in the page, but it's all there\n // in noscript\n selectors: ['.post-content noscript'],\n\n // Selectors to remove from the extracted content\n clean: [],\n\n // Convert the noscript tag to a div\n transforms: {\n noscript: 'div'\n }\n },\n\n author: {\n selectors: ['.post-author-name']\n },\n\n title: {\n selectors: ['.post h2.title']\n },\n\n date_published: {\n selectors: ['span.publishdate']\n }\n};\n\nvar NYMagExtractor = {\n domain: 'nymag.com',\n content: {\n // Order by most likely. Extractor will stop on first occurrence\n selectors: ['div.article-content', 'section.body', 'article.article'],\n\n // Selectors to remove from the extracted content\n clean: ['.ad', '.single-related-story'],\n\n // Object of tranformations to make on matched elements\n // Each key is the selector, each value is the tag to\n // transform to.\n // If a function is given, it should return a string\n // to convert to or nothing (in which case it will not perform\n // the transformation.\n transforms: {\n // Convert h1s to h2s\n h1: 'h2',\n\n // Convert lazy-loaded noscript images to figures\n noscript: function noscript($node, $) {\n var $children = $.browser ? $($node.text()) : $node.children();\n if ($children.length === 1 && $children.get(0) !== undefined && $children.get(0).tagName.toLowerCase() === 'img') {\n return 'figure';\n }\n\n return null;\n }\n }\n },\n\n title: {\n selectors: ['h1.lede-feature-title', 'h1.headline-primary', 'h1']\n },\n\n author: {\n selectors: ['.by-authors', '.lede-feature-author']\n },\n\n dek: {\n selectors: ['.lede-feature-teaser']\n },\n\n date_published: {\n selectors: [['time.article-timestamp[datetime]', 'datetime'], 'time.article-timestamp']\n }\n};\n\nvar WikipediaExtractor = {\n domain: 'wikipedia.org',\n content: {\n selectors: ['#mw-content-text'],\n\n defaultCleaner: false,\n\n // transform top infobox to an image with caption\n transforms: {\n '.infobox img': function infoboxImg($node) {\n var $parent = $node.parents('.infobox');\n // Only prepend the first image in .infobox\n if ($parent.children('img').length === 0) {\n $parent.prepend($node);\n }\n },\n '.infobox caption': 'figcaption',\n '.infobox': 'figure'\n },\n\n // Selectors to remove from the extracted content\n clean: ['.mw-editsection', 'figure tr, figure td, figure tbody', '#toc', '.navbox']\n\n },\n\n author: 'Wikipedia Contributors',\n\n title: {\n selectors: ['h2.title']\n },\n\n date_published: {\n selectors: ['#footer-info-lastmod']\n }\n\n};\n\nvar TwitterExtractor = {\n domain: 'twitter.com',\n\n content: {\n transforms: {\n // We're transforming essentially the whole page here.\n // Twitter doesn't have nice selectors, so our initial\n // selector grabs the whole page, then we're re-writing\n // it to fit our needs before we clean it up.\n '.permalink[role=main]': function permalinkRoleMain($node, $) {\n var tweets = $node.find('.tweet');\n var $tweetContainer = $('<div id=\"TWEETS_GO_HERE\"></div>');\n $tweetContainer.append(tweets);\n $node.replaceWith($tweetContainer);\n },\n\n // Twitter wraps @ with s, which\n // renders as a strikethrough\n s: 'span'\n },\n\n selectors: ['.permalink[role=main]'],\n\n defaultCleaner: false,\n\n clean: ['.stream-item-footer', 'button', '.tweet-details-fixer']\n },\n\n author: {\n selectors: ['.tweet.permalink-tweet .username']\n },\n\n date_published: {\n selectors: [['.permalink-tweet ._timestamp[data-time-ms]', 'data-time-ms']]\n }\n\n};\n\nvar NYTimesExtractor = {\n domain: 'www.nytimes.com',\n\n title: {\n selectors: ['h1.g-headline', 'h1[itemprop=\"headline\"]', 'h1.headline']\n },\n\n author: {\n selectors: [['meta[name=\"author\"]', 'value'], '.g-byline', '.byline']\n },\n\n content: {\n selectors: ['div.g-blocks', 'article#story'],\n\n transforms: {\n 'img.g-lazy': function imgGLazy($node) {\n var src = $node.attr('src');\n // const widths = $node.attr('data-widths')\n // .slice(1)\n // .slice(0, -1)\n // .split(',');\n // if (widths.length) {\n // width = widths.slice(-1);\n // } else {\n // width = '900';\n // }\n var width = 640;\n\n src = src.replace('{{size}}', width);\n $node.attr('src', src);\n }\n },\n\n clean: ['.ad', 'header#story-header', '.story-body-1 .lede.video', '.visually-hidden', '#newsletter-promo', '.promo', '.comments-button', '.hidden', '.comments', '.supplemental', '.nocontent', '.story-footer-links']\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n dek: null,\n\n next_page_url: null,\n\n excerpt: null\n};\n\n// Rename CustomExtractor\n// to fit your publication\nvar TheAtlanticExtractor = {\n domain: 'www.theatlantic.com',\n title: {\n selectors: ['h1.hed']\n },\n\n author: {\n selectors: ['article#article .article-cover-extra .metadata .byline a']\n },\n\n content: {\n selectors: [['.article-cover figure.lead-img', '.article-body'], '.article-body'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: [],\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.partner-box', '.callout']\n },\n\n date_published: {\n selectors: [['time[itemProp=\"datePublished\"]', 'datetime']]\n },\n\n lead_image_url: null,\n\n next_page_url: null,\n\n excerpt: null\n};\n\n// Rename CustomExtractor\n// to fit your publication\n// (e.g., NYTimesExtractor)\nvar NewYorkerExtractor = {\n domain: 'www.newyorker.com',\n title: {\n selectors: ['h1.title']\n },\n\n author: {\n selectors: ['.contributors']\n },\n\n content: {\n selectors: ['div#articleBody', 'div.articleBody'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: [],\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value'], ['time[itemProp=\"datePublished\"]', 'content']],\n\n timezone: 'America/New_York'\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n dek: {\n selectors: ['.dek', 'h2.dek']\n },\n\n next_page_url: null,\n\n excerpt: null\n};\n\n// Rename CustomExtractor\n// to fit your publication\n// (e.g., NYTimesExtractor)\nvar WiredExtractor = {\n domain: 'www.wired.com',\n title: {\n selectors: ['h1.post-title']\n },\n\n author: {\n selectors: ['a[rel=\"author\"]']\n },\n\n content: {\n selectors: ['article.content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: [],\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.visually-hidden', 'figcaption img.photo']\n },\n\n date_published: {\n selectors: [['meta[itemprop=\"datePublished\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n dek: {\n selectors: []\n },\n\n next_page_url: null,\n\n excerpt: null\n};\n\n// Rename CustomExtractor\n// to fit your publication\n// (e.g., NYTimesExtractor)\nvar MSNExtractor = {\n domain: 'www.msn.com',\n title: {\n selectors: ['h1']\n },\n\n author: {\n selectors: ['span.authorname-txt']\n },\n\n content: {\n selectors: ['div.richtext'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: [],\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['span.caption']\n },\n\n date_published: {\n selectors: ['span.time']\n },\n\n lead_image_url: {\n selectors: []\n },\n\n dek: {\n selectors: []\n },\n\n next_page_url: null,\n\n excerpt: null\n};\n\n// Rename CustomExtractor\n// to fit your publication\n// (e.g., NYTimesExtractor)\nvar YahooExtractor = {\n domain: 'www.yahoo.com',\n title: {\n selectors: ['header.canvas-header']\n },\n\n author: {\n selectors: ['span.provider-name']\n },\n\n content: {\n selectors: [\n // enter content selectors\n '.content-canvas'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: [],\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.figure-caption']\n },\n\n date_published: {\n selectors: [['time.date[datetime]', 'datetime']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n dek: {\n selectors: [\n // enter dek selectors\n ]\n },\n\n next_page_url: null,\n\n excerpt: null\n};\n\n// Rename CustomExtractor\n// to fit your publication\n// (e.g., NYTimesExtractor)\nvar BuzzfeedExtractor = {\n domain: 'www.buzzfeed.com',\n title: {\n selectors: ['h1[id=\"post-title\"]']\n },\n\n author: {\n selectors: ['a[data-action=\"user/username\"]', 'byline__author']\n },\n\n content: {\n selectors: [['.longform_custom_header_media', '#buzz_sub_buzz'], '#buzz_sub_buzz'],\n\n defaultCleaner: false,\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n h2: 'b',\n\n 'div.longform_custom_header_media': function divLongform_custom_header_media($node) {\n if ($node.has('img') && $node.has('.longform_header_image_source')) {\n return 'figure';\n }\n\n return null;\n },\n\n 'figure.longform_custom_header_media .longform_header_image_source': 'figcaption'\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.instapaper_ignore', '.suplist_list_hide .buzz_superlist_item .buzz_superlist_number_inline', '.share-box', '.print']\n },\n\n date_published: {\n selectors: ['.buzz-datetime']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n dek: {\n selectors: []\n },\n\n next_page_url: null,\n\n excerpt: null\n};\n\n// Rename CustomExtractor\n// to fit your publication\n// (e.g., NYTimesExtractor)\nvar WikiaExtractor = {\n domain: 'fandom.wikia.com',\n title: {\n selectors: ['h1.entry-title']\n },\n\n author: {\n selectors: ['.author vcard', '.fn']\n },\n\n content: {\n selectors: ['.grid-content', '.entry-content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: [],\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n dek: {\n selectors: []\n },\n\n next_page_url: null,\n\n excerpt: null\n};\n\n// Rename CustomExtractor\n// to fit your publication\n// (e.g., NYTimesExtractor)\nvar LittleThingsExtractor = {\n domain: 'www.littlethings.com',\n title: {\n selectors: ['h1.post-title']\n },\n\n author: {\n selectors: [['meta[name=\"author\"]', 'value']]\n },\n\n content: {\n selectors: [\n // enter content selectors\n '.mainContentIntro', '.content-wrapper'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: [],\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n next_page_url: null,\n\n excerpt: null\n};\n\n// Rename CustomExtractor\n// to fit your publication\n// (e.g., NYTimesExtractor)\nvar PoliticoExtractor = {\n domain: 'www.politico.com',\n title: {\n selectors: [\n // enter title selectors\n ['meta[name=\"og:title\"]', 'value']]\n },\n\n author: {\n selectors: ['.story-main-content .byline .vcard']\n },\n\n content: {\n selectors: [\n // enter content selectors\n '.story-main-content', '.content-group', '.story-core', '.story-text'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: [],\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['figcaption']\n },\n\n date_published: {\n selectors: [['.story-main-content .timestamp time[datetime]', 'datetime']]\n },\n\n lead_image_url: {\n selectors: [\n // enter lead_image_url selectors\n ['meta[name=\"og:image\"]', 'value']]\n },\n\n dek: {\n selectors: []\n },\n\n next_page_url: null,\n\n excerpt: null\n};\n\nvar DeadspinExtractor = {\n domain: 'deadspin.com',\n\n supportedDomains: ['jezebel.com', 'lifehacker.com', 'kotaku.com', 'gizmodo.com', 'jalopnik.com', 'kinja.com'],\n\n title: {\n selectors: ['h1.headline']\n },\n\n author: {\n selectors: ['.author']\n },\n\n content: {\n selectors: ['.post-content', '.entry-content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n 'iframe.lazyload[data-recommend-id^=\"youtube://\"]': function iframeLazyloadDataRecommendIdYoutube($node) {\n var youtubeId = $node.attr('id').split('youtube-')[1];\n $node.attr('src', 'https://www.youtube.com/embed/' + youtubeId);\n }\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.magnifier', '.lightbox']\n },\n\n date_published: {\n selectors: [['time.updated[datetime]', 'datetime']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n dek: {\n selectors: [\n // enter selectors\n ]\n },\n\n next_page_url: {\n selectors: [\n // enter selectors\n ]\n },\n\n excerpt: {\n selectors: [\n // enter selectors\n ]\n }\n};\n\n// Rename CustomExtractor\n// to fit your publication\n// (e.g., NYTimesExtractor)\nvar BroadwayWorldExtractor = {\n domain: 'www.broadwayworld.com',\n title: {\n selectors: ['h1.article-title']\n },\n\n author: {\n selectors: ['span[itemprop=author]']\n },\n\n content: {\n selectors: ['div[itemprop=articlebody]'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n },\n\n date_published: {\n selectors: [['meta[itemprop=datePublished]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n dek: {\n selectors: []\n },\n\n next_page_url: {\n selectors: [\n // enter selectors\n ]\n },\n\n excerpt: {\n selectors: [\n // enter selectors\n ]\n }\n};\n\n// Rename CustomExtractor\n// to fit your publication\n// (e.g., NYTimesExtractor)\nvar ApartmentTherapyExtractor = {\n domain: 'www.apartmenttherapy.com',\n title: {\n selectors: ['h1.headline']\n },\n\n author: {\n selectors: ['.PostByline__name']\n },\n\n content: {\n selectors: ['div.post__content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n 'div[data-render-react-id=\"images/LazyPicture\"]': function divDataRenderReactIdImagesLazyPicture($node, $) {\n var data = JSON.parse($node.attr('data-props'));\n var src = data.sources[0].src;\n\n var $img = $('<img />').attr('src', src);\n $node.replaceWith($img);\n }\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n },\n\n date_published: {\n selectors: [['.PostByline__timestamp[datetime]', 'datetime']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n dek: {\n selectors: []\n },\n\n next_page_url: {\n selectors: [\n // enter selectors\n ]\n },\n\n excerpt: {\n selectors: [\n // enter selectors\n ]\n }\n};\n\nvar MediumExtractor = {\n domain: 'medium.com',\n\n supportedDomains: ['trackchanges.postlight.com'],\n\n title: {\n selectors: ['h1']\n },\n\n author: {\n selectors: [['meta[name=\"author\"]', 'value']]\n },\n\n content: {\n selectors: [['.section-content'], '.section-content', 'article > div > section'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n // Re-write lazy-loaded youtube videos\n iframe: function iframe($node) {\n var ytRe = /https:\\/\\/i.embed.ly\\/.+url=https:\\/\\/i\\.ytimg\\.com\\/vi\\/(\\w+)\\//;\n var thumb = decodeURIComponent($node.attr('data-thumbnail'));\n\n if (ytRe.test(thumb)) {\n var _thumb$match = thumb.match(ytRe),\n _thumb$match2 = _slicedToArray(_thumb$match, 2),\n _ = _thumb$match2[0],\n youtubeId = _thumb$match2[1]; // eslint-disable-line\n\n\n $node.attr('src', 'https://www.youtube.com/embed/' + youtubeId);\n var $parent = $node.parents('figure');\n var $caption = $parent.find('figcaption');\n $parent.empty().append([$node, $caption]);\n }\n },\n\n // rewrite figures to pull out image and caption, remove rest\n figure: function figure($node) {\n // ignore if figure has an iframe\n if ($node.find('iframe').length > 0) return;\n\n var $img = $node.find('img').slice(-1)[0];\n var $caption = $node.find('figcaption');\n $node.empty().append([$img, $caption]);\n }\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n },\n\n date_published: {\n selectors: [['time[datetime]', 'datetime']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n dek: {\n selectors: [\n // enter selectors\n ]\n },\n\n next_page_url: {\n selectors: [\n // enter selectors\n ]\n },\n\n excerpt: {\n selectors: [\n // enter selectors\n ]\n }\n};\n\nvar WwwTmzComExtractor = {\n domain: 'www.tmz.com',\n\n title: {\n selectors: ['.post-title-breadcrumb', 'h1', '.headline']\n },\n\n author: 'TMZ STAFF',\n\n date_published: {\n selectors: ['.article-posted-date'],\n\n timezone: 'America/Los_Angeles'\n },\n\n dek: {\n selectors: [\n // enter selectors\n ]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.article-content', '.all-post-body'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.lightbox-link']\n }\n};\n\nvar WwwWashingtonpostComExtractor = {\n domain: 'www.washingtonpost.com',\n\n title: {\n selectors: ['h1', '#topper-headline-wrapper']\n },\n\n author: {\n selectors: ['.pb-byline']\n },\n\n date_published: {\n selectors: [['.pb-timestamp[itemprop=\"datePublished\"]', 'content']]\n },\n\n dek: {\n selectors: []\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.article-body'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n 'div.inline-content': function divInlineContent($node) {\n if ($node.has('img,iframe,video').length > 0) {\n return 'figure';\n }\n\n $node.remove();\n return null;\n },\n '.pb-caption': 'figcaption'\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.interstitial-link', '.newsletter-inline-unit']\n }\n};\n\nvar WwwHuffingtonpostComExtractor = {\n domain: 'www.huffingtonpost.com',\n\n title: {\n selectors: ['h1.headline__title']\n },\n\n author: {\n selectors: ['span.author-card__details__name']\n },\n\n date_published: {\n selectors: [['meta[name=\"article:modified_time\"]', 'value'], ['meta[name=\"article:published_time\"]', 'value']]\n },\n\n dek: {\n selectors: ['h2.headline__subtitle']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['div.entry__body'],\n\n defaultCleaner: false,\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n // 'div.top-media': ($node) => {\n // const $figure = $node.children('figure');\n // $node.replaceWith($figure);\n // },\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.pull-quote', '.tag-cloud', '.embed-asset', '.below-entry', '.entry-corrections', '#suggested-story']\n }\n};\n\nvar NewrepublicComExtractor = {\n domain: 'newrepublic.com',\n\n title: {\n selectors: ['h1.article-headline', '.minutes-primary h1.minute-title']\n },\n\n author: {\n selectors: ['div.author-list', '.minutes-primary h3.minute-byline']\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']],\n\n timezone: 'America/New_York'\n },\n\n dek: {\n selectors: ['h2.article-subhead']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [['.article-cover', 'div.content-body'], ['.minute-image', '.minutes-primary div.content-body']],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['aside']\n }\n};\n\nvar MoneyCnnComExtractor = {\n domain: 'money.cnn.com',\n\n title: {\n selectors: ['.article-title']\n },\n\n author: {\n selectors: ['.byline a']\n },\n\n date_published: {\n selectors: [['meta[name=\"date\"]', 'value']],\n\n timezone: 'GMT'\n },\n\n dek: {\n selectors: ['#storytext h2']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['#storytext'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.inStoryHeading']\n }\n};\n\nvar WwwThevergeComExtractor = {\n domain: 'www.theverge.com',\n\n supportedDomains: ['www.polygon.com'],\n\n title: {\n selectors: ['h1']\n },\n\n author: {\n selectors: [['meta[name=\"author\"]', 'value']]\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']]\n },\n\n dek: {\n selectors: ['h2.p-dek']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [\n // feature template multi-match\n ['.c-entry-hero .e-image', '.c-entry-intro', '.c-entry-content'],\n // regular post multi-match\n ['.e-image--hero', '.c-entry-content'],\n // feature template fallback\n '.l-wrapper .l-feature',\n // regular post fallback\n 'div.c-entry-content'],\n\n // Transform lazy-loaded images\n transforms: {\n noscript: function noscript($node) {\n var $children = $node.children();\n if ($children.length === 1 && $children.get(0).tagName === 'img') {\n return 'span';\n }\n\n return null;\n }\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.aside', 'img.c-dynamic-image']\n }\n};\n\nvar WwwCnnComExtractor = {\n domain: 'www.cnn.com',\n\n title: {\n selectors: ['h1.pg-headline', 'h1']\n },\n\n author: {\n selectors: ['.metadata__byline__author']\n },\n\n date_published: {\n selectors: [['meta[name=\"pubdate\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [\n // a more specific selector to grab the lead image and the body\n ['.media__video--thumbnail', '.zn-body-text'],\n // a fallback for the above\n '.zn-body-text', 'div[itemprop=\"articleBody\"]'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n '.zn-body__paragraph, .el__leafmedia--sourced-paragraph': function znBody__paragraphEl__leafmediaSourcedParagraph($node) {\n var $text = $node.html();\n if ($text) {\n return 'p';\n }\n\n return null;\n },\n\n // this transform cleans the short, all-link sections linking\n // to related content but not marked as such in any way.\n '.zn-body__paragraph': function znBody__paragraph($node) {\n if ($node.has('a')) {\n if ($node.text().trim() === $node.find('a').text().trim()) {\n $node.remove();\n }\n }\n },\n\n '.media__video--thumbnail': 'figure'\n\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwAolComExtractor = {\n domain: 'www.aol.com',\n\n title: {\n selectors: ['h1.p-article__title']\n },\n\n author: {\n selectors: [['meta[name=\"author\"]', 'value']]\n },\n\n date_published: {\n selectors: ['.p-article__byline__date'],\n\n timezone: 'America/New_York'\n },\n\n dek: {\n selectors: [\n // enter selectors\n ]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.article-content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwYoutubeComExtractor = {\n domain: 'www.youtube.com',\n\n title: {\n selectors: ['.watch-title', 'h1.watch-title-container']\n },\n\n author: {\n selectors: ['.yt-user-info']\n },\n\n date_published: {\n selectors: [['meta[itemProp=\"datePublished\"]', 'value']],\n\n timezone: 'GMT'\n },\n\n dek: {\n selectors: [\n // enter selectors\n ]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n defaultCleaner: false,\n\n selectors: [['#player-api', '#eow-description']],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n '#player-api': function playerApi($node, $) {\n var videoId = $('meta[itemProp=\"videoId\"]').attr('value');\n $node.html('\\n <iframe src=\"https://www.youtube.com/embed/' + videoId + '\" frameborder=\"0\" allowfullscreen></iframe>');\n }\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwTheguardianComExtractor = {\n domain: 'www.theguardian.com',\n\n title: {\n selectors: ['.content__headline']\n },\n\n author: {\n selectors: ['p.byline']\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']]\n },\n\n dek: {\n selectors: ['.content__standfirst']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.content__article-body'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.hide-on-mobile', '.inline-icon']\n }\n};\n\nvar WwwSbnationComExtractor = {\n domain: 'www.sbnation.com',\n\n title: {\n selectors: ['h1.c-page-title']\n },\n\n author: {\n selectors: [['meta[name=\"author\"]', 'value']]\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']]\n },\n\n dek: {\n selectors: ['h2.c-entry-summary.p-dek']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['div.c-entry-content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwBloombergComExtractor = {\n domain: 'www.bloomberg.com',\n\n title: {\n selectors: [\n // normal articles\n '.lede-headline',\n\n // /graphics/ template\n 'h1.article-title',\n\n // /news/ template\n 'h1.lede-text-only__hed']\n },\n\n author: {\n selectors: [['meta[name=\"parsely-author\"]', 'value'], '.byline-details__link',\n\n // /graphics/ template\n '.bydek',\n\n // /news/ template\n '.author']\n },\n\n date_published: {\n selectors: [['time.published-at', 'datetime'], ['time[datetime]', 'datetime'], ['meta[name=\"date\"]', 'value'], ['meta[name=\"parsely-pub-date\"]', 'value']]\n },\n\n dek: {\n selectors: []\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.article-body__content',\n\n // /graphics/ template\n ['section.copy-block'],\n\n // /news/ template\n '.body-copy'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.inline-newsletter', '.page-ad']\n }\n};\n\nvar WwwBustleComExtractor = {\n domain: 'www.bustle.com',\n\n title: {\n selectors: ['h1.post-page__title']\n },\n\n author: {\n selectors: ['div.content-meta__author']\n },\n\n date_published: {\n selectors: [['time.content-meta__published-date[datetime]', 'datetime']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.post-page__body'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwNprOrgExtractor = {\n domain: 'www.npr.org',\n\n title: {\n selectors: ['h1', '.storytitle']\n },\n\n author: {\n selectors: ['p.byline__name.byline__name--block']\n },\n\n date_published: {\n selectors: [['.dateblock time[datetime]', 'datetime'], ['meta[name=\"date\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value'], ['meta[name=\"twitter:image:src\"]', 'value']]\n },\n\n content: {\n selectors: ['.storytext'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n '.bucketwrap.image': 'figure',\n '.bucketwrap.image .credit-caption': 'figcaption'\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['div.enlarge_measure']\n }\n};\n\nvar WwwRecodeNetExtractor = {\n domain: 'www.recode.net',\n\n title: {\n selectors: ['h1.c-page-title']\n },\n\n author: {\n selectors: [['meta[name=\"author\"]', 'value']]\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']]\n },\n\n dek: {\n selectors: ['h2.c-entry-summary.p-dek']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [['figure.e-image--hero', '.c-entry-content'], '.c-entry-content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar QzComExtractor = {\n domain: 'qz.com',\n\n title: {\n selectors: ['header.item-header.content-width-responsive']\n },\n\n author: {\n selectors: [['meta[name=\"author\"]', 'value']]\n },\n\n date_published: {\n selectors: ['.timestamp']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [['figure.featured-image', '.item-body'], '.item-body'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.article-aside', '.progressive-image-thumbnail']\n }\n};\n\nvar WwwDmagazineComExtractor = {\n domain: 'www.dmagazine.com',\n\n title: {\n selectors: ['h1.story__title']\n },\n\n author: {\n selectors: ['.story__info .story__info__item:first-child']\n },\n\n date_published: {\n selectors: [\n // enter selectors\n '.story__info'],\n\n timezone: 'America/Chicago'\n },\n\n dek: {\n selectors: ['.story__subhead']\n },\n\n lead_image_url: {\n selectors: [['article figure a:first-child', 'href']]\n },\n\n content: {\n selectors: ['.story__content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwReutersComExtractor = {\n domain: 'www.reuters.com',\n\n title: {\n selectors: ['h1.article-headline']\n },\n\n author: {\n selectors: ['.author']\n },\n\n date_published: {\n selectors: [['meta[name=\"og:article:published_time\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['#article-text'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n '.article-subtitle': 'h4'\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['#article-byline .author']\n }\n};\n\nvar MashableComExtractor = {\n domain: 'mashable.com',\n\n title: {\n selectors: ['h1.title']\n },\n\n author: {\n selectors: ['span.author_name a']\n },\n\n date_published: {\n selectors: [['meta[name=\"og:article:published_time\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['section.article-content.blueprint'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n '.image-credit': 'figcaption'\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwChicagotribuneComExtractor = {\n domain: 'www.chicagotribune.com',\n\n title: {\n selectors: ['h1.trb_ar_hl_t']\n },\n\n author: {\n selectors: ['span.trb_ar_by_nm_au']\n },\n\n date_published: {\n selectors: [['meta[itemprop=\"datePublished\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['div.trb_ar_page'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwVoxComExtractor = {\n domain: 'www.vox.com',\n\n title: {\n selectors: ['h1.c-page-title']\n },\n\n author: {\n selectors: [['meta[name=\"author\"]', 'value']]\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']]\n },\n\n dek: {\n selectors: ['.p-dek']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [['figure.e-image--hero', '.c-entry-content'], '.c-entry-content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n 'figure .e-image__image noscript': function figureEImage__imageNoscript($node) {\n var imgHtml = $node.html();\n $node.parents('.e-image__image').find('.c-dynamic-image').replaceWith(imgHtml);\n },\n\n 'figure .e-image__meta': 'figcaption'\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar NewsNationalgeographicComExtractor = {\n domain: 'news.nationalgeographic.com',\n\n title: {\n selectors: ['h1', 'h1.main-title']\n },\n\n author: {\n selectors: ['.byline-component__contributors b span']\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']],\n format: 'ddd MMM DD HH:mm:ss zz YYYY',\n timezone: 'EST'\n },\n\n dek: {\n selectors: ['.article__deck']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [['.parsys.content', '.__image-lead__'], '.content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n '.parsys.content': function parsysContent($node, $) {\n var $imgSrc = $node.find('.image.parbase.section').find('.picturefill').first().data('platform-src');\n if ($imgSrc) {\n $node.prepend($('<img class=\"__image-lead__\" src=\"' + $imgSrc + '\"/>'));\n }\n }\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.pull-quote.pull-quote--large']\n }\n};\n\nvar WwwNationalgeographicComExtractor = {\n domain: 'www.nationalgeographic.com',\n\n title: {\n selectors: ['h1', 'h1.main-title']\n },\n\n author: {\n selectors: ['.byline-component__contributors b span']\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']]\n },\n\n dek: {\n selectors: ['.article__deck']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [['.parsys.content', '.__image-lead__'], '.content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n '.parsys.content': function parsysContent($node, $) {\n var $imageParent = $node.children().first();\n if ($imageParent.hasClass('imageGroup')) {\n var $dataAttrContainer = $imageParent.find('.media--medium__container').children().first();\n var imgPath1 = $dataAttrContainer.data('platform-image1-path');\n var imgPath2 = $dataAttrContainer.data('platform-image2-path');\n if (imgPath2 && imgPath1) {\n $node.prepend($('<div class=\"__image-lead__\">\\n <img src=\"' + imgPath1 + '\"/>\\n <img src=\"' + imgPath2 + '\"/>\\n </div>'));\n }\n } else {\n var $imgSrc = $node.find('.image.parbase.section').find('.picturefill').first().data('platform-src');\n if ($imgSrc) {\n $node.prepend($('<img class=\"__image-lead__\" src=\"' + $imgSrc + '\"/>'));\n }\n }\n }\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.pull-quote.pull-quote--small']\n }\n};\n\nvar WwwLatimesComExtractor = {\n domain: 'www.latimes.com',\n\n title: {\n selectors: ['.trb_ar_hl']\n },\n\n author: {\n selectors: [['meta[name=\"author\"]', 'value']]\n },\n\n date_published: {\n selectors: [['meta[itemprop=\"datePublished\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.trb_ar_main'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n '.trb_ar_la': function trb_ar_la($node) {\n var $figure = $node.find('figure');\n $node.replaceWith($figure);\n }\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.trb_ar_by', '.trb_ar_cr']\n }\n};\n\nvar PagesixComExtractor = {\n domain: 'pagesix.com',\n\n supportedDomains: ['nypost.com'],\n\n title: {\n selectors: ['h1 a']\n },\n\n author: {\n selectors: ['.byline']\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']]\n },\n\n dek: {\n selectors: [['meta[name=\"description\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [['#featured-image-wrapper', '.entry-content'], '.entry-content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n '#featured-image-wrapper': 'figure',\n '.wp-caption-text': 'figcaption'\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.modal-trigger']\n }\n};\n\nvar ThefederalistpapersOrgExtractor = {\n domain: 'thefederalistpapers.org',\n\n title: {\n selectors: ['h1.entry-title']\n },\n\n author: {\n selectors: ['main span.entry-author-name']\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.entry-content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: [['p[style]']]\n }\n};\n\nvar WwwCbssportsComExtractor = {\n domain: 'www.cbssports.com',\n\n title: {\n selectors: ['.article-headline']\n },\n\n author: {\n selectors: ['.author-name']\n },\n\n date_published: {\n selectors: [['.date-original-reading-time time', 'datetime']],\n timezone: 'UTC'\n },\n\n dek: {\n selectors: ['.article-subline']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.article'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwMsnbcComExtractor = {\n domain: 'www.msnbc.com',\n\n title: {\n selectors: ['h1', 'h1.is-title-pane']\n },\n\n author: {\n selectors: ['.author']\n },\n\n date_published: {\n selectors: [['meta[name=\"DC.date.issued\"]', 'value']]\n },\n\n dek: {\n selectors: [['meta[name=\"description\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.pane-node-body'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n '.pane-node-body': function paneNodeBody($node, $) {\n var _WwwMsnbcComExtractor = _slicedToArray(WwwMsnbcComExtractor.lead_image_url.selectors[0], 2),\n selector = _WwwMsnbcComExtractor[0],\n attr = _WwwMsnbcComExtractor[1];\n\n var src = $(selector).attr(attr);\n if (src) {\n $node.prepend('<img src=\"' + src + '\" />');\n }\n }\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwThepoliticalinsiderComExtractor = {\n domain: 'www.thepoliticalinsider.com',\n\n title: {\n selectors: [['meta[name=\"sailthru.title\"]', 'value']]\n },\n\n author: {\n selectors: [['meta[name=\"sailthru.author\"]', 'value']]\n },\n\n date_published: {\n selectors: [['meta[name=\"sailthru.date\"]', 'value']],\n timezone: 'America/New_York'\n },\n\n dek: {\n selectors: [\n // enter selectors\n ]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['div#article-body'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwMentalflossComExtractor = {\n domain: 'www.mentalfloss.com',\n\n title: {\n selectors: ['h1.title', '.title-group', '.inner']\n },\n\n author: {\n selectors: ['.field-name-field-enhanced-authors']\n },\n\n date_published: {\n selectors: ['.date-display-single'],\n timezone: 'America/New_York'\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['div.field.field-name-body'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar AbcnewsGoComExtractor = {\n domain: 'abcnews.go.com',\n\n title: {\n selectors: ['.article-header h1']\n },\n\n author: {\n selectors: ['.authors'],\n clean: ['.author-overlay', '.by-text']\n },\n\n date_published: {\n selectors: ['.timestamp'],\n timezone: 'America/New_York'\n\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.article-copy'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwNydailynewsComExtractor = {\n domain: 'www.nydailynews.com',\n\n title: {\n selectors: ['h1#ra-headline']\n },\n\n author: {\n selectors: [['meta[name=\"parsely-author\"]', 'value']]\n },\n\n date_published: {\n selectors: [['meta[name=\"sailthru.date\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['article#ra-body'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['dl#ra-tags', '.ra-related', 'a.ra-editor', 'dl#ra-share-bottom']\n }\n};\n\nvar WwwCnbcComExtractor = {\n domain: 'www.cnbc.com',\n\n title: {\n selectors: ['h1.title']\n },\n\n author: {\n selectors: [['meta[name=\"author\"]', 'value']]\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['div#article_body.content', 'div.story'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwPopsugarComExtractor = {\n domain: 'www.popsugar.com',\n\n title: {\n selectors: ['h2.post-title', 'title-text']\n },\n\n author: {\n selectors: [['meta[name=\"article:author\"]', 'value']]\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['#content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.share-copy-title', '.post-tags', '.reactions']\n }\n};\n\nvar ObserverComExtractor = {\n domain: 'observer.com',\n\n title: {\n selectors: ['h1.entry-title']\n },\n\n author: {\n selectors: ['.author', '.vcard']\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']]\n },\n\n dek: {\n selectors: ['h2.dek']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['div.entry-content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar PeopleComExtractor = {\n domain: 'people.com',\n\n title: {\n selectors: [['meta[name=\"og:title\"]', 'value']]\n },\n\n author: {\n selectors: ['a.author.url.fn']\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['div.article-body__inner'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwUsmagazineComExtractor = {\n domain: 'www.usmagazine.com',\n\n title: {\n selectors: ['header h1']\n },\n\n author: {\n selectors: ['a.article-byline.tracked-offpage']\n },\n\n date_published: {\n timezone: 'America/New_York',\n\n selectors: ['time.article-published-date']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['div.article-body-inner'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.module-related']\n }\n};\n\nvar WwwRollingstoneComExtractor = {\n domain: 'www.rollingstone.com',\n\n title: {\n selectors: ['h1.content-title']\n },\n\n author: {\n selectors: ['a.content-author.tracked-offpage']\n },\n\n date_published: {\n selectors: ['time.content-published-date'],\n\n timezone: 'America/New_York'\n },\n\n dek: {\n selectors: ['.content-description']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [['.lead-container', '.article-content'], '.article-content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.module-related']\n }\n};\n\nvar twofortysevensportsComExtractor = {\n domain: '247sports.com',\n\n title: {\n selectors: ['title', 'article header h1']\n },\n\n author: {\n selectors: ['.author']\n },\n\n date_published: {\n selectors: [['time[data-published]', 'data-published']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['section.body.article'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar UproxxComExtractor = {\n domain: 'uproxx.com',\n\n title: {\n selectors: ['div.post-top h1']\n },\n\n author: {\n selectors: ['.post-top .authorname']\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.post-body'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n 'div.image': 'figure',\n 'div.image .wp-media-credit': 'figcaption'\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwEonlineComExtractor = {\n domain: 'www.eonline.com',\n\n title: {\n selectors: ['h1.article__title']\n },\n\n author: {\n selectors: ['.entry-meta__author a']\n },\n\n date_published: {\n selectors: [['meta[itemprop=\"datePublished\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [['.post-content section, .post-content div.post-content__image']],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n 'div.post-content__image': 'figure',\n 'div.post-content__image .image__credits': 'figcaption'\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwMiamiheraldComExtractor = {\n domain: 'www.miamiherald.com',\n\n title: {\n selectors: ['h1.title']\n },\n\n date_published: {\n selectors: ['p.published-date'],\n\n timezone: 'America/New_York'\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['div.dateline-storybody'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwRefinery29ComExtractor = {\n domain: 'www.refinery29.com',\n\n title: {\n selectors: ['h1.title']\n },\n\n author: {\n selectors: ['.contributor']\n },\n\n date_published: {\n selectors: [['meta[name=\"sailthru.date\"]', 'value']],\n\n timezone: 'America/New_York'\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [['.full-width-opener', '.article-content'], '.article-content', '.body'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n 'div.loading noscript': function divLoadingNoscript($node) {\n var imgHtml = $node.html();\n $node.parents('.loading').replaceWith(imgHtml);\n },\n\n '.section-image': 'figure',\n\n '.section-image .content-caption': 'figcaption',\n\n '.section-text': 'p'\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.story-share']\n }\n};\n\nvar WwwMacrumorsComExtractor = {\n domain: 'www.macrumors.com',\n\n title: {\n selectors: ['h1', 'h1.title']\n },\n\n author: {\n selectors: ['.author-url']\n },\n\n date_published: {\n selectors: ['.article .byline'],\n\n // Wednesday January 18, 2017 11:44 am PST\n format: 'dddd MMMM D, YYYY h:mm A zz',\n\n timezone: 'America/Los_Angeles'\n },\n\n dek: {\n selectors: [['meta[name=\"description\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.article'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwAndroidcentralComExtractor = {\n domain: 'www.androidcentral.com',\n\n title: {\n selectors: ['h1', 'h1.main-title']\n },\n\n author: {\n selectors: ['.meta-by']\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']]\n },\n\n dek: {\n selectors: [['meta[name=\"og:description\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['.image-large', 'src']]\n },\n\n content: {\n selectors: ['.article-body'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.intro', 'blockquote']\n }\n};\n\nvar WwwSiComExtractor = {\n domain: 'www.si.com',\n\n title: {\n selectors: ['h1', 'h1.headline']\n },\n\n author: {\n selectors: [['meta[name=\"author\"]', 'value']]\n },\n\n date_published: {\n selectors: ['.timestamp'],\n\n timezone: 'America/New_York'\n },\n\n dek: {\n selectors: ['.quick-hit ul']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [['p', '.marquee_large_2x', '.component.image']],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n\n noscript: function noscript($node) {\n var $children = $node.children();\n if ($children.length === 1 && $children.get(0).tagName === 'img') {\n return 'figure';\n }\n\n return null;\n }\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: [['.inline-thumb', '.primary-message', '.description', '.instructions']]\n }\n};\n\nvar WwwRawstoryComExtractor = {\n domain: 'www.rawstory.com',\n\n title: {\n selectors: ['.blog-title']\n },\n\n author: {\n selectors: ['.blog-author a:first-of-type']\n },\n\n date_published: {\n selectors: ['.blog-author a:last-of-type'],\n\n timezone: 'EST'\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.blog-content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwCnetComExtractor = {\n domain: 'www.cnet.com',\n\n title: {\n selectors: [['meta[name=\"og:title\"]', 'value']]\n },\n\n author: {\n selectors: ['a.author']\n },\n\n date_published: {\n selectors: ['time'],\n\n timezone: 'America/Los_Angeles'\n },\n\n dek: {\n selectors: ['.article-dek']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [['img.__image-lead__', '.article-main-body'], '.article-main-body'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n 'figure.image': function figureImage($node) {\n var $img = $node.find('img');\n $img.attr('width', '100%');\n $img.attr('height', '100%');\n $img.addClass('__image-lead__');\n $node.remove('.imgContainer').prepend($img);\n }\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwCinemablendComExtractor = {\n domain: 'www.cinemablend.com',\n\n title: {\n selectors: ['.story_title']\n },\n\n author: {\n selectors: ['.author']\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']],\n\n timezone: 'EST'\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['div#wrap_left_content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwTodayComExtractor = {\n domain: 'www.today.com',\n\n title: {\n selectors: ['h1.entry-headline']\n },\n\n author: {\n selectors: [['meta[name=\"author\"]', 'value']]\n },\n\n date_published: {\n selectors: [['meta[name=\"DC.date.issued\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.entry-container'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.label-comment']\n }\n};\n\nvar WwwHowtogeekComExtractor = {\n domain: 'www.howtogeek.com',\n\n title: {\n selectors: ['title']\n },\n\n author: {\n selectors: ['#authorinfobox a']\n },\n\n date_published: {\n selectors: ['#authorinfobox + div li'],\n timezone: 'GMT'\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.thecontent'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwAlComExtractor = {\n domain: 'www.al.com',\n\n title: {\n selectors: [['meta[name=\"title\"]', 'value']]\n },\n\n author: {\n selectors: [['meta[name=\"article_author\"]', 'value']]\n },\n\n date_published: {\n selectors: [['meta[name=\"article_date_original\"]', 'value']],\n timezone: 'EST'\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.entry-content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwThepennyhoarderComExtractor = {\n domain: 'www.thepennyhoarder.com',\n\n title: {\n selectors: [['meta[name=\"dcterms.title\"]', 'value']]\n },\n\n author: {\n selectors: [['link[rel=\"author\"]', 'title']]\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [['.post-img', '.post-text'], '.post-text'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwWesternjournalismComExtractor = {\n domain: 'www.westernjournalism.com',\n\n title: {\n selectors: ['title', 'h1.entry-title']\n },\n\n author: {\n selectors: [['meta[name=\"author\"]', 'value']]\n },\n\n date_published: {\n selectors: [['meta[name=\"DC.date.issued\"]', 'value']]\n },\n\n dek: {\n selectors: ['.subtitle']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['div.article-sharing.top + div'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.ad-notice-small']\n }\n};\n\nvar FusionNetExtractor = {\n domain: 'fusion.net',\n\n title: {\n selectors: ['.post-title', '.single-title', '.headline']\n },\n\n author: {\n selectors: ['.show-for-medium .byline']\n },\n\n date_published: {\n selectors: [['time.local-time', 'datetime']]\n },\n\n dek: {\n selectors: [\n // enter selectors\n ]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [['.post-featured-media', '.article-content'], '.article-content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n '.fusion-youtube-oembed': 'figure'\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwAmericanowComExtractor = {\n domain: 'www.americanow.com',\n\n title: {\n selectors: ['.title', ['meta[name=\"title\"]', 'value']]\n },\n\n author: {\n selectors: ['.byline']\n },\n\n date_published: {\n selectors: [['meta[name=\"publish_date\"]', 'value']]\n },\n\n dek: {\n selectors: [\n // enter selectors\n ]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [['.article-content', '.image', '.body'], '.body'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.article-video-wrapper', '.show-for-small-only']\n }\n};\n\nvar ScienceflyComExtractor = {\n domain: 'sciencefly.com',\n\n title: {\n selectors: ['.entry-title', '.cb-entry-title', '.cb-single-title']\n },\n\n author: {\n selectors: ['div.cb-author', 'div.cb-author-title']\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']]\n },\n\n dek: {\n selectors: [\n // enter selectors\n ]\n },\n\n lead_image_url: {\n selectors: [['div.theiaPostSlider_slides img', 'src']]\n },\n\n content: {\n selectors: ['div.theiaPostSlider_slides'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar HellogigglesComExtractor = {\n domain: 'hellogiggles.com',\n\n title: {\n selectors: ['.title']\n },\n\n author: {\n selectors: ['.author-link']\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.entry-content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar ThoughtcatalogComExtractor = {\n domain: 'thoughtcatalog.com',\n\n title: {\n selectors: ['h1.title', ['meta[name=\"og:title\"]', 'value']]\n },\n\n author: {\n selectors: ['div.col-xs-12.article_header div.writer-container.writer-container-inline.writer-no-avatar h4.writer-name', 'h1.writer-name']\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.entry.post'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.tc_mark']\n }\n};\n\nvar WwwNjComExtractor = {\n domain: 'www.nj.com',\n\n title: {\n selectors: [['meta[name=\"title\"]', 'value']]\n },\n\n author: {\n selectors: [['meta[name=\"article_author\"]', 'value']]\n },\n\n date_published: {\n selectors: [['meta[name=\"article_date_original\"]', 'value']],\n\n timezone: 'America/New_York'\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.entry-content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwInquisitrComExtractor = {\n domain: 'www.inquisitr.com',\n\n title: {\n selectors: ['h1.entry-title.story--header--title']\n },\n\n author: {\n selectors: ['div.story--header--author']\n },\n\n date_published: {\n selectors: [['meta[name=\"datePublished\"]', 'value']]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['article.story', '.entry-content.'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.post-category', '.story--header--socials', '.story--header--content']\n }\n};\n\nvar WwwNbcnewsComExtractor = {\n domain: 'www.nbcnews.com',\n\n title: {\n selectors: ['div.article-hed h1']\n },\n\n author: {\n selectors: ['span.byline_author']\n },\n\n date_published: {\n selectors: [['.flag_article-wrapper time.timestamp_article[datetime]', 'datetime'], '.flag_article-wrapper time'],\n\n timezone: 'America/New_York'\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['div.article-body'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar FortuneComExtractor = {\n domain: 'fortune.com',\n\n title: {\n selectors: ['h1']\n },\n\n author: {\n selectors: [['meta[name=\"author\"]', 'value']]\n },\n\n date_published: {\n selectors: ['.MblGHNMJ'],\n\n timezone: 'UTC'\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [['picture', 'article.row'], 'article.row'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar WwwLinkedinComExtractor = {\n domain: 'www.linkedin.com',\n\n title: {\n selectors: ['.article-title', 'h1']\n },\n\n author: {\n selectors: [['meta[name=\"article:author\"]', 'value'], '.entity-name a[rel=author]']\n },\n\n date_published: {\n selectors: [['time[itemprop=\"datePublished\"]', 'datetime']],\n\n timezone: 'America/Los_Angeles'\n },\n\n dek: {\n selectors: [\n // enter selectors\n ]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [['header figure', '.prose'], '.prose'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.entity-image']\n }\n};\n\nvar ObamawhitehouseArchivesGovExtractor = {\n domain: 'obamawhitehouse.archives.gov',\n\n supportedDomains: ['whitehouse.gov'],\n\n title: {\n selectors: ['h1', '.pane-node-title']\n },\n\n author: {\n selectors: ['.blog-author-link', '.node-person-name-link']\n },\n\n date_published: {\n selectors: [['meta[name=\"article:published_time\"]', 'value']]\n },\n\n dek: {\n selectors: ['.field-name-field-forall-summary']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n defaultCleaner: false,\n\n selectors: ['div#content-start', '.pane-node-field-forall-body'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.pane-node-title', '.pane-custom.pane-1']\n }\n};\n\nvar WwwOpposingviewsComExtractor = {\n domain: 'www.opposingviews.com',\n\n title: {\n selectors: ['h1.title']\n },\n\n author: {\n selectors: ['div.date span span a']\n },\n\n date_published: {\n selectors: [['meta[name=\"publish_date\"]', 'value']]\n },\n\n dek: {\n selectors: [\n // enter selectors\n ]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.article-content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.show-for-small-only']\n }\n};\n\nvar WwwProspectmagazineCoUkExtractor = {\n domain: 'www.prospectmagazine.co.uk',\n\n title: {\n selectors: ['.page-title']\n },\n\n author: {\n selectors: ['.aside_author .title']\n },\n\n date_published: {\n selectors: ['.post-info'],\n\n timezone: 'Europe/London'\n },\n\n dek: {\n selectors: ['.page-subtitle']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [\n // ['article.type-post div.post_content p'],\n 'article .post_content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\nvar ForwardComExtractor = {\n domain: 'forward.com',\n\n title: {\n selectors: [['meta[name=\"og:title\"]', 'value']]\n },\n\n author: {\n selectors: ['.author-name', ['meta[name=\"sailthru.author\"]', 'value']]\n },\n\n date_published: {\n selectors: [['meta[name=\"date\"]', 'value']]\n },\n\n dek: {\n selectors: [\n // enter selectors\n ]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [['.post-item-media-wrap', '.post-item p']],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.donate-box', '.message', '.subtitle']\n }\n};\n\nvar WwwQdailyComExtractor = {\n domain: 'www.qdaily.com',\n\n title: {\n selectors: ['h2', 'h2.title']\n },\n\n author: {\n selectors: ['.name']\n },\n\n date_published: {\n selectors: [['.date.smart-date', 'data-origindate']]\n },\n\n dek: {\n selectors: ['.excerpt']\n },\n\n lead_image_url: {\n selectors: [['.article-detail-hd img', 'src']]\n },\n\n content: {\n selectors: ['.detail'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.lazyload', '.lazylad', '.lazylood']\n }\n};\n\nvar GothamistComExtractor = {\n domain: 'gothamist.com',\n\n supportedDomains: ['chicagoist.com', 'laist.com', 'sfist.com', 'shanghaiist.com', 'dcist.com'],\n\n title: {\n selectors: ['h1', '.entry-header h1']\n },\n\n author: {\n selectors: ['.author']\n },\n\n date_published: {\n selectors: ['abbr', 'abbr.published'],\n\n timezone: 'America/New_York'\n },\n\n dek: {\n selectors: [null]\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.entry-body'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n 'div.image-none': 'figure',\n '.image-none i': 'figcaption',\n 'div.image-left': 'figure',\n '.image-left i': 'figcaption',\n 'div.image-right': 'figure',\n '.image-right i': 'figcaption'\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.image-none br', '.image-left br', '.image-right br', '.galleryEase']\n }\n};\n\nvar WwwFoolComExtractor = {\n domain: 'www.fool.com',\n\n title: {\n selectors: ['h1']\n },\n\n author: {\n selectors: ['.author-inline .author-name']\n },\n\n date_published: {\n selectors: [['meta[name=\"date\"]', 'value']]\n },\n\n dek: {\n selectors: ['header h2']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.article-content'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n '.caption img': function captionImg($node) {\n var src = $node.attr('src');\n $node.parent().replaceWith('<figure><img src=\"' + src + '\"/></figure>');\n },\n '.caption': 'figcaption'\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['#pitch']\n }\n};\n\nvar WwwSlateComExtractor = {\n domain: 'www.slate.com',\n\n title: {\n selectors: ['.hed', 'h1']\n },\n\n author: {\n selectors: ['a[rel=author]']\n },\n\n date_published: {\n selectors: ['.pub-date'],\n\n timezone: 'America/New_York'\n },\n\n dek: {\n selectors: ['.dek']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: ['.body'],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: ['.about-the-author', '.pullquote', '.newsletter-signup-component', '.top-comment']\n }\n};\n\nvar IciRadioCanadaCaExtractor = {\n domain: 'ici.radio-canada.ca',\n\n title: {\n selectors: ['h1']\n },\n\n author: {\n selectors: [['meta[name=\"dc.creator\"]', 'value']]\n },\n\n date_published: {\n selectors: [['meta[name=\"dc.date.created\"]', 'value']],\n\n timezone: 'America/New_York'\n },\n\n dek: {\n selectors: ['.bunker-component.lead']\n },\n\n lead_image_url: {\n selectors: [['meta[name=\"og:image\"]', 'value']]\n },\n\n content: {\n selectors: [['.main-multimedia-item', '.news-story-content']],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {},\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: []\n }\n};\n\n\n\nvar CustomExtractors = Object.freeze({\n\tBloggerExtractor: BloggerExtractor,\n\tNYMagExtractor: NYMagExtractor,\n\tWikipediaExtractor: WikipediaExtractor,\n\tTwitterExtractor: TwitterExtractor,\n\tNYTimesExtractor: NYTimesExtractor,\n\tTheAtlanticExtractor: TheAtlanticExtractor,\n\tNewYorkerExtractor: NewYorkerExtractor,\n\tWiredExtractor: WiredExtractor,\n\tMSNExtractor: MSNExtractor,\n\tYahooExtractor: YahooExtractor,\n\tBuzzfeedExtractor: BuzzfeedExtractor,\n\tWikiaExtractor: WikiaExtractor,\n\tLittleThingsExtractor: LittleThingsExtractor,\n\tPoliticoExtractor: PoliticoExtractor,\n\tDeadspinExtractor: DeadspinExtractor,\n\tBroadwayWorldExtractor: BroadwayWorldExtractor,\n\tApartmentTherapyExtractor: ApartmentTherapyExtractor,\n\tMediumExtractor: MediumExtractor,\n\tWwwTmzComExtractor: WwwTmzComExtractor,\n\tWwwWashingtonpostComExtractor: WwwWashingtonpostComExtractor,\n\tWwwHuffingtonpostComExtractor: WwwHuffingtonpostComExtractor,\n\tNewrepublicComExtractor: NewrepublicComExtractor,\n\tMoneyCnnComExtractor: MoneyCnnComExtractor,\n\tWwwThevergeComExtractor: WwwThevergeComExtractor,\n\tWwwCnnComExtractor: WwwCnnComExtractor,\n\tWwwAolComExtractor: WwwAolComExtractor,\n\tWwwYoutubeComExtractor: WwwYoutubeComExtractor,\n\tWwwTheguardianComExtractor: WwwTheguardianComExtractor,\n\tWwwSbnationComExtractor: WwwSbnationComExtractor,\n\tWwwBloombergComExtractor: WwwBloombergComExtractor,\n\tWwwBustleComExtractor: WwwBustleComExtractor,\n\tWwwNprOrgExtractor: WwwNprOrgExtractor,\n\tWwwRecodeNetExtractor: WwwRecodeNetExtractor,\n\tQzComExtractor: QzComExtractor,\n\tWwwDmagazineComExtractor: WwwDmagazineComExtractor,\n\tWwwReutersComExtractor: WwwReutersComExtractor,\n\tMashableComExtractor: MashableComExtractor,\n\tWwwChicagotribuneComExtractor: WwwChicagotribuneComExtractor,\n\tWwwVoxComExtractor: WwwVoxComExtractor,\n\tNewsNationalgeographicComExtractor: NewsNationalgeographicComExtractor,\n\tWwwNationalgeographicComExtractor: WwwNationalgeographicComExtractor,\n\tWwwLatimesComExtractor: WwwLatimesComExtractor,\n\tPagesixComExtractor: PagesixComExtractor,\n\tThefederalistpapersOrgExtractor: ThefederalistpapersOrgExtractor,\n\tWwwCbssportsComExtractor: WwwCbssportsComExtractor,\n\tWwwMsnbcComExtractor: WwwMsnbcComExtractor,\n\tWwwThepoliticalinsiderComExtractor: WwwThepoliticalinsiderComExtractor,\n\tWwwMentalflossComExtractor: WwwMentalflossComExtractor,\n\tAbcnewsGoComExtractor: AbcnewsGoComExtractor,\n\tWwwNydailynewsComExtractor: WwwNydailynewsComExtractor,\n\tWwwCnbcComExtractor: WwwCnbcComExtractor,\n\tWwwPopsugarComExtractor: WwwPopsugarComExtractor,\n\tObserverComExtractor: ObserverComExtractor,\n\tPeopleComExtractor: PeopleComExtractor,\n\tWwwUsmagazineComExtractor: WwwUsmagazineComExtractor,\n\tWwwRollingstoneComExtractor: WwwRollingstoneComExtractor,\n\ttwofortysevensportsComExtractor: twofortysevensportsComExtractor,\n\tUproxxComExtractor: UproxxComExtractor,\n\tWwwEonlineComExtractor: WwwEonlineComExtractor,\n\tWwwMiamiheraldComExtractor: WwwMiamiheraldComExtractor,\n\tWwwRefinery29ComExtractor: WwwRefinery29ComExtractor,\n\tWwwMacrumorsComExtractor: WwwMacrumorsComExtractor,\n\tWwwAndroidcentralComExtractor: WwwAndroidcentralComExtractor,\n\tWwwSiComExtractor: WwwSiComExtractor,\n\tWwwRawstoryComExtractor: WwwRawstoryComExtractor,\n\tWwwCnetComExtractor: WwwCnetComExtractor,\n\tWwwCinemablendComExtractor: WwwCinemablendComExtractor,\n\tWwwTodayComExtractor: WwwTodayComExtractor,\n\tWwwHowtogeekComExtractor: WwwHowtogeekComExtractor,\n\tWwwAlComExtractor: WwwAlComExtractor,\n\tWwwThepennyhoarderComExtractor: WwwThepennyhoarderComExtractor,\n\tWwwWesternjournalismComExtractor: WwwWesternjournalismComExtractor,\n\tFusionNetExtractor: FusionNetExtractor,\n\tWwwAmericanowComExtractor: WwwAmericanowComExtractor,\n\tScienceflyComExtractor: ScienceflyComExtractor,\n\tHellogigglesComExtractor: HellogigglesComExtractor,\n\tThoughtcatalogComExtractor: ThoughtcatalogComExtractor,\n\tWwwNjComExtractor: WwwNjComExtractor,\n\tWwwInquisitrComExtractor: WwwInquisitrComExtractor,\n\tWwwNbcnewsComExtractor: WwwNbcnewsComExtractor,\n\tFortuneComExtractor: FortuneComExtractor,\n\tWwwLinkedinComExtractor: WwwLinkedinComExtractor,\n\tObamawhitehouseArchivesGovExtractor: ObamawhitehouseArchivesGovExtractor,\n\tWwwOpposingviewsComExtractor: WwwOpposingviewsComExtractor,\n\tWwwProspectmagazineCoUkExtractor: WwwProspectmagazineCoUkExtractor,\n\tForwardComExtractor: ForwardComExtractor,\n\tWwwQdailyComExtractor: WwwQdailyComExtractor,\n\tGothamistComExtractor: GothamistComExtractor,\n\tWwwFoolComExtractor: WwwFoolComExtractor,\n\tWwwSlateComExtractor: WwwSlateComExtractor,\n\tIciRadioCanadaCaExtractor: IciRadioCanadaCaExtractor\n});\n\nvar Extractors = _Object$keys(CustomExtractors).reduce(function (acc, key) {\n var extractor = CustomExtractors[key];\n return _extends({}, acc, mergeSupportedDomains(extractor));\n}, {});\n\n// CLEAN AUTHOR CONSTANTS\nvar CLEAN_AUTHOR_RE = /^\\s*(posted |written )?by\\s*:?\\s*(.*)/i;\n// author = re.sub(r'^\\s*(posted |written )?by\\s*:?\\s*(.*)(?i)',\n\n// CLEAN DEK CONSTANTS\nvar TEXT_LINK_RE = new RegExp('http(s)?://', 'i');\n// An ordered list of meta tag names that denote likely article deks.\n// From most distinct to least distinct.\n//\n// NOTE: There are currently no meta tags that seem to provide the right\n// content consistenty enough. Two options were:\n// - og:description\n// - dc.description\n// However, these tags often have SEO-specific junk in them that's not\n// header-worthy like a dek is. Excerpt material at best.\n\n\n// An ordered list of Selectors to find likely article deks. From\n// most explicit to least explicit.\n//\n// Should be more restrictive than not, as a failed dek can be pretty\n// detrimental to the aesthetics of an article.\n\n\n// CLEAN DATE PUBLISHED CONSTANTS\nvar MS_DATE_STRING = /^\\d{13}$/i;\nvar SEC_DATE_STRING = /^\\d{10}$/i;\nvar CLEAN_DATE_STRING_RE = /^\\s*published\\s*:?\\s*(.*)/i;\nvar TIME_MERIDIAN_SPACE_RE = /(.*\\d)(am|pm)(.*)/i;\nvar TIME_MERIDIAN_DOTS_RE = /\\.m\\./i;\nvar months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];\nvar allMonths = months.join('|');\nvar timestamp1 = '[0-9]{1,2}:[0-9]{2,2}( ?[ap].?m.?)?';\nvar timestamp2 = '[0-9]{1,2}[/-][0-9]{1,2}[/-][0-9]{2,4}';\nvar timestamp3 = '-[0-9]{3,4}$';\nvar SPLIT_DATE_STRING = new RegExp('(' + timestamp1 + ')|(' + timestamp2 + ')|(' + timestamp3 + ')|([0-9]{1,4})|(' + allMonths + ')', 'ig');\n\n// 2016-11-22T08:57-500\n// Check if datetime string has an offset at the end\nvar TIME_WITH_OFFSET_RE = /-\\d{3,4}$/;\n\n// CLEAN TITLE CONSTANTS\n// A regular expression that will match separating characters on a\n// title, that usually denote breadcrumbs or something similar.\nvar TITLE_SPLITTERS_RE = /(: | - | \\| )/g;\n\nvar DOMAIN_ENDINGS_RE = new RegExp('.com$|.net$|.org$|.co.uk$', 'g');\n\n// Take an author string (like 'By David Smith ') and clean it to\n// just the name(s): 'David Smith'.\nfunction cleanAuthor(author) {\n return normalizeSpaces(author.replace(CLEAN_AUTHOR_RE, '$2').trim());\n}\n\nfunction clean$1(leadImageUrl) {\n leadImageUrl = leadImageUrl.trim();\n if (validUrl.isWebUri(leadImageUrl)) {\n return leadImageUrl;\n }\n\n return null;\n}\n\n// Take a dek HTML fragment, and return the cleaned version of it.\n// Return None if the dek wasn't good enough.\nfunction cleanDek(dek, _ref) {\n var $ = _ref.$,\n excerpt = _ref.excerpt;\n\n // Sanity check that we didn't get too short or long of a dek.\n if (dek.length > 1000 || dek.length < 5) return null;\n\n // Check that dek isn't the same as excerpt\n if (excerpt && excerptContent(excerpt, 10) === excerptContent(dek, 10)) return null;\n\n var dekText = stripTags(dek, $);\n\n // Plain text links shouldn't exist in the dek. If we have some, it's\n // not a good dek - bail.\n if (TEXT_LINK_RE.test(dekText)) return null;\n\n return normalizeSpaces(dekText.trim());\n}\n\n// Is there a compelling reason to use moment here?\n// Mostly only being used for the isValid() method,\n// but could just check for 'Invalid Date' string.\n\nfunction cleanDateString(dateString) {\n return (dateString.match(SPLIT_DATE_STRING) || []).join(' ').replace(TIME_MERIDIAN_DOTS_RE, 'm').replace(TIME_MERIDIAN_SPACE_RE, '$1 $2 $3').replace(CLEAN_DATE_STRING_RE, '$1').trim();\n}\n\nfunction createDate(dateString, timezone, format) {\n if (TIME_WITH_OFFSET_RE.test(dateString)) {\n return moment(new Date(dateString));\n }\n\n return timezone ? moment.tz(dateString, format || parseFormat(dateString), timezone) : moment(dateString, format || parseFormat(dateString));\n}\n\n// Take a date published string, and hopefully return a date out of\n// it. Return none if we fail.\nfunction cleanDatePublished(dateString) {\n var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n timezone = _ref.timezone,\n format = _ref.format;\n\n // If string is in milliseconds or seconds, convert to int and return\n if (MS_DATE_STRING.test(dateString) || SEC_DATE_STRING.test(dateString)) {\n return new Date(parseInt(dateString, 10)).toISOString();\n }\n\n var date = createDate(dateString, timezone, format);\n\n if (!date.isValid()) {\n dateString = cleanDateString(dateString);\n date = createDate(dateString, timezone, format);\n }\n\n return date.isValid() ? date.toISOString() : null;\n}\n\n// Clean our article content, returning a new, cleaned node.\nfunction extractCleanNode(article, _ref) {\n var $ = _ref.$,\n _ref$cleanConditional = _ref.cleanConditionally,\n cleanConditionally = _ref$cleanConditional === undefined ? true : _ref$cleanConditional,\n _ref$title = _ref.title,\n title = _ref$title === undefined ? '' : _ref$title,\n _ref$url = _ref.url,\n url = _ref$url === undefined ? '' : _ref$url,\n _ref$defaultCleaner = _ref.defaultCleaner,\n defaultCleaner = _ref$defaultCleaner === undefined ? true : _ref$defaultCleaner;\n\n // Rewrite the tag name to div if it's a top level node like body or\n // html to avoid later complications with multiple body tags.\n rewriteTopLevel$$1(article, $);\n\n // Drop small images and spacer images\n // Only do this is defaultCleaner is set to true;\n // this can sometimes be too aggressive.\n if (defaultCleaner) cleanImages(article, $);\n\n // Make links absolute\n makeLinksAbsolute$$1(article, $, url);\n\n // Mark elements to keep that would normally be removed.\n // E.g., stripJunkTags will remove iframes, so we're going to mark\n // YouTube/Vimeo videos as elements we want to keep.\n markToKeep(article, $, url);\n\n // Drop certain tags like <title>, etc\n // This is -mostly- for cleanliness, not security.\n stripJunkTags(article, $);\n\n // H1 tags are typically the article title, which should be extracted\n // by the title extractor instead. If there's less than 3 of them (<3),\n // strip them. Otherwise, turn 'em into H2s.\n cleanHOnes$$1(article, $);\n\n // Clean headers\n cleanHeaders(article, $, title);\n\n // We used to clean UL's and OL's here, but it was leading to\n // too many in-article lists being removed. Consider a better\n // way to detect menus particularly and remove them.\n // Also optionally running, since it can be overly aggressive.\n if (defaultCleaner) cleanTags$$1(article, $, cleanConditionally);\n\n // Remove empty paragraph nodes\n removeEmpty(article, $);\n\n // Remove unnecessary attributes\n cleanAttributes$$1(article, $);\n\n return article;\n}\n\nfunction cleanTitle$$1(title, _ref) {\n var url = _ref.url,\n $ = _ref.$;\n\n // If title has |, :, or - in it, see if\n // we can clean it up.\n if (TITLE_SPLITTERS_RE.test(title)) {\n title = resolveSplitTitle(title, url);\n }\n\n // Final sanity check that we didn't get a crazy title.\n // if (title.length > 150 || title.length < 15) {\n if (title.length > 150) {\n // If we did, return h1 from the document if it exists\n var h1 = $('h1');\n if (h1.length === 1) {\n title = h1.text();\n }\n }\n\n // strip any html tags in the title text\n return normalizeSpaces(stripTags(title, $).trim());\n}\n\nfunction extractBreadcrumbTitle(splitTitle, text) {\n // This must be a very breadcrumbed title, like:\n // The Best Gadgets on Earth : Bits : Blogs : NYTimes.com\n // NYTimes - Blogs - Bits - The Best Gadgets on Earth\n if (splitTitle.length >= 6) {\n var _ret = function () {\n // Look to see if we can find a breadcrumb splitter that happens\n // more than once. If we can, we'll be able to better pull out\n // the title.\n var termCounts = splitTitle.reduce(function (acc, titleText) {\n acc[titleText] = acc[titleText] ? acc[titleText] + 1 : 1;\n return acc;\n }, {});\n\n var _Reflect$ownKeys$redu = _Reflect$ownKeys(termCounts).reduce(function (acc, key) {\n if (acc[1] < termCounts[key]) {\n return [key, termCounts[key]];\n }\n\n return acc;\n }, [0, 0]),\n _Reflect$ownKeys$redu2 = _slicedToArray(_Reflect$ownKeys$redu, 2),\n maxTerm = _Reflect$ownKeys$redu2[0],\n termCount = _Reflect$ownKeys$redu2[1];\n\n // We found a splitter that was used more than once, so it\n // is probably the breadcrumber. Split our title on that instead.\n // Note: max_term should be <= 4 characters, so that \" >> \"\n // will match, but nothing longer than that.\n\n\n if (termCount >= 2 && maxTerm.length <= 4) {\n splitTitle = text.split(maxTerm);\n }\n\n var splitEnds = [splitTitle[0], splitTitle.slice(-1)];\n var longestEnd = splitEnds.reduce(function (acc, end) {\n return acc.length > end.length ? acc : end;\n }, '');\n\n if (longestEnd.length > 10) {\n return {\n v: longestEnd\n };\n }\n\n return {\n v: text\n };\n }();\n\n if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === \"object\") return _ret.v;\n }\n\n return null;\n}\n\nfunction cleanDomainFromTitle(splitTitle, url) {\n // Search the ends of the title, looking for bits that fuzzy match\n // the URL too closely. If one is found, discard it and return the\n // rest.\n //\n // Strip out the big TLDs - it just makes the matching a bit more\n // accurate. Not the end of the world if it doesn't strip right.\n var _URL$parse = URL.parse(url),\n host = _URL$parse.host;\n\n var nakedDomain = host.replace(DOMAIN_ENDINGS_RE, '');\n\n var startSlug = splitTitle[0].toLowerCase().replace(' ', '');\n var startSlugRatio = wuzzy.levenshtein(startSlug, nakedDomain);\n\n if (startSlugRatio > 0.4 && startSlug.length > 5) {\n return splitTitle.slice(2).join('');\n }\n\n var endSlug = splitTitle.slice(-1)[0].toLowerCase().replace(' ', '');\n var endSlugRatio = wuzzy.levenshtein(endSlug, nakedDomain);\n\n if (endSlugRatio > 0.4 && endSlug.length >= 5) {\n return splitTitle.slice(0, -2).join('');\n }\n\n return null;\n}\n\n// Given a title with separators in it (colons, dashes, etc),\n// resolve whether any of the segments should be removed.\nfunction resolveSplitTitle(title) {\n var url = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n // Splits while preserving splitters, like:\n // ['The New New York', ' - ', 'The Washington Post']\n var splitTitle = title.split(TITLE_SPLITTERS_RE);\n if (splitTitle.length === 1) {\n return title;\n }\n\n var newTitle = extractBreadcrumbTitle(splitTitle, title);\n if (newTitle) return newTitle;\n\n newTitle = cleanDomainFromTitle(splitTitle, url);\n if (newTitle) return newTitle;\n\n // Fuzzy ratio didn't find anything, so this title is probably legit.\n // Just return it all.\n return title;\n}\n\nvar Cleaners = {\n author: cleanAuthor,\n lead_image_url: clean$1,\n dek: cleanDek,\n date_published: cleanDatePublished,\n content: extractCleanNode,\n title: cleanTitle$$1\n};\n\n// Using a variety of scoring techniques, extract the content most\n// likely to be article text.\n//\n// If strip_unlikely_candidates is True, remove any elements that\n// match certain criteria first. (Like, does this element have a\n// classname of \"comment\")\n//\n// If weight_nodes is True, use classNames and IDs to determine the\n// worthiness of nodes.\n//\n// Returns a cheerio object $\nfunction extractBestNode($, opts) {\n // clone the node so we can get back to our\n // initial parsed state if needed\n // TODO Do I need this? – AP\n // let $root = $.root().clone()\n\n if (opts.stripUnlikelyCandidates) {\n $ = stripUnlikelyCandidates($);\n }\n\n $ = convertToParagraphs$$1($);\n $ = scoreContent$$1($, opts.weightNodes);\n var $topCandidate = findTopCandidate$$1($);\n\n return $topCandidate;\n}\n\nvar GenericContentExtractor = {\n defaultOpts: {\n stripUnlikelyCandidates: true,\n weightNodes: true,\n cleanConditionally: true\n },\n\n // Extract the content for this resource - initially, pass in our\n // most restrictive opts which will return the highest quality\n // content. On each failure, retry with slightly more lax opts.\n //\n // :param return_type: string. If \"node\", should return the content\n // as a cheerio node rather than as an HTML string.\n //\n // Opts:\n // stripUnlikelyCandidates: Remove any elements that match\n // non-article-like criteria first.(Like, does this element\n // have a classname of \"comment\")\n //\n // weightNodes: Modify an elements score based on whether it has\n // certain classNames or IDs. Examples: Subtract if a node has\n // a className of 'comment', Add if a node has an ID of\n // 'entry-content'.\n //\n // cleanConditionally: Clean the node to return of some\n // superfluous content. Things like forms, ads, etc.\n extract: function extract(_ref, opts) {\n var $ = _ref.$,\n html = _ref.html,\n title = _ref.title,\n url = _ref.url;\n\n opts = _extends({}, this.defaultOpts, opts);\n\n $ = $ || cheerio.load(html);\n\n // Cascade through our extraction-specific opts in an ordered fashion,\n // turning them off as we try to extract content.\n var node = this.getContentNode($, title, url, opts);\n\n if (nodeIsSufficient(node)) {\n return this.cleanAndReturnNode(node, $);\n }\n\n // We didn't succeed on first pass, one by one disable our\n // extraction opts and try again.\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = _getIterator(_Reflect$ownKeys(opts).filter(function (k) {\n return opts[k] === true;\n })), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var key = _step.value;\n\n opts[key] = false;\n $ = cheerio.load(html);\n\n node = this.getContentNode($, title, url, opts);\n\n if (nodeIsSufficient(node)) {\n break;\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n return this.cleanAndReturnNode(node, $);\n },\n\n\n // Get node given current options\n getContentNode: function getContentNode($, title, url, opts) {\n return extractCleanNode(extractBestNode($, opts), {\n $: $,\n cleanConditionally: opts.cleanConditionally,\n title: title,\n url: url\n });\n },\n\n\n // Once we got here, either we're at our last-resort node, or\n // we broke early. Make sure we at least have -something- before we\n // move forward.\n cleanAndReturnNode: function cleanAndReturnNode(node, $) {\n if (!node) {\n return null;\n }\n\n return normalizeSpaces($.html(node));\n\n // if return_type == \"html\":\n // return normalize_spaces(node_to_html(node))\n // else:\n // return node\n }\n};\n\n// TODO: It would be great if we could merge the meta and selector lists into\n// a list of objects, because we could then rank them better. For example,\n// .hentry .entry-title is far better suited than <meta title>.\n\n// An ordered list of meta tag names that denote likely article titles. All\n// attributes should be lowercase for faster case-insensitive matching. From\n// most distinct to least distinct.\nvar STRONG_TITLE_META_TAGS = ['tweetmeme-title', 'dc.title', 'rbtitle', 'headline', 'title'];\n\n// og:title is weak because it typically contains context that we don't like,\n// for example the source site's name. Gotta get that brand into facebook!\nvar WEAK_TITLE_META_TAGS = ['og:title'];\n\n// An ordered list of XPath Selectors to find likely article titles. From\n// most explicit to least explicit.\n//\n// Note - this does not use classes like CSS. This checks to see if the string\n// exists in the className, which is not as accurate as .className (which\n// splits on spaces/endlines), but for our purposes it's close enough. The\n// speed tradeoff is worth the accuracy hit.\nvar STRONG_TITLE_SELECTORS = ['.hentry .entry-title', 'h1#articleHeader', 'h1.articleHeader', 'h1.article', '.instapaper_title', '#meebo-title'];\n\nvar WEAK_TITLE_SELECTORS = ['article h1', '#entry-title', '.entry-title', '#entryTitle', '#entrytitle', '.entryTitle', '.entrytitle', '#articleTitle', '.articleTitle', 'post post-title', 'h1.title', 'h2.article', 'h1', 'html head title', 'title'];\n\nvar GenericTitleExtractor = {\n extract: function extract(_ref) {\n var $ = _ref.$,\n url = _ref.url,\n metaCache = _ref.metaCache;\n\n // First, check to see if we have a matching meta tag that we can make\n // use of that is strongly associated with the headline.\n var title = void 0;\n\n title = extractFromMeta$$1($, STRONG_TITLE_META_TAGS, metaCache);\n if (title) return cleanTitle$$1(title, { url: url, $: $ });\n\n // Second, look through our content selectors for the most likely\n // article title that is strongly associated with the headline.\n title = extractFromSelectors$$1($, STRONG_TITLE_SELECTORS);\n if (title) return cleanTitle$$1(title, { url: url, $: $ });\n\n // Third, check for weaker meta tags that may match.\n title = extractFromMeta$$1($, WEAK_TITLE_META_TAGS, metaCache);\n if (title) return cleanTitle$$1(title, { url: url, $: $ });\n\n // Last, look for weaker selector tags that may match.\n title = extractFromSelectors$$1($, WEAK_TITLE_SELECTORS);\n if (title) return cleanTitle$$1(title, { url: url, $: $ });\n\n // If no matches, return an empty string\n return '';\n }\n};\n\n// An ordered list of meta tag names that denote likely article authors. All\n// attributes should be lowercase for faster case-insensitive matching. From\n// most distinct to least distinct.\n//\n// Note: \"author\" is too often the -developer- of the page, so it is not\n// added here.\nvar AUTHOR_META_TAGS = ['byl', 'clmst', 'dc.author', 'dcsext.author', 'dc.creator', 'rbauthors', 'authors'];\n\nvar AUTHOR_MAX_LENGTH = 300;\n\n// An ordered list of XPath Selectors to find likely article authors. From\n// most explicit to least explicit.\n//\n// Note - this does not use classes like CSS. This checks to see if the string\n// exists in the className, which is not as accurate as .className (which\n// splits on spaces/endlines), but for our purposes it's close enough. The\n// speed tradeoff is worth the accuracy hit.\nvar AUTHOR_SELECTORS = ['.entry .entry-author', '.author.vcard .fn', '.author .vcard .fn', '.byline.vcard .fn', '.byline .vcard .fn', '.byline .by .author', '.byline .by', '.byline .author', '.post-author.vcard', '.post-author .vcard', 'a[rel=author]', '#by_author', '.by_author', '#entryAuthor', '.entryAuthor', '.byline a[href*=author]', '#author .authorname', '.author .authorname', '#author', '.author', '.articleauthor', '.ArticleAuthor', '.byline'];\n\n// An ordered list of Selectors to find likely article authors, with\n// regular expression for content.\nvar bylineRe = /^[\\n\\s]*By/i;\nvar BYLINE_SELECTORS_RE = [['#byline', bylineRe], ['.byline', bylineRe]];\n\nvar GenericAuthorExtractor = {\n extract: function extract(_ref) {\n var $ = _ref.$,\n metaCache = _ref.metaCache;\n\n var author = void 0;\n\n // First, check to see if we have a matching\n // meta tag that we can make use of.\n author = extractFromMeta$$1($, AUTHOR_META_TAGS, metaCache);\n if (author && author.length < AUTHOR_MAX_LENGTH) {\n return cleanAuthor(author);\n }\n\n // Second, look through our selectors looking for potential authors.\n author = extractFromSelectors$$1($, AUTHOR_SELECTORS, 2);\n if (author && author.length < AUTHOR_MAX_LENGTH) {\n return cleanAuthor(author);\n }\n\n // Last, use our looser regular-expression based selectors for\n // potential authors.\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = _getIterator(BYLINE_SELECTORS_RE), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var _ref4 = _step.value;\n\n var _ref3 = _slicedToArray(_ref4, 2);\n\n var selector = _ref3[0];\n var regex = _ref3[1];\n\n var node = $(selector);\n if (node.length === 1) {\n var text = node.text();\n if (regex.test(text)) {\n return cleanAuthor(text);\n }\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n return null;\n }\n};\n\n// An ordered list of meta tag names that denote\n// likely date published dates. All attributes\n// should be lowercase for faster case-insensitive matching.\n// From most distinct to least distinct.\nvar DATE_PUBLISHED_META_TAGS = ['article:published_time', 'displaydate', 'dc.date', 'dc.date.issued', 'rbpubdate', 'publish_date', 'pub_date', 'pagedate', 'pubdate', 'revision_date', 'doc_date', 'date_created', 'content_create_date', 'lastmodified', 'created', 'date'];\n\n// An ordered list of XPath Selectors to find\n// likely date published dates. From most explicit\n// to least explicit.\nvar DATE_PUBLISHED_SELECTORS = ['.hentry .dtstamp.published', '.hentry .published', '.hentry .dtstamp.updated', '.hentry .updated', '.single .published', '.meta .published', '.meta .postDate', '.entry-date', '.byline .date', '.postmetadata .date', '.article_datetime', '.date-header', '.story-date', '.dateStamp', '#story .datetime', '.dateline', '.pubdate'];\n\n// An ordered list of compiled regular expressions to find likely date\n// published dates from the URL. These should always have the first\n// reference be a date string that is parseable by dateutil.parser.parse\nvar abbrevMonthsStr = '(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)';\nvar DATE_PUBLISHED_URL_RES = [\n// /2012/01/27/ but not /2012/01/293\nnew RegExp('/(20\\\\d{2}/\\\\d{2}/\\\\d{2})/', 'i'),\n// 20120127 or 20120127T but not 2012012733 or 8201201733\n// /[^0-9](20\\d{2}[01]\\d[0-3]\\d)([^0-9]|$)/i,\n// 2012-01-27\nnew RegExp('(20\\\\d{2}-[01]\\\\d-[0-3]\\\\d)', 'i'),\n// /2012/jan/27/\nnew RegExp('/(20\\\\d{2}/' + abbrevMonthsStr + '/[0-3]\\\\d)/', 'i')];\n\nvar GenericDatePublishedExtractor = {\n extract: function extract(_ref) {\n var $ = _ref.$,\n url = _ref.url,\n metaCache = _ref.metaCache;\n\n var datePublished = void 0;\n // First, check to see if we have a matching meta tag\n // that we can make use of.\n // Don't try cleaning tags from this string\n datePublished = extractFromMeta$$1($, DATE_PUBLISHED_META_TAGS, metaCache, false);\n if (datePublished) return cleanDatePublished(datePublished);\n\n // Second, look through our selectors looking for potential\n // date_published's.\n datePublished = extractFromSelectors$$1($, DATE_PUBLISHED_SELECTORS);\n if (datePublished) return cleanDatePublished(datePublished);\n\n // Lastly, look to see if a dately string exists in the URL\n datePublished = extractFromUrl(url, DATE_PUBLISHED_URL_RES);\n if (datePublished) return cleanDatePublished(datePublished);\n\n return null;\n }\n};\n\n// import {\n// DEK_META_TAGS,\n// DEK_SELECTORS,\n// DEK_URL_RES,\n// } from './constants';\n\n// import { cleanDek } from 'cleaners';\n\n// import {\n// extractFromMeta,\n// extractFromSelectors,\n// } from 'utils/dom';\n\n// Currently there is only one selector for\n// deks. We should simply return null here\n// until we have a more robust generic option.\n// Below is the original source for this, for reference.\nvar GenericDekExtractor = {\n // extract({ $, content, metaCache }) {\n extract: function extract() {\n return null;\n }\n};\n\n\n\n// def extract_dek(self):\n// # First, check to see if we have a matching meta tag that we can make\n// # use of.\n// dek = self.extract_from_meta('dek', constants.DEK_META_TAGS)\n// if not dek:\n// # Second, look through our CSS/XPath selectors. This may return\n// # an HTML fragment.\n// dek = self.extract_from_selectors('dek',\n// constants.DEK_SELECTORS,\n// text_only=False)\n//\n// if dek:\n// # Make sure our dek isn't in the first few thousand characters\n// # of the content, otherwise it's just the start of the article\n// # and not a true dek.\n// content = self.extract_content()\n// content_chunk = normalize_spaces(strip_tags(content[:2000]))\n// dek_chunk = normalize_spaces(dek[:100]) # Already has no tags.\n//\n// # 80% or greater similarity means the dek was very similar to some\n// # of the starting content, so we skip it.\n// if fuzz.partial_ratio(content_chunk, dek_chunk) < 80:\n// return dek\n//\n// return None\n\n// An ordered list of meta tag names that denote likely article leading images.\n// All attributes should be lowercase for faster case-insensitive matching.\n// From most distinct to least distinct.\nvar LEAD_IMAGE_URL_META_TAGS = ['og:image', 'twitter:image', 'image_src'];\n\nvar LEAD_IMAGE_URL_SELECTORS = ['link[rel=image_src]'];\n\nvar POSITIVE_LEAD_IMAGE_URL_HINTS = ['upload', 'wp-content', 'large', 'photo', 'wp-image'];\nvar POSITIVE_LEAD_IMAGE_URL_HINTS_RE = new RegExp(POSITIVE_LEAD_IMAGE_URL_HINTS.join('|'), 'i');\n\nvar NEGATIVE_LEAD_IMAGE_URL_HINTS = ['spacer', 'sprite', 'blank', 'throbber', 'gradient', 'tile', 'bg', 'background', 'icon', 'social', 'header', 'hdr', 'advert', 'spinner', 'loader', 'loading', 'default', 'rating', 'share', 'facebook', 'twitter', 'theme', 'promo', 'ads', 'wp-includes'];\nvar NEGATIVE_LEAD_IMAGE_URL_HINTS_RE = new RegExp(NEGATIVE_LEAD_IMAGE_URL_HINTS.join('|'), 'i');\n\nvar GIF_RE = /\\.gif(\\?.*)?$/i;\nvar JPG_RE = /\\.jpe?g(\\?.*)?$/i;\n\nfunction getSig($node) {\n return ($node.attr('class') || '') + ' ' + ($node.attr('id') || '');\n}\n\n// Scores image urls based on a variety of heuristics.\nfunction scoreImageUrl(url) {\n url = url.trim();\n var score = 0;\n\n if (POSITIVE_LEAD_IMAGE_URL_HINTS_RE.test(url)) {\n score += 20;\n }\n\n if (NEGATIVE_LEAD_IMAGE_URL_HINTS_RE.test(url)) {\n score -= 20;\n }\n\n // TODO: We might want to consider removing this as\n // gifs are much more common/popular than they once were\n if (GIF_RE.test(url)) {\n score -= 10;\n }\n\n if (JPG_RE.test(url)) {\n score += 10;\n }\n\n // PNGs are neutral.\n\n return score;\n}\n\n// Alt attribute usually means non-presentational image.\nfunction scoreAttr($img) {\n if ($img.attr('alt')) {\n return 5;\n }\n\n return 0;\n}\n\n// Look through our parent and grandparent for figure-like\n// container elements, give a bonus if we find them\nfunction scoreByParents($img) {\n var score = 0;\n var $figParent = $img.parents('figure').first();\n\n if ($figParent.length === 1) {\n score += 25;\n }\n\n var $parent = $img.parent();\n var $gParent = void 0;\n if ($parent.length === 1) {\n $gParent = $parent.parent();\n }\n\n [$parent, $gParent].forEach(function ($node) {\n if (PHOTO_HINTS_RE$1.test(getSig($node))) {\n score += 15;\n }\n });\n\n return score;\n}\n\n// Look at our immediate sibling and see if it looks like it's a\n// caption. Bonus if so.\nfunction scoreBySibling($img) {\n var score = 0;\n var $sibling = $img.next();\n var sibling = $sibling.get(0);\n\n if (sibling && sibling.tagName.toLowerCase() === 'figcaption') {\n score += 25;\n }\n\n if (PHOTO_HINTS_RE$1.test(getSig($sibling))) {\n score += 15;\n }\n\n return score;\n}\n\nfunction scoreByDimensions($img) {\n var score = 0;\n\n var width = parseFloat($img.attr('width'));\n var height = parseFloat($img.attr('height'));\n var src = $img.attr('src');\n\n // Penalty for skinny images\n if (width && width <= 50) {\n score -= 50;\n }\n\n // Penalty for short images\n if (height && height <= 50) {\n score -= 50;\n }\n\n if (width && height && !src.includes('sprite')) {\n var area = width * height;\n if (area < 5000) {\n // Smaller than 50 x 100\n score -= 100;\n } else {\n score += Math.round(area / 1000);\n }\n }\n\n return score;\n}\n\nfunction scoreByPosition($imgs, index) {\n return $imgs.length / 2 - index;\n}\n\n// Given a resource, try to find the lead image URL from within\n// it. Like content and next page extraction, uses a scoring system\n// to determine what the most likely image may be. Short circuits\n// on really probable things like og:image meta tags.\n//\n// Potential signals to still take advantage of:\n// * domain\n// * weird aspect ratio\nvar GenericLeadImageUrlExtractor = {\n extract: function extract(_ref) {\n var $ = _ref.$,\n content = _ref.content,\n metaCache = _ref.metaCache,\n html = _ref.html;\n\n var cleanUrl = void 0;\n if (!$.browser && $('head').length === 0) {\n $('*').first().prepend(html);\n }\n\n // Check to see if we have a matching meta tag that we can make use of.\n // Moving this higher because common practice is now to use large\n // images on things like Open Graph or Twitter cards.\n // images usually have for things like Open Graph.\n var imageUrl = extractFromMeta$$1($, LEAD_IMAGE_URL_META_TAGS, metaCache, false);\n\n if (imageUrl) {\n cleanUrl = clean$1(imageUrl);\n\n if (cleanUrl) return cleanUrl;\n }\n\n // Next, try to find the \"best\" image via the content.\n // We'd rather not have to fetch each image and check dimensions,\n // so try to do some analysis and determine them instead.\n var $content = $(content);\n var imgs = $('img', $content).toArray();\n var imgScores = {};\n\n imgs.forEach(function (img, index) {\n var $img = $(img);\n var src = $img.attr('src');\n\n if (!src) return;\n\n var score = scoreImageUrl(src);\n score += scoreAttr($img);\n score += scoreByParents($img);\n score += scoreBySibling($img);\n score += scoreByDimensions($img);\n score += scoreByPosition(imgs, index);\n\n imgScores[src] = score;\n });\n\n var _Reflect$ownKeys$redu = _Reflect$ownKeys(imgScores).reduce(function (acc, key) {\n return imgScores[key] > acc[1] ? [key, imgScores[key]] : acc;\n }, [null, 0]),\n _Reflect$ownKeys$redu2 = _slicedToArray(_Reflect$ownKeys$redu, 2),\n topUrl = _Reflect$ownKeys$redu2[0],\n topScore = _Reflect$ownKeys$redu2[1];\n\n if (topScore > 0) {\n cleanUrl = clean$1(topUrl);\n\n if (cleanUrl) return cleanUrl;\n }\n\n // If nothing else worked, check to see if there are any really\n // probable nodes in the doc, like <link rel=\"image_src\" />.\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = _getIterator(LEAD_IMAGE_URL_SELECTORS), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var selector = _step.value;\n\n var $node = $(selector).first();\n var src = $node.attr('src');\n if (src) {\n cleanUrl = clean$1(src);\n if (cleanUrl) return cleanUrl;\n }\n\n var href = $node.attr('href');\n if (href) {\n cleanUrl = clean$1(href);\n if (cleanUrl) return cleanUrl;\n }\n\n var value = $node.attr('value');\n if (value) {\n cleanUrl = clean$1(value);\n if (cleanUrl) return cleanUrl;\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n return null;\n }\n};\n\n\n\n// def extract(self):\n// \"\"\"\n// # First, try to find the \"best\" image via the content.\n// # We'd rather not have to fetch each image and check dimensions,\n// # so try to do some analysis and determine them instead.\n// content = self.extractor.extract_content(return_type=\"node\")\n// imgs = content.xpath('.//img')\n// img_scores = defaultdict(int)\n// logger.debug('Scoring %d images from content', len(imgs))\n// for (i, img) in enumerate(imgs):\n// img_score = 0\n//\n// if not 'src' in img.attrib:\n// logger.debug('No src attribute found')\n// continue\n//\n// try:\n// parsed_img = urlparse(img.attrib['src'])\n// img_path = parsed_img.path.lower()\n// except ValueError:\n// logger.debug('ValueError getting img path.')\n// continue\n// logger.debug('Image path is %s', img_path)\n//\n// if constants.POSITIVE_LEAD_IMAGE_URL_HINTS_RE.match(img_path):\n// logger.debug('Positive URL hints match. Adding 20.')\n// img_score += 20\n//\n// if constants.NEGATIVE_LEAD_IMAGE_URL_HINTS_RE.match(img_path):\n// logger.debug('Negative URL hints match. Subtracting 20.')\n// img_score -= 20\n//\n// # Gifs are more often structure than photos\n// if img_path.endswith('gif'):\n// logger.debug('gif found. Subtracting 10.')\n// img_score -= 10\n//\n// # JPGs are more often photographs\n// if img_path.endswith('jpg'):\n// logger.debug('jpg found. Adding 10.')\n// img_score += 10\n//\n// # PNGs are neutral.\n//\n// # Alt attribute usually means non-presentational image.\n// if 'alt' in img.attrib and len(img.attrib['alt']) > 5:\n// logger.debug('alt attribute found. Adding 5.')\n// img_score += 5\n//\n// # Look through our parent and grandparent for figure-like\n// # container elements, give a bonus if we find them\n// parents = [img.getparent()]\n// if parents[0] is not None and parents[0].getparent() is not None:\n// parents.append(parents[0].getparent())\n// for p in parents:\n// if p.tag == 'figure':\n// logger.debug('Parent with <figure> tag found. Adding 25.')\n// img_score += 25\n//\n// p_sig = ' '.join([p.get('id', ''), p.get('class', '')])\n// if constants.PHOTO_HINTS_RE.search(p_sig):\n// logger.debug('Photo hints regex match. Adding 15.')\n// img_score += 15\n//\n// # Look at our immediate sibling and see if it looks like it's a\n// # caption. Bonus if so.\n// sibling = img.getnext()\n// if sibling is not None:\n// if sibling.tag == 'figcaption':\n// img_score += 25\n//\n// sib_sig = ' '.join([sibling.get('id', ''),\n// sibling.get('class', '')]).lower()\n// if 'caption' in sib_sig:\n// img_score += 15\n//\n// # Pull out width/height if they were set.\n// img_width = None\n// img_height = None\n// if 'width' in img.attrib:\n// try:\n// img_width = float(img.get('width'))\n// except ValueError:\n// pass\n// if 'height' in img.attrib:\n// try:\n// img_height = float(img.get('height'))\n// except ValueError:\n// pass\n//\n// # Penalty for skinny images\n// if img_width and img_width <= 50:\n// logger.debug('Skinny image found. Subtracting 50.')\n// img_score -= 50\n//\n// # Penalty for short images\n// if img_height and img_height <= 50:\n// # Wide, short images are more common than narrow, tall ones\n// logger.debug('Short image found. Subtracting 25.')\n// img_score -= 25\n//\n// if img_width and img_height and not 'sprite' in img_path:\n// area = img_width * img_height\n//\n// if area < 5000: # Smaller than 50x100\n// logger.debug('Image with small area found. Subtracting 100.')\n// img_score -= 100\n// else:\n// img_score += round(area/1000.0)\n//\n// # If the image is higher on the page than other images,\n// # it gets a bonus. Penalty if lower.\n// logger.debug('Adding page placement bonus of %d.', len(imgs)/2 - i)\n// img_score += len(imgs)/2 - i\n//\n// # Use the raw src here because we munged img_path for case\n// # insensitivity\n// logger.debug('Final score is %d.', img_score)\n// img_scores[img.attrib['src']] += img_score\n//\n// top_score = 0\n// top_url = None\n// for (url, score) in img_scores.items():\n// if score > top_score:\n// top_url = url\n// top_score = score\n//\n// if top_score > 0:\n// logger.debug('Using top score image from content. Score was %d', top_score)\n// return top_url\n//\n//\n// # If nothing else worked, check to see if there are any really\n// # probable nodes in the doc, like <link rel=\"image_src\" />.\n// logger.debug('Trying to find lead image in probable nodes')\n// for selector in constants.LEAD_IMAGE_URL_SELECTORS:\n// nodes = self.resource.extract_by_selector(selector)\n// for node in nodes:\n// clean_value = None\n// if node.attrib.get('src'):\n// clean_value = self.clean(node.attrib['src'])\n//\n// if not clean_value and node.attrib.get('href'):\n// clean_value = self.clean(node.attrib['href'])\n//\n// if not clean_value and node.attrib.get('value'):\n// clean_value = self.clean(node.attrib['value'])\n//\n// if clean_value:\n// logger.debug('Found lead image in probable nodes.')\n// logger.debug('Node was: %s', node)\n// return clean_value\n//\n// return None\n\nfunction scoreSimilarity(score, articleUrl, href) {\n // Do this last and only if we have a real candidate, because it's\n // potentially expensive computationally. Compare the link to this\n // URL using difflib to get the % similarity of these URLs. On a\n // sliding scale, subtract points from this link based on\n // similarity.\n if (score > 0) {\n var similarity = new difflib.SequenceMatcher(null, articleUrl, href).ratio();\n // Subtract .1 from diff_percent when calculating modifier,\n // which means that if it's less than 10% different, we give a\n // bonus instead. Ex:\n // 3% different = +17.5 points\n // 10% different = 0 points\n // 20% different = -25 points\n var diffPercent = 1.0 - similarity;\n var diffModifier = -(250 * (diffPercent - 0.2));\n return score + diffModifier;\n }\n\n return 0;\n}\n\nfunction scoreLinkText(linkText, pageNum) {\n // If the link text can be parsed as a number, give it a minor\n // bonus, with a slight bias towards lower numbered pages. This is\n // so that pages that might not have 'next' in their text can still\n // get scored, and sorted properly by score.\n var score = 0;\n\n if (IS_DIGIT_RE.test(linkText.trim())) {\n var linkTextAsNum = parseInt(linkText, 10);\n // If it's the first page, we already got it on the first call.\n // Give it a negative score. Otherwise, up to page 10, give a\n // small bonus.\n if (linkTextAsNum < 2) {\n score = -30;\n } else {\n score = Math.max(0, 10 - linkTextAsNum);\n }\n\n // If it appears that the current page number is greater than\n // this links page number, it's a very bad sign. Give it a big\n // penalty.\n if (pageNum && pageNum >= linkTextAsNum) {\n score -= 50;\n }\n }\n\n return score;\n}\n\nfunction scorePageInLink(pageNum, isWp) {\n // page in the link = bonus. Intentionally ignore wordpress because\n // their ?p=123 link style gets caught by this even though it means\n // separate documents entirely.\n if (pageNum && !isWp) {\n return 50;\n }\n\n return 0;\n}\n\nvar DIGIT_RE$2 = /\\d/;\n\n// A list of words that, if found in link text or URLs, likely mean that\n// this link is not a next page link.\nvar EXTRANEOUS_LINK_HINTS$1 = ['print', 'archive', 'comment', 'discuss', 'e-mail', 'email', 'share', 'reply', 'all', 'login', 'sign', 'single', 'adx', 'entry-unrelated'];\nvar EXTRANEOUS_LINK_HINTS_RE$1 = new RegExp(EXTRANEOUS_LINK_HINTS$1.join('|'), 'i');\n\n// Match any link text/classname/id that looks like it could mean the next\n// page. Things like: next, continue, >, >>, » but not >|, »| as those can\n// mean last page.\nvar NEXT_LINK_TEXT_RE$1 = new RegExp('(next|weiter|continue|>([^|]|$)|»([^|]|$))', 'i');\n\n// Match any link text/classname/id that looks like it is an end link: things\n// like \"first\", \"last\", \"end\", etc.\nvar CAP_LINK_TEXT_RE$1 = new RegExp('(first|last|end)', 'i');\n\n// Match any link text/classname/id that looks like it means the previous\n// page.\nvar PREV_LINK_TEXT_RE$1 = new RegExp('(prev|earl|old|new|<|«)', 'i');\n\n// Match any phrase that looks like it could be page, or paging, or pagination\n\nfunction scoreExtraneousLinks(href) {\n // If the URL itself contains extraneous values, give a penalty.\n if (EXTRANEOUS_LINK_HINTS_RE$1.test(href)) {\n return -25;\n }\n\n return 0;\n}\n\nfunction makeSig$1($link) {\n return ($link.attr('class') || '') + ' ' + ($link.attr('id') || '');\n}\n\nfunction scoreByParents$1($link) {\n // If a parent node contains paging-like classname or id, give a\n // bonus. Additionally, if a parent_node contains bad content\n // (like 'sponsor'), give a penalty.\n var $parent = $link.parent();\n var positiveMatch = false;\n var negativeMatch = false;\n var score = 0;\n\n _Array$from(range(0, 4)).forEach(function () {\n if ($parent.length === 0) {\n return;\n }\n\n var parentData = makeSig$1($parent, ' ');\n\n // If we have 'page' or 'paging' in our data, that's a good\n // sign. Add a bonus.\n if (!positiveMatch && PAGE_RE.test(parentData)) {\n positiveMatch = true;\n score += 25;\n }\n\n // If we have 'comment' or something in our data, and\n // we don't have something like 'content' as well, that's\n // a bad sign. Give a penalty.\n if (!negativeMatch && NEGATIVE_SCORE_RE.test(parentData) && EXTRANEOUS_LINK_HINTS_RE$1.test(parentData)) {\n if (!POSITIVE_SCORE_RE.test(parentData)) {\n negativeMatch = true;\n score -= 25;\n }\n }\n\n $parent = $parent.parent();\n });\n\n return score;\n}\n\nfunction scorePrevLink(linkData) {\n // If the link has something like \"previous\", its definitely\n // an old link, skip it.\n if (PREV_LINK_TEXT_RE$1.test(linkData)) {\n return -200;\n }\n\n return 0;\n}\n\nfunction shouldScore(href, articleUrl, baseUrl, parsedUrl, linkText, previousUrls) {\n // skip if we've already fetched this url\n if (previousUrls.find(function (url) {\n return href === url;\n }) !== undefined) {\n return false;\n }\n\n // If we've already parsed this URL, or the URL matches the base\n // URL, or is empty, skip it.\n if (!href || href === articleUrl || href === baseUrl) {\n return false;\n }\n\n var hostname = parsedUrl.hostname;\n\n var _URL$parse = URL.parse(href),\n linkHost = _URL$parse.hostname;\n\n // Domain mismatch.\n\n\n if (linkHost !== hostname) {\n return false;\n }\n\n // If href doesn't contain a digit after removing the base URL,\n // it's certainly not the next page.\n var fragment = href.replace(baseUrl, '');\n if (!DIGIT_RE$2.test(fragment)) {\n return false;\n }\n\n // This link has extraneous content (like \"comment\") in its link\n // text, so we skip it.\n if (EXTRANEOUS_LINK_HINTS_RE$1.test(linkText)) {\n return false;\n }\n\n // Next page link text is never long, skip if it is too long.\n if (linkText.length > 25) {\n return false;\n }\n\n return true;\n}\n\nfunction scoreBaseUrl(href, baseRegex) {\n // If the baseUrl isn't part of this URL, penalize this\n // link. It could still be the link, but the odds are lower.\n // Example:\n // http://www.actionscript.org/resources/articles/745/1/JavaScript-and-VBScript-Injection-in-ActionScript-3/Page1.html\n if (!baseRegex.test(href)) {\n return -25;\n }\n\n return 0;\n}\n\nfunction scoreNextLinkText(linkData) {\n // Things like \"next\", \">>\", etc.\n if (NEXT_LINK_TEXT_RE$1.test(linkData)) {\n return 50;\n }\n\n return 0;\n}\n\nfunction scoreCapLinks(linkData) {\n // Cap links are links like \"last\", etc.\n if (CAP_LINK_TEXT_RE$1.test(linkData)) {\n // If we found a link like \"last\", but we've already seen that\n // this link is also \"next\", it's fine. If it's not been\n // previously marked as \"next\", then it's probably bad.\n // Penalize.\n if (NEXT_LINK_TEXT_RE$1.test(linkData)) {\n return -65;\n }\n }\n\n return 0;\n}\n\nfunction makeBaseRegex(baseUrl) {\n return new RegExp('^' + baseUrl, 'i');\n}\n\nfunction makeSig($link, linkText) {\n return (linkText || $link.text()) + ' ' + ($link.attr('class') || '') + ' ' + ($link.attr('id') || '');\n}\n\nfunction scoreLinks(_ref) {\n var links = _ref.links,\n articleUrl = _ref.articleUrl,\n baseUrl = _ref.baseUrl,\n parsedUrl = _ref.parsedUrl,\n $ = _ref.$,\n _ref$previousUrls = _ref.previousUrls,\n previousUrls = _ref$previousUrls === undefined ? [] : _ref$previousUrls;\n\n parsedUrl = parsedUrl || URL.parse(articleUrl);\n var baseRegex = makeBaseRegex(baseUrl);\n var isWp = isWordpress($);\n\n // Loop through all links, looking for hints that they may be next-page\n // links. Things like having \"page\" in their textContent, className or\n // id, or being a child of a node with a page-y className or id.\n //\n // After we do that, assign each page a score, and pick the one that\n // looks most like the next page link, as long as its score is strong\n // enough to have decent confidence.\n var scoredPages = links.reduce(function (possiblePages, link) {\n // Remove any anchor data since we don't do a good job\n // standardizing URLs (it's hard), we're going to do\n // some checking with and without a trailing slash\n var attrs = getAttrs(link);\n\n // if href is undefined, return\n if (!attrs.href) return possiblePages;\n\n var href = removeAnchor(attrs.href);\n var $link = $(link);\n var linkText = $link.text();\n\n if (!shouldScore(href, articleUrl, baseUrl, parsedUrl, linkText, previousUrls)) {\n return possiblePages;\n }\n\n // ## PASSED THE FIRST-PASS TESTS. Start scoring. ##\n if (!possiblePages[href]) {\n possiblePages[href] = {\n score: 0,\n linkText: linkText,\n href: href\n };\n } else {\n possiblePages[href].linkText = possiblePages[href].linkText + '|' + linkText;\n }\n\n var possiblePage = possiblePages[href];\n var linkData = makeSig($link, linkText);\n var pageNum = pageNumFromUrl(href);\n\n var score = scoreBaseUrl(href, baseRegex);\n score += scoreNextLinkText(linkData);\n score += scoreCapLinks(linkData);\n score += scorePrevLink(linkData);\n score += scoreByParents$1($link);\n score += scoreExtraneousLinks(href);\n score += scorePageInLink(pageNum, isWp);\n score += scoreLinkText(linkText, pageNum);\n score += scoreSimilarity(score, articleUrl, href);\n\n possiblePage.score = score;\n\n return possiblePages;\n }, {});\n\n return _Reflect$ownKeys(scoredPages).length === 0 ? null : scoredPages;\n}\n\n// Looks for and returns next page url\n// for multi-page articles\nvar GenericNextPageUrlExtractor = {\n extract: function extract(_ref) {\n var $ = _ref.$,\n url = _ref.url,\n parsedUrl = _ref.parsedUrl,\n _ref$previousUrls = _ref.previousUrls,\n previousUrls = _ref$previousUrls === undefined ? [] : _ref$previousUrls;\n\n parsedUrl = parsedUrl || URL.parse(url);\n\n var articleUrl = removeAnchor(url);\n var baseUrl = articleBaseUrl(url, parsedUrl);\n\n var links = $('a[href]').toArray();\n\n var scoredLinks = scoreLinks({\n links: links,\n articleUrl: articleUrl,\n baseUrl: baseUrl,\n parsedUrl: parsedUrl,\n $: $,\n previousUrls: previousUrls\n });\n\n // If no links were scored, return null\n if (!scoredLinks) return null;\n\n // now that we've scored all possible pages,\n // find the biggest one.\n var topPage = _Reflect$ownKeys(scoredLinks).reduce(function (acc, link) {\n var scoredLink = scoredLinks[link];\n return scoredLink.score > acc.score ? scoredLink : acc;\n }, { score: -100 });\n\n // If the score is less than 50, we're not confident enough to use it,\n // so we fail.\n if (topPage.score >= 50) {\n return topPage.href;\n }\n\n return null;\n }\n};\n\nvar CANONICAL_META_SELECTORS = ['og:url'];\n\nfunction parseDomain(url) {\n var parsedUrl = URL.parse(url);\n var hostname = parsedUrl.hostname;\n\n return hostname;\n}\n\nfunction result(url) {\n return {\n url: url,\n domain: parseDomain(url)\n };\n}\n\nvar GenericUrlExtractor = {\n extract: function extract(_ref) {\n var $ = _ref.$,\n url = _ref.url,\n metaCache = _ref.metaCache;\n\n var $canonical = $('link[rel=canonical]');\n if ($canonical.length !== 0) {\n var href = $canonical.attr('href');\n if (href) {\n return result(href);\n }\n }\n\n var metaUrl = extractFromMeta$$1($, CANONICAL_META_SELECTORS, metaCache);\n if (metaUrl) {\n return result(metaUrl);\n }\n\n return result(url);\n }\n};\n\nvar EXCERPT_META_SELECTORS = ['og:description', 'twitter:description'];\n\nfunction clean$2(content, $) {\n var maxLength = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 200;\n\n content = content.replace(/[\\s\\n]+/g, ' ').trim();\n return ellipsize(content, maxLength, { ellipse: '…' });\n}\n\nvar GenericExcerptExtractor = {\n extract: function extract(_ref) {\n var $ = _ref.$,\n content = _ref.content,\n metaCache = _ref.metaCache;\n\n var excerpt = extractFromMeta$$1($, EXCERPT_META_SELECTORS, metaCache);\n if (excerpt) {\n return clean$2(stripTags(excerpt, $));\n }\n // Fall back to excerpting from the extracted content\n var maxLength = 200;\n var shortContent = content.slice(0, maxLength * 5);\n return clean$2($(shortContent).text(), $, maxLength);\n }\n};\n\nvar GenericWordCountExtractor = {\n extract: function extract(_ref) {\n var content = _ref.content;\n\n var $ = cheerio.load(content);\n var $content = $('div').first();\n\n var text = normalizeSpaces($content.text());\n return text.split(/\\s/).length;\n }\n};\n\nvar GenericExtractor = {\n // This extractor is the default for all domains\n domain: '*',\n title: GenericTitleExtractor.extract,\n date_published: GenericDatePublishedExtractor.extract,\n author: GenericAuthorExtractor.extract,\n content: GenericContentExtractor.extract.bind(GenericContentExtractor),\n lead_image_url: GenericLeadImageUrlExtractor.extract,\n dek: GenericDekExtractor.extract,\n next_page_url: GenericNextPageUrlExtractor.extract,\n url_and_domain: GenericUrlExtractor.extract,\n excerpt: GenericExcerptExtractor.extract,\n word_count: GenericWordCountExtractor.extract,\n direction: function direction(_ref) {\n var title = _ref.title;\n return stringDirection.getDirection(title);\n },\n\n extract: function extract(options) {\n var html = options.html,\n $ = options.$;\n\n\n if (html && !$) {\n var loaded = cheerio.load(html);\n options.$ = loaded;\n }\n\n var title = this.title(options);\n var date_published = this.date_published(options);\n var author = this.author(options);\n var content = this.content(_extends({}, options, { title: title }));\n var lead_image_url = this.lead_image_url(_extends({}, options, { content: content }));\n var dek = this.dek(_extends({}, options, { content: content }));\n var next_page_url = this.next_page_url(options);\n var excerpt = this.excerpt(_extends({}, options, { content: content }));\n var word_count = this.word_count(_extends({}, options, { content: content }));\n var direction = this.direction({ title: title });\n\n var _url_and_domain = this.url_and_domain(options),\n url = _url_and_domain.url,\n domain = _url_and_domain.domain;\n\n return {\n title: title,\n author: author,\n date_published: date_published || null,\n dek: dek,\n lead_image_url: lead_image_url,\n content: content,\n next_page_url: next_page_url,\n url: url,\n domain: domain,\n excerpt: excerpt,\n word_count: word_count,\n direction: direction\n };\n }\n};\n\nvar Detectors = {\n 'meta[name=\"al:ios:app_name\"][value=\"Medium\"]': MediumExtractor,\n 'meta[name=\"generator\"][value=\"blogger\"]': BloggerExtractor\n};\n\nfunction detectByHtml($) {\n var selector = _Reflect$ownKeys(Detectors).find(function (s) {\n return $(s).length > 0;\n });\n\n return Detectors[selector];\n}\n\nfunction getExtractor(url, parsedUrl, $) {\n parsedUrl = parsedUrl || URL.parse(url);\n var _parsedUrl = parsedUrl,\n hostname = _parsedUrl.hostname;\n\n var baseDomain = hostname.split('.').slice(-2).join('.');\n\n return Extractors[hostname] || Extractors[baseDomain] || detectByHtml($) || GenericExtractor;\n}\n\n// Remove elements by an array of selectors\nfunction cleanBySelectors($content, $, _ref) {\n var clean = _ref.clean;\n\n if (!clean) return $content;\n\n $(clean.join(','), $content).remove();\n\n return $content;\n}\n\n// Transform matching elements\nfunction transformElements($content, $, _ref2) {\n var transforms = _ref2.transforms;\n\n if (!transforms) return $content;\n\n _Reflect$ownKeys(transforms).forEach(function (key) {\n var $matches = $(key, $content);\n var value = transforms[key];\n\n // If value is a string, convert directly\n if (typeof value === 'string') {\n $matches.each(function (index, node) {\n convertNodeTo$$1($(node), $, transforms[key]);\n });\n } else if (typeof value === 'function') {\n // If value is function, apply function to node\n $matches.each(function (index, node) {\n var result = value($(node), $);\n // If function returns a string, convert node to that value\n if (typeof result === 'string') {\n convertNodeTo$$1($(node), $, result);\n }\n });\n }\n });\n\n return $content;\n}\n\nfunction findMatchingSelector($, selectors, extractHtml) {\n return selectors.find(function (selector) {\n if (Array.isArray(selector)) {\n if (extractHtml) {\n return selector.reduce(function (acc, s) {\n return acc && $(s).length > 0;\n }, true);\n }\n\n var _selector = _slicedToArray(selector, 2),\n s = _selector[0],\n attr = _selector[1];\n\n return $(s).length === 1 && $(s).attr(attr) && $(s).attr(attr).trim() !== '';\n }\n\n return $(selector).length === 1 && $(selector).text().trim() !== '';\n });\n}\n\nfunction select(opts) {\n var $ = opts.$,\n type = opts.type,\n extractionOpts = opts.extractionOpts,\n _opts$extractHtml = opts.extractHtml,\n extractHtml = _opts$extractHtml === undefined ? false : _opts$extractHtml;\n // Skip if there's not extraction for this type\n\n if (!extractionOpts) return null;\n\n // If a string is hardcoded for a type (e.g., Wikipedia\n // contributors), return the string\n if (typeof extractionOpts === 'string') return extractionOpts;\n\n var selectors = extractionOpts.selectors,\n _extractionOpts$defau = extractionOpts.defaultCleaner,\n defaultCleaner = _extractionOpts$defau === undefined ? true : _extractionOpts$defau;\n\n\n var matchingSelector = findMatchingSelector($, selectors, extractHtml);\n\n if (!matchingSelector) return null;\n\n // Declaring result; will contain either\n // text or html, which will be cleaned\n // by the appropriate cleaner type\n\n // If the selector type requests html as its return type\n // transform and clean the element with provided selectors\n var $content = void 0;\n if (extractHtml) {\n // If matching selector is an array, we're considering this a\n // multi-match selection, which allows the parser to choose several\n // selectors to include in the result. Note that all selectors in the\n // array must match in order for this selector to trigger\n if (Array.isArray(matchingSelector)) {\n (function () {\n $content = $(matchingSelector.join(','));\n var $wrapper = $('<div></div>');\n $content.each(function (index, element) {\n $wrapper.append(element);\n });\n\n $content = $wrapper;\n })();\n } else {\n $content = $(matchingSelector);\n }\n\n // Wrap in div so transformation can take place on root element\n $content.wrap($('<div></div>'));\n $content = $content.parent();\n\n $content = transformElements($content, $, extractionOpts);\n $content = cleanBySelectors($content, $, extractionOpts);\n\n $content = Cleaners[type]($content, _extends({}, opts, { defaultCleaner: defaultCleaner }));\n\n return $.html($content);\n }\n\n var result = void 0;\n\n // if selector is an array (e.g., ['img', 'src']),\n // extract the attr\n if (Array.isArray(matchingSelector)) {\n var _matchingSelector = _slicedToArray(matchingSelector, 2),\n selector = _matchingSelector[0],\n attr = _matchingSelector[1];\n\n result = $(selector).attr(attr).trim();\n } else {\n var $node = $(matchingSelector);\n\n $node = cleanBySelectors($node, $, extractionOpts);\n $node = transformElements($node, $, extractionOpts);\n\n result = $node.text().trim();\n }\n\n // Allow custom extractor to skip default cleaner\n // for this type; defaults to true\n if (defaultCleaner) {\n return Cleaners[type](result, _extends({}, opts, extractionOpts));\n }\n\n return result;\n}\n\nfunction extractResult(opts) {\n var type = opts.type,\n extractor = opts.extractor,\n _opts$fallback = opts.fallback,\n fallback = _opts$fallback === undefined ? true : _opts$fallback;\n\n\n var result = select(_extends({}, opts, { extractionOpts: extractor[type] }));\n\n // If custom parser succeeds, return the result\n if (result) {\n return result;\n }\n\n // If nothing matches the selector, and fallback is enabled,\n // run the Generic extraction\n if (fallback) return GenericExtractor[type](opts);\n\n return null;\n}\n\nvar RootExtractor = {\n extract: function extract() {\n var extractor = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : GenericExtractor;\n var opts = arguments[1];\n var _opts = opts,\n contentOnly = _opts.contentOnly,\n extractedTitle = _opts.extractedTitle;\n // This is the generic extractor. Run its extract method\n\n if (extractor.domain === '*') return extractor.extract(opts);\n\n opts = _extends({}, opts, {\n extractor: extractor\n });\n\n if (contentOnly) {\n var _content = extractResult(_extends({}, opts, { type: 'content', extractHtml: true, title: extractedTitle\n }));\n return {\n content: _content\n };\n }\n var title = extractResult(_extends({}, opts, { type: 'title' }));\n var date_published = extractResult(_extends({}, opts, { type: 'date_published' }));\n var author = extractResult(_extends({}, opts, { type: 'author' }));\n var next_page_url = extractResult(_extends({}, opts, { type: 'next_page_url' }));\n var content = extractResult(_extends({}, opts, { type: 'content', extractHtml: true, title: title\n }));\n var lead_image_url = extractResult(_extends({}, opts, { type: 'lead_image_url', content: content }));\n var excerpt = extractResult(_extends({}, opts, { type: 'excerpt', content: content }));\n var dek = extractResult(_extends({}, opts, { type: 'dek', content: content, excerpt: excerpt }));\n var word_count = extractResult(_extends({}, opts, { type: 'word_count', content: content }));\n var direction = extractResult(_extends({}, opts, { type: 'direction', title: title }));\n\n var _ref3 = extractResult(_extends({}, opts, { type: 'url_and_domain' })) || { url: null, domain: null },\n url = _ref3.url,\n domain = _ref3.domain;\n\n return {\n title: title,\n content: content,\n author: author,\n date_published: date_published,\n lead_image_url: lead_image_url,\n dek: dek,\n next_page_url: next_page_url,\n url: url,\n domain: domain,\n excerpt: excerpt,\n word_count: word_count,\n direction: direction\n };\n }\n};\n\nvar collectAllPages = (function () {\n var _ref = _asyncToGenerator(_regeneratorRuntime.mark(function _callee(_ref2) {\n var next_page_url = _ref2.next_page_url,\n html = _ref2.html,\n $ = _ref2.$,\n metaCache = _ref2.metaCache,\n result = _ref2.result,\n Extractor = _ref2.Extractor,\n title = _ref2.title,\n url = _ref2.url;\n var pages, previousUrls, extractorOpts, nextPageResult, word_count;\n return _regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n // At this point, we've fetched just the first page\n pages = 1;\n previousUrls = [removeAnchor(url)];\n\n // If we've gone over 26 pages, something has\n // likely gone wrong.\n\n case 2:\n if (!(next_page_url && pages < 26)) {\n _context.next = 15;\n break;\n }\n\n pages += 1;\n _context.next = 6;\n return Resource.create(next_page_url);\n\n case 6:\n $ = _context.sent;\n\n html = $.html();\n\n extractorOpts = {\n url: next_page_url,\n html: html,\n $: $,\n metaCache: metaCache,\n contentOnly: true,\n extractedTitle: title,\n previousUrls: previousUrls\n };\n nextPageResult = RootExtractor.extract(Extractor, extractorOpts);\n\n\n previousUrls.push(next_page_url);\n result = _extends({}, result, {\n content: result.content + '<hr><h4>Page ' + pages + '</h4>' + nextPageResult.content\n });\n\n next_page_url = nextPageResult.next_page_url;\n _context.next = 2;\n break;\n\n case 15:\n word_count = GenericExtractor.word_count({ content: '<div>' + result.content + '</div>' });\n return _context.abrupt('return', _extends({}, result, {\n total_pages: pages,\n pages_rendered: pages,\n word_count: word_count\n }));\n\n case 17:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function collectAllPages(_x) {\n return _ref.apply(this, arguments);\n }\n\n return collectAllPages;\n})();\n\nvar Mercury = {\n parse: function parse(url, html) {\n var _this = this;\n\n var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n return _asyncToGenerator(_regeneratorRuntime.mark(function _callee() {\n var _opts$fetchAllPages, fetchAllPages, _opts$fallback, fallback, parsedUrl, $, Extractor, metaCache, result, _result, title, next_page_url;\n\n return _regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _opts$fetchAllPages = opts.fetchAllPages, fetchAllPages = _opts$fetchAllPages === undefined ? true : _opts$fetchAllPages, _opts$fallback = opts.fallback, fallback = _opts$fallback === undefined ? true : _opts$fallback;\n\n // if no url was passed and this is the browser version,\n // set url to window.location.href and load the html\n // from the current page\n\n if (!url && cheerio.browser) {\n url = window.location.href; // eslint-disable-line no-undef\n html = html || cheerio.html();\n }\n\n parsedUrl = URL.parse(url);\n\n if (validateUrl(parsedUrl)) {\n _context.next = 5;\n break;\n }\n\n return _context.abrupt('return', Errors.badUrl);\n\n case 5:\n _context.next = 7;\n return Resource.create(url, html, parsedUrl);\n\n case 7:\n $ = _context.sent;\n Extractor = getExtractor(url, parsedUrl, $);\n // console.log(`Using extractor for ${Extractor.domain}`);\n\n // If we found an error creating the resource, return that error\n\n if (!$.failed) {\n _context.next = 11;\n break;\n }\n\n return _context.abrupt('return', $);\n\n case 11:\n\n // if html still has not been set (i.e., url passed to Mercury.parse),\n // set html from the response of Resource.create\n if (!html) {\n html = $.html();\n }\n\n // Cached value of every meta name in our document.\n // Used when extracting title/author/date_published/dek\n metaCache = $('meta').map(function (_, node) {\n return $(node).attr('name');\n }).toArray();\n result = RootExtractor.extract(Extractor, {\n url: url,\n html: html,\n $: $,\n metaCache: metaCache,\n parsedUrl: parsedUrl,\n fallback: fallback\n });\n _result = result, title = _result.title, next_page_url = _result.next_page_url;\n\n // Fetch more pages if next_page_url found\n\n if (!(fetchAllPages && next_page_url)) {\n _context.next = 21;\n break;\n }\n\n _context.next = 18;\n return collectAllPages({\n Extractor: Extractor,\n next_page_url: next_page_url,\n html: html,\n $: $,\n metaCache: metaCache,\n result: result,\n title: title,\n url: url\n });\n\n case 18:\n result = _context.sent;\n _context.next = 22;\n break;\n\n case 21:\n result = _extends({}, result, {\n total_pages: 1,\n rendered_pages: 1\n });\n\n case 22:\n return _context.abrupt('return', result);\n\n case 23:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, _this);\n }))();\n },\n\n\n browser: !!cheerio.browser,\n\n // A convenience method for getting a resource\n // to work with, e.g., for custom extractor generator\n fetchResource: function fetchResource(url) {\n var _this2 = this;\n\n return _asyncToGenerator(_regeneratorRuntime.mark(function _callee2() {\n return _regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return Resource.create(url);\n\n case 2:\n return _context2.abrupt('return', _context2.sent);\n\n case 3:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, _this2);\n }))();\n }\n};\n\nmodule.exports = Mercury;\n//# sourceMappingURL=mercury.js.map\n","export default function insertValues(strings, ...values) {\n if (values.length) {\n return strings.reduce((result, part, idx) => {\n let value = values[idx];\n\n if (value && typeof value.toString === 'function') {\n value = value.toString();\n } else {\n value = '';\n }\n\n return result + part + value;\n }, '');\n }\n\n return strings.join('');\n}\n","import insertValues from './insert-values';\n\nconst bodyPattern = /^\\n([\\s\\S]+)\\s{2}$/gm;\nconst trailingWhitespace = /\\s+$/;\n\nexport default function template(strings, ...values) {\n const compiled = insertValues(strings, ...values);\n let [body] = compiled.match(bodyPattern) || [];\n let indentLevel = /^\\s{0,4}(.+)$/g;\n\n if (!body) {\n body = compiled;\n indentLevel = /^\\s{0,2}(.+)$/g;\n }\n\n return body.split('\\n')\n .slice(1)\n .map((line) => {\n line = line.replace(indentLevel, '$1');\n\n if (trailingWhitespace.test(line)) {\n line = line.replace(trailingWhitespace, '');\n }\n\n return line;\n })\n .join('\\n');\n}\n","import template from './index';\n\nexport default function (hostname, name) {\n return template`\n export const ${name} = {\n domain: '${hostname}',\n\n title: {\n selectors: [\n // enter title selectors\n ],\n },\n\n author: {\n selectors: [\n // enter author selectors\n ],\n },\n\n date_published: {\n selectors: [\n // enter selectors\n ],\n },\n\n dek: {\n selectors: [\n // enter selectors\n ],\n },\n\n lead_image_url: {\n selectors: [\n // enter selectors\n ],\n },\n\n content: {\n selectors: [\n // enter content selectors\n ],\n\n // Is there anything in the content you selected that needs transformed\n // before it's consumable content? E.g., unusual lazy loaded images\n transforms: {\n },\n\n // Is there anything that is in the result that shouldn't be?\n // The clean selectors will remove anything that matches from\n // the result\n clean: [\n\n ]\n },\n }\n `;\n}\n","import template from './index';\n\nconst IGNORE = [\n 'url',\n 'domain',\n 'content',\n 'word_count',\n 'next_page_url',\n 'excerpt',\n 'direction',\n 'total_pages',\n 'rendered_pages',\n];\n\nfunction testFor(key, value, dir) {\n if (IGNORE.find(k => k === key)) return '';\n\n return template`\n it('returns the ${key}', async () => {\n // To pass this test, fill out the ${key} selector\n // in ${dir}/index.js.\n const { ${key} } = await result\n\n // Update these values with the expected values from\n // the article.\n assert.equal(${key}, ${value ? `\\`${value}\\`` : \"''\"})\n });\n `;\n}\n\nexport default function (file, url, dir, result, name) {\n return template`\n import assert from 'assert';\n import fs from 'fs';\n import URL from 'url';\n import cheerio from 'cheerio';\n\n import Mercury from 'mercury';\n import getExtractor from 'extractors/get-extractor';\n import { excerptContent } from 'utils/text';\n\n describe('${name}', () => {\n describe('initial test case', () => {\n let result;\n let url;\n beforeAll(() => {\n url =\n '${url}';\n const html =\n fs.readFileSync('${file}');\n result =\n Mercury.parse(url, html, { fallback: false });\n });\n\n it('is selected properly', () => {\n // This test should be passing by default.\n // It sanity checks that the correct parser\n // is being selected for URLs from this domain\n const extractor = getExtractor(url);\n assert.equal(extractor.domain, URL.parse(url).hostname)\n })\n\n ${Reflect.ownKeys(result).map(k => testFor(k, result[k], dir)).join('\\n\\n')}\n\n it('returns the content', async () => {\n // To pass this test, fill out the content selector\n // in ${dir}/index.js.\n // You may also want to make use of the clean and transform\n // options.\n const { content } = await result;\n\n const $ = cheerio.load(content || '');\n\n const first13 = excerptContent($('*').first().text(), 13)\n\n // Update these values with the expected values from\n // the article.\n assert.equal(first13, 'Add the first 13 words of the article here');\n });\n });\n });\n `;\n}\n","/* eslint-disable import/no-extraneous-dependencies */\n/* eslint-disable no-use-before-define */\n/* eslint-disable no-console */\nimport fs from 'fs';\nimport URL from 'url';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { exec } from 'child_process';\n\nimport {\n stripJunkTags,\n makeLinksAbsolute,\n} from 'utils/dom';\nimport Mercury from '../dist/mercury';\nimport extractorTemplate from './templates/custom-extractor';\nimport extractorTestTemplate from './templates/custom-extractor-test';\n\nconst questions = [\n {\n type: 'input',\n name: 'website',\n message: 'Paste a url to an article you\\'d like to create or extend a parser for:',\n validate(value) {\n const { hostname } = URL.parse(value);\n if (hostname) return true;\n\n return false;\n },\n },\n];\nlet spinner;\n\nfunction confirm(fn, args, msg, newParser) {\n spinner = ora({ text: msg });\n spinner.start();\n const result = fn(...args);\n\n if (result && result.then) {\n result.then(r => savePage(r, args, newParser));\n } else {\n spinner.succeed();\n }\n\n return result;\n}\n\nfunction confirmCreateDir(dir, msg) {\n if (!fs.existsSync(dir)) {\n confirm(fs.mkdirSync, [dir], msg);\n }\n}\n\nfunction getDir(url) {\n const { hostname } = URL.parse(url);\n return `./src/extractors/custom/${hostname}`;\n}\n\nfunction scaffoldCustomParser(url) {\n const dir = getDir(url);\n const { hostname } = URL.parse(url);\n let newParser = false;\n\n if (!fs.existsSync(dir)) {\n newParser = true;\n confirmCreateDir(dir, `Creating ${hostname} directory`);\n confirmCreateDir(`./fixtures/${hostname}`, 'Creating fixtures directory');\n }\n\n confirm(Mercury.fetchResource, [url], 'Fetching fixture', newParser);\n}\n\n// if has arg, just assume that arg is a url and skip prmopt\nconst urlArg = process.argv[2];\nif (urlArg) {\n scaffoldCustomParser(urlArg);\n} else {\n inquirer.prompt(questions).then((answers) => {\n scaffoldCustomParser(answers.website);\n });\n}\n\nfunction generateScaffold(url, file, result) {\n const { hostname } = URL.parse(url);\n const extractor = extractorTemplate(hostname, extractorName(hostname));\n const extractorTest =\n extractorTestTemplate(\n file, url, getDir(url), result, extractorName(hostname)\n );\n\n fs.writeFileSync(`${getDir(url)}/index.js`, extractor);\n fs.writeFileSync(`${getDir(url)}/index.test.js`, extractorTest);\n fs.appendFileSync(\n './src/extractors/custom/index.js',\n exportString(url),\n );\n exec(`npm run lint-fix-quiet -- ${getDir(url)}/*.js`);\n}\n\nfunction savePage($, [url], newParser) {\n const { hostname } = URL.parse(url);\n\n spinner.succeed();\n\n const filename = new Date().getTime();\n const file = `./fixtures/${hostname}/${filename}.html`;\n // fix http(s) relative links:\n makeLinksAbsolute($('*').first(), $, url);\n $('[src], [href]').each((index, node) => {\n const $node = $(node);\n const link = $node.attr('src');\n if (link && link.slice(0, 2) === '//') {\n $node.attr('src', `http:${link}`);\n }\n });\n const html = stripJunkTags($('*').first(), $, ['script']).html();\n\n fs.writeFileSync(file, html);\n\n Mercury.parse(url, html).then((result) => {\n if (newParser) {\n confirm(generateScaffold, [url, file, result], 'Generating parser and tests');\n console.log(`Your custom site extractor has been set up. To get started building it, run\n yarn watch:test -- ${hostname}\n -- OR --\n npm run watch:test -- ${hostname}`);\n } else {\n console.log(`\n It looks like you already have a custom parser for this url.\n The page you linked to has been added to ${file}. Copy and paste\n the following code to use that page in your tests:\n const html = fs.readFileSync('${file}');`);\n }\n });\n}\n\nfunction exportString(url) {\n const { hostname } = URL.parse(url);\n return `export * from './${hostname}';`;\n}\n\nfunction extractorName(hostname) {\n const name = hostname\n .split('.')\n .map(w => `${w.charAt(0).toUpperCase()}${w.slice(1)}`)\n .join('');\n return `${name}Extractor`;\n}\n"],"names":["SPACER_RE","RegExp","KEEP_CLASS","KEEP_SELECTORS","STRIP_OUTPUT_TAGS","REMOVE_ATTRS","REMOVE_ATTR_SELECTORS","map","selector","REMOVE_ATTR_LIST","join","WHITELIST_ATTRS","WHITELIST_ATTRS_RE","REMOVE_EMPTY_TAGS","REMOVE_EMPTY_SELECTORS","tag","CLEAN_CONDITIONALLY_TAGS","HEADER_TAGS","HEADER_TAG_LIST","UNLIKELY_CANDIDATES_BLACKLIST","UNLIKELY_CANDIDATES_WHITELIST","DIV_TO_P_BLOCK_TAGS","IS_WP_SELECTOR","BLOCK_LEVEL_TAGS","BLOCK_LEVEL_TAGS_RE","candidatesBlacklist","CANDIDATES_BLACKLIST","candidatesWhitelist","CANDIDATES_WHITELIST","brsToPs","$","collapsing","each","index","element","$element","nextElement","next","get","tagName","toLowerCase","remove","paragraphize","node","br","$node","sibling","nextSibling","p","test","appendTo","replaceWith","convertDivs","div","$div","convertable","children","length","convertSpans","span","$span","parents","convertNodeTo","attrs","getAttrs","attribString","key","html","browser","text","contents","cleanForHeight","$img","height","parseInt","attr","width","removeAttr","removeSpacers","stripJunkTags","article","tags","not","removeAllButWhitelist","$article","find","reduce","acc","removeClass","NON_TOP_CANDIDATE_TAGS","NON_TOP_CANDIDATE_TAGS_RE","HNEWS_CONTENT_SELECTORS","PHOTO_HINTS","PHOTO_HINTS_RE","POSITIVE_SCORE_HINTS","POSITIVE_SCORE_RE","READABILITY_ASSET","NEGATIVE_SCORE_HINTS","NEGATIVE_SCORE_RE","DIGIT_RE","BR_TAGS_RE","BR_TAG_RE","UNLIKELY_RE","PARAGRAPH_SCORE_TAGS","CHILD_CONTENT_TAGS","BAD_TAGS","HTML_OR_BODY_RE","getWeight","classes","id","score","getScore","parseFloat","scoreCommas","match","idkRe","scoreLength","textLength","chunks","lengthBonus","Math","min","max","scoreParagraph","trim","slice","setScore","addScore","amount","getOrInitScore","e","addToParent","parent","weightNodes","scoreNode","addScoreTo","scorePs","$parent","rawScore","NORMALIZE_RE","normalizeSpaces","replace","PAGE_IN_HREF_RE","HAS_ALPHA_RE","IS_ALPHA_RE","IS_DIGIT_RE","ENCODING_RE","DEFAULT_ENCODING","isGoodSegment","segment","firstSegmentHasLetters","goodSegment","SENTENCE_END_RE","hasSentenceEnd","mergeSiblings","$candidate","topScore","siblingScoreThreshold","wrappingDiv","$sibling","siblingScore","append","contentBonus","density","linkDensity","newScore","siblingContent","siblingContentLength","first","removeUnlessContent","weight","hasClass","content","pCount","inputCount","contentLength","imgCount","nodeIsList","previousNode","prev","scriptCount","absolutize","rootUrl","$content","_","url","absoluteUrl","URL","resolve","makeLinksAbsolute","forEach","totalTextLength","linkText","linkLength","isGoodNode","maxChildren","withinComment","stripTags","cleanText","toArray","commentParent","nodeClass","class","classAndId","includes","undefined","attribs","attributes","name","value","setAttr","val","setAttribute","setAttrs","removeAttribute","ex","_interopDefault","require$$22","require$$21","require$$20","require$$19","require$$18","require$$17","require$$16","require$$15","require$$14","require$$13","require$$12","require$$11","require$$10","require$$9","require$$8","require$$7","require$$6","require$$5","require$$4","require$$3","require$$2","require$$1","require$$0","regexList","re","matchRe","exec","matches","pageNum","split","parsed","parse","parsedUrl","protocol","host","path","reverse","rawSegment","_segment$split2","_slicedToArray","_segment$split","possibleSegment","fileExt","push","cleanedSegments","arguments","words","str","iconv","encodingExists","testEncode","encoding","range","_regeneratorRuntime","mark","wrap","_context","start","end","stop","_marked","_ref","hostname","badUrl","error","messages","cheerio","BAD_CONTENT_TYPES","options","reject","request","err","response","body","statusMessage","statusCode","parseNon2xx","headers","contentType","_response$headers","BAD_CONTENT_TYPES_RE","MAX_CONTENT_LENGTH","_asyncToGenerator","_ref3","encodeURI","href","_extends","REQUEST_HEADERS","timeout","FETCH_TIMEOUT","jar","gzip","followAllRedirects","sent","validateResponse","abrupt","t0","Errors","_callee","_x2","_x3","apply","from","to","convertMetaProp","convertNodeTo$$1","brsToPs$$1","_Reflect$ownKeys","img","_URL$parse","concat","_toConsumableArray","addClass","$hOnes","_defineProperty","$p","NON_TOP_CANDIDATE_TAGS$1","PHOTO_HINTS$1","POSITIVE_SCORE_HINTS$1","NEGATIVE_SCORE_HINTS$1","UNLIKELY_CANDIDATES_BLACKLIST$1","UNLIKELY_CANDIDATES_WHITELIST$1","POSITIVE_SCORE_RE$1","NEGATIVE_SCORE_RE$1","PHOTO_HINTS_RE$1","READABILITY_ASSET$1","getOrInitScore$$1","addScore$$1","scoreNode$$1","addToParent$$1","_$node$get","PARAGRAPH_SCORE_TAGS$1","CHILD_CONTENT_TAGS$1","BAD_TAGS$1","convertSpans$1","HNEWS_CONTENT_SELECTORS$1","parentSelector","_ref2","childSelector","NON_TOP_CANDIDATE_TAGS_RE$1","header","$header","prevAll","title","metaNames","cachedNames","filter","indexOf","_step","type","nodes","values","cleanTags$$1","metaValue","v","_getIterator","foundNames","_iteratorNormalCompletion","_iterator","done","_loop","_typeof","_ret","_didIteratorError","_iteratorError","return","withinComment$$1","selectors","textOnly","IS_LINK","IS_IMAGE","root","isComment","TAGS_TO_REMOVE","cleanComments","create","preparedResponse","validResponse","result","failed","_this","generateDoc","encodeDoc","normalizeMetaTags","convertLazyLoadedImages","clean","getEncoding","decode","load","decodedContent","metaContentType","properEncoding","extractor","domains","domain","supportedDomains","merge","transforms","noscript","author","date_published","h1","$children","dek","defaultCleaner","prepend","$tweetContainer","tweets","s","src","lead_image_url","next_page_url","excerpt","timezone","h2","has","youtubeId","JSON","data","sources","iframe","decodeURIComponent","ytRe","thumb","_thumb$match2","_thumb$match","empty","$caption","figure","$text","videoId","imgHtml","format","$imgSrc","$imageParent","$dataAttrContainer","imgPath2","imgPath1","$figure","WwwMsnbcComExtractor","_WwwMsnbcComExtractor","BloggerExtractor","NYMagExtractor","WikipediaExtractor","TwitterExtractor","NYTimesExtractor","TheAtlanticExtractor","NewYorkerExtractor","WiredExtractor","MSNExtractor","YahooExtractor","BuzzfeedExtractor","WikiaExtractor","LittleThingsExtractor","PoliticoExtractor","DeadspinExtractor","BroadwayWorldExtractor","ApartmentTherapyExtractor","MediumExtractor","WwwTmzComExtractor","WwwWashingtonpostComExtractor","WwwHuffingtonpostComExtractor","NewrepublicComExtractor","MoneyCnnComExtractor","WwwThevergeComExtractor","WwwCnnComExtractor","WwwAolComExtractor","WwwYoutubeComExtractor","WwwTheguardianComExtractor","WwwSbnationComExtractor","WwwBloombergComExtractor","WwwBustleComExtractor","WwwNprOrgExtractor","WwwRecodeNetExtractor","QzComExtractor","WwwDmagazineComExtractor","WwwReutersComExtractor","MashableComExtractor","WwwChicagotribuneComExtractor","WwwVoxComExtractor","NewsNationalgeographicComExtractor","WwwNationalgeographicComExtractor","WwwLatimesComExtractor","PagesixComExtractor","ThefederalistpapersOrgExtractor","WwwCbssportsComExtractor","WwwThepoliticalinsiderComExtractor","WwwMentalflossComExtractor","AbcnewsGoComExtractor","WwwNydailynewsComExtractor","WwwCnbcComExtractor","WwwPopsugarComExtractor","ObserverComExtractor","PeopleComExtractor","WwwUsmagazineComExtractor","WwwRollingstoneComExtractor","twofortysevensportsComExtractor","UproxxComExtractor","WwwEonlineComExtractor","WwwMiamiheraldComExtractor","WwwRefinery29ComExtractor","WwwMacrumorsComExtractor","WwwAndroidcentralComExtractor","WwwSiComExtractor","WwwRawstoryComExtractor","WwwCnetComExtractor","WwwCinemablendComExtractor","WwwTodayComExtractor","WwwHowtogeekComExtractor","WwwAlComExtractor","WwwThepennyhoarderComExtractor","WwwWesternjournalismComExtractor","FusionNetExtractor","WwwAmericanowComExtractor","ScienceflyComExtractor","HellogigglesComExtractor","ThoughtcatalogComExtractor","WwwNjComExtractor","WwwInquisitrComExtractor","WwwNbcnewsComExtractor","FortuneComExtractor","WwwLinkedinComExtractor","ObamawhitehouseArchivesGovExtractor","WwwOpposingviewsComExtractor","WwwProspectmagazineCoUkExtractor","ForwardComExtractor","WwwQdailyComExtractor","GothamistComExtractor","WwwFoolComExtractor","WwwSlateComExtractor","IciRadioCanadaCaExtractor","_Object$keys","CustomExtractors","mergeSupportedDomains","months","timestamp1","timestamp2","timestamp3","allMonths","CLEAN_AUTHOR_RE","leadImageUrl","validUrl","isWebUri","excerptContent","TEXT_LINK_RE","dekText","dateString","SPLIT_DATE_STRING","TIME_MERIDIAN_DOTS_RE","TIME_MERIDIAN_SPACE_RE","CLEAN_DATE_STRING_RE","TIME_WITH_OFFSET_RE","moment","tz","parseFormat","MS_DATE_STRING","SEC_DATE_STRING","toISOString","createDate","date","isValid","cleanDateString","_ref$cleanConditional","cleanConditionally","_ref$title","_ref$url","_ref$defaultCleaner","rewriteTopLevel$$1","cleanImages","makeLinksAbsolute$$1","markToKeep","cleanHOnes$$1","cleanHeaders","removeEmpty","cleanAttributes$$1","TITLE_SPLITTERS_RE","resolveSplitTitle","splitTitle","titleText","termCounts","_Reflect$ownKeys$redu2","_Reflect$ownKeys$redu","maxTerm","termCount","splitEnds","longestEnd","DOMAIN_ENDINGS_RE","wuzzy","levenshtein","startSlug","nakedDomain","startSlugRatio","endSlug","endSlugRatio","extractBreadcrumbTitle","newTitle","cleanDomainFromTitle","cleanAuthor","clean$1","cleanDek","cleanDatePublished","extractCleanNode","cleanTitle$$1","opts","stripUnlikelyCandidates","convertToParagraphs$$1","scoreContent$$1","findTopCandidate$$1","defaultOpts","extract","getContentNode","nodeIsSufficient","cleanAndReturnNode","k","extractBestNode","metaCache","extractFromMeta$$1","STRONG_TITLE_META_TAGS","extractFromSelectors$$1","STRONG_TITLE_SELECTORS","WEAK_TITLE_META_TAGS","WEAK_TITLE_SELECTORS","bylineRe","AUTHOR_META_TAGS","AUTHOR_MAX_LENGTH","AUTHOR_SELECTORS","BYLINE_SELECTORS_RE","_ref4","regex","abbrevMonthsStr","datePublished","DATE_PUBLISHED_META_TAGS","DATE_PUBLISHED_SELECTORS","extractFromUrl","DATE_PUBLISHED_URL_RES","POSITIVE_LEAD_IMAGE_URL_HINTS","NEGATIVE_LEAD_IMAGE_URL_HINTS","POSITIVE_LEAD_IMAGE_URL_HINTS_RE","NEGATIVE_LEAD_IMAGE_URL_HINTS_RE","GIF_RE","JPG_RE","$figParent","$gParent","getSig","area","round","$imgs","LEAD_IMAGE_URL_META_TAGS","imageUrl","cleanUrl","imgs","scoreImageUrl","scoreAttr","scoreByParents","scoreBySibling","scoreByDimensions","scoreByPosition","imgScores","topUrl","LEAD_IMAGE_URL_SELECTORS","articleUrl","SequenceMatcher","ratio","similarity","diffPercent","diffModifier","linkTextAsNum","isWp","EXTRANEOUS_LINK_HINTS$1","EXTRANEOUS_LINK_HINTS_RE$1","$link","_Array$from","makeSig$1","positiveMatch","PAGE_RE","parentData","negativeMatch","linkData","PREV_LINK_TEXT_RE$1","baseUrl","previousUrls","linkHost","DIGIT_RE$2","fragment","baseRegex","NEXT_LINK_TEXT_RE$1","CAP_LINK_TEXT_RE$1","links","_ref$previousUrls","makeBaseRegex","isWordpress","possiblePages","link","removeAnchor","shouldScore","makeSig","pageNumFromUrl","scoreBaseUrl","scoreNextLinkText","scoreCapLinks","scorePrevLink","scoreByParents$1","scoreExtraneousLinks","scorePageInLink","scoreLinkText","scoreSimilarity","possiblePage","scoredPages","articleBaseUrl","scoreLinks","scoredLinks","scoredLink","topPage","parseDomain","$canonical","CANONICAL_META_SELECTORS","metaUrl","maxLength","ellipse","EXCERPT_META_SELECTORS","shortContent","GenericTitleExtractor","GenericDatePublishedExtractor","GenericAuthorExtractor","GenericContentExtractor","bind","GenericLeadImageUrlExtractor","GenericDekExtractor","GenericNextPageUrlExtractor","url_and_domain","GenericUrlExtractor","GenericExcerptExtractor","word_count","GenericWordCountExtractor","direction","getDirection","loaded","_url_and_domain","Detectors","_parsedUrl","Extractors","baseDomain","detectByHtml","GenericExtractor","$matches","extractHtml","Array","isArray","_selector","extractionOpts","_opts$extractHtml","_extractionOpts$defau","findMatchingSelector","matchingSelector","$wrapper","transformElements","cleanBySelectors","Cleaners","_matchingSelector","_opts$fallback","fallback","select","contentOnly","_opts","extractedTitle","extractResult","_content","Extractor","extractorOpts","nextPageResult","pages","RootExtractor","total_pages","pages_rendered","_x","fetchAllPages","_result","_opts$fetchAllPages","window","location","validateUrl","getExtractor","rendered_pages","fetchResource","_context2","_callee2","_this2","Mercury","insertValues","strings","part","idx","toString","bodyPattern","trailingWhitespace","template","compiled","indentLevel","line","IGNORE","testFor","dir","file","questions","spinner","confirm","fn","args","msg","newParser","ora","then","savePage","r","succeed","confirmCreateDir","fs","existsSync","mkdirSync","getDir","scaffoldCustomParser","urlArg","process","argv","prompt","answers","website","generateScaffold","extractorTemplate","extractorName","extractorTest","extractorTestTemplate","writeFileSync","appendFileSync","exportString","filename","Date","getTime","log","w","charAt","toUpperCase"],"mappings":"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"} |