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'));
}
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 = '<h1><b><i><a><ul><li><pre><hr><blockquote><img><br><font><p><small><big><sup><sub><code><em>';
+ $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, '<br><p>')));
+ $res = preg_replace("@</?(br|p)[^>]*>@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 = '<signature><lt><comment><'.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('@<signature>@i', '<br>-- <br>', $source);
+ $source = preg_replace('@</signature>@i', '', $source);
+ $source = preg_replace('@<lt>@i', '<', $source);
+ $source = preg_replace('@<comment[^>]*>((?:[^<]|<(?!/comment>))*)</comment>@i', '<!-- \1 -->', $source);
+ return removeEvilAttributes($source);
+}
+
/********************************************************************************
* HEADER STUFF
*/
function headerEncode($value, $trim = 0) {
if ($trim) {
- $value = substr($value, $trim) . "[...]";
+ if (strlen($value) > $trim) {
+ $value = substr($value, 0, $trim) . "[...]";
+ }
}
return "=?UTF-8?B?".base64_encode($value)."?=";
}
} else {
$res .= "[<a href=\"?group=$group&artid=$artid&action=new\">"
._b_('Répondre')."</a>] ";
- if ($banana->post->checkcancel()) {
+ if ($banana->post && $banana->post->checkcancel()) {
$res .= "[<a href=\"?group=$group&artid=$artid&action=cancel\">"
._b_('Annuler ce message')."</a>] ";
}
return $_prefix.join("\n$_prefix", $result).($_prefix ? '' : $sign);
}
-function formatbody($_text) {
- $res = "\n\n" . to_entities(wrap($_text, ""))."\n\n";
+function formatbody($_text, $format='plain')
+{
+ if ($format == 'html') {
+ $res = '<br/>'.removeEvilTags($_text).'<br/>';
+ } else if ($format == 'richtext') {
+ $res = '<br/>'.richtextToHtml($_text).'<br/>';
+ $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<a href=\"\\2\">\\2</a>\\4", $res);
$res = preg_replace("/ (<|>|") /", "\\1", $res);
-
- $parts = preg_split("/\n-- ?\n/", $res);
+
+ if ($format == 'html') {
+ $res = preg_replace("@(</p>)\n?-- \n?(<p[^>]*>|<br>)@", "\\1<br>-- \\2", $res);
+ $res = preg_replace("@<br>\n?-- \n?(<p[^>]*>)@", "<br>-- <br>\\2", $res);
+ $parts = preg_split("@(:?<p[^>]*>\n?-- \n?</p>|<br[^>]*>\n?-- \n?<br>)@", $res);
+ } else {
+ $parts = preg_split("/\n-- ?\n/", $res);
+ }
if (count($parts) > 1) {
- $sign = "</pre><hr style='width: 100%; margin: 1em 0em; ' /><pre>" . array_pop($parts);
- return join("\n-- \n", $parts).$sign;
+ $sign = array_pop($parts);
+ if ($format == 'html') {
+ $res = join('<br/>-- <br/>', $parts);
+ $sign = '<hr style="width: 100%; margin: 1em 0em; " />'.$sign;
+ } else {
+ $res = join('\n-- \n', $parts);
+ $sign = '</pre><hr style="width: 100%; margin: 1em 0em; " /><pre>'.$sign;
+ }
+ return $res.$sign;
} else {
return $res;
}