Skip to content

Commit 281ad5e

Browse files
committed
Merge branch 'master' of https://github.com/hexydec/htmldoc
2 parents f2ac744 + b5a2605 commit 281ad5e

File tree

9 files changed

+38
-12
lines changed

9 files changed

+38
-12
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "minify",
3-
"version": "0.8.3",
3+
"version": "0.8.5",
44
"description": "A token based HTML Document parser and minifier written in PHP",
55
"main": "index.js",
66
"directories": {

src/htmldoc/htmldoc.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,11 @@ class htmldoc {
7979
],
8080
'empty' => ['id', 'class', 'style', 'title', 'action', 'value', 'alt', 'lang', 'dir', 'onfocus', 'onblur', 'onchange', 'onclick', 'ondblclick', 'onmousedown', 'onmouseup', 'onmouseover', 'onmousemove', 'onmouseout', 'onkeypress', 'onkeydown', 'onkeyup'], // attributes to remove if empty
8181
'urls' => ['href', 'src', 'action', 'poster'], // attributes to minify URLs in
82+
'urlsmatch' => [
83+
'link' => [
84+
'rel' => ['stylesheet', 'icon', 'shortcut icon', 'apple-touch-icon-precomposed', 'apple-touch-icon', 'preload', 'prefetch', 'author', 'help']
85+
]
86+
]
8287
],
8388
'css' => 'hexydec\\html\\cssmin::minify', // specify the CSS minifier
8489
'js' => null, // specify the javascript minifier
@@ -339,7 +344,10 @@ protected static function parseSelector(string $selector) {
339344
while (($token = next($tokens)) !== false) {
340345
if ($token['type'] == 'squareclose') {
341346
break;
342-
} elseif ($token['type'] == 'string') {
347+
} elseif (in_array($token['type'], ['string', 'quotes'])) {
348+
if ($token['type'] == 'quotes') {
349+
$token['value'] = stripslashes(mb_substr($token['value'], 1, -1));
350+
}
343351
$item[isset($item['attribute']) ? 'value' : 'attribute'] = $token['value'];
344352
} elseif ($token['type'] == 'comparison') {
345353
$item['comparison'] = $token['value'];

src/htmldoc/tokens/tag.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,8 +254,8 @@ public function minify(array $minify) : void {
254254
$attributes[$key] = $value;
255255
}
256256

257-
// minify urls
258-
if ($minify['urls'] && in_array($key, $attr['urls'])) {
257+
// minify url attributes when not in list or match attribute
258+
if ($minify['urls'] && in_array($key, $attr['urls']) && (!in_array($this->tagName, array_keys($attr['urlsmatch'])) || $this->hasAttribute($attributes, $attr['urlsmatch'][$this->tagName]))) {
259259

260260
// make folder variables
261261
if ($folder === null && isset($_SERVER['REQUEST_URI'])) {
@@ -425,6 +425,14 @@ public function minify(array $minify) : void {
425425
}
426426
}
427427

428+
protected function hasAttribute(array $attr, array $items) {
429+
foreach ($items AS $key => $item) {
430+
if (!isset($attr[$key]) || !in_array($attr[$key], $item)) {
431+
return false;
432+
}
433+
}
434+
return true;
435+
}
428436
/**
429437
* Determine whether this tag or any of its child tokens match a selector
430438
*

src/htmldoc/tokens/text.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,6 @@ protected function getIndex($children) {
118118
* @return string The compiled HTML
119119
*/
120120
public function html(array $options = []) : string {
121-
return $this->content ? htmlspecialchars($this->content, ENT_NOQUOTES | ENT_HTML5) : '';
121+
return $this->content !== '' ? htmlspecialchars($this->content, ENT_NOQUOTES | ENT_HTML5) : '';
122122
}
123123
}

tests/findHtmldocTest.php

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,16 @@ public function testCanFindElements() {
1919
$this->assertEquals($doc->length, 4, 'Can count elements');
2020
// var_dump($doc->find('title'));
2121
$this->assertEquals('<title>Find</title>', $doc->find('title')->html());
22-
$this->assertEquals('<div class="find"><h1 class="find__heading">Heading</h1><p class="find__paragraph" title="This is a paragraph">Paragraph</p></div>', $doc->find('.find')->html());
22+
$this->assertEquals('<div class="find"><h1 class="find__heading">Heading</h1><p class="find__paragraph" title="This is a paragraph">Paragraph</p><a class="find__anchor" href="https://github.com/hexydec/htmldoc/">Anchor</a></div>', $doc->find('.find')->html());
2323
$this->assertEquals('<div id="first" class="first">First</div>', $doc->find('#first')->html());
2424
$this->assertEquals('<div id="first" class="first">First</div>', $doc->find('[class=first]')->html());
25-
$this->assertEquals('<div class="find"><h1 class="find__heading">Heading</h1><p class="find__paragraph" title="This is a paragraph">Paragraph</p></div><h1 class="find__heading">Heading</h1><p class="find__paragraph" title="This is a paragraph">Paragraph</p>', $doc->find('[class^=find]')->html());
26-
$this->assertEquals('<h1 class="find__heading">Heading</h1><p class="find__paragraph" title="This is a paragraph">Paragraph</p>', $doc->find('[class*=__]')->html());
25+
$this->assertEquals('<div class="find"><h1 class="find__heading">Heading</h1><p class="find__paragraph" title="This is a paragraph">Paragraph</p><a class="find__anchor" href="https://github.com/hexydec/htmldoc/">Anchor</a></div><h1 class="find__heading">Heading</h1><p class="find__paragraph" title="This is a paragraph">Paragraph</p><a class="find__anchor" href="https://github.com/hexydec/htmldoc/">Anchor</a>', $doc->find('[class^=find]')->html());
26+
$this->assertEquals('<h1 class="find__heading">Heading</h1><p class="find__paragraph" title="This is a paragraph">Paragraph</p><a class="find__anchor" href="https://github.com/hexydec/htmldoc/">Anchor</a>', $doc->find('[class*=__]')->html());
2727
$this->assertEquals('<h1 class="find__heading">Heading</h1>', $doc->find('[class$=heading]')->html());
2828
$this->assertEquals('<h1 class="find__heading">Heading</h1>', $doc->find('h1[class$=heading]')->html());
2929
$this->assertEquals('<h1 class="find__heading">Heading</h1>', $doc->find('html h1[class$=heading]')->html());
30+
$this->assertEquals('<a class="find__anchor" href="https://github.com/hexydec/htmldoc/">Anchor</a>', $doc->find('a[href$="://github.com/hexydec/htmldoc/"]')->html());
31+
$this->assertEquals(null, $doc->find('a[href$="://github.com/hexydec/htmldoc"]')->html());
3032
$this->assertEquals('<div id="first" class="first">First</div>', $doc->find('div:first-child')->html());
3133
$this->assertEquals('<div class="last">Last</div>', $doc->find('div:last-child')->html());
3234
$this->assertEquals('<div id="first" class="first">First</div><h1 class="find__heading">Heading</h1><p class="find__paragraph" title="This is a paragraph">Paragraph</p>', $doc->find('.first, .find__heading, .find__paragraph')->html());
@@ -51,9 +53,9 @@ public function testCanTraverseElements() {
5153

5254
$this->assertEquals('<div id="first" class="first">First</div>', $doc->find('body > *')->first()->html(), 'Can find first element');
5355
$this->assertEquals('<div class="last">Last</div>', $doc->find('body > *')->last()->html(), 'Can find last element');
54-
$this->assertEquals('<div class="find"><h1 class="find__heading">Heading</h1><p class="find__paragraph" title="This is a paragraph">Paragraph</p></div>', $doc->find('body > *')->eq(1)->html(), 'Can specific element');
55-
$this->assertEquals('<div class="find"><h1 class="find__heading">Heading</h1><p class="find__paragraph" title="This is a paragraph">Paragraph</p></div>', $doc->find('body > *')->eq(-2)->html(), 'Can specific element');
56-
$this->assertEquals('<div class="find"><h1 class="find__heading">Heading</h1><p class="find__paragraph" title="This is a paragraph">Paragraph</p></div>', $doc->find('.find')->children()->html(), 'Can specific element');
56+
$this->assertEquals('<div class="find"><h1 class="find__heading">Heading</h1><p class="find__paragraph" title="This is a paragraph">Paragraph</p><a class="find__anchor" href="https://github.com/hexydec/htmldoc/">Anchor</a></div>', $doc->find('body > *')->eq(1)->html(), 'Can specific element');
57+
$this->assertEquals('<div class="find"><h1 class="find__heading">Heading</h1><p class="find__paragraph" title="This is a paragraph">Paragraph</p><a class="find__anchor" href="https://github.com/hexydec/htmldoc/">Anchor</a></div>', $doc->find('body > *')->eq(-2)->html(), 'Can specific element');
58+
$this->assertEquals('<div class="find"><h1 class="find__heading">Heading</h1><p class="find__paragraph" title="This is a paragraph">Paragraph</p><a class="find__anchor" href="https://github.com/hexydec/htmldoc/">Anchor</a></div>', $doc->find('.find')->children()->html(), 'Can specific element');
5759

5860
$this->assertEquals(3, count($doc->find('body > *')->get()));
5961
$this->assertEquals('<div class="last">Last</div>', $doc->find('body > *')->get(2)->html());

tests/minifyHtmldocTest.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,10 @@ public function testCanMinifyUrls() {
138138
'https://test.com/alotof/of/folders/' => Array(
139139
'<link rel="stylesheet" href="/alotof/css/build/file.css?_12345">' => '<link rel="stylesheet" href="../../css/build/file.css?_12345">',
140140
'<a href="https://nottest.com/alotof/of/test/test.php">Different Domain</a>' => '<a href="//nottest.com/alotof/of/test/test.php">Different Domain</a>',
141+
),
142+
'https://test.com/' => Array(
143+
'<link rel="stylesheet" href="https://test.com/alotof/css/build/file.css?_12345">' => '<link rel="stylesheet" href="alotof/css/build/file.css?_12345">',
144+
'<link itemtype="url" href="https://test.com/">' => '<link itemtype="url" href="https://test.com/">',
141145
)
142146
);
143147
$doc = new htmldoc();

tests/templates/find.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
<div class="find">
99
<h1 class="find__heading">Heading</h1>
1010
<p class="find__paragraph" title="This is a paragraph">Paragraph</p>
11+
<a class="find__anchor" href="https://github.com/hexydec/htmldoc/">Anchor</a>
1112
</div>
1213
<div class="last">Last</div>
1314
</body>

tests/templates/whitespace-minified.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
preformatted
33

44
content
5-
</pre></body></html>
5+
</pre><div>0</div></body></html>

tests/templates/whitespace.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,8 @@
1717

1818
content
1919
</pre>
20+
<div>
21+
0
22+
</div>
2023
</body>
2124
</html>

0 commit comments

Comments
 (0)