mirror of
https://github.com/j0k3r/php-readability.git
synced 2026-09-27 14:36:23 +00:00
Compare commits
4
Commits
35b87585e7
...
a93488d727
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a93488d727 | ||
|
|
ac24ef54a4 | ||
|
|
76547fef78 | ||
|
|
228bc7ee1d |
+72
-70
@@ -213,7 +213,9 @@ class Readability implements LoggerAwareInterface
|
|||||||
*/
|
*/
|
||||||
public function init(): bool
|
public function init(): bool
|
||||||
{
|
{
|
||||||
|
if (!isset($this->dom)) {
|
||||||
$this->loadHtml();
|
$this->loadHtml();
|
||||||
|
}
|
||||||
|
|
||||||
if (!isset($this->dom->documentElement)) {
|
if (!isset($this->dom->documentElement)) {
|
||||||
return false;
|
return false;
|
||||||
@@ -751,6 +753,76 @@ class Readability implements LoggerAwareInterface
|
|||||||
$this->flags &= ~$flag;
|
$this->flags &= ~$flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load HTML in a DOMDocument.
|
||||||
|
* Apply Pre filters
|
||||||
|
* Cleanup HTML using Tidy (or not).
|
||||||
|
*/
|
||||||
|
public function loadHtml(): void
|
||||||
|
{
|
||||||
|
$this->original_html = $this->html;
|
||||||
|
|
||||||
|
$this->logger->debug('Parsing URL: ' . $this->url);
|
||||||
|
|
||||||
|
if ($this->url) {
|
||||||
|
$host = parse_url($this->url, \PHP_URL_HOST);
|
||||||
|
if (null !== $host) {
|
||||||
|
$this->domainRegExp = '/' . strtr((string) preg_replace('/www\d*\./', '', $host), ['.' => '\.']) . '/';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mb_internal_encoding('UTF-8');
|
||||||
|
mb_http_output('UTF-8');
|
||||||
|
mb_regex_encoding('UTF-8');
|
||||||
|
|
||||||
|
// HACK: dirty cleanup to replace some stuff; shouldn't use regexps with HTML but well...
|
||||||
|
if (!$this->flagIsActive(self::FLAG_DISABLE_PREFILTER)) {
|
||||||
|
foreach ($this->pre_filters as $search => $replace) {
|
||||||
|
$this->html = preg_replace($search, $replace, $this->html);
|
||||||
|
}
|
||||||
|
unset($search, $replace);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ('' === trim($this->html)) {
|
||||||
|
$this->html = '<html></html>';
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Use tidy (if it exists).
|
||||||
|
* This fixes problems with some sites which would otherwise trouble DOMDocument's HTML parsing.
|
||||||
|
* Although sometimes it makes matters worse, which is why there is an option to disable it.
|
||||||
|
*/
|
||||||
|
if ($this->useTidy) {
|
||||||
|
$this->logger->debug('Tidying document');
|
||||||
|
|
||||||
|
$tidy = tidy_repair_string($this->html, $this->tidy_config, 'UTF8');
|
||||||
|
if (false !== $tidy && $this->html !== $tidy) {
|
||||||
|
$this->tidied = true;
|
||||||
|
$this->html = $tidy;
|
||||||
|
$this->html = preg_replace('/[\r\n]+/is', "\n", $this->html);
|
||||||
|
}
|
||||||
|
unset($tidy);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->html = self::entitizeNonAscii((string) $this->html);
|
||||||
|
|
||||||
|
if ('html5lib' === $this->parser || 'html5' === $this->parser) {
|
||||||
|
$this->dom = (new HTML5())->loadHTML($this->html);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ('libxml' === $this->parser) {
|
||||||
|
libxml_use_internal_errors(true);
|
||||||
|
|
||||||
|
$this->dom = new \DOMDocument();
|
||||||
|
$this->dom->preserveWhiteSpace = false;
|
||||||
|
$this->dom->loadHTML($this->html, \LIBXML_NOBLANKS | \LIBXML_COMPACT | \LIBXML_NOERROR);
|
||||||
|
|
||||||
|
libxml_use_internal_errors(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->dom->registerNodeClass(\DOMElement::class, JSLikeHTMLElement::class);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the article title as an H1.
|
* Get the article title as an H1.
|
||||||
*
|
*
|
||||||
@@ -1375,76 +1447,6 @@ class Readability implements LoggerAwareInterface
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Load HTML in a DOMDocument.
|
|
||||||
* Apply Pre filters
|
|
||||||
* Cleanup HTML using Tidy (or not).
|
|
||||||
*/
|
|
||||||
private function loadHtml(): void
|
|
||||||
{
|
|
||||||
$this->original_html = $this->html;
|
|
||||||
|
|
||||||
$this->logger->debug('Parsing URL: ' . $this->url);
|
|
||||||
|
|
||||||
if ($this->url) {
|
|
||||||
$host = parse_url($this->url, \PHP_URL_HOST);
|
|
||||||
if (null !== $host) {
|
|
||||||
$this->domainRegExp = '/' . strtr((string) preg_replace('/www\d*\./', '', $host), ['.' => '\.']) . '/';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mb_internal_encoding('UTF-8');
|
|
||||||
mb_http_output('UTF-8');
|
|
||||||
mb_regex_encoding('UTF-8');
|
|
||||||
|
|
||||||
// HACK: dirty cleanup to replace some stuff; shouldn't use regexps with HTML but well...
|
|
||||||
if (!$this->flagIsActive(self::FLAG_DISABLE_PREFILTER)) {
|
|
||||||
foreach ($this->pre_filters as $search => $replace) {
|
|
||||||
$this->html = preg_replace($search, $replace, $this->html);
|
|
||||||
}
|
|
||||||
unset($search, $replace);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ('' === trim($this->html)) {
|
|
||||||
$this->html = '<html></html>';
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Use tidy (if it exists).
|
|
||||||
* This fixes problems with some sites which would otherwise trouble DOMDocument's HTML parsing.
|
|
||||||
* Although sometimes it makes matters worse, which is why there is an option to disable it.
|
|
||||||
*/
|
|
||||||
if ($this->useTidy) {
|
|
||||||
$this->logger->debug('Tidying document');
|
|
||||||
|
|
||||||
$tidy = tidy_repair_string($this->html, $this->tidy_config, 'UTF8');
|
|
||||||
if (false !== $tidy && $this->html !== $tidy) {
|
|
||||||
$this->tidied = true;
|
|
||||||
$this->html = $tidy;
|
|
||||||
$this->html = preg_replace('/[\r\n]+/is', "\n", $this->html);
|
|
||||||
}
|
|
||||||
unset($tidy);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->html = self::entitizeNonAscii((string) $this->html);
|
|
||||||
|
|
||||||
if ('html5lib' === $this->parser || 'html5' === $this->parser) {
|
|
||||||
$this->dom = (new HTML5())->loadHTML($this->html);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ('libxml' === $this->parser) {
|
|
||||||
libxml_use_internal_errors(true);
|
|
||||||
|
|
||||||
$this->dom = new \DOMDocument();
|
|
||||||
$this->dom->preserveWhiteSpace = false;
|
|
||||||
$this->dom->loadHTML($this->html, \LIBXML_NOBLANKS | \LIBXML_COMPACT | \LIBXML_NOERROR);
|
|
||||||
|
|
||||||
libxml_use_internal_errors(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->dom->registerNodeClass(\DOMElement::class, JSLikeHTMLElement::class);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function getAncestors(\DOMElement $node, int $maxDepth = 0): array
|
private function getAncestors(\DOMElement $node, int $maxDepth = 0): array
|
||||||
{
|
{
|
||||||
$ancestors = [];
|
$ancestors = [];
|
||||||
|
|||||||
Reference in New Issue
Block a user