mirror of
https://github.com/the-djmaze/snappymail.git
synced 2024-11-10 09:02:45 +08:00
146 lines
2.7 KiB
JavaScript
146 lines
2.7 KiB
JavaScript
/**
|
|
* Inspired by https://github.com/mcpar-land/vcfer
|
|
*/
|
|
|
|
export class VCardProperty {
|
|
|
|
/**
|
|
* A class describing a single vCard property.
|
|
* Will almost always be a member of a
|
|
* {@link VCard}'s [props]{@link VCard.props} map.
|
|
*
|
|
* Accepts either 2-4 arguments, or 1 argument in jCard property format.
|
|
* @param arg the field, or a jCard property
|
|
* @param value
|
|
* @param params
|
|
* @param type
|
|
*/
|
|
constructor(arg, value, params, type = 'text')
|
|
{
|
|
this.field = '';
|
|
|
|
/**
|
|
* the value of the property.
|
|
* @example '(123) 456 7890'
|
|
*/
|
|
this.value = '';
|
|
|
|
/**
|
|
* the type of the property value.
|
|
* @example 'text'
|
|
*/
|
|
this.type = '';
|
|
|
|
/**
|
|
* https://www.rfc-editor.org/rfc/rfc6350.html#section-5
|
|
* An jCard parameters object.
|
|
* @example
|
|
* {
|
|
* type: ['work', 'voice', 'pref'],
|
|
* value: 'uri'
|
|
* }
|
|
*/
|
|
this.params = {};
|
|
|
|
// Construct from arguments
|
|
if (value !== undefined && typeof arg === 'string') {
|
|
this.field = arg;
|
|
this.value = value;
|
|
this.params = params || {};
|
|
this.type = type;
|
|
}
|
|
// construct from jcard
|
|
else if (value === undefined && params === undefined && typeof arg === 'object') {
|
|
this.parseFromJCardProperty(arg);
|
|
}
|
|
// invalid property
|
|
else {
|
|
throw Error('invalid Property constructor');
|
|
}
|
|
}
|
|
|
|
parseFromJCardProperty(jCardProp)
|
|
{
|
|
jCardProp = JSON.parse(JSON.stringify(jCardProp));
|
|
this.field = jCardProp[0].toLowerCase();
|
|
this.params = jCardProp[1];
|
|
this.type = jCardProp[2];
|
|
this.value = jCardProp[3];
|
|
}
|
|
|
|
addParam(key, value)
|
|
{
|
|
if (Array.isArray(this.params[key])) {
|
|
this.params[key].push(value);
|
|
}
|
|
else if (this.params[key] != null) {
|
|
this.params[key] = [this.params[key], value];
|
|
}
|
|
else {
|
|
this.params[key] = value;
|
|
}
|
|
}
|
|
|
|
/** Returns a copy of the Property's string value. */
|
|
getValue()
|
|
{
|
|
return '' + this.value;
|
|
}
|
|
|
|
/**
|
|
* https://www.rfc-editor.org/rfc/rfc6350.html#section-5.3
|
|
*/
|
|
pref()
|
|
{
|
|
return this.params.pref || 100;
|
|
}
|
|
|
|
/**
|
|
* https://www.rfc-editor.org/rfc/rfc6350.html#section-5.6
|
|
*/
|
|
tags()
|
|
{
|
|
return this.params.type || [];
|
|
}
|
|
|
|
/** Returns `true` if all the following are true:
|
|
* - the property's value contains charactes other than `;`
|
|
* - the property has no parameters
|
|
*/
|
|
isEmpty()
|
|
{
|
|
return ((null == this.value || !/[^;]+/.test(this.value)) && !Object.keys(this.params).length);
|
|
}
|
|
|
|
notEmpty()
|
|
{
|
|
return !this.isEmpty();
|
|
}
|
|
|
|
/** Returns a readonly string copy of the property's field. */
|
|
getField()
|
|
{
|
|
return '' + this.field;
|
|
}
|
|
|
|
/**
|
|
* Returns stringified JSON
|
|
*/
|
|
toString()
|
|
{
|
|
return JSON.stringify(this);
|
|
}
|
|
|
|
/**
|
|
* Returns a JSON array in a [jCard property]{@link JCardProperty} format
|
|
*/
|
|
toJSON()
|
|
{
|
|
return [
|
|
this.field,
|
|
this.params,
|
|
this.type || 'text',
|
|
this.value
|
|
];
|
|
}
|
|
}
|