thomascube
2011-04-15 569f8306db3f61831795f15793b1c8f749f94779
Fix vcard folding at 75 chars; don't fold vcards for internal storage

3 files modified
30 ■■■■■ changed files
program/include/rcube_contacts.php 2 ●●● patch | view | raw | blame | history
program/include/rcube_vcard.php 24 ●●●●● patch | view | raw | blame | history
program/steps/addressbook/export.inc 4 ●●●● patch | view | raw | blame | history
program/include/rcube_contacts.php
@@ -551,7 +551,7 @@
                    $words .= ' ' . self::normalize_string($value);
            }
        }
        $out['vcard'] = $vcard->export();
        $out['vcard'] = $vcard->export(false);
        foreach ($this->table_cols as $col) {
            $key = $col;
program/include/rcube_vcard.php
@@ -206,9 +206,10 @@
  /**
   * 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,18 +466,13 @@
  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
    $c = 66;
    $out = ":\n " . substr($matches[1], 0, $c);
    $c = 71;
    $out .= substr($matches[1], 0, $c);
    for ($n = $c; $c < strlen($matches[1]); $c++) {
      // break if length > 70 or mutlibyte character starts after position 66
      if ($n > 70 || ($n > 66 && ord($matches[1][$c]) >> 6 == 3)) {
        $out .= "\n ";
      // break if length > 75 or mutlibyte character starts after position 71
      if ($n > 75 || ($n > 71 && ord($matches[1][$c]) >> 6 == 3)) {
        $out .= "\n  ";
        $n = 0;
      }
      $out .= $matches[1][$c];
@@ -486,9 +482,9 @@
    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);
  }
program/steps/addressbook/export.inc
@@ -32,7 +32,7 @@
while ($result && ($row = $result->next())) {
  // we already have a vcard record
  if ($row['vcard']) {
    echo $row['vcard'] . "\n";
    echo rcube_vcard::rfc2425_fold($row['vcard']) . "\n";
  }
  // copy values into vcard object
  else {
@@ -46,7 +46,7 @@
      }
    }
    echo $vcard->export() . "\n";
    echo $vcard->export(true) . "\n";
  }
}