Skip to content

Commit

Permalink
Added RemoveLivePreviewAttributes template normalization to non-JavaS…
Browse files Browse the repository at this point in the history
…cript renderer generators
  • Loading branch information
JoshyPHP committed Dec 7, 2017
1 parent ce42909 commit 392c11f
Show file tree
Hide file tree
Showing 17 changed files with 142 additions and 17 deletions.
5 changes: 5 additions & 0 deletions docs/testdox.txt
Expand Up @@ -1325,6 +1325,9 @@ s9e\TextFormatter\Tests\Configurator\TemplateNormalizations\RemoveComments
s9e\TextFormatter\Tests\Configurator\TemplateNormalizations\RemoveInterElementWhitespace
[x] Works

s9e\TextFormatter\Tests\Configurator\TemplateNormalizations\RemoveLivePreviewAttributes
[x] Works

s9e\TextFormatter\Tests\Configurator\TemplateNormalizations\SetRelNoreferrerOnTargetedLinks
[x] Works

Expand Down Expand Up @@ -1697,6 +1700,7 @@ s9e\TextFormatter\Tests\Configurator\JavaScript
[x] Tag config is wholly deduplicated
[x] The public API is created if any method is exported
[x] The public API is not created if no method is exported
[x] Preserves live preview attributes

s9e\TextFormatter\Tests\Configurator\Bundle
[x] getConfigurator() returns a configured instance of Configurator
Expand Down Expand Up @@ -2772,6 +2776,7 @@ s9e\TextFormatter\Tests\Configurator\RendererGenerators\XSLT
[x] escapes a parameter's default value
[x] Merges simple templates together
[x] Calls $optimizer->optimizeTemplate() for each template
[x] Removes live preview attributes

s9e\TextFormatter\Tests\Renderer
[x] loadXML() returns a DOMDocument
Expand Down
1 change: 1 addition & 0 deletions phpunit.xml
Expand Up @@ -149,6 +149,7 @@
<file>tests/Configurator/TemplateNormalizations/PreserveSingleSpacesTest.php</file>
<file>tests/Configurator/TemplateNormalizations/RemoveCommentsTest.php</file>
<file>tests/Configurator/TemplateNormalizations/RemoveInterElementWhitespaceTest.php</file>
<file>tests/Configurator/TemplateNormalizations/RemoveLivePreviewAttributesTest.php</file>
<file>tests/Configurator/TemplateNormalizations/SetRelNoreferrerOnTargetedLinksTest.php</file>
<file>tests/Configurator/TemplateNormalizations/SortAttributesByNameTest.php</file>
<file>tests/Configurator/TemplateNormalizations/TransposeCommentsTest.php</file>
Expand Down
6 changes: 0 additions & 6 deletions scripts/build/5.3.convert.php
Expand Up @@ -108,12 +108,6 @@ function convertCustom($filepath, &$file)
'public function getTextContent($expr)',
)
),
'JavaScript.php' => array(
array(
'$this->xsl = (new XSLT)->getXSL($this->configurator->rendering);',
"\$rendererGenerator = new XSLT;\n\t\t\$this->xsl = \$rendererGenerator->getXSL(\$this->configurator->rendering);"
)
),
'JavaScript/Encoder.php' => array(
array(
'return $this->typeEncoders[$type]($value);',
Expand Down
4 changes: 2 additions & 2 deletions src/Bundles/Forum/Renderer.php

Large diffs are not rendered by default.

4 changes: 3 additions & 1 deletion src/Configurator/JavaScript.php
Expand Up @@ -126,7 +126,9 @@ public function getParser(array $config = null)
$this->configOptimizer->reset();

// Get the stylesheet used for rendering
$this->xsl = (new XSLT)->getXSL($this->configurator->rendering);
$xslt = new XSLT;
$xslt->optimizer->normalizer->remove('RemoveLivePreviewAttributes');
$this->xsl = $xslt->getXSL($this->configurator->rendering);

// Prepare the parser's config
$this->config = (isset($config)) ? $config : $this->configurator->asConfig();
Expand Down
12 changes: 12 additions & 0 deletions src/Configurator/RendererGenerators/PHP.php
Expand Up @@ -17,6 +17,7 @@
use s9e\TextFormatter\Configurator\RendererGenerators\PHP\Serializer;
use s9e\TextFormatter\Configurator\RendererGenerators\PHP\SwitchStatement;
use s9e\TextFormatter\Configurator\Rendering;
use s9e\TextFormatter\Configurator\TemplateNormalizer;

class PHP implements RendererGenerator
{
Expand Down Expand Up @@ -65,6 +66,11 @@ class PHP implements RendererGenerator
*/
public $lastFilepath;

/**
* @var TemplateNormalizer
*/
protected $normalizer;

/**
* @var Optimizer Optimizer
*/
Expand Down Expand Up @@ -95,6 +101,10 @@ public function __construct($cacheDir = null)
}
$this->useMultibyteStringFunctions = extension_loaded('mbstring');
$this->serializer = new Serializer;

$this->normalizer = new TemplateNormalizer;
$this->normalizer->clear();
$this->normalizer->add('RemoveLivePreviewAttributes');
}

/**
Expand Down Expand Up @@ -223,6 +233,8 @@ protected static function export(array $value)
*/
protected function compileTemplate($template)
{
$template = $this->normalizer->normalizeTemplate($template);

// Parse the template
$ir = TemplateParser::parse($template);

Expand Down
1 change: 1 addition & 0 deletions src/Configurator/RendererGenerators/XSLT/Optimizer.php
Expand Up @@ -26,6 +26,7 @@ public function __construct()
$this->normalizer->append('MergeConsecutiveCopyOf');
$this->normalizer->append('MergeIdenticalConditionalBranches');
$this->normalizer->append('OptimizeNestedConditionals');
$this->normalizer->append('RemoveLivePreviewAttributes');
}

/**
Expand Down
@@ -0,0 +1,41 @@
<?php

/**
* @package s9e\TextFormatter
* @copyright Copyright (c) 2010-2016 The s9e Authors
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
namespace s9e\TextFormatter\Configurator\TemplateNormalizations;

use DOMAttr;
use DOMElement;

/**
* Remove attributes related to live preview
*/
class RemoveLivePreviewAttributes extends AbstractNormalization
{
/**
* {@inheritdoc}
*/
protected $queries = [
'//@* [starts-with(name(), "data-s9e-livepreview-")]',
'//xsl:attribute[starts-with(@name, "data-s9e-livepreview-")]'
];

/**
* {@inheritdoc}
*/
protected function normalizeAttribute(DOMAttr $attribute)
{
$attribute->parentNode->removeAttributeNode($attribute);
}

/**
* {@inheritdoc}
*/
protected function normalizeElement(DOMElement $element)
{
$element->parentNode->removeChild($element);
}
}
2 changes: 1 addition & 1 deletion tests/Bundles/data/Forum/016.html
@@ -1,3 +1,3 @@
<pre data-hljs="" data-s9e-livepreview-postprocess="if('undefined'!==typeof hljs)hljs._hb(this)"><code>echo 'Hello world';</code></pre><script>if("undefined"!==typeof hljs)hljs._ha();else if("undefined"===typeof hljsLoading){hljsLoading=1;var a=document.getElementsByTagName("head")[0],e=document.createElement("link");e.type="text/css";e.rel="stylesheet";e.href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/styles/default.min.css";a.appendChild(e);e=document.createElement("script");e.type="text/javascript";e.onload=function(){var d={},f=0;hljs._hb=function(b){b.removeAttribute("data-hljs");var c=b.innerHTML;c in d?b.innerHTML=d[c]:(7<++f&&(d={},f=0),hljs.highlightBlock(b.firstChild),d[c]=b.innerHTML)};hljs._ha=function(){for(var b=document.querySelectorAll("pre[data-hljs]"),c=b.length;0<c;)hljs._hb(b.item(--c))};hljs._ha()};e.async=!0;e.src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/highlight.min.js";a.appendChild(e)}</script>
<pre data-hljs=""><code>echo 'Hello world';</code></pre><script>if("undefined"!==typeof hljs)hljs._ha();else if("undefined"===typeof hljsLoading){hljsLoading=1;var a=document.getElementsByTagName("head")[0],e=document.createElement("link");e.type="text/css";e.rel="stylesheet";e.href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/styles/default.min.css";a.appendChild(e);e=document.createElement("script");e.type="text/javascript";e.onload=function(){var d={},f=0;hljs._hb=function(b){b.removeAttribute("data-hljs");var c=b.innerHTML;c in d?b.innerHTML=d[c]:(7<++f&&(d={},f=0),hljs.highlightBlock(b.firstChild),d[c]=b.innerHTML)};hljs._ha=function(){for(var b=document.querySelectorAll("pre[data-hljs]"),c=b.length;0<c;)hljs._hb(b.item(--c))};hljs._ha()};e.async=!0;e.src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/highlight.min.js";a.appendChild(e)}</script>

Text
4 changes: 2 additions & 2 deletions tests/Bundles/data/Forum/017.html
@@ -1,5 +1,5 @@
<pre data-hljs="" data-s9e-livepreview-postprocess="if('undefined'!==typeof hljs)hljs._hb(this)"><code>echo 'Hello world';</code></pre><script>if("undefined"!==typeof hljs)hljs._ha();else if("undefined"===typeof hljsLoading){hljsLoading=1;var a=document.getElementsByTagName("head")[0],e=document.createElement("link");e.type="text/css";e.rel="stylesheet";e.href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/styles/default.min.css";a.appendChild(e);e=document.createElement("script");e.type="text/javascript";e.onload=function(){var d={},f=0;hljs._hb=function(b){b.removeAttribute("data-hljs");var c=b.innerHTML;c in d?b.innerHTML=d[c]:(7<++f&&(d={},f=0),hljs.highlightBlock(b.firstChild),d[c]=b.innerHTML)};hljs._ha=function(){for(var b=document.querySelectorAll("pre[data-hljs]"),c=b.length;0<c;)hljs._hb(b.item(--c))};hljs._ha()};e.async=!0;e.src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/highlight.min.js";a.appendChild(e)}</script>
<pre data-hljs=""><code>echo 'Hello world';</code></pre><script>if("undefined"!==typeof hljs)hljs._ha();else if("undefined"===typeof hljsLoading){hljsLoading=1;var a=document.getElementsByTagName("head")[0],e=document.createElement("link");e.type="text/css";e.rel="stylesheet";e.href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/styles/default.min.css";a.appendChild(e);e=document.createElement("script");e.type="text/javascript";e.onload=function(){var d={},f=0;hljs._hb=function(b){b.removeAttribute("data-hljs");var c=b.innerHTML;c in d?b.innerHTML=d[c]:(7<++f&&(d={},f=0),hljs.highlightBlock(b.firstChild),d[c]=b.innerHTML)};hljs._ha=function(){for(var b=document.querySelectorAll("pre[data-hljs]"),c=b.length;0<c;)hljs._hb(b.item(--c))};hljs._ha()};e.async=!0;e.src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/highlight.min.js";a.appendChild(e)}</script>

Text<br>

<pre data-hljs="" data-s9e-livepreview-postprocess="if('undefined'!==typeof hljs)hljs._hb(this)"><code class="language-php">echo 'Hello world';</code></pre><script>if("undefined"!==typeof hljs)hljs._ha();else if("undefined"===typeof hljsLoading){hljsLoading=1;var a=document.getElementsByTagName("head")[0],e=document.createElement("link");e.type="text/css";e.rel="stylesheet";e.href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/styles/default.min.css";a.appendChild(e);e=document.createElement("script");e.type="text/javascript";e.onload=function(){var d={},f=0;hljs._hb=function(b){b.removeAttribute("data-hljs");var c=b.innerHTML;c in d?b.innerHTML=d[c]:(7<++f&&(d={},f=0),hljs.highlightBlock(b.firstChild),d[c]=b.innerHTML)};hljs._ha=function(){for(var b=document.querySelectorAll("pre[data-hljs]"),c=b.length;0<c;)hljs._hb(b.item(--c))};hljs._ha()};e.async=!0;e.src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/highlight.min.js";a.appendChild(e)}</script>
<pre data-hljs=""><code class="language-php">echo 'Hello world';</code></pre><script>if("undefined"!==typeof hljs)hljs._ha();else if("undefined"===typeof hljsLoading){hljsLoading=1;var a=document.getElementsByTagName("head")[0],e=document.createElement("link");e.type="text/css";e.rel="stylesheet";e.href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/styles/default.min.css";a.appendChild(e);e=document.createElement("script");e.type="text/javascript";e.onload=function(){var d={},f=0;hljs._hb=function(b){b.removeAttribute("data-hljs");var c=b.innerHTML;c in d?b.innerHTML=d[c]:(7<++f&&(d={},f=0),hljs.highlightBlock(b.firstChild),d[c]=b.innerHTML)};hljs._ha=function(){for(var b=document.querySelectorAll("pre[data-hljs]"),c=b.length;0<c;)hljs._hb(b.item(--c))};hljs._ha()};e.async=!0;e.src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/highlight.min.js";a.appendChild(e)}</script>
2 changes: 1 addition & 1 deletion tests/Bundles/data/Forum/026.html
@@ -1,3 +1,3 @@
<pre data-hljs="" data-s9e-livepreview-postprocess="if('undefined'!==typeof hljs)hljs._hb(this)"><code>line 1
<pre data-hljs=""><code>line 1
line 2
</code></pre><script>if("undefined"!==typeof hljs)hljs._ha();else if("undefined"===typeof hljsLoading){hljsLoading=1;var a=document.getElementsByTagName("head")[0],e=document.createElement("link");e.type="text/css";e.rel="stylesheet";e.href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/styles/default.min.css";a.appendChild(e);e=document.createElement("script");e.type="text/javascript";e.onload=function(){var d={},f=0;hljs._hb=function(b){b.removeAttribute("data-hljs");var c=b.innerHTML;c in d?b.innerHTML=d[c]:(7<++f&&(d={},f=0),hljs.highlightBlock(b.firstChild),d[c]=b.innerHTML)};hljs._ha=function(){for(var b=document.querySelectorAll("pre[data-hljs]"),c=b.length;0<c;)hljs._hb(b.item(--c))};hljs._ha()};e.async=!0;e.src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/highlight.min.js";a.appendChild(e)}</script>
4 changes: 3 additions & 1 deletion tests/Configurator/JavaScript/HintGeneratorTest.php
Expand Up @@ -16,7 +16,9 @@ public function assertHintsContain($str)
$this->configurator->finalize();
$config = ConfigHelper::filterConfig($this->configurator->asConfig(), 'JS');

$xsl = $this->configurator->rendering->engine->getXSL($this->configurator->rendering);
$xslt = $this->configurator->rendering->engine;
$xslt->optimizer->normalizer->remove('RemoveLivePreviewAttributes');
$xsl = $xslt->getXSL($this->configurator->rendering);

$generator = new HintGenerator;
$generator->setConfig($config);
Expand Down
10 changes: 10 additions & 0 deletions tests/Configurator/JavaScriptTest.php
Expand Up @@ -412,6 +412,16 @@ public function testNoExport()
$this->configurator->javascript->exportMethods = [];
$this->assertNotContains("window['s9e']['TextFormatter']", $this->configurator->javascript->getParser());
}

/**
* @testdox Preserves live preview attributes
*/
public function testLivePreviewAttributes()
{
$this->configurator->tags->add('X')->template = '<hr data-s9e-livepreview-ignore-attrs="style"/>';

$this->assertContains('data-s9e-livepreview-ignore-attrs', $this->configurator->javascript->getParser());
}
}

class NonScalarConfigThing implements ConfigProvider
Expand Down
8 changes: 8 additions & 0 deletions tests/Configurator/RendererGenerators/PHPTest.php
Expand Up @@ -1345,6 +1345,14 @@ function ($configurator)
$configurator->tags->add('X')->template = '<x:svg xmlns:x="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"></x:svg>';
}
],
[
'<r><X/></r>',
'<div></div>',
function ($configurator)
{
$configurator->tags->add('X')->template = '<div data-s9e-livepreview-ignore-attrs="foo"/>';
}
],
];
}

Expand Down
10 changes: 10 additions & 0 deletions tests/Configurator/RendererGenerators/XSLTTest.php
Expand Up @@ -174,4 +174,14 @@ public function testOptimizerCalls()
$this->assertContains('<xsl:template match="X"><b>x</b></xsl:template>', $xsl);
$this->assertContains('<xsl:template match="Y"><b>y</b></xsl:template>', $xsl);
}

/**
* @testdox Removes live preview attributes
*/
public function testRemovesLivePreviewAttributes()
{
$this->configurator->tags->add('X')->template = '<hr data-s9e-livepreview-ignore-attrs="foo"/>';

$this->assertNotContains('livepreview', $this->getXSL());
}
}
@@ -0,0 +1,39 @@
<?php

namespace s9e\TextFormatter\Tests\Configurator\TemplateNormalizations;

/**
* @covers s9e\TextFormatter\Configurator\TemplateNormalizations\RemoveLivePreviewAttributes
*/
class RemoveLivePreviewAttributesTest extends AbstractTest
{
public function getData()
{
return [
[
'<div data-s9e-mediaembed="foo">..</div>',
'<div data-s9e-mediaembed="foo">..</div>'
],
[
'<div data-s9e-livepreview-postprocess="this.foo()">..</div>',
'<div>..</div>'
],
[
'<div data-s9e-livepreview-ignore-attrs="style">..</div>',
'<div>..</div>'
],
[
'<div data-s9e-mediaembed="foo" data-s9e-livepreview-postprocess="this.foo()">..</div>',
'<div data-s9e-mediaembed="foo">..</div>'
],
[
'<div data-s9e-mediaembed="foo">..</div>',
'<div data-s9e-mediaembed="foo">..</div>'
],
[
'<div><xsl:attribute name="data-s9e-livepreview-postprocess">this.foo()</xsl:attribute>..</div>',
'<div>..</div>'
],
];
}
}

0 comments on commit 392c11f

Please sign in to comment.