vcards-js
Version:
Create vCards to import contacts into Outlook, iOS, Mac OS, Android devices, and more.
339 lines (290 loc) • 8.34 kB
JavaScript
/********************************************************************************
vCards-js, Eric J Nesser, November 2014
********************************************************************************/
/*jslint node: true */
'use strict';
/**
* Represents a contact that can be imported into Outlook, iOS, Mac OS, Android devices, and more
*/
var vCard = (function () {
/**
* Get photo object for storing photos in vCards
*/
function getPhoto() {
return {
url: '',
mediaType: '',
base64: false,
/**
* Attach a photo from a URL
* @param {string} url URL where photo can be found
* @param {string} mediaType Media type of photo (JPEG, PNG, GIF)
*/
attachFromUrl: function(url, mediaType) {
this.url = url;
this.mediaType = mediaType;
this.base64 = false;
},
/**
* Embed a photo from a file using base-64 encoding (not implemented yet)
* @param {string} filename
*/
embedFromFile: function(fileLocation) {
var fs = require('fs');
var path = require('path');
this.mediaType = path.extname(fileLocation).toUpperCase().replace(/\./g, "");
var imgData = fs.readFileSync(fileLocation);
this.url = imgData.toString('base64');
this.base64 = true;
},
/**
* Embed a photo from a base-64 string
* @param {string} base64String
*/
embedFromString: function(base64String, mediaType) {
this.mediaType = mediaType;
this.url = base64String;
this.base64 = true;
}
};
}
/**
* Get a mailing address to attach to a vCard.
*/
function getMailingAddress() {
return {
/**
* Represents the actual text that should be put on the mailing label when delivering a physical package
* @type {String}
*/
label: '',
/**
* Street address
* @type {String}
*/
street: '',
/**
* City
* @type {String}
*/
city: '',
/**
* State or province
* @type {String}
*/
stateProvince: '',
/**
* Postal code
* @type {String}
*/
postalCode: '',
/**
* Country or region
* @type {String}
*/
countryRegion: ''
};
}
/**
* Get social media URLs
* @return {object} Social media URL hash group
*/
function getSocialUrls() {
return {
'facebook': '',
'linkedIn': '',
'twitter': '',
'flickr': ''
};
}
/********************************************************************************
* Public interface for vCard
********************************************************************************/
return {
/**
* Specifies a value that represents a persistent, globally unique identifier associated with the vCard
* @type {String}
*/
uid: '',
/**
* Date of birth
* @type {Datetime}
*/
birthday: '',
/**
* Cell phone number
* @type {String}
*/
cellPhone: '',
/**
* Other cell phone number or pager
* @type {String}
*/
pagerPhone: '',
/**
* The address for private electronic mail communication
* @type {String}
*/
email: '',
/**
* The address for work-related electronic mail communication
* @type {String}
*/
workEmail: '',
/**
* First name
* @type {String}
*/
firstName: '',
/**
* Formatted name string associated with the vCard object (will automatically populate if not set)
* @type {String}
*/
formattedName: '',
/**
* Gender.
* @type {String} Must be M or F for Male or Female
*/
gender: '',
/**
* Home mailing address
* @type {object}
*/
homeAddress: getMailingAddress(),
/**
* Home phone
* @type {String}
*/
homePhone: '',
/**
* Home facsimile
* @type {String}
*/
homeFax: '',
/**
* Last name
* @type {String}
*/
lastName: '',
/**
* Logo
* @type {object}
*/
logo: getPhoto(),
/**
* Middle name
* @type {String}
*/
middleName: '',
/**
* Prefix for individual's name
* @type {String}
*/
namePrefix: '',
/**
* Suffix for individual's name
* @type {String}
*/
nameSuffix: '',
/**
* Nickname of individual
* @type {String}
*/
nickname: '',
/**
* Specifies supplemental information or a comment that is associated with the vCard
* @type {String}
*/
note: '',
/**
* The name and optionally the unit(s) of the organization associated with the vCard object
* @type {String}
*/
organization: '',
/**
* Individual's photo
* @type {object}
*/
photo: getPhoto(),
/**
* The role, occupation, or business category of the vCard object within an organization
* @type {String}
*/
role: '',
/**
* Social URLs attached to the vCard object (ex: Facebook, Twitter, LinkedIn)
* @type {String}
*/
socialUrls: getSocialUrls(),
/**
* A URL that can be used to get the latest version of this vCard
* @type {String}
*/
source: '',
/**
* Specifies the job title, functional position or function of the individual within an organization
* @type {String}
*/
title: '',
/**
* URL pointing to a website that represents the person in some way
* @type {String}
*/
url: '',
/**
* URL pointing to a website that represents the person's work in some way
* @type {String}
*/
workUrl: '',
/**
* Work mailing address
* @type {object}
*/
workAddress: getMailingAddress(),
/**
* Work phone
* @type {String}
*/
workPhone: '',
/**
* Work facsimile
* @type {String}
*/
workFax: '',
/**
* vCard version
* @type {String}
*/
version: '3.0',
/**
* Get major version of the vCard format
* @return {integer}
*/
getMajorVersion: function() {
var majorVersionString = this.version ? this.version.split('.')[0] : '4';
if (!isNaN(majorVersionString)) {
return parseInt(majorVersionString);
}
return 4;
},
/**
* Get formatted vCard
* @return {String} Formatted vCard in VCF format
*/
getFormattedString: function() {
var vCardFormatter = require('./lib/vCardFormatter');
return vCardFormatter.getFormattedString(this);
},
/**
* Save formatted vCard to file
* @param {String} filename
*/
saveToFile: function(filename) {
var vCardFormatter = require('./lib/vCardFormatter');
var contents = vCardFormatter.getFormattedString(this);
var fs = require('fs');
fs.writeFileSync(filename, contents, { encoding: 'utf8' });
}
};
});
module.exports = vCard;