describe until topCandidates

This commit is contained in:
DarkCat09 2024-12-25 12:08:03 +04:00
parent 463f2cf798
commit fbd91df52c
Signed by: DarkCat09
GPG key ID: BD3CE9B65916CD82

View file

@ -177,7 +177,58 @@ let contentScore = 1;
24.1. Если текущая нода -- не элемент, либо у неё нет родителя, либо её родитель -- не элемент, то пропускаем
24.2. // line 1240
Теперь нам нужно записывать баллы "полезности" каждого из ancestors. Они НЕ равны contentScore элемента вне цикла пункта 24, мы их сейчас будем считать отдельно. В ридабилити баллы элемента сохраняются в поле DOM-объекта ноды .readability.contentScore (см. ниже в 24.2)
24.2. Если у текущего элемента есть поле .readability, то переходим сразу к 24.3, иначе элемент необходимо "проинициализировать":
node.readability = { contentScore: 0 };
Посмотрим на тег элемента и добавим к .readability.contentScore за него баллы:
div => +5
pre, td, blockquote => +3
А за эти теги убавим баллы:
address, ol, ul, dl, dd, dt, li, form => -3
h1-6, th => -5
Посмотрим на класс.
Если он матчится по регулярке
/-ad-|hidden|^hid$| hid$| hid |^hid |banner|combx|comment|com-|contact|footer|gdpr|masthead|media|meta|outbrain|promo|related|scroll|share|shoutbox|sidebar|skyscraper|sponsor|shopping|tags|widget/i
то -25 баллов к node.readability.contentScore.
А если он матчится по регулярке
/article|body|content|entry|hentry|h-entry|main|page|pagination|post|text|blog|story/i
то +25 баллов к .readability.contentScore.
Аналогично делаем для айди: матч по первой регулярке отнимает 25, матч по второй прибавляет 25.
24.3. Теперь вспоминаем про contentScore для элемента вне цикла пункта 24, для которого мы искали предков. Баллы полезности этого элемента частично получают и его предки.
Если текущий ancestor (мы ещё в цикле 24, напоминаю) -- это родитель элемента вне цикла, то есть индекс в массиве ancestors у него = 0 (первый найденный предок), то делитель = 1, и к баллам полезности предка node.readability.contentScore мы прибавляем баллы полезности элемента вне цикла contentScore (делённые на 1, то есть родителю достаются все баллы).
Если текущий ancestor -- это родитель родителя элемента вне цикла, то есть его индекс в массиве ancestors = 1 (второй найденный предок), то делитель = 2, и к его баллам полезности .readability.contentScore мы прибавляем половину contentScore элемента вне цикла.
Если уровень/глубина предка >= 2, то есть он выше родителя родителя, считаем делитель так: level * 3, где level -- это индекс в массиве ancestors (от 0 до 4, так как мы брали максимум 5 предков, точнее, от 2 до 4, так как значения делителей для индексов 0 и 1 отдельно уже указаны выше), прибавляем к баллам полезности предка .readability.contentScore баллы полезности элемента вне цикла contentScore / делитель.
С кодом понятнее, думаю:
let scoreDivider;
// level -- индекс в ancestors
if (level === 0) {
scoreDivider = 1;
} else if (level === 1) {
scoreDivider = 2;
} else {
scoreDivider = level * 3;
}
ancestor.readability.contentScore += contentScore / scoreDivider;
Обратите внимание, contentScore мы явно не записывали элементу вне цикла 24, а только передавали эти баллы его родителю, а также частично другим предкам.
***
*** Часть 3