Compare commits

..
17 Commits
Author SHA1 Message Date
Jérémy BenoistandGitHub 6427dd7371 Merge pull request #32 from j0k3r/html5
Add missing HTML5 class
2017-06-30 16:50:09 +02:00
Jeremy Benoist 613a63c062 CS 2017-06-30 16:42:29 +02:00
Jeremy Benoist 05089bbd03 Add missing HTML5 class 2017-06-30 16:32:37 +02:00
Jérémy BenoistandGitHub 5ac82f3c87 Merge pull request #30 from j0k3r/avoid-php-warning
Avoid php warning
2017-05-19 16:16:20 +02:00
Jeremy Benoist 85fb92a042 Fix tests 2017-05-19 16:02:36 +02:00
Jeremy Benoist f2a43b476c Avoid PHP Warning
This isn't the best solution but the previous one using `@` wasn't really better.
Appending a string into a fragment might generate some warning if the string contains bad entity.
For example `+`.
2017-05-19 15:37:46 +02:00
Jérémy BenoistandGitHub 6def743902 Merge pull request #27 from jtojnar/ext-mbstring
Add mbstring as a dependency
2017-03-18 09:16:30 +01:00
Jan Tojnar 8a44926392 Add mbstring as a dependency 2017-03-18 04:02:50 +01:00
Jérémy BenoistandGitHub 8c7740f073 Merge pull request #26 from j0k3r/fix-phpunit-7.x
Fix PHPUnit error on PHP 7+
2017-03-09 09:41:33 +01:00
Jeremy Benoist 6a4720c951 Fix PHPUnit error on PHP 7+ 2017-03-09 09:21:13 +01:00
Jérémy BenoistandGitHub 7a9a82b543 Update README.md 2017-03-09 09:02:04 +01:00
Jérémy BenoistandGitHub 8a91d36294 Merge pull request #25 from jtojnar/patch-1
Add tidy to suggested dependenies
2017-03-09 09:01:05 +01:00
Jan TojnarandGitHub 669adfb20f Add tidy to suggested dependenies 2017-02-16 15:12:45 +01:00
Jeremy BenoistandGitHub 445b889efb Merge pull request #24 from j0k3r/links
Don't be to hard on 'links' attribute
2017-02-02 16:12:48 +01:00
Jeremy Benoist 8b1c3f147d Don't be to hard on 'links' attribute 2017-02-02 15:57:15 +01:00
Jeremy BenoistandGitHub a505a13d0c Merge pull request #22 from jtojnar/master
Depend on psr/log instead of Monolog
2017-01-14 17:09:58 +01:00
Jan Tojnar 9fe0d07805 Depend on psr/log instead of Monolog 2017-01-14 09:08:15 +01:00
6 changed files with 75 additions and 58 deletions
+1 -1
View File
@@ -46,7 +46,7 @@ before_script:
script:
- mkdir -p build/logs
- phpunit -v --coverage-clover build/logs/clover.xml
- php vendor/bin/simple-phpunit -v --coverage-clover build/logs/clover.xml
- if [ "$CS_FIXER" = "run" ]; then php vendor/bin/php-cs-fixer fix --verbose --dry-run ; fi;
after_script:
+2 -2
View File
@@ -17,9 +17,9 @@ The default php-readability lib is really old and needs to be improved. I found
## Requirements
By default, this lib will use the [Tidy extension](https://github.com/htacg/tidy-html5) if it's available. Tidy is only used to cleanup the given HTML and avoid problems with bad HTML structure, etc ..
By default, this lib will use the [Tidy extension](https://github.com/htacg/tidy-html5) if it's available. Tidy is only used to cleanup the given HTML and avoid problems with bad HTML structure, etc .. It'll be suggested by Composer.
Since Composer doesn't support suggestion on PHP extension, I write this suggestion here.
Also, if you got problem from parsing a content without Tidy installed, please install it and try again.
## Usage
+9 -2
View File
@@ -25,11 +25,18 @@
}],
"require": {
"php": ">=5.3.3",
"monolog/monolog": "^1.13"
"ext-mbstring": "*",
"psr/log": "^1.0",
"electrolinux/php-html5lib": "^0.1.0"
},
"require-dev": {
"satooshi/php-coveralls": "~0.6",
"friendsofphp/php-cs-fixer": "<2"
"friendsofphp/php-cs-fixer": "<2",
"monolog/monolog": "^1.13",
"symfony/phpunit-bridge": "^3.2"
},
"suggest": {
"ext-tidy": "Used to clean up given HTML and to avoid problems with bad HTML structure."
},
"autoload": {
"psr-4": { "Readability\\": "src/" }
+20 -13
View File
@@ -45,19 +45,31 @@ class JSLikeHTMLElement extends \DOMElement
*/
public function __set($name, $value)
{
if ($name === 'innerHTML') {
if ($name !== 'innerHTML') {
$trace = debug_backtrace();
trigger_error('Undefined property via __set(): ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'], E_USER_NOTICE);
return;
}
// first, empty the element
for ($x = $this->childNodes->length - 1; $x >= 0; --$x) {
$this->removeChild($this->childNodes->item($x));
}
// $value holds our new inner HTML
if ($value !== '') {
$value = trim($value);
if (empty($value)) {
return;
}
// ensure bad entity won't generate warning
$previousError = libxml_use_internal_errors(true);
$f = $this->ownerDocument->createDocumentFragment();
// appendXML() expects well-formed markup (XHTML)
// @ to suppress PHP warnings
$result = @$f->appendXML($value);
$result = $f->appendXML($value);
if ($result) {
if ($f->hasChildNodes()) {
$this->appendChild($f);
@@ -72,7 +84,7 @@ class JSLikeHTMLElement extends \DOMElement
// We use it (and suppress the warning) because an HTML fragment will
// be wrapped around <html><body> tags which we don't really want to keep.
// Note: despite the warning, if loadHTML succeeds it will return true.
$result = @$f->loadHTML('<htmlfragment>' . $value . '</htmlfragment>');
$result = $f->loadHTML('<htmlfragment>' . $value . '</htmlfragment>');
if ($result) {
$import = $f->getElementsByTagName('htmlfragment')->item(0);
@@ -81,16 +93,11 @@ class JSLikeHTMLElement extends \DOMElement
$importedNode = $this->ownerDocument->importNode($child, true);
$this->appendChild($importedNode);
}
} else {
// oh well, we tried, we really did. :(
// this element is now empty
}
}
}
} else {
$trace = debug_backtrace();
trigger_error('Undefined property via __set(): ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'], E_USER_NOTICE);
}
libxml_clear_errors();
libxml_use_internal_errors($previousError);
}
/**
+3 -2
View File
@@ -2,6 +2,7 @@
namespace Readability;
use HTML5Lib\Parser;
use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerInterface;
use Psr\Log\NullLogger;
@@ -83,7 +84,7 @@ class Readability implements LoggerAwareInterface
* Defined up here so we don't instantiate them repeatedly in loops.
*/
public $regexps = array(
'unlikelyCandidates' => '/display\s*:\s*none|ignore|\binfos?\b|annoy|clock|date|time|author|intro|links|hidd?e|about|archive|\bprint|bookmark|tags|tag-list|share|search|social|robot|published|combx|comment|mast(?:head)|subscri|community|category|disqus|extra|head|head(?:er|note)|floor|foot(?:er|note)|menu|tool\b|function|nav|remark|rss|shoutbox|widget|meta|banner|sponsor|adsense|inner-?ad|ad-|sponsor|\badv\b|\bads\b|agr?egate?|pager|sidebar|popup|tweet|twitter/i',
'unlikelyCandidates' => '/display\s*:\s*none|ignore|\binfos?\b|annoy|clock|date|time|author|intro|hidd?e|about|archive|\bprint|bookmark|tags|tag-list|share|search|social|robot|published|combx|comment|mast(?:head)|subscri|community|category|disqus|extra|head|head(?:er|note)|floor|foot(?:er|note)|menu|tool\b|function|nav|remark|rss|shoutbox|widget|meta|banner|sponsor|adsense|inner-?ad|ad-|sponsor|\badv\b|\bads\b|agr?egate?|pager|sidebar|popup|tweet|twitter/i',
'okMaybeItsACandidate' => '/article\b|contain|\bcontent|column|general|detail|shadow|lightbox|blog|body|entry|main|page/i',
'positive' => '/read|full|article|body|\bcontent|contain|entry|main|markdown|page|attach|pagination|post|text|blog|story/i',
'negative' => '/bottom|stat|info|discuss|e[\-]?mail|comment|reply|log.{2}(n|ed)|sign|single|combx|com-|contact|_nav|link|media|\bout|promo|\bad-|related|scroll|shoutbox|sidebar|sponsor|shopping|teaser|recommend/i',
@@ -284,7 +285,7 @@ class Readability implements LoggerAwareInterface
$this->html = mb_convert_encoding($this->html, 'HTML-ENTITIES', 'UTF-8');
if (!($this->parser === 'html5lib' && ($this->dom = \HTML5_Parser::parse($this->html)))) {
if (!($this->parser === 'html5lib' && ($this->dom = Parser::parse($this->html)))) {
libxml_use_internal_errors(true);
$this->dom = new \DOMDocument();
+10 -8
View File
@@ -33,6 +33,15 @@ class ReadabilityTest extends \PHPUnit_Framework_TestCase
$this->assertInstanceOf('DomDocument', $readability->dom);
}
public function testConstructHtml5Parser()
{
$readability = $this->getReadability('<html/>', 'http://0.0.0.0', 'html5lib');
$this->assertEquals('http://0.0.0.0', $readability->url);
$this->assertInstanceOf('DomDocument', $readability->dom);
$this->assertEquals('<html/>', $readability->original_html);
}
/**
* @requires extension tidy
*/
@@ -326,13 +335,6 @@ class ReadabilityTest extends \PHPUnit_Framework_TestCase
$this->assertNotContains('This text is also an awesome text and you should know that', $readability->getContent()->innerHTML);
}
// public function testConstructParser()
// {
// $readability = $this->getReadability('<html/>', 'http://0.0.0.0', 'html5lib');
// $this->assertEquals('http://0.0.0.0', $readability->url);
// }
// dummy function to be used to the next test
public function error2Exception($code, $string, $file, $line, $context)
{
@@ -443,7 +445,7 @@ class ReadabilityTest extends \PHPUnit_Framework_TestCase
public function testPostFilters()
{
$readability = $this->getReadability('<div>' . str_repeat('<p>This <b>is</b> the awesome content :)</p>', 7) . '</div>', 'http://0.0.0.0');
$readability = $this->getReadability('<div>' . str_repeat('<p>This <b>is</b> the awesome content :)</p>', 10) . '</div>', 'http://0.0.0.0');
$readability->addPostFilter('!<strong[^>]*>(.*?)</strong>!is', '');
$res = $readability->init();