diff options
Diffstat (limited to 'src/extract.ts')
| -rw-r--r-- | src/extract.ts | 45 |
1 files changed, 32 insertions, 13 deletions
diff --git a/src/extract.ts b/src/extract.ts index 282fa07..8b5c57f 100644 --- a/src/extract.ts +++ b/src/extract.ts @@ -177,21 +177,40 @@ export const buildProbeScript = (config: ExtractionConfig): string => String.raw if (snippetEl) { snippet = norm(snippetEl.innerText); } else { - // No dedicated description element: subtract the parts we can name - // (title, breadcrumb, source) and keep what is left. - var drop = {}; - for (var s = 0; CFG.subtract && s < CFG.subtract.length; s++) { - var parts = item.querySelectorAll(CFG.subtract[s]); - for (var p = 0; p < parts.length; p++) { - var pl = linesOf(parts[p]); - for (var q = 0; q < pl.length; q++) drop[norm(pl[q])] = true; + // No dedicated description element. Rather than guess at class names + // for the source and breadcrumb, use their position: an engine that + // renders "source / breadcrumb / title / description" puts every piece + // of metadata *before* the title, so everything after the title line is + // the description. Class names churn; that ordering does not. + var itemLines = linesOf(item); + var titleIndex = -1; + for (var t = 0; t < itemLines.length; t++) { + if (norm(itemLines[t]) === title) { titleIndex = t; break; } + } + + var candidate; + if (titleIndex >= 0) { + candidate = itemLines.slice(titleIndex + 1); + } else { + // Title is not its own line (it may be inline with other text). + // Fall back to subtracting the parts we can name. + var drop = {}; + for (var s = 0; CFG.subtract && s < CFG.subtract.length; s++) { + var parts = item.querySelectorAll(CFG.subtract[s]); + for (var p = 0; p < parts.length; p++) { + var pl = linesOf(parts[p]); + for (var q = 0; q < pl.length; q++) drop[norm(pl[q])] = true; + } } + candidate = itemLines.filter(function (l) { return !drop[norm(l)]; }); } - var kept = linesOf(item).filter(function (l) { - var n = norm(l); - return !drop[n] && n !== title && !/^https?:\/\//.test(n) && n.indexOf("›") === -1; - }); - snippet = norm(kept.join(" ")); + + snippet = norm( + candidate.filter(function (l) { + var n = norm(l); + return n !== title && !/^https?:\/\//.test(n) && n.indexOf("›") === -1; + }).join(" "), + ); } seen[url] = true; |
