JS: vCard parser

more at: https://github.com/comoyo/vcfparser https://github.com/nilclass/vcardjs https://github.com/muff/vCard.js

HTML

<pre>BEGIN:VCARD
VERSION:2.1
N:Albert;Yannick;;
FN:Yannick Albert
ORG:ARTsinn
TITLE:CEO
TEL;CELL;VOICE:+49 1525 1333833
ADR;WORK:;;Fockstr. 31;Kiel;SH;24114;Deutschland
LABEL;WORK;ENCODING=QUOTED-PRINTABLE:ARTsinn=0D=0A=
 Yannick Albert=0D=0A=
 Fockstr. 31=0D=0A=
 24114 Kiel, SH, Deutschland
ADR;HOME:;Fockstr. 31;;Kiel;SH;24114;Deutschland
LABEL;HOME;ENCODING=QUOTED-PRINTABLE: Yannick Albert=0D=0A=
 Fockstr. 31=0D=0A=
 24114 Kiel, SH, Deutschland
X-WAB-GENDER:2
URL;HOME:http://yckart.com/
URL;WORK:http://artsinn.de/
BDAY:19911008
EMAIL;PREF;INTERNET:[email protected]
REV:20130619T014947Z
END:VCARD</pre>

JavaScript

function parse(input) {
    var Re1 = /^(version|fn|title|org):(.+)$/i;
    var Re2 = /^([^:;]+);([^:]+):(.+)$/;
    var ReKey = /item\d{1,2}\./;
    var fields = {};

    input.split(/\r\n|\r|\n/).forEach(function (line) {
        var results, key;

        if (Re1.test(line)) {
            results = line.match(Re1);
            key = results[1].toLowerCase();
            fields[key] = results[2];
        } else if (Re2.test(line)) {
            results = line.match(Re2);
            key = results[1].replace(ReKey, '').toLowerCase();

            var meta = {};
            results[2].split(';')
                .map(function (p, i) {
                var match = p.match(/([a-z]+)=(.*)/i);
                if (match) {
                    return [match[1], match[2]];
                } else {
                    return ["TYPE" + (i === 0 ? "" : i), p];
                }
            })
                .forEach(function (p) {
                meta[p[0]] = p[1];
            });

            if (!fields[key]) fields[key] = [];

            fields[key].push({
                meta: meta,
                value: results[3].split(';')
            })
        }
    });

    return fields;
};

var $ = function(selector) {
    return document.querySelector(selector);
};

$('pre').innerHTML = JSON.stringify(
    parse(document.body.innerText), 0, 2
);