X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=banana%2Fmisc.inc.php;h=f57ed8e4441d53d71312b35ac9bf1816e255deaf;hb=0b53e7e835c08e664f92a8443cc785714366e533;hp=410ec7e68577f7c61f496da721e7e74cdb76e5bd;hpb=1110246140290ef0ae49d1b39e23d2cb72e1192d;p=banana.git diff --git a/banana/misc.inc.php b/banana/misc.inc.php index 410ec7e..f57ed8e 100644 --- a/banana/misc.inc.php +++ b/banana/misc.inc.php @@ -14,7 +14,7 @@ function _b_($str) { return utf8_decode(dgettext('banana', utf8_encode($str))); } function to_entities($str) { - require_once 'banana/utf8.php'; + require_once dirname(__FILE__).'/utf8.php'; return utf8entities(htmlentities($str, ENT_NOQUOTES, 'UTF-8')); } @@ -35,14 +35,15 @@ function textFormat_translate($format) * Taken from php.net */ - /** +/** * @return string * @param string * @desc Strip forbidden tags and delegate tag-source check to removeEvilAttributes() */ function removeEvilTags($source) { - $allowedTags = '
'; + $allowedTags = '
)\n?-- \n?(
'; + $source = preg_replace('||i', '
', $source); $source = strip_tags($source, $allowedTags); return preg_replace('/<(.*?)>/ie', "'<'.removeEvilAttributes('\\1').'>'", $source); } @@ -59,19 +60,68 @@ function removeEvilAttributes($tagSource) return stripslashes(preg_replace("/$stripAttrib/i", '', $tagSource)); } +/** Convert html to plain text + */ +function htmlToPlainText($res) +{ + $res = trim(html_entity_decode(strip_tags($res, ''; @@ -236,7 +286,20 @@ function displayshortcuts($first = -1) { * FORMATTING STUFF : BODY */ -function wrap($text, $_prefix="") +function autoformat($text) +{ + global $banana; + $length = $banana->wrap; + + $cmd = "echo ".escapeshellarg($text)." | perl -MText::Autoformat -e 'autoformat {left=>1, right=>$length, all=>1 };'"; + exec($cmd, $result, $ret); + if ($ret != 0) { + $result = split("\n", $text); + } + return $result; +} + +function wrap($text, $_prefix="", $_force=false) { $parts = preg_split("/\n-- ?\n/", $text); if (count($parts) >1) { @@ -244,33 +307,111 @@ function wrap($text, $_prefix="") $text = join("\n-- \n", $parts); } else { $sign = ''; - $text = $text; } global $banana; + $url = $banana->url_regexp; $length = $banana->wrap; - $cmd = "echo ".escapeshellarg($text)." | perl -MText::Autoformat -e 'autoformat {left=>1, right=>$length, all=>1 };'"; - exec($cmd, $result); + $max = $length + ($length/10); + $splits = split("\n", $text); + $result = array(); + $next = array(); + $format = false; + foreach ($splits as $line) { + if ($_force || strlen($line) > $max) { + if (preg_match("!^(.*)($url)(.*)!i", $line, $matches) && strlen($matches[2]) > $length && strlen($matches) < 900) { + if (strlen($matches[1]) != 0) { + array_push($next, rtrim($matches[1])); + if (strlen($matches[1]) > $max) { + $format = true; + } + } + + if ($format) { + $result = array_merge($result, autoformat(join("\n", $next))); + } else { + $result = array_merge($result, $next); + } + $format = false; + $next = array(); + array_push($result, $matches[2]); + + if (strlen($matches[6]) != 0) { + array_push($next, ltrim($matches[6])); + if (strlen($matches[6]) > $max) { + $format = true; + } + } + } else { + $format = true; + array_push($next, $line); + } + } else { + array_push($next, $line); + } + } + if ($format) { + $result = array_merge($result, autoformat(join("\n", $next))); + } else { + $result = array_merge($result, $next); + } return $_prefix.join("\n$_prefix", $result).($_prefix ? '' : $sign); } -function formatbody($_text, $format='plain') +function cutlink($link) +{ + global $banana; + + if (strlen($link) > $banana->wrap) { + $link = substr($link, 0, $banana->wrap - 3)."..."; + } + return $link; +} + +function cleanurl($url) +{ + $url = str_replace('@', '%40', $url); + return ''.cutlink($url).''; +} + +function formatbody($_text, $format='plain', $flowed=false) { 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); +} + /******************************************************************************** * HEADER STUFF */ function _headerdecode($charset, $c, $str) { - $s = ($c == 'Q') ? quoted_printable_decode($str) : base64_decode($str); + $s = ($c == 'Q' || $c == 'q') ? quoted_printable_decode($str) : base64_decode($str); $s = iconv($charset, 'iso-8859-15', $s); return str_replace('_', ' ', $s); } function headerDecode($value) { - $val = preg_replace('/(=\?[^?]*\?[BQ]\?[^?]*\?=) (=\?[^?]*\?[BQ]\?[^?]*\?=)/', '\1\2', $value); - return preg_replace('/=\?([^?]*)\?([BQ])\?([^?]*)\?=/e', '_headerdecode("\1", "\2", "\3")', $val); + $val = preg_replace('/(=\?[^?]*\?[BQbq]\?[^?]*\?=) (=\?[^?]*\?[BQbq]\?[^?]*\?=)/', '\1\2', $value); + return preg_replace('/=\?([^?]*)\?([BQbq])\?([^?]*)\?=/e', '_headerdecode("\1", "\2", "\3")', $val); } function headerEncode($value, $trim = 0) { @@ -140,7 +190,7 @@ function formatDisplayHeader($_header,$_text) { return $rsl; case "x-face": - return ''; + return ''; default: if (function_exists('hook_formatDisplayHeader') @@ -223,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.'
'.removeEvilTags(html_entity_decode(to_entities($_text))).'
'; + $res = '
'.html_entity_decode(to_entities(removeEvilTags($_text))).'
'; + } else if ($format == 'richtext') { + $res = '
'.html_entity_decode(to_entities(richtextToHtml($_text))).'
'; } else { - $res = "\n\n" . to_entities(wrap($_text, ""))."\n\n"; + $res = "\n\n" . to_entities(wrap($_text, "", $flowed))."\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("/ (<|>|") /", "\\1", $res); + if ($format != 'html') { + global $banana; + $url = $banana->url_regexp; + $res = preg_replace("/(<|>|")/", " \\1 ", $res); + $res = preg_replace("!$url!ie", "'\\1'.cleanurl('\\2').'\\3'", $res); + $res = preg_replace('/(["\[])?(?:mailto:)?([a-z0-9.\-+_]+@[a-z0-9.\-+_]+)(["\]])?/i', '\1\2\3', $res); + $res = preg_replace("/ (<|>|") /", "\\1", $res); + + if ($format == 'richtext') { + $format = 'html'; + } + } + if ($format == 'html') { - $res = preg_replace("@(]*>|
)@", "\\1
-- \\2", $res); - $res = preg_replace("@
\n?-- \n?(]*>)@", "
--
\\2", $res); - $parts = preg_split("@(:?]*>\n?-- \n?
|
]*>\n?-- \n?
)@", $res); + $res = preg_replace("@()\n?-- ?\n?(]*>|
]*>)@", "\\1
-- \\2", $res); + $res = preg_replace("@
]*>\n?-- ?\n?(]*>)@", "
--
\\2", $res); + $res = preg_replace("@(]*>)\n?-- ?\n@", "
--
\\1", $res); + $parts = preg_split("@(:?]*>\n?-- ?\n?
|
]*>\n?-- ?\n?
]*>)@", $res); } else { + while (preg_match("@(^||\n)>@i", $res)) { + $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); } @@ -278,7 +419,7 @@ function formatbody($_text, $format='plain') $sign = array_pop($parts); if ($format == 'html') { $res = join('
--
', $parts); - $sign = '
'.$sign; + $sign = '
'.$sign.'
'; } else { $res = join('\n-- \n', $parts); $sign = ''.$sign;