X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=banana%2Fmisc.inc.php;h=8f334846c261d9f40f4eb4f275aef388a9e4b45b;hb=09f71105fb4d3afd464c92a4d5358d9c1440a602;hp=7a526ecdb20553e0c6402edac1a285a2105c01ed;hpb=e04e6059901219052f5ac34da1c7af393718d63b;p=banana.git diff --git a/banana/misc.inc.php b/banana/misc.inc.php index 7a526ec..8f33484 100644 --- a/banana/misc.inc.php +++ b/banana/misc.inc.php @@ -286,6 +286,19 @@ function displayshortcuts($first = -1) { * FORMATTING STUFF : BODY */ +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); @@ -301,18 +314,46 @@ function wrap($text, $_prefix="", $_force=false) $length = $banana->wrap; $max = $length + ($length/10); $splits = split("\n", $text); - $ret = -1; + $result = array(); + $next = array(); + $format = false; foreach ($splits as $line) { if ($_force || strlen($line) > $max) { - if (!preg_match("!^\\s*$url\\s*$!i", $line)) { - $cmd = "echo ".escapeshellarg($text)." | perl -MText::Autoformat -e 'autoformat {left=>1, right=>$length, all=>1 };'"; - exec($cmd, $result, $ret); - break; + 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 ($ret != 0) { - $result = $splits; + if ($format) { + $result = array_merge($result, autoformat(join("\n", $next))); + } else { + $result = array_merge($result, $next); } return $_prefix.join("\n$_prefix", $result).($_prefix ? '' : $sign); @@ -333,26 +374,32 @@ function formatbody($_text, $format='plain', $flowed=false) if ($format == 'html') { $res = '
'.html_entity_decode(to_entities(removeEvilTags($_text))).'
'; } else if ($format == 'richtext') { - $res = '
'.createlinks(html_entity_decode(to_entities(richtextToHtml($_text)))).'
'; - $format = 'html'; + $res = '
'.html_entity_decode(to_entities(richtextToHtml($_text))).'
'; } else { $res = "\n\n" . to_entities(wrap($_text, "", $flowed))."\n\n"; } - global $banana; - $url = $banana->url_regexp; - $res = preg_replace("/(<|>|")/", " \\1 ", $_text); - $res = preg_replace("!$url!ie", "'\\1'.cutlink('\\2').'\\3'", $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'.cutlink('\\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("@(

)\n?-- \n?(]*>|]*>)@", "\\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++) {
+        while (preg_match("@(^|
|\n)>@i", $res)) {
             $res  = preg_replace("@(^|
|\n)((>[^\n]*\n)+)@ie",
-                "'\\1
'"
+                "'\\1
'"
     		    .".stripslashes(preg_replace('@(^|
|\n)>[ \\t\\r]*@i', '\\1', '\\2'))"
 	    	    .".'
'",
 	            $res);