From 5f22a40974fc3ff97008ba3fe6dac5b4497b4938 Mon Sep 17 00:00:00 2001 From: Domovoy Date: Mon, 23 Jul 2012 15:48:00 +0200 Subject: [PATCH 1/4] Hook prepare_body now have a priority of 10, it is runned before showmore --- nsfw/nsfw.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nsfw/nsfw.php b/nsfw/nsfw.php index 4a65b720..60ab4581 100755 --- a/nsfw/nsfw.php +++ b/nsfw/nsfw.php @@ -10,7 +10,7 @@ */ function nsfw_install() { - register_hook('prepare_body', 'addon/nsfw/nsfw.php', 'nsfw_prepare_body'); + register_hook('prepare_body', 'addon/nsfw/nsfw.php', 'nsfw_prepare_body', 10); register_hook('plugin_settings', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings'); register_hook('plugin_settings_post', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings_post'); From 7b786e02149ba01550a4028bcf0e11b8f575d3ec Mon Sep 17 00:00:00 2001 From: Domovoy Date: Mon, 23 Jul 2012 20:07:15 +0200 Subject: [PATCH 2/4] showmore now only count what is visible to know if it should act, fixes #1 --- showmore/showmore.php | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/showmore/showmore.php b/showmore/showmore.php index 2b4d5d0f..e4f0de4e 100755 --- a/showmore/showmore.php +++ b/showmore/showmore.php @@ -66,6 +66,31 @@ function showmore_addon_settings_post(&$a,&$b) { } } +function get_body_length($body) { + $string = trim($body); + + // We need to get rid of hidden tags (display: none) + $dom = DomDocument::loadHTML($body); + $xpath = new DOMXPath($dom); + + /* + * Checking any possible syntax of the style attribute with xpath is impossible + * So we just get any element with a style attribute, and check them with a regexp + */ + $xr = $xpath->query('//*[@style]'); + foreach($xr as $node) { + if(preg_match('/.*display: *none *;.*/',$node->getAttribute('style'))) { + // Hidden, remove it from its parent + $node->parentNode->removeChild($node); + } + } + // Now we can get the body of our HTML DomDocument, it contains only what is visible + $string = $dom->saveHTML($dom->getElementsByTagName('body')->item(0)); + + $string = strip_tags($string); + return strlen($string); +} + function showmore_prepare_body(&$a,&$b) { $words = null; @@ -76,7 +101,7 @@ function showmore_prepare_body(&$a,&$b) { if(!$chars) $chars = 1100; - if (strlen(strip_tags(trim($b['html']))) > $chars) { + if (get_body_length($b['html']) > $chars) { $found = true; $shortened = trim(showmore_cutitem($b['html'], $chars))."..."; } From 7f34be5a9a2e32fa9622c5d4b8836142b69a8916 Mon Sep 17 00:00:00 2001 From: Domovoy Date: Mon, 23 Jul 2012 20:46:09 +0200 Subject: [PATCH 3/4] The $node parameter of DomDocument::saveHTML was added only in php version 5.3.6. No problem, strip_tags gets out anything we don't want anyway. --- showmore/showmore.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/showmore/showmore.php b/showmore/showmore.php index e4f0de4e..5b0f14a0 100755 --- a/showmore/showmore.php +++ b/showmore/showmore.php @@ -85,7 +85,7 @@ function get_body_length($body) { } } // Now we can get the body of our HTML DomDocument, it contains only what is visible - $string = $dom->saveHTML($dom->getElementsByTagName('body')->item(0)); + $string = $dom->saveHTML(); $string = strip_tags($string); return strlen($string); From 47a5a5c03a78e829ece69912deb78ad3e3af235e Mon Sep 17 00:00:00 2001 From: Domovoy Date: Mon, 23 Jul 2012 21:22:20 +0200 Subject: [PATCH 4/4] Supree the warning of DomDocument::loadHTML --- showmore/showmore.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/showmore/showmore.php b/showmore/showmore.php index 5b0f14a0..096fd3f7 100755 --- a/showmore/showmore.php +++ b/showmore/showmore.php @@ -70,7 +70,9 @@ function get_body_length($body) { $string = trim($body); // We need to get rid of hidden tags (display: none) - $dom = DomDocument::loadHTML($body); + + // Get rid of the warning. It would be better to have some valid html as input + $dom = @DomDocument::loadHTML($body); $xpath = new DOMXPath($dom); /*