From 3ebac0167bf20104fb7a2a55934765117760264c Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Mon, 18 Aug 2014 03:53:18 -0400
Subject: [PATCH] Only add zen-mode text labels in compose step

---
 program/lib/Roundcube/rcube_csv2vcard.php |  119 +++++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 106 insertions(+), 13 deletions(-)

diff --git a/program/lib/Roundcube/rcube_csv2vcard.php b/program/lib/Roundcube/rcube_csv2vcard.php
index 9c28a3b..06bc387 100644
--- a/program/lib/Roundcube/rcube_csv2vcard.php
+++ b/program/lib/Roundcube/rcube_csv2vcard.php
@@ -47,7 +47,7 @@
         //'business_street_2'     => '',
         //'business_street_3'     => '',
         'car_phone'             => 'phone:car',
-        'categories'            => 'categories',
+        'categories'            => 'groups',
         //'children'              => '',
         'company'               => 'organization',
         //'company_main_phone'    => '',
@@ -56,7 +56,7 @@
         //'email_2_type'          => '',
         //'email_3_address'       => '', //@TODO
         //'email_3_type'          => '',
-        'email_address'         => 'email:main',
+        'email_address'         => 'email:pref',
         //'email_type'            => '',
         'first_name'            => 'firstname',
         'gender'                => 'gender',
@@ -124,6 +124,31 @@
         //'work_address_2'        => '',
         'work_country'          => 'country:work',
         'work_zipcode'          => 'zipcode:work',
+        'last'                  => 'surname',
+        'first'                 => 'firstname',
+        'work_city'             => 'locality:work',
+        'work_state'            => 'region:work',
+        'home_city_short'       => 'locality:home',
+        'home_state_short'      => 'region:home',
+
+        // Atmail
+        'date_of_birth'         => 'birthday',
+        'email'                 => 'email:pref',
+        'home_mobile'           => 'phone:cell',
+        'home_zip'              => 'zipcode:home',
+        'info'                  => 'notes',
+        'user_photo'            => 'photo',
+        'url'                   => 'website:homepage',
+        'work_company'          => 'organization',
+        'work_dept'             => 'departament',
+        'work_fax'              => 'phone:work,fax',
+        'work_mobile'           => 'phone:work,cell',
+        'work_title'            => 'jobtitle',
+        'work_zip'              => 'zipcode:work',
+        'group'                 => 'groups',
+
+        // GMail
+        'groups'                => 'groups',
     );
 
     /**
@@ -224,8 +249,30 @@
         'work_phone'        => "Work Phone",
         'work_address'      => "Work Address",
         //'work_address_2'    => "Work Address 2",
+        'work_city'         => "Work City",
         'work_country'      => "Work Country",
+        'work_state'        => "Work State",
         'work_zipcode'      => "Work ZipCode",
+
+        // Atmail
+        'date_of_birth'     => "Date of Birth",
+        'email'             => "Email",
+        //'email_2'         => "Email2",
+        //'email_3'         => "Email3",
+        //'email_4'         => "Email4",
+        //'email_5'         => "Email5",
+        'home_mobile'       => "Home Mobile",
+        'home_zip'          => "Home Zip",
+        'info'              => "Info",
+        'user_photo'        => "User Photo",
+        'url'               => "URL",
+        'work_company'      => "Work Company",
+        'work_dept'         => "Work Dept",
+        'work_fax'          => "Work Fax",
+        'work_mobile'       => "Work Mobile",
+        'work_title'        => "Work Title",
+        'work_zip'          => "Work Zip",
+        'groups'            => "Group",
     );
 
     protected $local_label_map = array();
@@ -262,7 +309,6 @@
     {
         // convert to UTF-8
         $head     = substr($csv, 0, 4096);
-        $fallback = rcube::get_instance()->config->get('default_charset', 'ISO-8859-1'); // fallback to Latin-1?
         $charset  = rcube_charset::detect($head, RCUBE_CHARSET);
         $csv      = rcube_charset::convert($csv, $charset);
         $head     = '';
@@ -270,14 +316,8 @@
         $this->map = array();
 
         // Parse file
-        foreach (preg_split("/[\r\n]+/", $csv) as $i => $line) {
-            $line = trim($line);
-            if (empty($line)) {
-                continue;
-            }
-
-            $elements = rcube_utils::explode_quoted_string(',', $line);
-
+        foreach (preg_split("/[\r\n]+/", $csv) as $line) {
+            $elements = $this->parse_line($line);
             if (empty($elements)) {
                 continue;
             }
@@ -305,6 +345,35 @@
     }
 
     /**
+     * Parse CSV file line
+     */
+    protected function parse_line($line)
+    {
+        $line = trim($line);
+        if (empty($line)) {
+            return null;
+        }
+
+        $fields = rcube_utils::explode_quoted_string(',', $line);
+
+        // remove quotes if needed
+        if (!empty($fields)) {
+            foreach ($fields as $idx => $value) {
+                if (($len = strlen($value)) > 1 && $value[0] == '"' && $value[$len-1] == '"') {
+                    // remove surrounding quotes
+                    $value = substr($value, 1, -1);
+                    // replace doubled quotes inside the string with single quote
+                    $value = str_replace('""', '"', $value);
+
+                    $fields[$idx] = $value;
+                }
+            }
+        }
+
+        return $fields;
+    }
+
+    /**
      * Parse CSV header line, detect fields mapping
      */
     protected function parse_header($elements)
@@ -324,6 +393,12 @@
         if (!empty($this->local_label_map)) {
             for ($i = 0; $i < $size; $i++) {
                 $label = $this->local_label_map[$elements[$i]];
+
+                // special localization label
+                if ($label && $label[0] == '_') {
+                    $label = substr($label, 1);
+                }
+
                 if ($label && !empty($this->csv2vcard_map[$label])) {
                     $map2[$i] = $this->csv2vcard_map[$label];
                 }
@@ -355,9 +430,18 @@
             $contact['birthday'] = $contact['birthday-y'] .'-' .$contact['birthday-m'] . '-' . $contact['birthday-d'];
         }
 
+        // categories/groups separator in vCard is ',' not ';'
+        if (!empty($contact['groups'])) {
+            $contact['groups'] = str_replace(';', ',', $contact['groups']);
+        }
+
+        // Empty dates, e.g. "0/0/00", "0000-00-00 00:00:00"
         foreach (array('birthday', 'anniversary') as $key) {
-            if (!empty($contact[$key]) && $contact[$key] == '0/0/00') { // @TODO: localization?
-                unset($contact[$key]);
+            if (!empty($contact[$key])) {
+                $date = preg_replace('/[0[:^word:]]/', '', $contact[$key]);
+                if (empty($date)) {
+                    unset($contact[$key]);
+                }
             }
         }
 
@@ -367,6 +451,15 @@
             }
         }
 
+        // Convert address(es) to rcube_vcard data
+        foreach ($contact as $idx => $value) {
+            $name = explode(':', $idx);
+            if (in_array($name[0], array('street', 'locality', 'region', 'zipcode', 'country'))) {
+                $contact['address:'.$name[1]][$name[0]] = $value;
+                unset($contact[$idx]);
+            }
+        }
+
         // Create vcard object
         $vcard = new rcube_vcard();
         foreach ($contact as $name => $value) {

--
Gitblit v1.9.1