diff options
author | Michael <icarus@dabo.de> | 2012-02-19 20:36:59 +0100 |
---|---|---|
committer | Michael <icarus@dabo.de> | 2012-02-19 20:36:59 +0100 |
commit | 31653aef64c94ade956b552dad65bfe15f0ad491 (patch) | |
tree | f79bd0d84484910a5b545d62946711ba0550c54b /include/html2bbcode.php | |
parent | 4713069e68e163971f2625500f9006501e59bd04 (diff) | |
download | volse-hubzilla-31653aef64c94ade956b552dad65bfe15f0ad491.tar.gz volse-hubzilla-31653aef64c94ade956b552dad65bfe15f0ad491.tar.bz2 volse-hubzilla-31653aef64c94ade956b552dad65bfe15f0ad491.zip |
Brand new html2bbcode. Some other changes in diaspora to bbcode handling
Diffstat (limited to 'include/html2bbcode.php')
-rwxr-xr-x | include/html2bbcode.php | 390 |
1 files changed, 271 insertions, 119 deletions
diff --git a/include/html2bbcode.php b/include/html2bbcode.php index 8025c336b..1b4b5e99a 100755 --- a/include/html2bbcode.php +++ b/include/html2bbcode.php @@ -1,127 +1,279 @@ <?php +/* +html2bbcode.php +Converter for HTML to BBCode +Made by: ike@piratenpartei.de +Originally made for the syncom project: http://wiki.piratenpartei.de/Syncom + https://github.com/annando/Syncom +*/ -/** - * html2bbcode - */ - - -function html2bbcode($s) { - - - // only keep newlines from source that are within pre tags - - $s = stripnl_exceptinpre($s); - - - // Tags to Find - - $htmltags = array( - '/\<pre\>(.*?)\<\/pre\>/is', - '/\<p(.*?)\>/is', - '/\<\/p\>/is', - '/\<b\>(.*?)\<\/b\>/is', - '/\<i\>(.*?)\<\/i\>/is', - '/\<u\>(.*?)\<\/u\>/is', - '/\<ul\>(.*?)\<\/ul\>/is', - '/\<li\>(.*?)\<\/li\>/is', - '/\<img(.*?)width: *([0-9]+)(.*?)height: *([0-9]+)(.*?)src=\"(.*?)\" (.*?)\>/is', - '/\<img(.*?)height: *([0-9]+)(.*?)width: *([0-9]+)(.*?)src=\"(.*?)\" (.*?)\>/is', - '/\<img(.*?)src=\"(.*?)\"(.*?)width: *([0-9]+)(.*?)height: *([0-9]+)(.*?)\>/is', - '/\<img(.*?)src=\"(.*?)\"(.*?)height: *([0-9]+)(.*?)width: *([0-9]+)(.*?)\>/is', - '/\<img(.*?) src=\"(.*?)\" (.*?)\>/is', - '/\<div(.*?)\>(.*?)\<\/div\>/is', - '/\<br(.*?)\>/is', - '/\<strong\>(.*?)\<\/strong\>/is', - '/\<a (.*?)href=\"(.*?)\"(.*?)\>(.*?)\<\/a\>/is', - '/\<code\>(.*?)\<\/code\>/is', - '/\<span style=\"color:(.*?)\"\>(.*?)\<\/span\>/is', - '/\<span style=\"font-size:(.*?)\"\>(.*?)\<\/span\>/is', - '/\<blockquote\>(.*?)\<\/blockquote\>/is', - '/\<video(.*?) src=\"(.*?)\" (.*?)\>(.*?)\<\/video\>/is', - '/\<audio(.*?) src=\"(.*?)\" (.*?)\>(.*?)\<\/audio\>/is', - '/\<iframe(.*?) src=\"(.*?)\" (.*?)\>(.*?)\<\/iframe\>/is', - - ); - - // Replace with - - $bbtags = array( - '[code]$1[/code]', - '', - "\n", - '[b]$1[/b]', - '[i]$1[/i]', - '[u]$1[/u]', - '[list]$1[/list]', - '[*]$1', - '[img=$2x$4]$6[/img]', - '[img=$4x$2]$6[/img]', - '[img=$4x$6]$2[/img]', - '[img=$6x$4]$2[/img]', - '[img]$2[/img]', - '$2', - "\n", - '[b]$1[/b]', - '[url=$2]$4[/url]', - '[code]$1[/code]', - '[color="$1"]$2[/color]', - '[size=$1]$2[/size]', - '[quote]$1[/quote]', - '[video]$1[/video]', - '[audio]$1[/audio]', - '[iframe]$1[/iframe]', - ); - - // Replace $htmltags in $text with $bbtags - $text = preg_replace ($htmltags, $bbtags, $s); - - call_hooks('html2bbcode', $text); - - // Strip all other HTML tags - $text = strip_tags($text); - return $text; +function node2bbcode(&$doc, $oldnode, $attributes, $startbb, $endbb) +{ + do { + $done = node2bbcodesub(&$doc, $oldnode, $attributes, $startbb, $endbb); + } while ($done); +} + +function node2bbcodesub(&$doc, $oldnode, $attributes, $startbb, $endbb) +{ + $savestart = str_replace('$', '%', $startbb); + $replace = false; + + $xpath = new DomXPath($doc); + + $list = $xpath->query("//".$oldnode); + foreach ($list as $oldNode) { + + $attr = array(); + if ($oldNode->attributes->length) + foreach ($oldNode->attributes as $attribute) + $attr[$attribute->name] = $attribute->value; + + $replace = true; + + $startbb = $savestart; + + $i = 0; + + foreach ($attributes as $attribute => $value) { + + $startbb = str_replace('%'.++$i, '$1', $startbb); + + if (strpos('*'.$startbb, '$1') > 0) { + + if ($replace and (@$attr[$attribute] != '')) { + + $startbb = preg_replace($value, $startbb, $attr[$attribute], -1, $count); + + // If nothing could be changed + if ($count == 0) + $replace = false; + } else + $replace = false; + } else { + if (@$attr[$attribute] != $value) + $replace = false; + } + } + + if ($replace) { + $StartCode = $oldNode->ownerDocument->createTextNode($startbb); + $EndCode = $oldNode->ownerDocument->createTextNode($endbb); + + $oldNode->parentNode->insertBefore($StartCode, $oldNode); + if ($oldNode->hasChildNodes()) { + foreach ($oldNode->childNodes as $child) { + $newNode = $child->cloneNode(true); + $oldNode->parentNode->insertBefore($newNode, $oldNode); + } + } + + $oldNode->parentNode->insertBefore($EndCode, $oldNode); + $oldNode->parentNode->removeChild($oldNode); + } + } + return($replace); } -function stripnl_exceptinpre($string) +function deletenode(&$doc, $node) { - // First, check for <pre> tag - if(strpos($string, '<pre>') === false) - { - return str_replace("\n","", $string); - } - - // If there is a <pre>, we have to split by line - // and manually replace the linebreaks - - $strArr=explode("\n", $string); - - $output=""; - $preFound=false; - - // Loop over each line - foreach($strArr as $line) - { // See if the line has a <pre>. If it does, set $preFound to true - if(strpos($line, "<pre>") !== false) - { - $preFound=true; - } - elseif(strpos($line, "</pre>") !== false) - { - $preFound=false; - } - - // If we are in a pre tag, add line and also add \n, else add the line without \n - if($preFound) - { - $output .= $line . "\n"; - } - else - { - $output .= $line ; - } - } - - return $output; + $xpath = new DomXPath($doc); + $list = $xpath->query("//".$node); + foreach ($list as $child) + $child->parentNode->removeChild($child); } +function html2bbcode($message) +{ + + //$file = tempnam("/tmp/", "html"); + //file_put_contents($file, $message); + + $message = str_replace("\r", "", $message); + + $message = str_replace(array( + "<li><p>", + "</p></li>"), + array( + "<li>", + "</li>"), + $message); + + // remove namespaces + $message = preg_replace('=<(\w+):(.+?)>=', '<removeme>', $message); + $message = preg_replace('=</(\w+):(.+?)>=', '</removeme>', $message); + + $doc = new DOMDocument(); + $doc->preserveWhiteSpace = false; + + $message = mb_convert_encoding($message, 'HTML-ENTITIES', "UTF-8"); + + @$doc->loadHTML($message); + + deletenode($doc, 'style'); + deletenode($doc, 'head'); + deletenode($doc, 'title'); + deletenode($doc, 'meta'); + deletenode($doc, 'xml'); + deletenode($doc, 'removeme'); + + $xpath = new DomXPath($doc); + $list = $xpath->query("//pre"); + foreach ($list as $node) + $node->nodeValue = str_replace("\n", "\r", $node->nodeValue); + + $message = $doc->saveHTML(); + $message = str_replace(array("\n<", ">\n", "\r", "\n", "\xC3\x82\xC2\xA0"), array("<", ">", "<br>", " ", ""), $message); + $message = preg_replace('= [\s]*=i', " ", $message); + @$doc->loadHTML($message); + + node2bbcode($doc, 'html', array(), "", ""); + node2bbcode($doc, 'body', array(), "", ""); + + // Outlook-Quote - Variant 1 + node2bbcode($doc, 'p', array('class'=>'MsoNormal', 'style'=>'margin-left:35.4pt'), '[quote]', '[/quote]'); + + // Outlook-Quote - Variant 2 + node2bbcode($doc, 'div', array('style'=>'border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'), '[quote]', '[/quote]'); + + // MyBB-Stuff + node2bbcode($doc, 'span', array('style'=>'text-decoration: underline;'), '[u]', '[/u]'); + node2bbcode($doc, 'span', array('style'=>'font-style: italic;'), '[i]', '[/i]'); + node2bbcode($doc, 'span', array('style'=>'font-weight: bold;'), '[b]', '[/b]'); + + node2bbcode($doc, 'font', array('face'=>'/([\w ]+)/', 'size'=>'/(\d+)/', 'color'=>'/(.+)/'), '[font=$1][size=$2][color=$3]', '[/color][/size][/font]'); + node2bbcode($doc, 'font', array('size'=>'/(\d+)/', 'color'=>'/(.+)/'), '[size=$1][color=$2]', '[/color][/size]'); + node2bbcode($doc, 'font', array('face'=>'/([\w ]+)/', 'size'=>'/(.+)/'), '[font=$1][size=$2]', '[/size][/font]'); + node2bbcode($doc, 'font', array('face'=>'/([\w ]+)/', 'color'=>'/(.+)/'), '[font=$1][color=$3]', '[/color][/font]'); + node2bbcode($doc, 'font', array('face'=>'/([\w ]+)/'), '[font=$1]', '[/font]'); + node2bbcode($doc, 'font', array('size'=>'/(\d+)/'), '[size=$1]', '[/size]'); + node2bbcode($doc, 'font', array('color'=>'/(.+)/'), '[color=$1]', '[/color]'); + + node2bbcode($doc, 'span', array('style'=>'/.*color:\s*(.+?)[,;].*/'), '[color="$1"]', '[/color]'); + node2bbcode($doc, 'span', array('style'=>'/.*font-size:\s*(\d+)/'), '[size=$1]', '[/size]'); + + //node2bbcode($doc, 'span', array('style'=>'/.*font-family:\s*(.+?)[,;].*/'), '[font=$1]', '[/font]'); + //node2bbcode($doc, 'div', array('style'=>'/.*font-family:\s*(.+?)[,;].*font-size:\s*(\d+?)pt.*/'), '[font=$1][size=$2]', '[/size][/font]'); + //node2bbcode($doc, 'div', array('style'=>'/.*font-family:\s*(.+?)[,;].*font-size:\s*(\d+?)px.*/'), '[font=$1][size=$2]', '[/size][/font]'); + //node2bbcode($doc, 'div', array('style'=>'/.*font-family:\s*(.+?)[,;].*/'), '[font=$1]', '[/font]'); + + node2bbcode($doc, 'strong', array(), '[b]', '[/b]'); + node2bbcode($doc, 'em', array(), '[i]', '[/i]'); + node2bbcode($doc, 'b', array(), '[b]', '[/b]'); + node2bbcode($doc, 'i', array(), '[i]', '[/i]'); + node2bbcode($doc, 'u', array(), '[u]', '[/u]'); + + node2bbcode($doc, 'big', array(), "[size=large]", "[/size]"); + node2bbcode($doc, 'small', array(), "[size=small]", "[/size]"); + + node2bbcode($doc, 'blockquote', array(), '[quote]', '[/quote]'); + + node2bbcode($doc, 'br', array(), "\n", ''); + + node2bbcode($doc, 'p', array('class'=>'MsoNormal'), "\n", ""); + node2bbcode($doc, 'div', array('class'=>'MsoNormal'), "\r", ""); + + node2bbcode($doc, 'span', array(), "", ""); + + node2bbcode($doc, 'span', array(), "", ""); + node2bbcode($doc, 'pre', array(), "", ""); + node2bbcode($doc, 'div', array(), "\r", "\r"); + node2bbcode($doc, 'p', array(), "\n", "\n"); + + node2bbcode($doc, 'ul', array(), "[list]", "[/list]"); + node2bbcode($doc, 'ol', array(), "[list=1]", "[/list]"); + node2bbcode($doc, 'li', array(), "[*]", ""); + + node2bbcode($doc, 'hr', array(), "[hr]", ""); + + node2bbcode($doc, 'table', array(), "", ""); + node2bbcode($doc, 'tr', array(), "\n", ""); + node2bbcode($doc, 'td', array(), "\t", ""); + + node2bbcode($doc, 'h1', array(), "\n\n[size=xx-large][b]", "[/b][/size]\n"); + node2bbcode($doc, 'h2', array(), "\n\n[size=x-large][b]", "[/b][/size]\n"); + node2bbcode($doc, 'h3', array(), "\n\n[size=large][b]", "[/b][/size]\n"); + node2bbcode($doc, 'h4', array(), "\n\n[size=medium][b]", "[/b][/size]\n"); + node2bbcode($doc, 'h5', array(), "\n\n[size=small][b]", "[/b][/size]\n"); + node2bbcode($doc, 'h6', array(), "\n\n[size=x-small][b]", "[/b][/size]\n"); + + node2bbcode($doc, 'a', array('href'=>'/(.+)/'), '[url=$1]', '[/url]'); + + node2bbcode($doc, 'img', array('src'=>'/(.+)/', 'width'=>'/(\d+)/', 'height'=>'/(\d+)/'), '[img$2x$3]$1', '[/img]'); + node2bbcode($doc, 'img', array('src'=>'/(.+)/'), '[img]$1', '[/img]'); + + + node2bbcode($doc, 'video', array('src'=>'/(.+)/'), '[video]$1', '[/video]'); + node2bbcode($doc, 'audio', array('src'=>'/(.+)/'), '[audio]$1', '[/audio]'); + node2bbcode($doc, 'iframe', array('src'=>'/(.+)/'), '[iframe]$1', '[/iframe]'); + + node2bbcode($doc, 'code', array(), '[code]$1', '[/code]'); + + $message = $doc->saveHTML(); + + // I'm removing something really disturbing + // Don't know exactly what it is + $message = str_replace(chr(194).chr(160), ' ', $message); + + $message = str_replace(" ", " ", $message); + + // removing multiple DIVs + $message = preg_replace('=\r *\r=i', "\n", $message); + $message = str_replace("\r", "\n", $message); + + call_hooks('html2bbcode', $message); + + $message = strip_tags($message); + + $message = html_entity_decode($message, ENT_QUOTES, 'UTF-8'); + + $message = str_replace(array("<"), array("<"), $message); + + // remove quotes if they don't make sense + $message = preg_replace('=\[/quote\][\s]*\[quote\]=i', "\n", $message); + + $message = preg_replace('=\[quote\]\s*=i', "[quote]", $message); + $message = preg_replace('=\s*\[/quote\]=i', "[/quote]", $message); + + do { + $oldmessage = $message; + $message = str_replace("\n \n", "\n\n", $message); + } while ($oldmessage != $message); + + do { + $oldmessage = $message; + $message = str_replace("\n\n\n", "\n\n", $message); + } while ($oldmessage != $message); + + $message = str_replace(array( + "[/size]\n\n", + "\n\n[hr]\n", + "\n[hr]\n\n", + "\n\n[list", + "[/list]\n\n", + "\n[/list]", + "[list]\n", + "[list=1]\n", + "\n\n[*]"), + array( + "[/size]\n", + "\n[hr]\n", + "\n[hr]\n", + "\n[list", + "[/list]\n", + "[/list]", + "[list]", + "[list=1]", + "\n[*]"), + $message); + + $message = str_replace(array('[b][b]', '[/b][/b]', '[i][i]', '[/i][/i]'), + array('[b]', '[/b]', '[i]', '[/i]'), $message); + + // Handling Yahoo style of mails + $message = str_replace('[hr][b]From:[/b]', '[quote][b]From:[/b]', $message); + + return(trim($message)); +} +?> |