* based upon NSFW from Mike Macgirvin * */ function showmore_install() { register_hook('prepare_body', 'addon/showmore/showmore.php', 'showmore_prepare_body'); register_hook('plugin_settings', 'addon/showmore/showmore.php', 'showmore_addon_settings'); register_hook('plugin_settings_post', 'addon/showmore/showmore.php', 'showmore_addon_settings_post'); } function showmore_uninstall() { unregister_hook('prepare_body', 'addon/showmore/showmore.php', 'showmore_prepare_body'); unregister_hook('plugin_settings', 'addon/showmore/showmore.php', 'showmore_addon_settings'); unregister_hook('plugin_settings_post', 'addon/showmore/showmore.php', 'showmore_addon_settings_post'); } function showmore_addon_settings(&$a,&$s) { if(! local_user()) return; /* Add our stylesheet to the page so we can make our settings look nice */ $a->page['htmlhead'] .= ''."\r\n"; $enable_checked = (intval(get_pconfig(local_user(),'showmore','disable')) ? '' : ' checked="checked"'); $chars = get_pconfig(local_user(),'showmore','chars'); if(!$chars) $chars = '1100'; $s .= '
'; $s .= '

' . t('"Show more" Settings').'

'; $s .= '
'; $s .= ''; $s .= ''; $s .= '
'; $s .= ''; $s .= ''; $s .= '
'; $s .= '
'; // $s .= '
' . t('Use /expression/ to provide regular expressions') . '
'; $s .= '
'; return; } function showmore_addon_settings_post(&$a,&$b) { if(! local_user()) return; if($_POST['showmore-submit']) { set_pconfig(local_user(),'showmore','chars',trim($_POST['showmore-chars'])); $enable = ((x($_POST,'showmore-enable')) ? intval($_POST['showmore-enable']) : 0); $disable = 1-$enable; set_pconfig(local_user(),'showmore','disable', $disable); info( t('Show More Settings saved.') . EOL); } } 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(); $string = strip_tags($string); return strlen($string); } function showmore_prepare_body(&$a,&$b) { $words = null; if(get_pconfig(local_user(),'showmore','disable')) return; $chars = (int)get_pconfig(local_user(),'showmore','chars'); if(!$chars) $chars = 1100; if (get_body_length($b['html']) > $chars) { $found = true; $shortened = trim(showmore_cutitem($b['html'], $chars))."..."; } if($found) { $rnd = random_string(8); $b['html'] = ''.$shortened." ". ''.sprintf(t('show more')).''. ''; } } function showmore_cutitem($text, $limit) { $text = trim($text); $text = mb_convert_encoding($text, 'HTML-ENTITIES', "UTF-8"); $text = substr($text, 0, $limit); $pos1 = strrpos($text, "<"); $pos2 = strrpos($text, ">"); $pos3 = strrpos($text, "&"); $pos4 = strrpos($text, ";"); if ($pos1 > $pos3) { if ($pos1 > $pos2) $text = substr($text, 0, $pos1); } else { if ($pos3 > $pos4) $text = substr($text, 0, $pos3); } $doc = new DOMDocument(); $doc->preserveWhiteSpace = false; $doctype = ''; @$doc->loadHTML($doctype."".$text.""); $text = $doc->saveHTML(); $text = str_replace(array("", "", $doctype), array("", "", ""), $text); return($text); }