From 8bb2fd7c67786ae8d945e1baaeb3dd8d0e9195b1 Mon Sep 17 00:00:00 2001 From: David Fricker Date: Sat, 4 Feb 2017 23:00:17 +0000 Subject: prevents an exception being thrown prevents an exception being thrown by postProcessContent when $result is a bool not a DOM object. --- src/HTMLParser.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/HTMLParser.php b/src/HTMLParser.php index a8c28ff..0313b2a 100644 --- a/src/HTMLParser.php +++ b/src/HTMLParser.php @@ -183,6 +183,10 @@ class HTMLParser if (!$parseSuccessful) { return false; } + + if (!$result) { + return false; + } $result = $this->postProcessContent($result); -- cgit v1.2.3 From 16ad941225aa543a9f05ba2488e222dc9246a026 Mon Sep 17 00:00:00 2001 From: Andres Rey Date: Fri, 10 Mar 2017 11:12:15 +0000 Subject: Apply fixes from StyleCI --- src/HTMLParser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/HTMLParser.php b/src/HTMLParser.php index bc9aa9f..288d8a8 100644 --- a/src/HTMLParser.php +++ b/src/HTMLParser.php @@ -185,7 +185,7 @@ class HTMLParser if (!$parseSuccessful) { return false; } - + if (!$result) { return false; } -- cgit v1.2.3 From bba656d6733818c450be40292a7c803b76e8973f Mon Sep 17 00:00:00 2001 From: Andres Rey Date: Sat, 20 May 2017 12:25:44 +0100 Subject: Add new backup approach. Cloning the original DOM object is not useful to keep a backup of it because there seems to be a connection between original object and clone. Making a change on the original object translates it to the backup one, so html must be reloaded everytime the algorithm cycles. --- src/HTMLParser.php | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/HTMLParser.php b/src/HTMLParser.php index 288d8a8..9be6ff3 100644 --- a/src/HTMLParser.php +++ b/src/HTMLParser.php @@ -16,11 +16,6 @@ class HTMLParser */ private $dom = null; - /** - * @var DOMDocument - */ - private $backupdom = null; - /** * @var array */ @@ -107,8 +102,6 @@ class HTMLParser $this->environment->getConfig()->merge($options); - $this->dom = new DOMDocument('1.0', 'utf-8'); - // To avoid having a gazillion of errors on malformed HTMLs libxml_use_internal_errors(true); } @@ -122,15 +115,12 @@ class HTMLParser */ public function parse($html) { - $this->loadHTML($html); + $this->dom = $this->loadHTML($html); $this->removeScripts(); $this->prepDocument(); - // In case we need the original HTML to create a fake top candidate - $this->backupdom = clone $this->dom; - $this->metadata = $this->getMetadata(); $this->metadata['image'] = $this->getMainImage(); @@ -165,7 +155,8 @@ class HTMLParser $length += mb_strlen($p->textContent); } if ($result && mb_strlen(preg_replace('/\s/', '', $result->textContent)) < 500) { - $root = $this->backupdom->getElementsByTagName('body')->item(0); + $this->dom = $this->loadHTML($html); + $root = $this->dom->getElementsByTagName('body')->item(0); if ($this->getConfig()->getOption('stripUnlikelyCandidates')) { $this->getConfig()->setOption('stripUnlikelyCandidates', false); @@ -203,18 +194,30 @@ class HTMLParser } /** + * Creates a DOM Document object and loads the provided HTML on it. + * + * Used for the first load of Readability and subsequent reloads (when disabling flags and rescanning the text) + * Previous versions of Readability used this method one time and cloned the DOM to keep a backup. This caused bugs + * because cloning the DOM object keeps a relation between the clone and the original one, doing changes in both + * objects and ruining the backup. + * * @param string $html + * @return DOMDocument */ private function loadHTML($html) { + $dom = new DOMDocument('1.0', 'utf-8'); + if (!$this->getConfig()->getOption('substituteEntities')) { // Keep the original HTML entities - $this->dom->substituteEntities = false; + $dom->substituteEntities = false; } // Prepend the XML tag to avoid having issues with special characters. Should be harmless. - $this->dom->loadHTML('' . $html); - $this->dom->encoding = 'UTF-8'; + $dom->loadHTML('' . $html); + $dom->encoding = 'UTF-8'; + + return $dom; } /** -- cgit v1.2.3 From c0f2df985a0770c058bcd1c0aed5cd6b220672b8 Mon Sep 17 00:00:00 2001 From: Andres Rey Date: Sat, 20 May 2017 13:24:18 +0100 Subject: Move the removeScripts and prepDocument functions inside the loadHTML function. Performance will suffer (as the system has to reparse the html eveytime it cycles) but is the only solution AFAIK. --- src/HTMLParser.php | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/HTMLParser.php b/src/HTMLParser.php index 13d7817..ef849a8 100644 --- a/src/HTMLParser.php +++ b/src/HTMLParser.php @@ -118,10 +118,6 @@ class HTMLParser { $this->dom = $this->loadHTML($html); - $this->removeScripts(); - - $this->prepDocument(); - $this->metadata = $this->getMetadata(); $this->metadata['image'] = $this->getMainImage(); @@ -223,6 +219,10 @@ class HTMLParser $dom->loadHTML('' . $html); $dom->encoding = 'UTF-8'; + $this->removeScripts($dom); + + $this->prepDocument($dom); + return $dom; } @@ -236,13 +236,15 @@ class HTMLParser /** * Removes all the scripts of the html. + * + * @param DOMDocument $dom */ - private function removeScripts() + private function removeScripts(DOMDocument $dom) { $toRemove = ['script', 'noscript']; foreach ($toRemove as $tag) { - while ($script = $this->dom->getElementsByTagName($tag)) { + while ($script = $dom->getElementsByTagName($tag)) { if ($script->item(0)) { $script->item(0)->parentNode->removeChild($script->item(0)); } else { @@ -252,12 +254,14 @@ class HTMLParser } } - /* + /** * Prepares the document for parsing + * + * @param DOMDocument $dom */ - private function prepDocument() + private function prepDocument(DOMDocument $dom) { - $brs = $this->dom->getElementsByTagName('br'); + $brs = $dom->getElementsByTagName('br'); $length = $brs->length; for ($i = 0; $i < $length; $i++) { /** @var \DOMNode $br */ @@ -289,7 +293,7 @@ class HTMLParser */ if ($replaced) { - $p = $this->dom->createElement('p'); + $p = $dom->createElement('p'); $br->parentNode->replaceChild($p, $br); $next = $p->nextSibling; @@ -311,7 +315,7 @@ class HTMLParser } // Replace font tags with span - $fonts = $this->dom->getElementsByTagName('font'); + $fonts = $dom->getElementsByTagName('font'); $length = $fonts->length; for ($i = 0; $i < $length; $i++) { $font = $fonts->item($length - 1 - $i); -- cgit v1.2.3 From 29daafcd8d733e47a5ee0a0275f26c328f511b00 Mon Sep 17 00:00:00 2001 From: Andres Rey Date: Sun, 21 May 2017 23:33:33 +0100 Subject: Minor fix --- src/HTMLParser.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/HTMLParser.php b/src/HTMLParser.php index ef849a8..0407b87 100644 --- a/src/HTMLParser.php +++ b/src/HTMLParser.php @@ -170,11 +170,7 @@ class HTMLParser } } - if (!$parseSuccessful) { - return false; - } - - if (!$result) { + if (!$parseSuccessful || $result) { return false; } -- cgit v1.2.3 From 5b95fc2f77a1122b75a8ff20420dc0a24c1e524c Mon Sep 17 00:00:00 2001 From: Andres Rey Date: Tue, 30 May 2017 15:57:21 +0100 Subject: Minor fix --- src/HTMLParser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/HTMLParser.php b/src/HTMLParser.php index 0407b87..cb2fab4 100644 --- a/src/HTMLParser.php +++ b/src/HTMLParser.php @@ -170,7 +170,7 @@ class HTMLParser } } - if (!$parseSuccessful || $result) { + if (!$parseSuccessful) { return false; } -- cgit v1.2.3 From 83e54ca3198ce541f1805b0930a7b15f57f696dd Mon Sep 17 00:00:00 2001 From: Andres Rey Date: Tue, 30 May 2017 17:09:10 +0100 Subject: Updat test case for needs-entity-normalization --- .../needs-entity-normalization/expected.html | 15 +- .../needs-entity-normalization/source.html | 154 +++++++-------------- 2 files changed, 59 insertions(+), 110 deletions(-) diff --git a/test/test-pages/needs-entity-normalization/expected.html b/test/test-pages/needs-entity-normalization/expected.html index 0224f1c..223558c 100644 --- a/test/test-pages/needs-entity-normalization/expected.html +++ b/test/test-pages/needs-entity-normalization/expected.html @@ -1,8 +1,7 @@ -

25/03/2017 | 06:41 | Ocurrió en la escuela Alfredo Benitz. Fue en un acto conmemorativo por el Día de la Memoria en la plaza céntrica de la localidad, ante la presencia del intendente Rubén Ovelar. Video.

-

Simularon un fusilamiento en un acto escolar en La Cumbre.

Un verdadero escándalo sacude a la localidad cordobesa de La Cumbre por un acto escolar en el que alumnos del nivel primario de la escuela Alfredo Benítez simularon un fusilamiento militar.

-La polémica ceremonia fue realizada en el marco del acto central por el Día de la Memoria, Verdad y Justicia en la plaza principal de la ciudad, ante la presencia del intendente local, Rubén Ovelar y todo su gabinete.

-Las fotografías de niños simulando ser militares y otros, arrodillados en el piso, con los ojos vendados causaron conmoción y en minutos se viralizaron a través de las redes sociales.

-Ovelar, en diálogo con Cadena 3, salió a poner paños fríos y le restó importancia a la polémica.

-"Hay opiniones diversas, pero no hay que meter a los niños en esto. Fue una buena representación, por lo menos a mi manera de ver", dijo.

Informes de María Eugenia Pasquali y Federico Albarenque.

- -
\ No newline at end of file +

30/05/2017 | 11:57 | El titular del Suoem le dijo al intendente que "va a pagar caro, esta infamia y canallada"–por la publiación de sueldos–. Los municipales realizaron una ruidosa protesta en el Palacio 6 de Julio

Los municipales de la ciudad de Córdoba realizan este martes una ruidosa asamblea general en el Palacio 6 de Julio y todas las reparticiones como medida de presión en contra de la difusión de las lista de los empleados y los sueldos que perciben.

+"Esta infamia, esta canallada, este intento por pisotear nuestra dignidad este ataque a nuestra seguridad y la de nuestras familias le prometo que lo va a pagar caro; vamos a responder con toda la fuerza", disparó al hablar ante la multitud el titular del Suoem, Rubén Daniele.

+"En estos días señor intendente lo he visto suelto de cuerpo, diría que casi con una sonrisa burlona. Le prometo y lo juro acá: en unos meses se va a borrar la sonrisa y se va a cagar como se cagó otras veces, pidiendo que vayamos a solucionar los problemas de la ciudad", agregó.

+Si bien la medida de fuerza arrancó a las 11 en la explanada de la Municipalidad, la atención en el municipio, los CPC y otras dependencias se vio resentida durante toda la jornada.

+Además, las asambleas afectan el normal funcionamiento en las escuelas municipales y jardines maternales.

+Ayer, Damián Bizzi, vocero del Sindicato Unión Obreros y Empleados Municipales (Suoem) manifestó a Cadena 3 que las asambleas “son la única forma de hacernos escuchar”: “Lo esencial sería que no hubiéramos tenido este problema. No hay otra forma que las autoridades municipales nos escuchen".

+"Estamos en una situación de conflicto y ésta es la única forma de hacernos escuchar. Es una gestión que no escucha mucho”, dijo.

\ No newline at end of file diff --git a/test/test-pages/needs-entity-normalization/source.html b/test/test-pages/needs-entity-normalization/source.html index 72179ad..8111db1 100644 --- a/test/test-pages/needs-entity-normalization/source.html +++ b/test/test-pages/needs-entity-normalization/source.html @@ -1,4 +1,4 @@ -Simularon un fusilamiento en un acto escolar en La Cumbre +Daniele, a Mestre: "En unos meses se va a borrar la sonrisa" @@ -162,37 +162,12 @@ msRequestAnimationFrame;raf?raf(cb):window.addEventListener("load",cb); googletag.defineSlot('/416478284/Cadena-3/General/B5', [300, 250], 'div-gpt-ad-1460643366541-6').addService(googletag.pubads()); googletag.defineSlot('/416478284/Cadena-3/General/F1', [[960, 80], [728, 90], [960, 250], [970, 90]], 'div-gpt-ad-1460643366541-7').addService(googletag.pubads()); googletag.pubads().enableSingleRequest(); - - googletag.pubads().setTargeting('Noticias', ['Política y Economía']); googletag.enableServices(); }); - - - - - - + -

Escándalo por el 24 M

Simularon un fusilamiento en un acto escolar en La Cumbre

25/03/2017 | 06:41 | Ocurrió en la escuela Alfredo Benitz. Fue en un acto conmemorativo por el Día de la Memoria en la plaza céntrica de la localidad, ante la presencia del intendente Rubén Ovelar. Video.

+

Difusión de datos

Daniele, a Mestre: "En unos meses se va a borrar la sonrisa"

30/05/2017 | 11:57 | El titular del Suoem le dijo al intendente que "va a pagar caro, esta infamia y canallada"–por la publiación de sueldos–. Los municipales realizaron una ruidosa protesta en el Palacio 6 de Julio

@@ -780,39 +755,39 @@ googletag.cmd.push(function() { googletag.display('div-gpt-ad-1467226916317-0');
- Compartir en Facebook + Compartir en Facebook
- Compartir en Twitter + Compartir en Twitter
- Compartir en Google+ + Compartir en Google+
- Imprimir + Imprimir
-

Simularon un fusilamiento en un acto escolar en La Cumbre.

+
PreviousNext

Daniele habló en la asamblea general del Suoem.

Caos vehicular en inmediaciones de la Municipalidad por la protesta.

Daniele habló en la asamblea general del Suoem.

Caos vehicular en inmediaciones de la Municipalidad por la protesta.

@@ -829,7 +804,7 @@ googletag.cmd.push(function() { googletag.display('div-gpt-ad-1467226916317-0'); advertising: { client: 'vast', //tag: 'http://ads.e-planning.net/eb/4/5289/Audio_en_Vivo/PreRoll_1?o=v&ma=1&vv=2' - tag: 'https://pubads.g.doubleclick.net/gampad/ads?sz=400x300&iu=/416478284/Cadena-3/Radio-En-Vivo/PreRoll-Audios&impl=s&gdfp_req=1&env=vp&output=vast&unviewed_position_start=1&url=http://www.cadena3.com&correlator=20170326065916' + tag: 'https://pubads.g.doubleclick.net/gampad/ads?sz=400x300&iu=/416478284/Cadena-3/Radio-En-Vivo/PreRoll-Audios&impl=s&gdfp_req=1&env=vp&output=vast&unviewed_position_start=1&url=http://www.cadena3.com&correlator=20170530124736' }, events: { onAdTime: function (adEvent) { @@ -851,19 +826,22 @@ googletag.cmd.push(function() { googletag.display('div-gpt-ad-1467226916317-0'); Cerrar publicidad
-
Escándalo en La Cumbre por un acto por el Día de la Memoria (María Eugenia Pasquali).

Escándalo en La Cumbre por un acto por el Día de la Memoria (María Eugenia Pasquali).

Un verdadero escándalo sacude a la localidad cordobesa de La Cumbre por un acto escolar en el que alumnos del nivel primario de la escuela Alfredo Benítez simularon un fusilamiento militar.
+

Daniele cruzó en duros términos al intendente (Informe de Juan Pablo Viola).

Daniele cruzó en duros términos al intendente (Informe de Juan Pablo Viola).

flecha
1 de 2
flecha

Los municipales de la ciudad de Córdoba realizan este martes una ruidosa asamblea general en el Palacio 6 de Julio y todas las reparticiones como medida de presión en contra de la difusión de las lista de los empleados y los sueldos que perciben.

-La polémica ceremonia fue realizada en el marco del acto central por el Día de la Memoria, Verdad y Justicia en la plaza principal de la ciudad, ante la presencia del intendente local, Rubén Ovelar y todo su gabinete.
+"Esta infamia, esta canallada, este intento por pisotear nuestra dignidad este ataque a nuestra seguridad y la de nuestras familias le prometo que lo va a pagar caro; vamos a responder con toda la fuerza", disparó al hablar ante la multitud el titular del Suoem, Rubén Daniele.

-Las fotografías de niños simulando ser militares y otros, arrodillados en el piso, con los ojos vendados causaron conmoción y en minutos se viralizaron a través de las redes sociales.
+"En estos días señor intendente lo he visto suelto de cuerpo, diría que casi con una sonrisa burlona. Le prometo y lo juro acá: en unos meses se va a borrar la sonrisa y se va a cagar como se cagó otras veces, pidiendo que vayamos a solucionar los problemas de la ciudad", agregó.

-Ovelar, en diálogo con Cadena 3, salió a poner paños fríos y le restó importancia a la polémica.
+Si bien la medida de fuerza arrancó a las 11 en la explanada de la Municipalidad, la atención en el municipio, los CPC y otras dependencias se vio resentida durante toda la jornada.

-"Hay opiniones diversas, pero no hay que meter a los niños en esto. Fue una buena representación, por lo menos a mi manera de ver", dijo.
+


+

-
+Además, las asambleas afectan el normal funcionamiento en las escuelas municipales y jardines maternales.

-Informes de María Eugenia Pasquali y Federico Albarenque.

+Ayer, Damián Bizzi, vocero del Sindicato Unión Obreros y Empleados Municipales (Suoem) manifestó a Cadena 3 que las asambleas “son la única forma de hacernos escuchar”: “Lo esencial sería que no hubiéramos tenido este problema. No hay otra forma que las autoridades municipales nos escuchen".
+
+"Estamos en una situación de conflicto y ésta es la única forma de hacernos escuchar. Es una gestión que no escucha mucho”, dijo.

@@ -877,35 +855,35 @@ Ovelar, en diálogo con Cadena 3, salió a poner paños fríos y le rest
- Compartir en Facebook + Compartir en Facebook
- Compartir en Twitter + Compartir en Twitter
- Compartir en Google+ + Compartir en Google+
- Imprimir + Imprimir
@@ -929,7 +907,7 @@ Ovelar, en diálogo con Cadena 3, salió a poner paños fríos y le rest
- +
@@ -937,10 +915,10 @@ Ovelar, en diálogo con Cadena 3, salió a poner paños fríos y le rest

Comentá

-

comentarios

+

comentarios

-
+
@@ -997,7 +975,8 @@ Ovelar, en diálogo con Cadena 3, salió a poner paños fríos y le rest
- +

Sociedad

Compartir en FacebookCompartir en Twitter
El edificio del empresario está sobre Santa Fe, frente a la Policía.

10:25 | Habría sido víctima de una delación. Le llevaron US$ 500 mil y elementos de valor en su casa frente a la jefatura de Policía de Córdoba. Osvaldo Elías Absi contó a Cadena 3 detalles del hecho.

Sospechan que el círculo íntimo instigó el robo (Informe de Carlos Castro Torres)

Sospechan que el círculo íntimo instigó el robo (Informe de Carlos Castro Torres)

flecha
1 de 2
flecha

Sociedad

Compartir en FacebookCompartir en Twitter
Familiares de Sapito y Balbo se enfrentaron en Tribunales (Foto: @roxicanal12)

10:01 | Los incidentes se produjeron a la salida de la audiencia en la Cámara 4ª del Crimen. El abogado de "Sapito", Carlos Hairabedian, dijo a Cadena 3 que fue un "ataque brutal".

Fuerte crítica a la Justicia de Córdoba de Mario Pereyra.

Fuerte crítica a la Justicia de Córdoba de Mario Pereyra.

flecha
1 de 3
flecha
@@ -1018,10 +997,10 @@ Ovelar, en diálogo con Cadena 3, salió a poner paños fríos y le rest
-
Rige un alerta por tormentas fuertes para Córdoba.

22:00 | El aviso abarca al extremo sur de la provincia de Buenos Aires, este de Catamarca y de San Juan, noreste de Chubut, La Pampa, este de La Rioja, este de Mendoza, centro y este de Río Negro y San Luis.

+
Daniele habló en la asamblea general del Suoem.
Daniele cruzó en duros términos al intendente (Informe de Juan Pablo Viola).

Daniele cruzó en duros términos al intendente (Informe de Juan Pablo Viola).

flecha
1 de 2
flecha

11:57 | El titular del Suoem le dijo al intendente que "va a pagar caro, esta infamia y canallada"–por la publiación de sueldos–. Los municipales realizaron una ruidosa protesta en el Palacio 6 de Julio

@@ -1053,13 +1032,13 @@ Ovelar, en diálogo con Cadena 3, salió a poner paños fríos y le rest

Inmuebles

Vehículos