| | |
| | | $this->email[0] = $this->email[$pref_index]; |
| | | $this->email[$pref_index] = $tmp; |
| | | } |
| | | |
| | | // fix broken vcards from Outlook that only supply ORG but not the required N or FN properties |
| | | if (!strlen(trim($this->displayname . $this->surname . $this->firstname)) && strlen($this->organization)) { |
| | | $this->displayname = $this->organization; |
| | | } |
| | | } |
| | | |
| | | /** |
| | |
| | | default: |
| | | if ($field == 'phone' && $this->phonetypemap[$type_uc]) { |
| | | $type = $this->phonetypemap[$type_uc]; |
| | | } |
| | | } |
| | | |
| | | if (($tag = self::$fieldmap[$field]) && (is_array($value) || strlen($value))) { |
| | | $index = count($this->raw[$tag]); |
| | |
| | | */ |
| | | public static function cleanup($vcard) |
| | | { |
| | | // Convert special types (like Skype) to normal type='skype' classes with this simple regex ;) |
| | | $vcard = preg_replace( |
| | | '/item(\d+)\.(TEL|EMAIL|URL)([^:]*?):(.*?)item\1.X-ABLabel:(?:_\$!<)?([\w-() ]*)(?:>!\$_)?./s', |
| | | '\2;type=\5\3:\4', |
| | | $vcard); |
| | | |
| | | // convert Apple X-ABRELATEDNAMES into X-* fields for better compatibility |
| | | $vcard = preg_replace_callback( |
| | | '/item(\d+)\.(X-ABRELATEDNAMES)([^:]*?):(.*?)item\1.X-ABLabel:(?:_\$!<)?([\w-() ]*)(?:>!\$_)?./s', |
| | | array('self', 'x_abrelatednames_callback'), |
| | | $vcard); |
| | | |
| | | // Remove cruft like item1.X-AB*, item1.ADR instead of ADR, and empty lines |
| | | $vcard = preg_replace(array('/^item\d*\.X-AB.*$/m', '/^item\d*\./m', "/\n+/"), array('', '', "\n"), $vcard); |
| | | // Cleanup |
| | | $vcard = preg_replace(array( |
| | | // convert special types (like Skype) to normal type='skype' classes with this simple regex ;) |
| | | '/item(\d+)\.(TEL|EMAIL|URL)([^:]*?):(.*?)item\1.X-ABLabel:(?:_\$!<)?([\w-() ]*)(?:>!\$_)?./s', |
| | | '/^item\d*\.X-AB.*$/m', // remove cruft like item1.X-AB* |
| | | '/^item\d*\./m', // remove item1.ADR instead of ADR |
| | | '/\n+/', // remove empty lines |
| | | '/^(N:[^;\R]*)$/m', // if N doesn't have any semicolons, add some |
| | | ), |
| | | array( |
| | | '\2;type=\5\3:\4', |
| | | '', |
| | | '', |
| | | "\n", |
| | | '\1;;;;', |
| | | ), $vcard); |
| | | |
| | | // convert X-WAB-GENDER to X-GENDER |
| | | if (preg_match('/X-WAB-GENDER:(\d)/', $vcard, $matches)) { |
| | | $value = $matches[1] == '2' ? 'male' : 'female'; |
| | | $vcard = preg_replace('/X-WAB-GENDER:\d/', 'X-GENDER:' . $value, $vcard); |
| | | } |
| | | |
| | | // if N doesn't have any semicolons, add some |
| | | $vcard = preg_replace('/^(N:[^;\R]*)$/m', '\1;;;;', $vcard); |
| | | |
| | | return $vcard; |
| | | } |
| | |
| | | $enc = null; |
| | | |
| | | foreach($regs2[1] as $attrid => $attr) { |
| | | $attr = preg_replace('/[\s\t\n\r\0\x0B]/', '', $attr); |
| | | if ((list($key, $value) = explode('=', $attr)) && $value) { |
| | | $value = trim($value); |
| | | if ($key == 'ENCODING') { |
| | | $value = strtoupper($value); |
| | | // add next line(s) to value string if QP line end detected |
| | |
| | | return $result; |
| | | } |
| | | |
| | | $s = strtr($s, $rep2); |
| | | $s = trim(strtr($s, $rep2)); |
| | | } |
| | | |
| | | // some implementations (GMail) use non-standard backslash before colon (#1489085) |