41a37ba3c0957614f1754e7ee74cf4ee03613560
2 /********************************************************************************
3 * include/misc.inc.php : Misc functions
4 * -------------------------
6 * This file is part of the banana distribution
7 * Copyright: See COPYING files that comes with this distribution
8 ********************************************************************************/
10 /********************************************************************************
14 function _b_($str) { return utf8_decode(dgettext('banana', utf8_encode($str))); }
16 function to_html($str, $charset) {
17 require_once 'banana/utf8.php';
18 return utf8entities(htmlentities(iconv($charset, 'utf8', $str), ENT_NOQUOTES
, 'UTF-8'));
21 /********************************************************************************
25 function _headerdecode($charset, $c, $str) {
26 $s = ($c == 'Q') ?
quoted_printable_decode($str) : base64_decode($str);
27 $s = iconv($charset, 'iso-8859-15', $s);
28 return str_replace('_', ' ', $s);
31 function headerDecode($value) {
32 $val = preg_replace('/(=\?[^?]*\?[BQ]\?[^?]*\?=) (=\?[^?]*\?[BQ]\?[^?]*\?=)/', '\1\2', $value);
33 return preg_replace('/=\?([^?]*)\?([BQ])\?([^?]*)\?=/e', '_headerdecode("\1", "\2", "\3")', $val);
36 function header_translate($hdr) {
38 case 'from': return _b_('De');
39 case 'subject': return _b_('Sujet');
40 case 'newsgroups': return _b_('Forums');
41 case 'followup-to': return _b_('Suivi-à');
42 case 'date': return _b_('Date');
43 case 'organization': return _b_('Organisation');
44 case 'references': return _b_('Références');
45 case 'x-face': return _b_('Image');
47 if (function_exists('hook_headerTranslate')
48 && $res = hook_headerTranslate($hdr)) {
55 function formatDisplayHeader($_header,$_text) {
59 return formatDate($_text);
64 $groups = preg_split("/[\t ]*,[\t ]*/",$_text);
65 foreach ($groups as $g) {
66 $res.="<a href='?group=$g'>$g</a>, ";
68 return substr($res,0, -2);
71 return formatFrom($_text);
76 $text = str_replace("><","> <",$_text);
77 $text = preg_split("/[ \t]/",strtr($text,$banana->spool
->ids
));
78 $parents = preg_grep("/^\d+$/",$text);
79 $p = array_pop($parents);
84 $p = $banana->spool
->overview
[$p]->parent
;
86 foreach (array_reverse($par_ok) as $p) {
87 $rsl .= "<a href=\"?group={$banana->spool->group}&artid=$p\">$ndx</a> ";
93 return '<img src="xface.php?face='.base64_encode($_text).'" alt="x-face" />';
96 if (function_exists('hook_formatDisplayHeader')
97 && $res = hook_formatDisplayHeader($_header, $_text))
101 return htmlentities($_text);
105 /********************************************************************************
109 function formatDate($_text) {
110 return strftime("%A %d %B %Y, %H:%M (fuseau serveur)", strtotime($_text));
113 function fancyDate($stamp) {
114 $today = intval(time() / (24*3600));
115 $dday = intval($stamp / (24*3600));
117 if ($today == $dday) {
119 } elseif ($today == 1 +
$dday) {
120 $format = _b_('hier')." %H:%M";
121 } elseif ($today < 7 +
$dday) {
122 $format = '%a %H:%M';
124 $format = '%a %e %b';
126 return strftime($format, $stamp);
129 function formatFrom($text) {
130 # From: mark@cbosgd.ATT.COM
131 # From: mark@cbosgd.ATT.COM (Mark Horton)
132 # From: Mark Horton <mark@cbosgd.ATT.COM>
133 $mailto = '<a href="mailto:';
135 $result = htmlentities($text);
136 if (preg_match("/^([^ ]+)@([^ ]+)$/",$text,$regs)) {
137 $result="$mailto{$regs[1]}@{$regs[2]}\">".htmlentities($regs[1]."@".$regs[2])."</a>";
139 if (preg_match("/^([^ ]+)@([^ ]+) \((.*)\)$/",$text,$regs)) {
140 $result="$mailto{$regs[1]}@{$regs[2]}\">".htmlentities($regs[3])."</a>";
142 if (preg_match("/^\"?([^<>\"]+)\"? +<(.+)@(.+)>$/",$text,$regs)) {
143 $result="$mailto{$regs[2]}@{$regs[3]}\">".htmlentities($regs[1])."</a>";
145 return preg_replace("/\\\(\(|\))/","\\1",$result);
148 function displayshortcuts($first = -1) {
150 extract($banana->state
);
152 $res = '<div class="banana_scuts">';
153 $res .= '[<a href="?">'._b_('Liste des forums').'</a>] ';
154 if (is_null($group)) {
155 return $res.'[<a href="?subscribe=1">'._b_('Abonnements').'</a>]</div>';
158 $res .= "[<a href=\"?group=$group\">$group</a>] ";
160 if (is_null($artid)) {
161 $res .= "[<a href=\"?group=$group&action=new\">"._b_('Nouveau message')."</a>] ";
162 if (sizeof($banana->spool
->overview
)>$banana->tmax
) {
164 $n = intval(log(count($banana->spool
->overview
), 10))+
1;
165 for ($ndx=1; $ndx <= sizeof($banana->spool
->overview
); $ndx +
= $banana->tmax
) {
167 $fmt = "[%0{$n}u-%0{$n}u] ";
169 $fmt = "[<a href=\"?group=$group&first=$ndx\">%0{$n}u-%0{$n}u</a>] ";
171 $res .= sprintf($fmt, $ndx, min($ndx+
$banana->tmax
-1,sizeof($banana->spool
->overview
)));
175 $res .= "[<a href=\"?group=$group&artid=$artid&action=new\">"
176 ._b_('Répondre')."</a>] ";
177 if ($banana->post
->checkcancel()) {
178 $res .= "[<a href=\"?group=$group&artid=$artid&action=cancel\">"
179 ._b_('Annuler ce message')."</a>] ";
182 return $res.'</div>';
185 /********************************************************************************
186 * FORMATTING STUFF : BODY
189 function wrap($text, $_prefix="")
191 $parts = preg_split("/\n-- ?\n/", $text);
192 if (count($parts) >1) {
193 $sign = "\n-- \n" . array_pop($parts);
194 $text = join("\n-- \n", $parts);
201 $length = $banana->wrap
;
202 $cmd = "echo ".escapeshellarg($text)." | perl -MText::Autoformat -e 'autoformat {left=>1, right=>$length, all=>1 };'";
205 return $_prefix.join("\n$_prefix", $result).($_prefix ?
'' : $sign);
208 function formatbody($_text) {
209 $res = "\n\n" . wrap($_text, "")."\n\n";
210 $res = preg_replace("/(<|>|")/", " \\1 ", $res);
211 $res = preg_replace('/(["\[])?((https?|ftp|news):\/\/[a-z@0-9.~%$£µ&i#\-+=_\/\?]*)(["\]])?/i', "\\1<a href=\"\\2\">\\2</a>\\4", $res);
212 $res = preg_replace("/ (<|>|") /", "\\1", $res);
214 $parts = preg_split("/\n-- ?\n/", $res);
216 if (count($parts) > 1) {
217 $sign = "</pre><hr style='width: 100%; margin: 1em 0em; ' /><pre>" . array_pop($parts);
218 return join("\n-- \n", $parts).$sign;