X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=banana%2Fmisc.inc.php;h=f8df8709168cc9fe047e0d758ee8ae95ab49a44f;hb=76032c26b695305820448a33acd03e73cc502b41;hp=ea88ccd5db8bd3f6a78dfd2d9ea67348353679e0;hpb=382606fb71a6b0192c8b40d362b12d6b017ac144;p=banana.git diff --git a/banana/misc.inc.php b/banana/misc.inc.php index ea88ccd..f8df870 100644 --- a/banana/misc.inc.php +++ b/banana/misc.inc.php @@ -13,9 +13,100 @@ function _b_($str) { return utf8_decode(dgettext('banana', utf8_encode($str))); } -function to_html($str, $charset) { - require_once 'banana/utf8.php'; - return utf8entities(htmlentities(iconv($charset, 'utf8', $str), ENT_NOQUOTES, 'UTF-8')); +function to_entities($str) { + require_once dirname(__FILE__).'/utf8.php'; + return utf8entities(htmlentities($str, ENT_NOQUOTES, 'UTF-8')); +} + +function is_utf8($s) { return iconv('utf-8', 'utf-8', $s) == $s; } + +function textFormat_translate($format) +{ + switch (strtolower($format)) { + case 'plain': return _b_('Texte brut'); + case 'richtext': return _b_('Texte enrichi'); + case 'html': return _b_('HTML'); + default: return $format; + } +} + +/******************************************************************************** + * HTML STUFF + * Taken from php.net + */ + +/** + * @return string + * @param string + * @desc Strip forbidden tags and delegate tag-source check to removeEvilAttributes() + */ +function removeEvilTags($source) +{ + $allowedTags = '
)\n?-- \n?(
'; + $source = preg_replace('||i', '
', $source); + $source = strip_tags($source, $allowedTags); + return preg_replace('/<(.*?)>/ie', "'<'.removeEvilAttributes('\\1').'>'", $source); +} + +/** + * @return string + * @param string + * @desc Strip forbidden attributes from a tag + */ +function removeEvilAttributes($tagSource) +{ + $stripAttrib = 'javascript:|onclick|ondblclick|onmousedown|onmouseup|onmouseover|'. + 'onmousemove|onmouseout|onkeypress|onkeydown|onkeyup'; + return stripslashes(preg_replace("/$stripAttrib/i", '', $tagSource)); +} + +/** Convert html to plain text + */ +function htmlToPlainText($res) +{ + $res = trim(html_entity_decode(strip_tags($res, ''; @@ -205,17 +305,46 @@ function wrap($text, $_prefix="") return $_prefix.join("\n$_prefix", $result).($_prefix ? '' : $sign); } -function formatbody($_text) { - $res = "\n\n" . htmlentities(wrap($_text, ""))."\n\n"; +function formatbody($_text, $format='plain') +{ + if ($format == 'html') { + $res = ''))); + $res = preg_replace("@?(br|p|div)[^>]*>@i", "\n", $res); + if (!is_utf8($res)) { + $res = utf8_encode($res); + } + return $res; +} + +/******************************************************************************** + * RICHTEXT STUFF + */ + +/** Convert richtext to html + */ +function richtextToHtml($source) +{ + $tags = Array('bold' => 'b', + 'italic' => 'i', + 'smaller' => 'small', + 'bigger' => 'big', + 'underline' => 'u', + 'subscript' => 'sub', + 'superscript' => 'sup', + 'excerpt' => 'blockquote', + 'paragraph' => 'p', + 'nl' => 'br' + ); + + // clean unsupported tags + $protectedTags = '
<'.join('><', array_keys($tags)).'>'; + $source = strip_tags($source, $protectedTags); + + // convert richtext tags to html + foreach (array_keys($tags) as $tag) { + $source = preg_replace('@(?)'.$tag.'([^>]*>)@i', '\1'.$tags[$tag].'\2', $source); + } + + // some special cases + $source = preg_replace('@ @i', ' @i', '', $source); + $source = preg_replace('@
--
', $source); + $source = preg_replace('@@i', '<', $source); + $source = preg_replace('@ ]*>((?:[^<]|<(?!/comment>))*) @i', '', $source); + return removeEvilAttributes($source); } /******************************************************************************** @@ -33,6 +124,15 @@ function headerDecode($value) { return preg_replace('/=\?([^?]*)\?([BQ])\?([^?]*)\?=/e', '_headerdecode("\1", "\2", "\3")', $val); } +function headerEncode($value, $trim = 0) { + if ($trim) { + if (strlen($value) > $trim) { + $value = substr($value, 0, $trim) . "[...]"; + } + } + return "=?UTF-8?B?".base64_encode($value)."?="; +} + function header_translate($hdr) { switch ($hdr) { case 'from': return _b_('De'); @@ -173,10 +273,10 @@ function displayshortcuts($first = -1) { } } else { $res .= "[" - ._b_('Répondre')."] "; - if ($banana->post->checkcancel()) { + ._b_('Répondre')."] "; + if ($banana->post && $banana->post->checkcancel()) { $res .= "[" - ._b_('Annuler ce message')."] "; + ._b_('Annuler ce message')."] "; } } return $res.'
'.html_entity_decode(to_entities(removeEvilTags($_text))).'
'; + } else if ($format == 'richtext') { + $res = '
'.html_entity_decode(to_entities(richtextToHtml($_text))).'
'; + $format = 'html'; + } else { + $res = "\n\n" . to_entities(wrap($_text, ""))."\n\n"; + } $res = preg_replace("/(<|>|")/", " \\1 ", $res); - $res = preg_replace('/(["\[])?((https?|ftp|news):\/\/[a-z@0-9.~%$£µ&i#\-+=_\/\?]*)(["\]])?/i', "\\1\\2\\4", $res); + $res = preg_replace('/(["\[])?((https?|ftp|news):\/\/[a-z@0-9.~%$£µ&i#\-+=_\/\?]*)(["\]])?/i', '\1\2\4', $res); $res = preg_replace("/ (<|>|") /", "\\1", $res); - - $parts = preg_split("/\n-- ?\n/", $res); + + if ($format == 'html') { + $res = preg_replace("@(]*>|
]*>)@", "\\1
-- \\2", $res); + $res = preg_replace("@
]*>\n?-- \n?(]*>)@", "
--
\\2", $res); + $parts = preg_split("@(:?]*>\n?-- \n?
|
]*>\n?-- \n?
]*>)@", $res); + } else { + for ($i = 1 ; preg_match("@(^||\n)>@i", $res) ; $i++) { + $res = preg_replace("@(^||\n)((>[^\n]*\n)+)@ie", + "'\\1'" + .".stripslashes(preg_replace('@(^||\n)>[ \\t\\r]*@i', '\\1', '\\2'))" + .".''", + $res); + } + $res = preg_replace("@-- ?\n@", "\n-- \n", $res); + $parts = preg_split("/\n-- ?\n/", $res); + } if (count($parts) > 1) { - $sign = "" . array_pop($parts); - return join("\n-- \n", $parts).$sign; + $sign = array_pop($parts); + if ($format == 'html') { + $res = join('
--
', $parts); + $sign = '
'.$sign.'
'; + } else { + $res = join('\n-- \n', $parts); + $sign = ''.$sign; + } + return $res.$sign; } else { return $res; }