X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=banana%2Fmisc.inc.php;h=8f334846c261d9f40f4eb4f275aef388a9e4b45b;hb=09f71105fb4d3afd464c92a4d5358d9c1440a602;hp=9b568d82a767292992d5f3a8d095c91025814814;hpb=940ae667f3ed96e2e3eed46a741421c5ea04440e;p=banana.git diff --git a/banana/misc.inc.php b/banana/misc.inc.php index 9b568d8..8f33484 100644 --- a/banana/misc.inc.php +++ b/banana/misc.inc.php @@ -42,7 +42,8 @@ function textFormat_translate($format) */ function removeEvilTags($source) { - $allowedTags = '



  • '; + $allowedTags = '



    • '; + $source = preg_replace('||i', '
      ', $source); $source = strip_tags($source, $allowedTags); return preg_replace('/<(.*?)>/ie', "'<'.removeEvilAttributes('\\1').'>'", $source); } @@ -63,8 +64,8 @@ function removeEvilAttributes($tagSource) */ function htmlToPlainText($res) { - $res = trim(html_entity_decode(strip_tags($res, '
      '))); - $res = preg_replace("@]>@i", "\n", $res); + $res = trim(html_entity_decode(strip_tags($res, '

      '; @@ -285,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) { @@ -293,36 +307,104 @@ 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 formatbody($_text, $format='plain', $flowed=false) { if ($format == 'html') { - $res = '
      '.removeEvilTags($_text).'
      '; + $res = '
      '.html_entity_decode(to_entities(removeEvilTags($_text))).'
      '; } else if ($format == 'richtext') { - $res = '
      '.richtextToHtml($_text).'
      '; - $format = 'html'; + $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'.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); + $res = preg_replace("@(

      )\n?-- \n?(]*>|]*>)@", "\\1
      -- \\2", $res); + $res = preg_replace("@]*>\n?-- \n?(]*>)@", "
      --
      \\2", $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);
           }
       
      @@ -330,7 +412,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;