mirror of
https://github.com/j0k3r/php-readability.git
synced 2026-09-27 06:26:17 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eef6d6d456 | ||
|
|
30a577c617 | ||
|
|
70b393a2a3 | ||
|
|
9ab6d0d9e8 | ||
|
|
8712db510e | ||
|
|
422c74f29c | ||
|
|
ed3393a79f | ||
|
|
63cd304dba | ||
|
|
43939f88d9 | ||
|
|
4c68cc9f09 | ||
|
|
276684ab6d | ||
|
|
163058aeff | ||
|
|
6427dd7371 | ||
|
|
613a63c062 | ||
|
|
05089bbd03 | ||
|
|
5ac82f3c87 | ||
|
|
85fb92a042 | ||
|
|
f2a43b476c | ||
|
|
6def743902 | ||
|
|
8a44926392 | ||
|
|
8c7740f073 | ||
|
|
6a4720c951 | ||
|
|
7a9a82b543 | ||
|
|
8a91d36294 | ||
|
|
669adfb20f | ||
|
|
445b889efb | ||
|
|
8b1c3f147d | ||
|
|
a505a13d0c | ||
|
|
9fe0d07805 | ||
|
|
e5d31b93d1 | ||
|
|
6e24a5d731 | ||
|
|
ff754b80bd | ||
|
|
ade850534c | ||
|
|
d97bece7c5 | ||
|
|
47ce4fb7f9 | ||
|
|
3de4e918b4 | ||
|
|
5182d6cb11 | ||
|
|
fb9810a827 | ||
|
|
22aa4c3b31 | ||
|
|
2ef400bf73 | ||
|
|
dec4514c00 | ||
|
|
00f622e9b7 | ||
|
|
7b47e2f1de | ||
|
|
c756ec067e | ||
|
|
8ab7d76cd5 | ||
|
|
149a333b40 | ||
|
|
209c404d7b | ||
|
|
6e3f2e8c0b | ||
|
|
8cbecd7e99 | ||
|
|
438699ab15 | ||
|
|
ea7a62d352 | ||
|
|
9181fd1a2c | ||
|
|
2951936e00 | ||
|
|
92965f76cf | ||
|
|
850ade16b6 | ||
|
|
dc590542f0 |
@@ -3,6 +3,7 @@
|
|||||||
/.gitignore export-ignore
|
/.gitignore export-ignore
|
||||||
/.scrutinizer.yml export-ignore
|
/.scrutinizer.yml export-ignore
|
||||||
/.travis.yml export-ignore
|
/.travis.yml export-ignore
|
||||||
|
/.php_cs export-ignore
|
||||||
/README.md export-ignore
|
/README.md export-ignore
|
||||||
/phpunit.xml.dist export-ignore
|
/phpunit.xml.dist export-ignore
|
||||||
/tests export-ignore
|
/tests export-ignore
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
vendor/
|
vendor/
|
||||||
coverage/
|
coverage/
|
||||||
composer.lock
|
composer.lock
|
||||||
|
.php_cs.cache
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return Symfony\CS\Config\Config::create()
|
||||||
|
->setUsingCache(true)
|
||||||
|
->level(Symfony\CS\FixerInterface::SYMFONY_LEVEL)
|
||||||
|
// use default SYMFONY_LEVEL and extra fixers:
|
||||||
|
->fixers(array(
|
||||||
|
'concat_with_spaces',
|
||||||
|
'ordered_use',
|
||||||
|
'phpdoc_order',
|
||||||
|
'strict',
|
||||||
|
'strict_param',
|
||||||
|
'long_array_syntax',
|
||||||
|
))
|
||||||
|
->finder(
|
||||||
|
Symfony\CS\Finder\DefaultFinder::create()
|
||||||
|
->in(__DIR__)
|
||||||
|
->exclude(array('vendor'))
|
||||||
|
)
|
||||||
|
;
|
||||||
+1
-2
@@ -1,3 +1,2 @@
|
|||||||
tools:
|
tools:
|
||||||
external_code_coverage:
|
external_code_coverage: false
|
||||||
timeout: 600
|
|
||||||
|
|||||||
+34
-13
@@ -1,34 +1,55 @@
|
|||||||
language: php
|
language: php
|
||||||
|
|
||||||
php:
|
php:
|
||||||
- 5.3.3
|
|
||||||
- 5.3
|
|
||||||
- 5.4
|
|
||||||
- 5.5
|
- 5.5
|
||||||
- 5.6
|
- 5.6
|
||||||
|
- 7.0
|
||||||
|
- 7.1
|
||||||
|
- 7.2
|
||||||
|
- 7.3
|
||||||
- nightly
|
- nightly
|
||||||
- hhvm
|
|
||||||
|
|
||||||
# run build against nightly but allow them to fail
|
|
||||||
matrix:
|
matrix:
|
||||||
|
include:
|
||||||
|
- php: 5.3.3
|
||||||
|
dist: precise
|
||||||
|
sudo: required
|
||||||
|
- php: 5.3
|
||||||
|
dist: precise
|
||||||
|
sudo: required
|
||||||
|
- php: 5.4
|
||||||
|
dist: precise
|
||||||
|
sudo: required
|
||||||
|
- php: 7.0
|
||||||
|
env: CS_FIXER=run
|
||||||
fast_finish: true
|
fast_finish: true
|
||||||
allow_failures:
|
allow_failures:
|
||||||
|
- php: 7.3
|
||||||
- php: nightly
|
- php: nightly
|
||||||
- php: hhvm
|
|
||||||
|
|
||||||
# faster builds on new travis setup not using sudo
|
# cache vendor dirs
|
||||||
sudo: false
|
cache:
|
||||||
|
directories:
|
||||||
|
- vendor
|
||||||
|
- $HOME/.composer/cache
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
- if [ -n "$GH_TOKEN" ]; then composer config github-oauth.github.com ${GH_TOKEN}; fi;
|
||||||
|
# disable TLS for composer because openssl is disabled for PHP 5.3.3 on travis
|
||||||
|
# see: https://blog.travis-ci.com/upcoming_ubuntu_11_10_migration/
|
||||||
|
- if [[ $TRAVIS_PHP_VERSION = 5.3.3 ]]; then composer config -g -- disable-tls true; fi;
|
||||||
|
- if [[ $TRAVIS_PHP_VERSION = 5.3.3 ]]; then composer config -g -- secure-http false; fi;
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- composer self-update
|
- composer self-update
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
- composer install --prefer-dist --no-interaction
|
- composer install -o --prefer-dist --no-interaction
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- phpunit --coverage-clover=coverage.clover
|
- mkdir -p build/logs
|
||||||
|
- 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:
|
after_script:
|
||||||
- |
|
- php vendor/bin/coveralls -v
|
||||||
wget https://scrutinizer-ci.com/ocular.phar
|
|
||||||
php ocular.phar code-coverage:upload --format=php-clover coverage.clover
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Readability
|
# Readability
|
||||||
|
|
||||||
[](https://travis-ci.org/j0k3r/php-readability)
|
[](https://travis-ci.org/j0k3r/php-readability)
|
||||||
[](https://scrutinizer-ci.com/g/j0k3r/php-readability/?branch=master)
|
[](https://coveralls.io/github/j0k3r/php-readability/?branch=master)
|
||||||
|
|
||||||
This is an extract of the Readability class from this [full-text-rss](https://github.com/Dither/full-text-rss) fork. It can be defined as a better version of the original [php-readability](https://bitbucket.org/fivefilters/php-readability/overview).
|
This is an extract of the Readability class from this [full-text-rss](https://github.com/Dither/full-text-rss) fork. It can be defined as a better version of the original [php-readability](https://bitbucket.org/fivefilters/php-readability/overview).
|
||||||
|
|
||||||
@@ -17,9 +17,9 @@ The default php-readability lib is really old and needs to be improved. I found
|
|||||||
|
|
||||||
## Requirements
|
## 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
|
## Usage
|
||||||
|
|
||||||
@@ -45,3 +45,20 @@ if ($result) {
|
|||||||
echo 'Looks like we couldn\'t find the content. :(';
|
echo 'Looks like we couldn\'t find the content. :(';
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If you want to debug it, or check what's going on, you can inject a logger (which must follow `Psr\Log\LoggerInterface`, Monolog for example):
|
||||||
|
|
||||||
|
```php
|
||||||
|
use Readability\Readability;
|
||||||
|
use Monolog\Logger;
|
||||||
|
use Monolog\Handler\StreamHandler;
|
||||||
|
|
||||||
|
$url = 'http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/729-thatcher.html';
|
||||||
|
$html = file_get_contents($url);
|
||||||
|
|
||||||
|
$logger = new Logger('readability');
|
||||||
|
$logger->pushHandler(new StreamHandler('path/to/your.log', Logger::DEBUG));
|
||||||
|
|
||||||
|
$readability = new Readability($html, $url);
|
||||||
|
$readability->setLogger($logger);
|
||||||
|
```
|
||||||
|
|||||||
+13
-1
@@ -24,7 +24,19 @@
|
|||||||
"role": "Developer (original JS version)"
|
"role": "Developer (original JS version)"
|
||||||
}],
|
}],
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=5.3.3"
|
"php": ">=5.3.3",
|
||||||
|
"ext-mbstring": "*",
|
||||||
|
"psr/log": "^1.0",
|
||||||
|
"electrolinux/php-html5lib": "^0.1.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"satooshi/php-coveralls": "~0.6",
|
||||||
|
"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": {
|
"autoload": {
|
||||||
"psr-4": { "Readability\\": "src/" }
|
"psr-4": { "Readability\\": "src/" }
|
||||||
|
|||||||
+2
-2
@@ -26,7 +26,7 @@
|
|||||||
</whitelist>
|
</whitelist>
|
||||||
</filter>
|
</filter>
|
||||||
|
|
||||||
<logging>
|
<!-- <logging>
|
||||||
<log type="coverage-html" target="coverage" title="Readability" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70"/>
|
<log type="coverage-html" target="coverage" title="Readability" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70"/>
|
||||||
</logging>
|
</logging> -->
|
||||||
</phpunit>
|
</phpunit>
|
||||||
|
|||||||
+25
-15
@@ -45,18 +45,31 @@ class JSLikeHTMLElement extends \DOMElement
|
|||||||
*/
|
*/
|
||||||
public function __set($name, $value)
|
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
|
// first, empty the element
|
||||||
for ($x = $this->childNodes->length - 1; $x >= 0; --$x) {
|
for ($x = $this->childNodes->length - 1; $x >= 0; --$x) {
|
||||||
$this->removeChild($this->childNodes->item($x));
|
$this->removeChild($this->childNodes->item($x));
|
||||||
}
|
}
|
||||||
|
|
||||||
// $value holds our new inner HTML
|
// $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();
|
$f = $this->ownerDocument->createDocumentFragment();
|
||||||
|
|
||||||
// appendXML() expects well-formed markup (XHTML)
|
// appendXML() expects well-formed markup (XHTML)
|
||||||
$result = @$f->appendXML($value); // @ to suppress PHP warnings
|
$result = $f->appendXML($value);
|
||||||
if ($result) {
|
if ($result) {
|
||||||
if ($f->hasChildNodes()) {
|
if ($f->hasChildNodes()) {
|
||||||
$this->appendChild($f);
|
$this->appendChild($f);
|
||||||
@@ -71,24 +84,20 @@ class JSLikeHTMLElement extends \DOMElement
|
|||||||
// We use it (and suppress the warning) because an HTML fragment will
|
// 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.
|
// 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.
|
// 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) {
|
if ($result) {
|
||||||
$import = $f->getElementsByTagName('htmlfragment')->item(0);
|
$import = $f->getElementsByTagName('htmlfragment')->item(0);
|
||||||
|
|
||||||
foreach ($import->childNodes as $child) {
|
foreach ($import->childNodes as $child) {
|
||||||
$importedNode = $this->ownerDocument->importNode($child, true);
|
$importedNode = $this->ownerDocument->importNode($child, true);
|
||||||
$this->appendChild($importedNode);
|
$this->appendChild($importedNode);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
// oh well, we tried, we really did. :(
|
|
||||||
// this element is now empty
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else {
|
libxml_clear_errors();
|
||||||
$trace = debug_backtrace();
|
libxml_use_internal_errors($previousError);
|
||||||
trigger_error('Undefined property via __set(): '.$name.' in '.$trace[0]['file'].' on line '.$trace[0]['line'], E_USER_NOTICE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -100,8 +109,9 @@ class JSLikeHTMLElement extends \DOMElement
|
|||||||
*/
|
*/
|
||||||
public function __get($name)
|
public function __get($name)
|
||||||
{
|
{
|
||||||
if ($name == 'innerHTML') {
|
if ($name === 'innerHTML') {
|
||||||
$inner = '';
|
$inner = '';
|
||||||
|
|
||||||
foreach ($this->childNodes as $child) {
|
foreach ($this->childNodes as $child) {
|
||||||
$inner .= $this->ownerDocument->saveXML($child);
|
$inner .= $this->ownerDocument->saveXML($child);
|
||||||
}
|
}
|
||||||
@@ -110,13 +120,13 @@ class JSLikeHTMLElement extends \DOMElement
|
|||||||
}
|
}
|
||||||
|
|
||||||
$trace = debug_backtrace();
|
$trace = debug_backtrace();
|
||||||
trigger_error('Undefined property via __get(): '.$name.' in '.$trace[0]['file'].' on line '.$trace[0]['line'], E_USER_NOTICE);
|
trigger_error('Undefined property via __get(): ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'], E_USER_NOTICE);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function __toString()
|
public function __toString()
|
||||||
{
|
{
|
||||||
return '['.$this->tagName.']';
|
return '[' . $this->tagName . ']';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+311
-239
File diff suppressed because it is too large
Load Diff
+180
-66
@@ -2,76 +2,83 @@
|
|||||||
|
|
||||||
namespace Tests\Readability;
|
namespace Tests\Readability;
|
||||||
|
|
||||||
|
use Monolog\Handler\TestHandler;
|
||||||
|
use Monolog\Logger;
|
||||||
use Readability\Readability;
|
use Readability\Readability;
|
||||||
|
|
||||||
class ReadabilityTested extends Readability
|
class ReadabilityTest extends \PHPUnit\Framework\TestCase
|
||||||
{
|
{
|
||||||
public function getDebugText()
|
public $logHandler;
|
||||||
|
public $logger;
|
||||||
|
|
||||||
|
private function getReadability($html, $url = null, $parser = 'libxml', $useTidy = true)
|
||||||
{
|
{
|
||||||
return $this->debugText;
|
$readability = new Readability($html, $url, $parser, $useTidy);
|
||||||
|
|
||||||
|
$this->logHandler = new TestHandler();
|
||||||
|
$this->logger = new Logger('test', array($this->logHandler));
|
||||||
|
$readability->setLogger($this->logger);
|
||||||
|
|
||||||
|
return $readability;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getDomainRegexp()
|
|
||||||
{
|
|
||||||
return $this->domainRegExp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ReadabilityTest extends \PHPUnit_Framework_TestCase
|
|
||||||
{
|
|
||||||
/**
|
/**
|
||||||
* @requires extension tidy
|
* @requires extension tidy
|
||||||
*/
|
*/
|
||||||
public function testConstructDefault()
|
public function testConstructDefault()
|
||||||
{
|
{
|
||||||
$readability = new ReadabilityTested('');
|
$readability = $this->getReadability('');
|
||||||
|
|
||||||
$this->assertNull($readability->url);
|
$this->assertNull($readability->url);
|
||||||
$this->assertContains('Parsing URL', $readability->getDebugText());
|
|
||||||
$this->assertContains('Tidying document', $readability->getDebugText());
|
|
||||||
$this->assertNull($readability->getDomainRegexp());
|
|
||||||
$this->assertInstanceOf('DomDocument', $readability->dom);
|
$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
|
* @requires extension tidy
|
||||||
*/
|
*/
|
||||||
public function testConstructSimple()
|
public function testConstructSimple()
|
||||||
{
|
{
|
||||||
$readability = new ReadabilityTested('<html/>', 'http://0.0.0.0');
|
$readability = $this->getReadability('<html/>', 'http://0.0.0.0');
|
||||||
|
|
||||||
$this->assertEquals('http://0.0.0.0', $readability->url);
|
$this->assertEquals('http://0.0.0.0', $readability->url);
|
||||||
$this->assertContains('Parsing URL', $readability->getDebugText());
|
|
||||||
$this->assertContains('Tidying document', $readability->getDebugText());
|
|
||||||
$this->assertEquals('/0\.0\.0\.0/', $readability->getDomainRegexp());
|
|
||||||
$this->assertInstanceOf('DomDocument', $readability->dom);
|
$this->assertInstanceOf('DomDocument', $readability->dom);
|
||||||
|
$this->assertEquals('<html/>', $readability->original_html);
|
||||||
|
$this->assertTrue($readability->tidied);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testConstructDefaultWithoutTidy()
|
public function testConstructDefaultWithoutTidy()
|
||||||
{
|
{
|
||||||
$readability = new ReadabilityTested('', null, 'libxml', false);
|
$readability = $this->getReadability('', null, 'libxml', false);
|
||||||
|
|
||||||
$this->assertNull($readability->url);
|
$this->assertNull($readability->url);
|
||||||
$this->assertContains('Parsing URL', $readability->getDebugText());
|
$this->assertEquals('', $readability->original_html);
|
||||||
$this->assertNotContains('Tidying document', $readability->getDebugText());
|
$this->assertFalse($readability->tidied);
|
||||||
$this->assertNull($readability->getDomainRegexp());
|
|
||||||
$this->assertInstanceOf('DomDocument', $readability->dom);
|
$this->assertInstanceOf('DomDocument', $readability->dom);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testConstructSimpleWithoutTidy()
|
public function testConstructSimpleWithoutTidy()
|
||||||
{
|
{
|
||||||
$readability = new ReadabilityTested('<html/>', 'http://0.0.0.0', 'libxml', false);
|
$readability = $this->getReadability('<html/>', 'http://0.0.0.0', 'libxml', false);
|
||||||
|
|
||||||
$this->assertEquals('http://0.0.0.0', $readability->url);
|
$this->assertEquals('http://0.0.0.0', $readability->url);
|
||||||
$this->assertContains('Parsing URL', $readability->getDebugText());
|
|
||||||
$this->assertNotContains('Tidying document', $readability->getDebugText());
|
|
||||||
$this->assertEquals('/0\.0\.0\.0/', $readability->getDomainRegexp());
|
|
||||||
$this->assertInstanceOf('DomDocument', $readability->dom);
|
$this->assertInstanceOf('DomDocument', $readability->dom);
|
||||||
|
$this->assertEquals('<html/>', $readability->original_html);
|
||||||
|
$this->assertFalse($readability->tidied);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testInitNoContent()
|
public function testInitNoContent()
|
||||||
{
|
{
|
||||||
$readability = new ReadabilityTested('<html/>', 'http://0.0.0.0');
|
$readability = $this->getReadability('<html/>', 'http://0.0.0.0');
|
||||||
$res = $readability->init();
|
$res = $readability->init();
|
||||||
|
|
||||||
$this->assertFalse($res);
|
$this->assertFalse($res);
|
||||||
@@ -83,7 +90,7 @@ class ReadabilityTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
public function testInitP()
|
public function testInitP()
|
||||||
{
|
{
|
||||||
$readability = new ReadabilityTested(str_repeat('<p>This is the awesome content :)</p>', 7), 'http://0.0.0.0');
|
$readability = $this->getReadability(str_repeat('<p>This is the awesome content :)</p>', 7), 'http://0.0.0.0');
|
||||||
$res = $readability->init();
|
$res = $readability->init();
|
||||||
|
|
||||||
$this->assertTrue($res);
|
$this->assertTrue($res);
|
||||||
@@ -96,7 +103,7 @@ class ReadabilityTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
public function testInitDivP()
|
public function testInitDivP()
|
||||||
{
|
{
|
||||||
$readability = new ReadabilityTested('<div>'.str_repeat('<p>This is the awesome content :)</p>', 7).'</div>', 'http://0.0.0.0');
|
$readability = $this->getReadability('<div>' . str_repeat('<p>This is the awesome content :)</p>', 7) . '</div>', 'http://0.0.0.0');
|
||||||
$res = $readability->init();
|
$res = $readability->init();
|
||||||
|
|
||||||
$this->assertTrue($res);
|
$this->assertTrue($res);
|
||||||
@@ -109,7 +116,7 @@ class ReadabilityTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
public function testInitDiv()
|
public function testInitDiv()
|
||||||
{
|
{
|
||||||
$readability = new ReadabilityTested('<div>'.str_repeat('This is the awesome content :)', 7).'</div>', 'http://0.0.0.0');
|
$readability = $this->getReadability('<div>' . str_repeat('This is the awesome content :)', 7) . '</div>', 'http://0.0.0.0');
|
||||||
$readability->debug = true;
|
$readability->debug = true;
|
||||||
$res = $readability->init();
|
$res = $readability->init();
|
||||||
|
|
||||||
@@ -123,7 +130,7 @@ class ReadabilityTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
public function testWithFootnotes()
|
public function testWithFootnotes()
|
||||||
{
|
{
|
||||||
$readability = new ReadabilityTested('<div>'.str_repeat('<p>This is an awesome text with some links, here there are: <a href="http://0.0.0.0/test.html">the awesome</a></p>', 7).'</div>', 'http://0.0.0.0');
|
$readability = $this->getReadability('<div>' . str_repeat('<p>This is an awesome text with some links, here there are: <a href="http://0.0.0.0/test.html">the awesome</a></p>', 7) . '</div>', 'http://0.0.0.0');
|
||||||
$readability->debug = true;
|
$readability->debug = true;
|
||||||
$readability->convertLinksToFootnotes = true;
|
$readability->convertLinksToFootnotes = true;
|
||||||
$res = $readability->init();
|
$res = $readability->init();
|
||||||
@@ -140,7 +147,7 @@ class ReadabilityTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
public function testStandardClean()
|
public function testStandardClean()
|
||||||
{
|
{
|
||||||
$readability = new ReadabilityTested('<div><h2>Title</h2>'.str_repeat('<p>This is an awesome text with some links, here there are: <a href="http://0.0.0.0/test.html">the awesome</a></p>', 7).'<a href="#nofollow" rel="nofollow">will NOT be removed</a></div>', 'http://0.0.0.0');
|
$readability = $this->getReadability('<div><h2>Title</h2>' . str_repeat('<p>This is an awesome text with some links, here there are: <a href="http://0.0.0.0/test.html">the awesome</a></p>', 7) . '<a href="#nofollow" rel="nofollow">will NOT be removed</a></div>', 'http://0.0.0.0');
|
||||||
$readability->debug = true;
|
$readability->debug = true;
|
||||||
$readability->lightClean = false;
|
$readability->lightClean = false;
|
||||||
$res = $readability->init();
|
$res = $readability->init();
|
||||||
@@ -157,7 +164,7 @@ class ReadabilityTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
public function testWithIframe()
|
public function testWithIframe()
|
||||||
{
|
{
|
||||||
$readability = new ReadabilityTested('<div><h2>Title</h2>'.str_repeat('<p>This is an awesome text with some links, here there are: <a href="http://0.0.0.0/test.html">the awesome</a></p>', 7).'<p>This is an awesome text with some links, here there are <iframe src="http://youtube.com/test" href="#nofollow" rel="nofollow"></iframe><iframe>http://soundcloud.com/test</iframe></p></div>', 'http://0.0.0.0');
|
$readability = $this->getReadability('<div><h2>Title</h2>' . str_repeat('<p>This is an awesome text with some links, here there are: <a href="http://0.0.0.0/test.html">the awesome</a></p>', 7) . '<p>This is an awesome text with some links, here there are <iframe src="http://youtube.com/test" href="#nofollow" rel="nofollow"></iframe><iframe>http://soundcloud.com/test</iframe></p></div>', 'http://0.0.0.0');
|
||||||
$readability->debug = true;
|
$readability->debug = true;
|
||||||
$res = $readability->init();
|
$res = $readability->init();
|
||||||
|
|
||||||
@@ -172,7 +179,7 @@ class ReadabilityTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
public function testWithArticle()
|
public function testWithArticle()
|
||||||
{
|
{
|
||||||
$readability = new ReadabilityTested('<article><p>'.str_repeat('This is an awesome text with some links, here there are: the awesome', 20).'</p><p>This is an awesome text with some links, here there are <iframe src="http://youtube.com/test" href="#nofollow" rel="nofollow"></iframe></p></article>', 'http://0.0.0.0');
|
$readability = $this->getReadability('<article><p>' . str_repeat('This is an awesome text with some links, here there are: the awesome', 20) . '</p><p>This is an awesome text with some links, here there are <iframe src="http://youtube.com/test" href="#nofollow" rel="nofollow"></iframe></p></article>', 'http://0.0.0.0');
|
||||||
$readability->debug = true;
|
$readability->debug = true;
|
||||||
$res = $readability->init();
|
$res = $readability->init();
|
||||||
|
|
||||||
@@ -187,7 +194,22 @@ class ReadabilityTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
public function testWithAside()
|
public function testWithAside()
|
||||||
{
|
{
|
||||||
$readability = new ReadabilityTested('<article>'.str_repeat('<p>This is an awesome text with some links, here there are: <a href="http://0.0.0.0/test.html">the awesome</a></p>', 7).'<footer><aside>'.str_repeat('<p>This is an awesome text with some links, here there are</p>', 8).'</aside></footer></article>', 'http://0.0.0.0');
|
$readability = $this->getReadability('<article>' . str_repeat('<p>This is an awesome text with some links, here there are: <a href="http://0.0.0.0/test.html">the awesome</a></p>', 7) . '<footer><aside>' . str_repeat('<p>This is an awesome text with some links, here there are</p>', 8) . '</aside></footer></article>', 'http://0.0.0.0');
|
||||||
|
$readability->debug = true;
|
||||||
|
$res = $readability->init();
|
||||||
|
|
||||||
|
$this->assertTrue($res);
|
||||||
|
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getContent());
|
||||||
|
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getTitle());
|
||||||
|
$this->assertEmpty($readability->getTitle()->innerHTML);
|
||||||
|
$this->assertContains('This is an awesome text with some links, here there are', $readability->getContent()->innerHTML);
|
||||||
|
$this->assertNotContains('<aside>', $readability->getContent()->innerHTML);
|
||||||
|
$this->assertContains('<footer readability="4"/>', $readability->getContent()->innerHTML);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testWithClasses()
|
||||||
|
{
|
||||||
|
$readability = $this->getReadability('<article>' . str_repeat('<p>This is an awesome text with some links, here there are: <a href="http://0.0.0.0/test.html">the awesome</a></p>', 7) . '<div style="display:none">' . str_repeat('<p class="clock">This text should be removed</p>', 10) . '</div></article>', 'http://0.0.0.0');
|
||||||
$readability->debug = true;
|
$readability->debug = true;
|
||||||
$res = $readability->init();
|
$res = $readability->init();
|
||||||
|
|
||||||
@@ -197,14 +219,14 @@ class ReadabilityTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->assertContains('alt="article"', $readability->getContent()->innerHTML);
|
$this->assertContains('alt="article"', $readability->getContent()->innerHTML);
|
||||||
$this->assertEmpty($readability->getTitle()->innerHTML);
|
$this->assertEmpty($readability->getTitle()->innerHTML);
|
||||||
$this->assertContains('This is an awesome text with some links, here there are', $readability->getContent()->innerHTML);
|
$this->assertContains('This is an awesome text with some links, here there are', $readability->getContent()->innerHTML);
|
||||||
$this->assertNotContains('<aside>', $readability->getContent()->innerHTML);
|
$this->assertNotContains('This text should be removed', $readability->getContent()->innerHTML);
|
||||||
$this->assertContains('<footer/>', $readability->getContent()->innerHTML);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testWithClasses()
|
public function testWithClassesWithoutLightClean()
|
||||||
{
|
{
|
||||||
$readability = new ReadabilityTested('<article>'.str_repeat('<p>This is an awesome text with some links, here there are: <a href="http://0.0.0.0/test.html">the awesome</a></p>', 7).'<div style="display:none">'.str_repeat('<p class="clock">This text should be removed</p>', 10).'</div></article>', 'http://0.0.0.0');
|
$readability = $this->getReadability('<article>' . str_repeat('<p>This is an awesome text with some links, here there are: <a href="http://0.0.0.0/test.html">the awesome</a></p>', 7) . '<div style="display:none">' . str_repeat('<p class="clock">This text should be removed</p>', 10) . '</div></article>', 'http://0.0.0.0');
|
||||||
$readability->debug = true;
|
$readability->debug = true;
|
||||||
|
$readability->lightClean = false;
|
||||||
$res = $readability->init();
|
$res = $readability->init();
|
||||||
|
|
||||||
$this->assertTrue($res);
|
$this->assertTrue($res);
|
||||||
@@ -218,28 +240,26 @@ class ReadabilityTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
public function testWithTd()
|
public function testWithTd()
|
||||||
{
|
{
|
||||||
$readability = new ReadabilityTested('<table><tr>'.str_repeat('<td><p>This is an awesome text with some links, here there are the awesome</td>', 7).'</tr></table>', 'http://0.0.0.0');
|
$readability = $this->getReadability('<table><tr>' . str_repeat('<td><p>This is an awesome text with some links, here there are the awesome</td>', 7) . '</tr></table>', 'http://0.0.0.0');
|
||||||
$readability->debug = true;
|
$readability->debug = true;
|
||||||
$res = $readability->init();
|
$res = $readability->init();
|
||||||
|
|
||||||
$this->assertTrue($res);
|
$this->assertTrue($res);
|
||||||
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getContent());
|
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getContent());
|
||||||
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getTitle());
|
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getTitle());
|
||||||
$this->assertContains('alt="tr"', $readability->getContent()->innerHTML);
|
|
||||||
$this->assertEmpty($readability->getTitle()->innerHTML);
|
$this->assertEmpty($readability->getTitle()->innerHTML);
|
||||||
$this->assertContains('This is an awesome text with some links, here there are', $readability->getContent()->innerHTML);
|
$this->assertContains('This is an awesome text with some links, here there are', $readability->getContent()->innerHTML);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testWithSameClasses()
|
public function testWithSameClasses()
|
||||||
{
|
{
|
||||||
$readability = new ReadabilityTested('<article class="awesomecontent">'.str_repeat('<p>This is an awesome text with some links, here there are the awesome</p>', 7).'<div class="awesomecontent">This text is also an awesome text and you should know that !</div></article>', 'http://0.0.0.0');
|
$readability = $this->getReadability('<article class="awesomecontent">' . str_repeat('<p>This is an awesome text with some links, here there are the awesome</p>', 7) . '<div class="awesomecontent">This text is also an awesome text and you should know that !</div></article>', 'http://0.0.0.0');
|
||||||
$readability->debug = true;
|
$readability->debug = true;
|
||||||
$res = $readability->init();
|
$res = $readability->init();
|
||||||
|
|
||||||
$this->assertTrue($res);
|
$this->assertTrue($res);
|
||||||
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getContent());
|
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getContent());
|
||||||
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getTitle());
|
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getTitle());
|
||||||
$this->assertContains('alt="article"', $readability->getContent()->innerHTML);
|
|
||||||
$this->assertEmpty($readability->getTitle()->innerHTML);
|
$this->assertEmpty($readability->getTitle()->innerHTML);
|
||||||
$this->assertContains('This is an awesome text with some links, here there are', $readability->getContent()->innerHTML);
|
$this->assertContains('This is an awesome text with some links, here there are', $readability->getContent()->innerHTML);
|
||||||
$this->assertContains('This text is also an awesome text and you should know that', $readability->getContent()->innerHTML);
|
$this->assertContains('This text is also an awesome text and you should know that', $readability->getContent()->innerHTML);
|
||||||
@@ -247,14 +267,13 @@ class ReadabilityTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
public function testWithScript()
|
public function testWithScript()
|
||||||
{
|
{
|
||||||
$readability = new ReadabilityTested('<article class="awesomecontent">'.str_repeat('<p>This is an awesome text with some links, here there are the awesome</p>', 7).'<p><script>This text is also an awesome text and you should know that !</script></p></article>', 'http://0.0.0.0');
|
$readability = $this->getReadability('<article class="awesomecontent">' . str_repeat('<p>This is an awesome text with some links, here there are the awesome</p>', 7) . '<p><script>This text is also an awesome text and you should know that !</script></p></article>', 'http://0.0.0.0');
|
||||||
$readability->debug = true;
|
$readability->debug = true;
|
||||||
$res = $readability->init();
|
$res = $readability->init();
|
||||||
|
|
||||||
$this->assertTrue($res);
|
$this->assertTrue($res);
|
||||||
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getContent());
|
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getContent());
|
||||||
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getTitle());
|
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getTitle());
|
||||||
$this->assertContains('alt="article"', $readability->getContent()->innerHTML);
|
|
||||||
$this->assertEmpty($readability->getTitle()->innerHTML);
|
$this->assertEmpty($readability->getTitle()->innerHTML);
|
||||||
$this->assertContains('This is an awesome text with some links, here there are', $readability->getContent()->innerHTML);
|
$this->assertContains('This is an awesome text with some links, here there are', $readability->getContent()->innerHTML);
|
||||||
$this->assertNotContains('This text is also an awesome text and you should know that', $readability->getContent()->innerHTML);
|
$this->assertNotContains('This text is also an awesome text and you should know that', $readability->getContent()->innerHTML);
|
||||||
@@ -262,14 +281,13 @@ class ReadabilityTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
public function testTitle()
|
public function testTitle()
|
||||||
{
|
{
|
||||||
$readability = new ReadabilityTested('<title>this is my title</title><article class="awesomecontent">'.str_repeat('<p>This is an awesome text with some links, here there are the awesome</p>', 7).'<p></p></article>', 'http://0.0.0.0');
|
$readability = $this->getReadability('<title>this is my title</title><article class="awesomecontent">' . str_repeat('<p>This is an awesome text with some links, here there are the awesome</p>', 7) . '<p></p></article>', 'http://0.0.0.0');
|
||||||
$readability->debug = true;
|
$readability->debug = true;
|
||||||
$res = $readability->init();
|
$res = $readability->init();
|
||||||
|
|
||||||
$this->assertTrue($res);
|
$this->assertTrue($res);
|
||||||
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getContent());
|
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getContent());
|
||||||
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getTitle());
|
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getTitle());
|
||||||
$this->assertContains('alt="article"', $readability->getContent()->innerHTML);
|
|
||||||
$this->assertEquals('this is my title', $readability->getTitle()->innerHTML);
|
$this->assertEquals('this is my title', $readability->getTitle()->innerHTML);
|
||||||
$this->assertContains('This is an awesome text with some links, here there are', $readability->getContent()->innerHTML);
|
$this->assertContains('This is an awesome text with some links, here there are', $readability->getContent()->innerHTML);
|
||||||
$this->assertNotContains('This text is also an awesome text and you should know that', $readability->getContent()->innerHTML);
|
$this->assertNotContains('This text is also an awesome text and you should know that', $readability->getContent()->innerHTML);
|
||||||
@@ -277,14 +295,13 @@ class ReadabilityTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
public function testTitleWithDash()
|
public function testTitleWithDash()
|
||||||
{
|
{
|
||||||
$readability = new ReadabilityTested('<title> title2 - title3 </title><article class="awesomecontent">'.str_repeat('<p>This is an awesome text with some links, here there are the awesome</p>', 7).'<p></p></article>', 'http://0.0.0.0');
|
$readability = $this->getReadability('<title> title2 - title3 </title><article class="awesomecontent">' . str_repeat('<p>This is an awesome text with some links, here there are the awesome</p>', 7) . '<p></p></article>', 'http://0.0.0.0');
|
||||||
$readability->debug = true;
|
$readability->debug = true;
|
||||||
$res = $readability->init();
|
$res = $readability->init();
|
||||||
|
|
||||||
$this->assertTrue($res);
|
$this->assertTrue($res);
|
||||||
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getContent());
|
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getContent());
|
||||||
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getTitle());
|
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getTitle());
|
||||||
$this->assertContains('alt="article"', $readability->getContent()->innerHTML);
|
|
||||||
$this->assertEquals('title2 - title3', $readability->getTitle()->innerHTML);
|
$this->assertEquals('title2 - title3', $readability->getTitle()->innerHTML);
|
||||||
$this->assertContains('This is an awesome text with some links, here there are', $readability->getContent()->innerHTML);
|
$this->assertContains('This is an awesome text with some links, here there are', $readability->getContent()->innerHTML);
|
||||||
$this->assertNotContains('This text is also an awesome text and you should know that', $readability->getContent()->innerHTML);
|
$this->assertNotContains('This text is also an awesome text and you should know that', $readability->getContent()->innerHTML);
|
||||||
@@ -292,14 +309,13 @@ class ReadabilityTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
public function testTitleWithDoubleDot()
|
public function testTitleWithDoubleDot()
|
||||||
{
|
{
|
||||||
$readability = new ReadabilityTested('<title> title2 : title3 </title><article class="awesomecontent">'.str_repeat('<p>This is an awesome text with some links, here there are the awesome</p>', 7).'<p></p></article>', 'http://0.0.0.0');
|
$readability = $this->getReadability('<title> title2 : title3 </title><article class="awesomecontent">' . str_repeat('<p>This is an awesome text with some links, here there are the awesome</p>', 7) . '<p></p></article>', 'http://0.0.0.0');
|
||||||
$readability->debug = true;
|
$readability->debug = true;
|
||||||
$res = $readability->init();
|
$res = $readability->init();
|
||||||
|
|
||||||
$this->assertTrue($res);
|
$this->assertTrue($res);
|
||||||
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getContent());
|
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getContent());
|
||||||
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getTitle());
|
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getTitle());
|
||||||
$this->assertContains('alt="article"', $readability->getContent()->innerHTML);
|
|
||||||
$this->assertEquals('title2 : title3', $readability->getTitle()->innerHTML);
|
$this->assertEquals('title2 : title3', $readability->getTitle()->innerHTML);
|
||||||
$this->assertContains('This is an awesome text with some links, here there are', $readability->getContent()->innerHTML);
|
$this->assertContains('This is an awesome text with some links, here there are', $readability->getContent()->innerHTML);
|
||||||
$this->assertNotContains('This text is also an awesome text and you should know that', $readability->getContent()->innerHTML);
|
$this->assertNotContains('This text is also an awesome text and you should know that', $readability->getContent()->innerHTML);
|
||||||
@@ -307,30 +323,18 @@ class ReadabilityTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
public function testTitleTooShortUseH1()
|
public function testTitleTooShortUseH1()
|
||||||
{
|
{
|
||||||
$readability = new ReadabilityTested('<title>too short</title><h1>this is my h1 title !</h1><article class="awesomecontent">'.str_repeat('<p>This is an awesome text with some links, here there are the awesome</p>', 7).'<p></p></article>', 'http://0.0.0.0');
|
$readability = $this->getReadability('<title>too short</title><h1>this is my h1 title !</h1><article class="awesomecontent">' . str_repeat('<p>This is an awesome text with some links, here there are the awesome</p>', 7) . '<p></p></article>', 'http://0.0.0.0');
|
||||||
$readability->debug = true;
|
$readability->debug = true;
|
||||||
$res = $readability->init();
|
$res = $readability->init();
|
||||||
|
|
||||||
$this->assertTrue($res);
|
$this->assertTrue($res);
|
||||||
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getContent());
|
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getContent());
|
||||||
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getTitle());
|
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getTitle());
|
||||||
$this->assertContains('alt="article"', $readability->getContent()->innerHTML);
|
|
||||||
$this->assertEquals('this is my h1 title !', $readability->getTitle()->innerHTML);
|
$this->assertEquals('this is my h1 title !', $readability->getTitle()->innerHTML);
|
||||||
$this->assertContains('This is an awesome text with some links, here there are', $readability->getContent()->innerHTML);
|
$this->assertContains('This is an awesome text with some links, here there are', $readability->getContent()->innerHTML);
|
||||||
$this->assertNotContains('This text is also an awesome text and you should know that', $readability->getContent()->innerHTML);
|
$this->assertNotContains('This text is also an awesome text and you should know that', $readability->getContent()->innerHTML);
|
||||||
}
|
}
|
||||||
|
|
||||||
// public function testConstructParser()
|
|
||||||
// {
|
|
||||||
// $readability = new ReadabilityTested('<html/>', 'http://0.0.0.0', 'html5lib');
|
|
||||||
|
|
||||||
// $this->assertEquals('http://0.0.0.0', $readability->url);
|
|
||||||
// $this->assertContains('Parsing URL', $readability->getDebugText());
|
|
||||||
// $this->assertContains('Tidying document', $readability->getDebugText());
|
|
||||||
// $this->assertEquals('/0\.0\.0\.0/', $readability->getDomainRegexp());
|
|
||||||
// $this->assertInstanceOf('DomDocument', $readability->dom);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// dummy function to be used to the next test
|
// dummy function to be used to the next test
|
||||||
public function error2Exception($code, $string, $file, $line, $context)
|
public function error2Exception($code, $string, $file, $line, $context)
|
||||||
{
|
{
|
||||||
@@ -368,7 +372,7 @@ class ReadabilityTest extends \PHPUnit_Framework_TestCase
|
|||||||
</body>
|
</body>
|
||||||
</html>';
|
</html>';
|
||||||
|
|
||||||
$readability = new ReadabilityTested($data, 'http://iosgames.ru/?p=22030');
|
$readability = $this->getReadability($data, 'http://iosgames.ru/?p=22030');
|
||||||
$readability->debug = true;
|
$readability->debug = true;
|
||||||
|
|
||||||
$res = $readability->init();
|
$res = $readability->init();
|
||||||
@@ -379,4 +383,114 @@ class ReadabilityTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->assertContains('<iframe src="https://www.youtube.com/embed/PUep6xNeKjA" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"> </iframe>', $readability->getContent()->innerHTML);
|
$this->assertContains('<iframe src="https://www.youtube.com/embed/PUep6xNeKjA" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"> </iframe>', $readability->getContent()->innerHTML);
|
||||||
$this->assertContains('3D Touch', $readability->getTitle()->innerHTML);
|
$this->assertContains('3D Touch', $readability->getTitle()->innerHTML);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This should generate an Exception "DOMElement::setAttribute(): ID post-60 already defined".
|
||||||
|
*/
|
||||||
|
public function testAppendIdAlreadyHere()
|
||||||
|
{
|
||||||
|
$data = '<!DOCTYPE html>
|
||||||
|
<html lang="fr">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1.0">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<header class="header sml-text-center med-text-left" role="banner">
|
||||||
|
<h1 class="no-margin"><a class="maintitle" href="https://0.0.0.0" title="Bloc-notes">Bloc-notes</a></h1>
|
||||||
|
<h2 class="h5 no-margin"></h2>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="nav" role="navigation">
|
||||||
|
<div class="responsive-menu">
|
||||||
|
<label for="menu">Menu</label>
|
||||||
|
<input type="checkbox" id="menu">
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<article class="article" role="article" id="post-60">
|
||||||
|
<section>
|
||||||
|
This is an awesome text with some links, here there are<br/>
|
||||||
|
This is an awesome text with some links, here there are<br/>
|
||||||
|
This is an awesome text with some links, here there are<br/>
|
||||||
|
This is an awesome text with some links, here there are<br/>
|
||||||
|
This is an awesome text with some links, here there are<br/>
|
||||||
|
This is an awesome text with some links, here there are<br/>
|
||||||
|
This is an awesome text with some links, here there are<br/>
|
||||||
|
This is an awesome text with some links, here there are<br/>
|
||||||
|
This is an awesome text with some links, here there are<br/>
|
||||||
|
This is an awesome text with some links, here there are<br/>
|
||||||
|
This is an awesome text with some links, here there are
|
||||||
|
</section>
|
||||||
|
<footer>
|
||||||
|
<small>
|
||||||
|
Classé dans : <a class="noactive" title="Services réseaux">Services réseaux</a>
|
||||||
|
</small>
|
||||||
|
</footer>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>';
|
||||||
|
|
||||||
|
$readability = $this->getReadability($data, 'http://0.0.0.0');
|
||||||
|
$readability->debug = true;
|
||||||
|
|
||||||
|
$res = $readability->init();
|
||||||
|
|
||||||
|
$this->assertTrue($res);
|
||||||
|
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getContent());
|
||||||
|
$this->assertInstanceOf('Readability\JSLikeHTMLElement', $readability->getTitle());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testPostFilters()
|
||||||
|
{
|
||||||
|
$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();
|
||||||
|
|
||||||
|
$this->assertTrue($res);
|
||||||
|
$this->assertContains('This the awesome content :)', $readability->getContent()->innerHTML);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testPreFilters()
|
||||||
|
{
|
||||||
|
$this->markTestSkipped('Won\'t work until loadHtml() is moved in init() instead of __construct()');
|
||||||
|
|
||||||
|
$readability = $this->getReadability('<div>' . str_repeat('<p>This <b>is</b> the awesome and WONDERFUL content :)</p>', 7) . '</div>', 'http://0.0.0.0');
|
||||||
|
$readability->addPreFilter('!<b[^>]*>(.*?)</b>!is', '');
|
||||||
|
|
||||||
|
$res = $readability->init();
|
||||||
|
|
||||||
|
$this->assertTrue($res);
|
||||||
|
$this->assertContains('This the awesome and WONDERFUL content :)', $readability->getContent()->innerHTML);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testChildNodeGoneNull()
|
||||||
|
{
|
||||||
|
// from http://www.ayyaantuu.net/ethiopia-targets-opposition-lawmakers/
|
||||||
|
$html = file_get_contents('tests/fixtures/childNodeGoesNull.html');
|
||||||
|
|
||||||
|
$readability = $this->getReadability($html, 'http://0.0.0.0');
|
||||||
|
$readability->debug = true;
|
||||||
|
$readability->convertLinksToFootnotes = true;
|
||||||
|
$res = $readability->init();
|
||||||
|
|
||||||
|
$this->assertTrue($res);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testKeepFootnotes()
|
||||||
|
{
|
||||||
|
// from https://www.schreibdichte.de/blog/feed-aggregator-und-spaeter-lesen-dienst-im-team
|
||||||
|
$html = file_get_contents('tests/fixtures/keepFootnotes.html');
|
||||||
|
|
||||||
|
$readability = $this->getReadability($html, 'http://0.0.0.0');
|
||||||
|
$readability->debug = true;
|
||||||
|
$res = $readability->init();
|
||||||
|
|
||||||
|
$this->assertTrue($res);
|
||||||
|
$this->assertContains('<sup id="fnref1:fnfeed_2"><a href="#fn:fnfeed_2" class="footnote-ref">2</a></sup>', $readability->getContent()->innerHTML);
|
||||||
|
$this->assertContains('<a href="#fnref1:fnfeed_2" rev="footnote"', $readability->getContent()->innerHTML);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+137
@@ -0,0 +1,137 @@
|
|||||||
|
<div id="main-sidebar-container">
|
||||||
|
|
||||||
|
<!-- #main Starts -->
|
||||||
|
<section id="main">
|
||||||
|
<?php if (function_exists ('adinserter')) echo adinserter (1); ?><article class="post-23842 post type-post status-publish format-standard hentry category-ethiopia">
|
||||||
|
<header>
|
||||||
|
<h1 class="title entry-title">Ethiopia targets opposition who met with European lawmakers</h1> </header>
|
||||||
|
<div class="post-meta"><span class="Small"><abbr class="date time published updated" title="2017-01-09T15:25:17-0500">January 9, 2017</abbr> <span class="Small">in</span> <span class="categories"><a href="http://www.ayyaantuu.net/category/horn-of-africa/ethiopia/" title="View all items in Ethiopia">Ethiopia</a></span> </div>
|
||||||
|
<section class="entry">
|
||||||
|
<div id="fb-root"></div>
|
||||||
|
<p><strong>Ethiopia targets opposition who met with European lawmakers</strong></p>
|
||||||
|
<p><span class="dateline"><img class="alignleft wp-image-22789 size-full" src="http://www.ayyaantuu.net/wp-content/uploads/2016/12/Ana-Gomes-Merera-Gudina.jpg" alt="Ethiopia targets opposition who met with European lawmakers" width="300" height="160" srcset="http://www.ayyaantuu.net/wp-content/uploads/2016/12/Ana-Gomes-Merera-Gudina.jpg 300w, http://www.ayyaantuu.net/wp-content/uploads/2016/12/Ana-Gomes-Merera-Gudina-200x107.jpg 200w" sizes="(max-width: 300px) 100vw, 300px" />ADDIS ABABA (<a href="http://www.foxnews.com/world/2017/01/09/ethiopia-targets-opposition-who-met-with-european-lawmakers.html">Fox News</a>) – </span>Ethiopia says it will not release a leading opposition figure detained under the country’s state of emergency after meeting with European lawmakers in Belgium.</p>
|
||||||
|
<!-- WP QUADS Content Ad Plugin v. 1.3.9 -->
|
||||||
|
<div class="quads-location quads-ad2" id="quads-ad2" style="float:left;margin:2px 2px 2px 0;">
|
||||||
|
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
|
||||||
|
<!-- Ad2016_12_14_3 -->
|
||||||
|
<ins class="adsbygoogle"
|
||||||
|
style="display:inline-block;width:336px;height:280px"
|
||||||
|
data-ad-client="ca-pub-6953193962442323"
|
||||||
|
data-ad-slot="4950645476"></ins>
|
||||||
|
<script>
|
||||||
|
(adsbygoogle = window.adsbygoogle || []).push({});
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>Prime Minister Hailemariam Desalegn told reporters on Monday that Merara Gudina of the Oromo Federalist Congress party instead will face justice.</p>
|
||||||
|
<p>The prime minister says “individuals in the European Parliament who are harboring anti-peace elements cannot save those who trespass the law of the country.”</p>
|
||||||
|
<p>Merara is one of 22,000 people the prime minister says were detained under the state of emergency declared in October after widespread anti-government protests.</p>
|
||||||
|
<p>Merara was arrested immediately after he returned from Belgium. He was accused of meeting with members of an armed Ethiopian opposition group in Brussels, an act banned under the emergency law.</p>
|
||||||
|
|
||||||
|
<div style="font-size:0px;height:0px;line-height:0px;margin:0;padding:0;clear:both"></div><aside class="mashsb-container mashsb-main "><div class="mashsb-box"><div class="mashsb-count mash-small" style="float:left;"><div class="counts mashsbcount">0</div><span class="mashsb-sharetext">SHARES</span></div><div class="mashsb-buttons"><a class="mashicon-facebook mash-small" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.ayyaantuu.net%2Fethiopia-targets-opposition-lawmakers%2F" target="_blank" rel="nofollow"><span class="icon"></span><span class="text">Share</span></a><a class="mashicon-twitter mash-small" href="https://twitter.com/intent/tweet?text=Ethiopia%20targets%20opposition%20who%20met%20with%20European%20lawmakers&url=http://www.ayyaantuu.net/?p=23842&via= ayyaantuu" target="_blank" rel="nofollow"><span class="icon"></span><span class="text">Tweet</span></a><div class="onoffswitch mash-small"></div><div class="secondary-shares" style="display:none;"><a class="mashicon-subscribe mash-small" href="#" target="_blank" rel="nofollow"><span class="icon"></span><span class="text">Subscribe</span></a><div class="onoffswitch2 mash-small" style="display:none;"></div></div></div>
|
||||||
|
</div>
|
||||||
|
<div style="clear:both;"></div><div class="mashsb-toggle-container"></div></aside>
|
||||||
|
<!-- Share buttons by mashshare.net - Version: 3.3.6--> </section><!-- /.entry -->
|
||||||
|
<div class="fix"></div>
|
||||||
|
<aside id="connect">
|
||||||
|
<h3>Subscribe</h3>
|
||||||
|
|
||||||
|
<div class="col-left">
|
||||||
|
<p>Subscribe to our e-mail newsletter to receive updates.</p>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="social">
|
||||||
|
<a href="http://www.ayyaantuu.net/feed/" class="subscribe" title="RSS"></a>
|
||||||
|
|
||||||
|
<a target="_blank" href="https://twitter.com/ayyaantuu" class="twitter" title="Twitter"></a>
|
||||||
|
|
||||||
|
<a target="_blank" href="https://www.facebook.com/ayyaantuu.oromiyaa" class="facebook" title="Facebook"></a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- col-left -->
|
||||||
|
|
||||||
|
<div class="related-posts col-right">
|
||||||
|
<h4>Related Posts:</h4>
|
||||||
|
<div class="woo-sc-related-posts">
|
||||||
|
<ul>
|
||||||
|
<li class="post-id-23812">
|
||||||
|
|
||||||
|
<a href="http://www.ayyaantuu.net/country-new-african-millionaire/" title="Africa Business: The life of TPLF millionaire in Oromia/Ethiopia?" class="related-title"><span>Africa Business: The life of TPLF millionaire in Oromia/Ethiopia?</span></a>
|
||||||
|
</li>
|
||||||
|
<li class="post-id-23794">
|
||||||
|
|
||||||
|
<a href="http://www.ayyaantuu.net/ethiopian-girl-band-funding-axed-uk/" title="Ethiopian girl band Yegna’s funding axed by UK – BBC News" class="related-title"><span>Ethiopian girl band Yegna’s funding axed by UK – BBC News</span></a>
|
||||||
|
</li>
|
||||||
|
<li class="post-id-23783">
|
||||||
|
|
||||||
|
<a href="http://www.ayyaantuu.net/infrastructure-led-chinese-approach/" title="Ethiopia’s political ripple a big test for infrastructure-led Chinese approach" class="related-title"><span>Ethiopia’s political ripple a big test for infrastructure-led Chinese approach</span></a>
|
||||||
|
</li>
|
||||||
|
<li class="post-id-23766">
|
||||||
|
|
||||||
|
<a href="http://www.ayyaantuu.net/defense-witness-testimonials/" title="Defense Witness Testimonials on Yonatan Tesfaye’s Terrorism Charges" class="related-title"><span>Defense Witness Testimonials on Yonatan Tesfaye’s Terrorism Charges</span></a>
|
||||||
|
</li>
|
||||||
|
<li class="post-id-23745">
|
||||||
|
|
||||||
|
<a href="http://www.ayyaantuu.net/foreign-government-internet-shutdowns-soared-2016/" title="Foreign government internet shutdowns soared in 2016" class="related-title"><span>Foreign government internet shutdowns soared in 2016</span></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div class="fix"></div><!--/.fix-->
|
||||||
|
</div><!--/.woo-sc-related-posts--> </div><!-- col-right -->
|
||||||
|
|
||||||
|
<div class="fix"></div>
|
||||||
|
</aside>
|
||||||
|
<div class="post-utility"></div>
|
||||||
|
</article><!-- /.post -->
|
||||||
|
<div class="post-entries">
|
||||||
|
<div class="nav-prev fl"><a href="http://www.ayyaantuu.net/many-bombs-united-states-dropped-2016/" rel="prev"><i class="fa fa-angle-left"></i> How Many Bombs the United States Dropped in 2016?</a></div>
|
||||||
|
<div class="nav-next fr"><a href="http://www.ayyaantuu.net/rockefeller-conspiracy-one-world-order/" rel="next">David Rockefeller Says Conspiracy About ‘One World Order’ Is True <i class="fa fa-angle-right"></i></a></div>
|
||||||
|
<div class="fix"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php if (function_exists ('adinserter')) echo adinserter (1); ?><div id="comments"> <h3 id="comments-title">One Response to <em>Ethiopia targets opposition who met with European lawmakers</em></h3>
|
||||||
|
<ol class="commentlist">
|
||||||
|
|
||||||
|
<li id="comment-30772" class="comment even thread-even depth-1">
|
||||||
|
|
||||||
|
<div id="li-comment-30772" class="comment-container">
|
||||||
|
|
||||||
|
<div class="avatar"></div>
|
||||||
|
|
||||||
|
<div class="comment-head">
|
||||||
|
|
||||||
|
<span class="name">Addis Zemen</span>
|
||||||
|
<span class="date">January 9, 2017 at 5:57 pm</span>
|
||||||
|
<span class="perma"><a href="http://www.ayyaantuu.net/ethiopia-targets-opposition-lawmakers/#comment-30772" title="Direct link to this comment">#</a></span>
|
||||||
|
<span class="edit"></span>
|
||||||
|
|
||||||
|
</div><!-- /.comment-head -->
|
||||||
|
|
||||||
|
<div class="comment-entry">
|
||||||
|
|
||||||
|
<p>10,000 people that were areested in Oromia got released. When the people were arrested it was under the assumption “Violence broke out during an Oromo religious festival, and in some instances foreigners seem to have been targeted. ”</p>
|
||||||
|
<p>But now many prosecutors agree Violence was not the case. The people at the Erecha celebration thought aliens invaded their country. They thought the foreigners were aliens from another planet.<br />
|
||||||
|
Close to a thousand threw themselves of a cliff just because they saw a helicopter flying near them. Many are paralized hundreds died. Now the injured are trying to blame the helicopter pilot for their injuries by saying the pilot caused their injuries by scaring them, flying like an alien abductor UFO would . After the prosecutor agreed it was an accident or suicide that caused the deaths of hundreds of people at the Erecha celebration, the suspected 10,000 prisoners got released. The prosecutors are blaming those that spoke with the European parliament for spreading false information about what really happened at the Erecha celebration.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="reply">
|
||||||
|
<a rel='nofollow' class='comment-reply-link' href='http://www.ayyaantuu.net/ethiopia-targets-opposition-lawmakers/?replytocom=30772#respond' onclick='return addComment.moveForm( "comment-30772", "30772", "respond", "23842" )' aria-label='Reply to Addis Zemen'>Reply</a> </div><!-- /.reply -->
|
||||||
|
|
||||||
|
</div><!-- /comment-entry -->
|
||||||
|
|
||||||
|
</div><!-- /.comment-container -->
|
||||||
|
|
||||||
|
</li><!-- #comment-## -->
|
||||||
|
</ol>
|
||||||
|
</div> <div id="respond" class="comment-respond">
|
||||||
|
<h3 id="reply-title" class="comment-reply-title">Leave a Reply <small><a rel="nofollow" id="cancel-comment-reply-link" href="/ethiopia-targets-opposition-lawmakers/#respond" style="display:none;">Click here to cancel reply.</a></small></h3> <form action="http://www.ayyaantuu.net/wp-comments-post.php" method="post" id="commentform" class="comment-form">
|
||||||
|
<p class="comment-form-comment"><label class="hide" for="comment">Comment</label> <textarea tabindex="4" id="comment" name="comment" cols="50" rows="10" maxlength="65525" aria-required="true" required="required"></textarea></p><p class="comment-form-author"><input id="author" name="author" type="text" class="txt" tabindex="1" value="" size="30" aria-required='true' /><label for="author">Name <span class="required">(required)</span></label> </p>
|
||||||
|
<p class="comment-form-email"><input id="email" name="email" type="text" class="txt" tabindex="2" value="" size="30" aria-required='true' /><label for="email">Email (will not be published) <span class="required">(required)</span></label> </p>
|
||||||
|
<p class="comment-form-url"><input id="url" name="url" type="text" class="txt" tabindex="3" value="" size="30" /><label for="url">Website</label></p>
|
||||||
|
<p class="form-submit"><input name="submit" type="submit" id="submit" class="submit" value="Submit Comment" /> <input type='hidden' name='comment_post_ID' value='23842' id='comment_post_ID' />
|
||||||
|
<input type='hidden' name='comment_parent' id='comment_parent' value='0' />
|
||||||
|
</p><p style="display: none;"><input type="hidden" id="akismet_comment_nonce" name="akismet_comment_nonce" value="39bacbf69e" /></p><p style="display: none;"><input type="hidden" id="ak_js" name="ak_js" value="66"/></p> </form>
|
||||||
|
</div><!-- #respond -->
|
||||||
|
|
||||||
|
</section><!-- /#main -->
|
||||||
Vendored
+54
@@ -0,0 +1,54 @@
|
|||||||
|
<article>
|
||||||
|
|
||||||
|
<h1>Feed-Aggregator und Später-Lesen-Dienst im Team</h1>
|
||||||
|
|
||||||
|
<figure>
|
||||||
|
<img src="https://www.schreibdichte.de/content/1-blog/20170505-feed-aggregator-und-spaeter-lesen-dienst-im-team/workflow.png" alt="Feed-Aggregator und Später-Lesen-Dienst im Team" >
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<time datetime="2017-05-05T18:40:00+00:00" >05.05.2017</time>
|
||||||
|
|
||||||
|
<p> <span class="tag">Tags:</span>
|
||||||
|
<ul class="tag_list">
|
||||||
|
<li><a href="https://www.schreibdichte.de/blog/tag:Software">Software</a></li>
|
||||||
|
<li><a href="https://www.schreibdichte.de/blog/tag:Web">Web</a></li>
|
||||||
|
<li><a href="https://www.schreibdichte.de/blog/tag:Tools">Tools</a></li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
|
||||||
|
<div class="content">
|
||||||
|
<p>Dank einer Mitteilung <sup id="fnref1:fnfeed_1"><a href="#fn:fnfeed_1" class="footnote-ref">1</a></sup> im OSBN <sup id="fnref1:fnfeed_2"><a href="#fn:fnfeed_2" class="footnote-ref">2</a></sup>, bin ich auf den Feed-Aggregator Miniflux <sup id="fnref1:fnfeed_3"><a href="#fn:fnfeed_3" class="footnote-ref">3</a></sup> aufmerksam geworden. Ich hatte schon lange nach einer Alternative zu Fever <sup id="fnref1:fnfeed_4"><a href="#fn:fnfeed_4" class="footnote-ref">4</a></sup> gesucht, da der Anschein vorlag, dass die Entwicklung nicht mehr weiter ging. Was sich bestätigte.</p>
|
||||||
|
<p>Miniflux ist prima, einfach gehalten und erledigt genau dass, was es machen soll. Zudem wird die Fever-API unterstützt, was bedeutet, dass ich weiterhin meine Feed-Reader nutzen kann, was den Dialog mit Miniflux auf dem Server betrifft. Das ist deshalb interessant, um den Lesestatus oder das Favorisieren von Feeds zentral auf dem Server zu berücksichtigen und nicht lokal. So habe ich sowohl auf dem lokalen Rechner, als auch auf allen mobilen Geräten den gleichen Stand und Status meiner abonnierten Feeds.</p>
|
||||||
|
<p>Für das spätere Lesen von Webseiten, nutze ich seit längerem wallabag <sup id="fnref1:fnfeed_5"><a href="#fn:fnfeed_5" class="footnote-ref">5</a></sup>. Wallabag wird mit Inhalten über den Browser gefüttert. Die Webseiten werden bei der Konservierung von Werbung befreit, damit der reine Text vorliegt. Bilder dagegen nicht und gehen evtl. verloren, wenn es die Quelle mal nicht mehr geben sollte. Ich habe also zwei Orte, an denen Informationen gehalten werden. Miniflux zur Verwaltung von Feed-Nachrichten und Wallabag für Webseiten.</p>
|
||||||
|
<p>Bei einem Update von Miniflux ist mit aufgefallen, dass es nun eine API für Wallabag gibt. Dabei werden alle gespeicherten Feeds von Miniflux an Wallabag übergeben. Eine prima Angelegenheit, da ich jetzt nur noch einen Topf habe, woraus ich meine gesammelten Informationen aus dem Netz entnehme.</p>
|
||||||
|
<p>Miniflux als auch wallabag sind selbst gehostete Web-Applikationen, die auch über den Browser erreichbar sind. Native wallabag-Apps für iOS bzw. Android werden ebenfalls angeboten. Wallabag bietet zusätzlich einen Feed an, um die gesammelten Informationen per Feed-Reader zu lesen. Hierbei drängt sich evtl. die Idee auf, diesen Feed wieder in Miniflux zu abonnieren, da dann zentral alles aus verschiedenen Quellen vorliegt. Hier hätten wir allerdings eine gewisse Redundanz.</p>
|
||||||
|
<p>Ich nutze seit ein paar Monaten Devonthink <sup id="fnref1:fnfeed_6"><a href="#fn:fnfeed_6" class="footnote-ref">6</a></sup> auf dem Mac. Das ist eine lokale Dokumentenverwaltung (DMS), die heute u.a. meine Bücher, Notizen und mein Mail-Archiv verwaltet und ihre Stärke u.a. in der Suche von Informationen hat. Devonthink versteht es auch Feeds zu abonnieren. Für mich war dies der Moment, nun den Feed von wallabag mit all meinen gespeicherten Informationen aus dem Web mit zu integrieren. Ich muss sagen, eine runde Lösung, denn jetzt habe ich für die lokale Suche und das Lesen eine zentrale Stelle.</p>
|
||||||
|
<p>Die Grafik veranschaulicht das Teamplay zwischen Feed-Aggregator Miniflux und wallabag als Später-Lesen-Dienst, zusammengeführt in Devonthink. Ich kenne leider keine Dokumentenverwaltung für Linux oder Windows, die auch Feeds versteht. Wer etwas kennt, bitte melden. Wer zudem etwas zum Thema hören möchte, für dem ist ggf. die Podcast-Folge "Der eigene Workflow" <sup id="fnref1:fnfeed_7"><a href="#fn:fnfeed_7" class="footnote-ref">7</a></sup> interessant.</p>
|
||||||
|
<div class="footnotes">
|
||||||
|
<hr />
|
||||||
|
<ol>
|
||||||
|
<li id="fn:fnfeed_1">
|
||||||
|
<p>Artikel zu Miniflux: <a href="Link"><a href="https://www.robbinaer.info/index.php?post/78">https://www.robbinaer.info/index.php?post/78</a></a> <a href="#fnref1:fnfeed_1" rev="footnote" class="footnote-backref">↩</a></p>
|
||||||
|
</li>
|
||||||
|
<li id="fn:fnfeed_2">
|
||||||
|
<p>OSBN: <a href="Link"><a href="https://osbn.de">https://osbn.de</a></a> <a href="#fnref1:fnfeed_2" rev="footnote" class="footnote-backref">↩</a></p>
|
||||||
|
</li>
|
||||||
|
<li id="fn:fnfeed_3">
|
||||||
|
<p>Miniflux: <a href="Link"><a href="https://miniflux.net">https://miniflux.net</a></a> <a href="#fnref1:fnfeed_3" rev="footnote" class="footnote-backref">↩</a></p>
|
||||||
|
</li>
|
||||||
|
<li id="fn:fnfeed_4">
|
||||||
|
<p>Fever: <a href="Link"><a href="https://feedafever.com">https://feedafever.com</a></a> <a href="#fnref1:fnfeed_4" rev="footnote" class="footnote-backref">↩</a></p>
|
||||||
|
</li>
|
||||||
|
<li id="fn:fnfeed_5">
|
||||||
|
<p>wallabag: <a href="Link"><a href="https://wallabag.org/de">https://wallabag.org/de</a></a> <a href="#fnref1:fnfeed_5" rev="footnote" class="footnote-backref">↩</a></p>
|
||||||
|
</li>
|
||||||
|
<li id="fn:fnfeed_6">
|
||||||
|
<p>Devonthink: <a href="Link"><a href="http://www.devontechnologies.com/de/produkte/devonthink/ueberblick.html">http://www.devontechnologies.com/de/produkte/devonthink/ueberblick.html</a></a> <a href="#fnref1:fnfeed_6" rev="footnote" class="footnote-backref">↩</a></p>
|
||||||
|
</li>
|
||||||
|
<li id="fn:fnfeed_7">
|
||||||
|
<p>Podcast MacMittwoch: <a href="Link"><a href="https://itunes.apple.com/de/podcast/macmittwoch/id1212750085?mt=2ueberblick.html">https://itunes.apple.com/de/podcast/macmittwoch/id1212750085?mt=2ueberblick.html</a></a> <a href="#fnref1:fnfeed_7" rev="footnote" class="footnote-backref">↩</a></p>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</div></div>
|
||||||
|
|
||||||
|
</article>
|
||||||
Reference in New Issue
Block a user