Fix vcard folding at 75 chars; don't fold vcards for internal storage

release-0.6
thomascube 13 years ago
parent 5c4c06665c
commit 569f8306db

@ -551,7 +551,7 @@ class rcube_contacts extends rcube_addressbook
$words .= ' ' . self::normalize_string($value); $words .= ' ' . self::normalize_string($value);
} }
} }
$out['vcard'] = $vcard->export(); $out['vcard'] = $vcard->export(false);
foreach ($this->table_cols as $col) { foreach ($this->table_cols as $col) {
$key = $col; $key = $col;

@ -206,9 +206,10 @@ class rcube_vcard
/** /**
* Convert the data structure into a vcard 3.0 string * Convert the data structure into a vcard 3.0 string
*/ */
public function export() public function export($folded = true)
{ {
return self::rfc2425_fold(self::vcard_encode($this->raw)); $vcard = self::vcard_encode($this->raw);
return $folded ? self::rfc2425_fold($vcard) : $vcard;
} }
@ -465,17 +466,12 @@ class rcube_vcard
private static function rfc2425_fold_callback($matches) private static function rfc2425_fold_callback($matches)
{ {
// use mb string function if available
if (function_exists('mb_ereg_replace')) {
return ":\n " . mb_ereg_replace('(.{70})', "\\1\n ", $matches[1]);
}
// chunk_split string and avoid lines breaking multibyte characters // chunk_split string and avoid lines breaking multibyte characters
$c = 66; $c = 71;
$out = ":\n " . substr($matches[1], 0, $c); $out .= substr($matches[1], 0, $c);
for ($n = $c; $c < strlen($matches[1]); $c++) { for ($n = $c; $c < strlen($matches[1]); $c++) {
// break if length > 70 or mutlibyte character starts after position 66 // break if length > 75 or mutlibyte character starts after position 71
if ($n > 70 || ($n > 66 && ord($matches[1][$c]) >> 6 == 3)) { if ($n > 75 || ($n > 71 && ord($matches[1][$c]) >> 6 == 3)) {
$out .= "\n "; $out .= "\n ";
$n = 0; $n = 0;
} }
@ -486,9 +482,9 @@ class rcube_vcard
return $out; return $out;
} }
private static function rfc2425_fold($val) public static function rfc2425_fold($val)
{ {
return preg_replace_callback('/:([^\n]{72,})/', array('self', 'rfc2425_fold_callback'), $val) . "\n"; return preg_replace_callback('/([^\n]{72,})/', array('self', 'rfc2425_fold_callback'), $val);
} }

@ -32,7 +32,7 @@ header('Content-Disposition: attachment; filename="rcube_contacts.vcf"');
while ($result && ($row = $result->next())) { while ($result && ($row = $result->next())) {
// we already have a vcard record // we already have a vcard record
if ($row['vcard']) { if ($row['vcard']) {
echo $row['vcard'] . "\n"; echo rcube_vcard::rfc2425_fold($row['vcard']) . "\n";
} }
// copy values into vcard object // copy values into vcard object
else { else {
@ -46,7 +46,7 @@ while ($result && ($row = $result->next())) {
} }
} }
echo $vcard->export() . "\n"; echo $vcard->export(true) . "\n";
} }
} }

Loading…
Cancel
Save