From aea57d0cf35aa51002e052dd1eb0391ee5a59447 Mon Sep 17 00:00:00 2001 From: Jan Lukas Gernert Date: Tue, 28 Feb 2023 03:59:48 +0100 Subject: [PATCH] fix has_single_tag_inside_element & update tests --- resources/tests/readability/001/expected.html | 4 +- resources/tests/readability/002/expected.html | 2 +- resources/tests/readability/003/expected.html | 4 +- .../tests/readability/aclu/expected.html | 4 +- .../tests/readability/aktualne/expected.html | 69 ++++++++++++++++++- .../tests/readability/webmd-1/expected.html | 4 +- src/full_text_parser/mod.rs | 16 ++--- src/full_text_parser/readability/mod.rs | 18 +---- src/full_text_parser/readability/tests.rs | 2 +- src/util.rs | 2 +- 10 files changed, 86 insertions(+), 39 deletions(-) diff --git a/resources/tests/readability/001/expected.html b/resources/tests/readability/001/expected.html index bdd9564..38b4cd2 100644 --- a/resources/tests/readability/001/expected.html +++ b/resources/tests/readability/001/expected.html @@ -1,4 +1,4 @@ -

So finally you're testing your frontend JavaScript code? Great! The more you +

So finally you're testing your frontend JavaScript code? Great! The more you write tests, the more confident you are with your code… but how much precisely? That's where code coverage might help.

@@ -117,4 +117,4 @@ describe("Cow", function() { sessions and code reviews — but that's another story.

-

So is code coverage silver bullet? No. Is it useful? Definitely. Happy testing!

+

So is code coverage silver bullet? No. Is it useful? Definitely. Happy testing!

diff --git a/resources/tests/readability/002/expected.html b/resources/tests/readability/002/expected.html index c6c52c4..713686a 100644 --- a/resources/tests/readability/002/expected.html +++ b/resources/tests/readability/002/expected.html @@ -1,4 +1,4 @@ -

For more than a decade the Web has used XMLHttpRequest (XHR) to achieve +

For more than a decade the Web has used XMLHttpRequest (XHR) to achieve asynchronous requests in JavaScript. While very useful, XHR is not a very nice API. It suffers from lack of separation of concerns. The input, output and state are all managed by interacting with one object, and state is diff --git a/resources/tests/readability/003/expected.html b/resources/tests/readability/003/expected.html index 5075df0..cfa065f 100644 --- a/resources/tests/readability/003/expected.html +++ b/resources/tests/readability/003/expected.html @@ -1,4 +1,4 @@ -

Test document title

+

Test document title

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, @@ -14,4 +14,4 @@ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. -

+

diff --git a/resources/tests/readability/aclu/expected.html b/resources/tests/readability/aclu/expected.html index 2d1034a..70cf7f2 100644 --- a/resources/tests/readability/aclu/expected.html +++ b/resources/tests/readability/aclu/expected.html @@ -1,4 +1,4 @@ -
+

I don't use Facebook. I'm not technophobic — I'm a geek. I've been using email since the early 1990s, I have accounts on hundreds of services around the net, and I do software development and internet protocol design both for work and for fun. I believe that a globe-spanning communications network like the internet can be a positive social force, and I publish much of my own work on the open web.

@@ -104,4 +104,4 @@

As we work to address the fallout from the current storm around Facebook and Cambridge Analytica, we can't afford to lose sight of these larger mechanisms at play. Cambridge Analytica's failures and mistakes are inherent to Facebook's business model. We need to seriously challenge the social structures that encourage people to opt in to this kind of surveillance. At the same time, we also need to protect those of us who manage to opt out.

-
+
diff --git a/resources/tests/readability/aktualne/expected.html b/resources/tests/readability/aktualne/expected.html index 4c28ea5..d47a173 100644 --- a/resources/tests/readability/aktualne/expected.html +++ b/resources/tests/readability/aktualne/expected.html @@ -1 +1,68 @@ -FIXME \ No newline at end of file +
+

+ Zázrak jedné sezony? West Ham dává pochybovačům stále pádnější odpovědi a fotbalový svět si začíná uvědomovat, že se absolutní anglická fotbalová elita rozrůstá o nového člena. Tým manažera Davida Moyese prohání giganty i v aktuálním ročníku Premier League. +

+
+

+ Pět vítězných soutěžních duelů v řadě, během nich jediný inkasovaný gól. Čtvrté místo v lize, stejný bodový zisk jako loňský šampion Manchester City a nadšené ohlasy z tábora těch nejrenomovanějších komentátorů ostrovního fotbalu. +

+

+ West Ham je opět v kurzu, nadšené ohlasy po nedělní jasné výhře 4:1 na hřišti Aston Villy zaplnily anglický mediální prostor. +

+

+ "Stali se excelentním týmem. Jsou skvělí ve všech částech hřiště a David Moyes si zaslouží obrovský kredit za to, do jaké pozice je dostal," píše na Twitter Gary Lineker. +

+

+ "Nenapadá mě jediný důvod, proč by letos nemohli skončit v elitní čtyřce," přidává se Emile Heskey, někdejší útočník Liverpoolu. "Je fér říct, že vypadají fantasticky. Moyes je neskutečně oživil." +

+

+ I Heskey si všiml, že se Kladiváři skvěle vyrovnávají s náročným programem a pro ně novou rolí: účastí ve více soutěžích najednou. Moyes zůstává konzervativní v určování základní sestavy, chytře ale rozšířil kádr a v Evropské lize či ligovém poháru nechává některé opory odpočívat. Výjimkou potvrzující pravidlo je přitom Tomáš Souček, o jehož nezbytnosti bude řeč níže. +

+

+ "Klíčová věc je ta, že když udělá změny, pořád jim zůstává stejná struktura. To je něco, co pravidelně říkáme třeba o Manchesteru City. Ve hře neustále zůstává nějaká fundamentální filosofie. West Ham to má podobně a už kvůli tomu je třeba před Moyesem smeknout," přirovnává Heskey. +

+

Podívejte se na důležité momenty zápasu Aston Villa - West Ham:

+

+ V Evropské lize má West Ham po třech zápasech plný bodový zisk. V anglickém ligovém poháru dobyl čtvrtfinále, když vyřadil oba bohaté velkokluby z Manchesteru. +

+

+ Čeští fotbalisté nicméně momentálně nejsou ve světlech těch nejjasnějších reflektorů. +

+

+ Vladimír Coufal už sice uzdravil poraněné tříslo, v sestavě ale před ním dostal přednost rozjetý Ben Johnson. Anglický mladík další působivé představení okořenil parádním gólem a potvrdil, že se stává tvrdou konkurencí pro českého reprezentačního beka. +

+

+ Tomáš Souček zůstává nepostradatelným členem základní sestavy, navzdory tomu, že jeho poslední výkony působí nenápadně. +

+

+ "Pořád toho odvádí strašnou spoustu mimo hlavní pozornost. Jsou to důležité věci, které je snadné přehlédnout," píše ve svém hodnocení server Claret and Hugh.  +

+

+ "S Declanem Ricem vytvořil silné partnerství a udělal spoustu těžké práce. Má dobrou rozehrávku. Jediné, na co si lze stěžovat, jsou jeho občasná špatná rozhodnutí ve finální třetině hřiště," hodnotí českého středopolaře londýnský večerník Evening Standard. +

+

+ Web Football.London to vidí podobně. "Opět byl silný ve vzduchu, na obou koncích hřiště. Ve finální fázi se ale nerozhodoval dobře, příliš často volil špatnou variantu." +

+

+ Moyes nicméně nenechává Součka oddechnout. V pěti posledních utkáních, které West Ham odehrál během pouhých čtrnácti dnů, chyběl Čech jen pár minut v závěru na Evertonu, když utrpěl zranění v obličeji. +

+

+ Fanoušci pravidelně spekulují o únavě, skotský manažer ale - jak se zdá - bude mít v sestavě raději unaveného Součka než kohokoli jiného. Zvlášť, když Alex Král, plánovaný back-up do středu zálohy, stále není k dispozici. +

+

+ Zatímco v minulé sezoně Souček častokrát zastínil svého kolegu Rice, letos je to právě anglický reprezentant, kdo si užívá zasloužené ódy na svou adresu. +

+

+ "Hraje prostě velkolepě a připomínám, že je mu stále jen dvaadvacet let," kroutí hlavou Lineker. Není sám. Ještě před pár měsíci se většina odborníků pozastavovala nad údajnou cenovkou kolem 100 milionů liber. Nyní už zaznívají hlasy o tom, jak může být i tato hranice při případném přestupu Declana Rice výrazně překročena. +

+

+ S blížícím se zimním přestupním termínem budou spekulace nabývat na síle, fanoušci Hammers ale věří, že Rice zůstane nejméně do léta. Jeho spokojenost je do očí bijící, stejně jako ochota nechat na hřišti všechno ve prospěch Clarets and Blues. +

+

+ "Náš kolektiv je teď opravdu speciální. Působíme ve výjimečném prostředí. Každé ráno se probouzíme s obrovskou touhou po dalším tréninku. Jsme nadšení," tvrdí mladá anglická superstar. +

+

+ "Jsme na děleném třetím místě. Lidé se před sezonou hodně ptali, zda to můžeme dokázat znovu. Ukázali jsme, že ano. Ale musíme pokračovat. Tohle musí být náš standard. Nesmíme polevit, pokud chceme být velkým týmem," zdůrazňuje Rice. +

+
+
diff --git a/resources/tests/readability/webmd-1/expected.html b/resources/tests/readability/webmd-1/expected.html index 408d7a2..8969848 100644 --- a/resources/tests/readability/webmd-1/expected.html +++ b/resources/tests/readability/webmd-1/expected.html @@ -1,4 +1,4 @@ -
+

Feb. 23, 2015 -- Life-threatening peanut allergies have mysteriously been on the rise in the past decade, with little hope for a cure.

@@ -59,4 +59,4 @@ to peanuts and other tree nuts can be especially severe. Nuts are the main reason people get a life-threatening problem called anaphylaxis.

-
+ diff --git a/src/full_text_parser/mod.rs b/src/full_text_parser/mod.rs index f965f6b..fc2130d 100644 --- a/src/full_text_parser/mod.rs +++ b/src/full_text_parser/mod.rs @@ -900,18 +900,10 @@ impl FullTextParser { let mut node_iter = Some(root.clone()); while let Some(mut node) = node_iter { - let classes = node.get_class_names(); - if classes.contains("page") { - node.set_attribute("class", "page").map_err(|e| { - log::error!("{e}"); - FullTextParserError::Xml - })?; - } else { - node.remove_attribute("class").map_err(|e| { - log::error!("{e}"); - FullTextParserError::Xml - })?; - } + node.remove_attribute("class").map_err(|e| { + log::error!("{e}"); + FullTextParserError::Xml + })?; node.remove_attribute(constants::SCORE_ATTR).map_err(|e| { log::error!("{e}"); diff --git a/src/full_text_parser/readability/mod.rs b/src/full_text_parser/readability/mod.rs index b2a2c19..dcd2a5f 100644 --- a/src/full_text_parser/readability/mod.rs +++ b/src/full_text_parser/readability/mod.rs @@ -399,8 +399,8 @@ impl Readability { for mut sibling in siblings { let mut append = false; - let score = Self::get_content_score(&sibling); - log::debug!("Looking at sibling node: {sibling:?} with score {score:?}"); + let score = Self::get_content_score(&sibling).unwrap_or(0.0); + log::debug!("Looking at sibling node: {sibling:?} with score {score}"); if top_candidate == sibling { append = true; @@ -420,9 +420,7 @@ impl Readability { Self::get_content_score(&top_candidate).unwrap_or(0.0) * 0.2; } - if Self::get_content_score(&sibling).unwrap_or(0.0) + content_bonus - >= sibling_score_threshold - { + if score + content_bonus >= sibling_score_threshold { append = true; } else if sibling.get_name().to_uppercase() == "P" { let link_density = Util::get_link_density(&sibling); @@ -476,12 +474,6 @@ impl Readability { log::error!("{error}"); FullTextParserError::Readability })?; - top_candidate - .set_property("class", "page") - .map_err(|error| { - log::error!("{error}"); - FullTextParserError::Readability - })?; } else { let mut div = Node::new("DIV", None, &document) .map_err(|()| FullTextParserError::Readability)?; @@ -490,10 +482,6 @@ impl Readability { log::error!("{error}"); FullTextParserError::Readability })?; - div.set_property("class", "page").map_err(|error| { - log::error!("{error}"); - FullTextParserError::Readability - })?; for mut child in article_content.get_child_nodes() { child.unlink(); diff --git a/src/full_text_parser/readability/tests.rs b/src/full_text_parser/readability/tests.rs index 98c605c..8e2ed62 100644 --- a/src/full_text_parser/readability/tests.rs +++ b/src/full_text_parser/readability/tests.rs @@ -40,7 +40,7 @@ async fn run_test(name: &str) { article.document = Some(article_document); let html = article.get_content().unwrap(); - std::fs::write("expected.html", &html).unwrap(); + //std::fs::write("expected.html", &html).unwrap(); let expected = std::fs::read_to_string(format!( "./resources/tests/readability/{name}/expected.html" diff --git a/src/util.rs b/src/util.rs index 22df0b2..01ac1d4 100644 --- a/src/util.rs +++ b/src/util.rs @@ -380,7 +380,7 @@ impl Util { } // And there should be no text nodes with real content - node.get_child_nodes().iter().any(|n| { + !node.get_child_nodes().iter().any(|n| { n.get_type() .map(|t| t == NodeType::TextNode) .unwrap_or(false)