Skip to content

Commit

Permalink
[Core] adds a Filterclass, that modifies HTML for being exportet
Browse files Browse the repository at this point in the history
(#5862)
  • Loading branch information
mathias-weitz-cross-solutions committed Jul 3, 2015
1 parent a0e326c commit 474f37c
Show file tree
Hide file tree
Showing 6 changed files with 207 additions and 0 deletions.
1 change: 1 addition & 0 deletions module/Core/config/module.config.php
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,7 @@
),
'factories' => array(
"Core/XssFilter" => "Core\Filter\XssFilterFactory",
"Core/HtmlAbsPathFilter" => "Core\Factory\Filter\HtmlAbsPathFilterFactory",
),
),

Expand Down
28 changes: 28 additions & 0 deletions module/Core/src/Core/Factory/Filter/HtmlAbsPathFilterFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php
/**
* YAWIK
*
* @filesource
* @copyright (c) 2013-2015 Cross Solution (http://cross-solution.de)
* @license MIT
* @author weitz@cross-solution.de
*/

namespace Core\Factory\Filter;

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Core\Filter\HtmlAbsPathFilter;

class HtmlAbsPathFilterFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
$request = $serviceLocator->getServiceLocator()->get('request');
$uri = $request->getUri();
$filter = new HtmlAbsPathFilter();
$filter->setUri($uri);
return $filter;
}

}
51 changes: 51 additions & 0 deletions module/Core/src/Core/Filter/HtmlAbsPathFilter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?php
/**
* YAWIK
*
* @filesource
* @copyright (c) 2013-2015 Cross Solution (http://cross-solution.de)
* @license MIT
* @author weitz@cross-solution.de
*/

namespace Core\Filter;

use Zend\Filter\FilterInterface;
use Zend\Filter\Exception;
use Zend\Dom\Query;

use Zend\Uri\Http;


class HtmlAbsPathFilter implements FilterInterface {

protected $uri;

public function setUri($uri) {
$this->uri = $uri;
return $this;
}

public function filter($html)
{
$baseUri = new Http($this->uri);

$dom = new Query($html);
$results = $dom->execute('*[@href],*[@src]');
foreach ($results as $result) {
$attributeMap = $result->attributes;
foreach ($attributeMap as $attribute) {
$name = $attribute->name;
if ($name == 'href' || $name == 'src') {
$value = $result->getAttribute($name);
$uri = new Http($value);
$h = $uri->resolve($baseUri);
$result->setAttribute($name, $h);
}
}
}
$document = $results->getDocument();
$documentHTML = $document->saveHTML();
return $documentHTML;
}
}
95 changes: 95 additions & 0 deletions module/Core/test/CoreTest/Filter/HtmlAbsPathFilterTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
<?php
/**
* YAWIK
*
* @filesource
* @copyright (c) 2013-2015 Cross Solution (http://cross-solution.de)
* @license MIT
* @author weitz@cross-solution.de
*/

namespace CoreTest\Filter;

use Core\Filter\HtmlAbsPathFilter;


class HtmlAbsPathFilterTest extends \PHPUnit_Framework_TestCase {

protected $htmlTests = array(
array(
'original' =>
'
<html>
<head>
<link rel="stylesheet" type="text/css" href="http://php.net/cached.php?t=1421837618&amp;f=/fonts/Fira/fira.css" media="screen">
<link rel="stylesheet" type="text/css" href="//php.net/cached.php?t=1421837618&amp;f=/fonts/Fira/fira.css" media="screen">
<link rel="stylesheet" type="text/css" href="localCSS.css" media="screen">
</head>
<body>
<div>
<table>
<tr>
<td class="foo">
<div>
Lorem ipsum <span class="bar">
<a href="/foo/bar" id="one" onClick="JavaScript:void()">One</a>
<a href="/foo/baz" id="two">Two</a>
<a src="/foo/bat" id="three">Three</a>
<img src="/foo/bla" />
<img src="../foo/bla">
<img src="foo/bla">
<img src="../foo/bli">
</span>
</div>
</td>
</tr>
</table>
</div>
</body>
</html>
',
),
array(
'original' =>
'
<html>
<head>
<link rel="stylesheet" type="text/css" href=\'http://php.net/cached.php?t=1421837618&amp;f=/fonts/Fira/fira.css\' media="screen">
<link rel="stylesheet" type="text/css" href=\'//php.net/cached.php?t=1421837618&amp;f=/fonts/Fira/fira.css\' media="screen">
<link rel="stylesheet" type="text/css" href=\'localCSS.css\' media="screen">
</head>
<body>
<table>
<tr>
<td class="foo">
<div>
Lorem ipsum <span class="bar">
<a href="/foo/bar" id="one" onClick="JavaScript:void()">One</a>
</span>
</td>
</tr>
</table>
</div>
</body>
</html>
',

)
);


public function testFilter()
{
$filter = new HtmlAbsPathFilter();
foreach ($this->htmlTests as $test) {

$filter->setUri('http://aaa.bbb.cc/ddd/');
$f = $filter->filter($test['original']);
preg_match_all ( '/(?:href|src)\s*=\s*"([^"]*)"/', $f, $matches);
foreach ($matches[1] as $uri) {
$this->assertRegExp("/^https?:\/\//", $uri);

}
}
}
}
2 changes: 2 additions & 0 deletions module/Jobs/src/Jobs/Listener/Publisher.php
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,8 @@ public function restPost(JobEvent $e)
$render = $serviceManager->get('ViewPhpRendererStrategy')->getRenderer();
$viewModel = $serviceManager->get('Jobs/viewModelTemplateFilter')->__invoke($entity);
$html = $render->render($viewModel);
$absUrlFilter = $serviceManager->get('filterManager')->get('Core/HtmlAbsPathFilter');
$html = $absUrlFilter->filter($html);

$host = $restClient->getHost();
if (!isset($host)) {
Expand Down
30 changes: 30 additions & 0 deletions module/Jobs/test/JobsTest/Listener/PublisherTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@ class PublisherTest extends \PHPUnit_Framework_TestCase

protected $providerChannel;

protected $filterManager;

protected $htmlAbsPathFilter;

/**
* @var
*/
Expand All @@ -89,6 +93,11 @@ public static function publisherSetter($attribute, $value)
return strtolower($attribute);
}

public static function absPathFilter($value)
{
return $value;
}

/**
*
*/
Expand Down Expand Up @@ -152,6 +161,21 @@ public function setUp()
->method('__set')
->will($this->returnCallback($staticClassPrefix . 'publisherSetter'));

$this->htmlAbsPathFilter = $this->getMockBuilder('\Core\Filter\HtmlAbsPathFilter')
->disableOriginalConstructor()
->getMock();

$this->htmlAbsPathFilter->expects($this->any())
->method('filter')
->will($this->returnCallback($staticClassPrefix . 'absPathFilter'));

$this->filterManager = $this->getMockBuilder('\Zend\ServiceManager\ServiceManager')
->disableOriginalConstructor()
->getMock();

$this->filterManager->expects($this->at(0))
->method('get')
->willReturn($this->htmlAbsPathFilter);

$this->restClient = $this->getMockBuilder('\Core\Service\RestClient')
->disableOriginalConstructor()
Expand Down Expand Up @@ -266,6 +290,12 @@ public function setUp()
$this->serviceManager
->expects($this->at(6))
->method('get')
->with('filterManager')
->will($this->returnValue($this->filterManager));

$this->serviceManager
->expects($this->at(7))
->method('get')
->with('repositories')
->will($this->returnValue($this->repositories));

Expand Down

0 comments on commit 474f37c

Please sign in to comment.