RFC 6351
xCard: vCard XML Representation
RFC 6351: xCard: vCard XML Representation π
Okay bestie, here's the deets on this one π
- Written by: S. Perreault from Viagenie π§
- Category: Standards Track β¨
- Date: August 2011 πΈ
- ISSN: 2070-1721
- Obsoletes/Updates: this doc doesn't list anything it obsoletes or updates π¦
Abstract β¨
This document defines the XML schema of the vCard data format. Basically, it's the blueprint for turning vCard into XML π
Status of This Memo
This is an Internet Standards Track document. π₯
This document is a product of the Internet Engineering Task Force (IETF). It represents the consensus of the IETF community. It has received public review and has been approved for publication by the Internet Engineering Steering Group (IESG). Further information on Internet Standards is available in Section 2 of RFC 5741. π
Information about the current status of this document, any errata, and how to provide feedback on it may be obtained at http://www.rfc-editor.org/info/rfc6351. π
Copyright Notice
Copyright (c) 2011 IETF Trust and the persons identified as the document authors. All rights reserved. π
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) as they stand on the date this document was published. Please read these documents carefully, because they explain your rights and restrictions for this document. Code Components pulled out of this document need to include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions, and they come without warranty as described in the Simplified BSD License. βοΈβ¨
Table of Contents π§
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 2
2. Conventions . . . . . . . . . . . . . . . . . . . . . . . . . 2
3. The Schema . . . . . . . . . . . . . . . . . . . . . . . . . . 2
4. Example: Author's XML vCard . . . . . . . . . . . . . . . . . 3
5. Design Considerations . . . . . . . . . . . . . . . . . . . . 4
5.1. Extensibility . . . . . . . . . . . . . . . . . . . . . . 6
5.2. Limitations . . . . . . . . . . . . . . . . . . . . . . . 7
6. Format Conversions . . . . . . . . . . . . . . . . . . . . . . 8
7. Security Considerations . . . . . . . . . . . . . . . . . . . 10
8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 11
8.1. Registration of the XML Namespace . . . . . . . . . . . . 11
8.2. Media Type . . . . . . . . . . . . . . . . . . . . . . . . 11
9. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 12
10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 12
10.1. Normative References . . . . . . . . . . . . . . . . . . . 12
10.2. Informative References . . . . . . . . . . . . . . . . . . 13
Appendix A. Relax NG Schema . . . . . . . . . . . . . . . . . . . 14
1. Introduction β¨
Okay so vCard [RFC6350] is a data format for representing and swapping info about people and other entities. It's text-based, not binary, which is very much the vibe πΈ This document defines xCard, an XML [W3C.REC-xml-20081126] representation for vCard. The underlying data structure is exactly the same, so you get a 1-to-1 mapping between the original vCard format and the XML version, no cap π¦ XML formatting might be the move in places where an XML engine is already easy to grab, since you can reuse it instead of writing a standalone vCard parser. Genius π
Earlier work on an XML format for vCard started in 1998 with Frank Dawson [VCARD-DTD]. Sadly, it did not take over the world π
2. Conventions π
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC2119]. Those are the big rule words, so pay attention to them π
3. The Schema π§
The schema is written in the RELAX NG language [ISO.19757-2.2008], and you'll find it in Appendix A. π
4. Example: Author's XML vCard π
Here's the author's own vCard in XML. Literally the best way to see the mapping in action π₯
<?xml version="1.0" encoding="UTF-8"?>
<vcards xmlns="urn:ietf:params:xml:ns:vcard-4.0">
<vcard>
<fn><text>Simon Perreault</text></fn>
<n>
<surname>Perreault</surname>
<given>Simon</given>
<additional/>
<prefix/>
<suffix>ing. jr</suffix>
<suffix>M.Sc.</suffix>
</n>
<bday><date>--0203</date></bday>
<anniversary>
<date-time>20090808T1430-0500</date-time>
</anniversary>
<gender><sex>M</sex></gender>
<lang>
<parameters><pref><integer>1</integer></pref></parameters>
<language-tag>fr</language-tag>
</lang>
<lang>
<parameters><pref><integer>2</integer></pref></parameters>
<language-tag>en</language-tag>
</lang>
<org>
<parameters><type><text>work</text></type></parameters>
<text>Viagenie</text>
</org>
<adr>
<parameters>
<type><text>work</text></type>
<label><text>Simon Perreault
2875 boul. Laurier, suite D2-630
Quebec, QC, Canada
G1V 2M2</text></label>
</parameters>
<pobox/>
<ext/>
<street>2875 boul. Laurier, suite D2-630</street>
<locality>Quebec</locality>
<region>QC</region>
<code>G1V 2M2</code>
<country>Canada</country>
</adr>
<tel>
<parameters>
<type>
<text>work</text>
<text>voice</text>
</type>
</parameters>
<uri>tel:+1-418-656-9254;ext=102</uri>
</tel>
<tel>
<parameters>
<type>
<text>work</text>
<text>text</text>
<text>voice</text>
<text>cell</text>
<text>video</text>
</type>
</parameters>
<uri>tel:+1-418-262-6501</uri>
</tel>
<email>
<parameters><type><text>work</text></type></parameters>
<text>simon.perreault@viagenie.ca</text>
</email>
<geo>
<parameters><type><text>work</text></type></parameters>
<uri>geo:46.766336,-71.28955</uri>
</geo>
<key>
<parameters><type><text>work</text></type></parameters>
<uri>http://www.viagenie.ca/simon.perreault/simon.asc</uri>
</key>
<tz><text>America/Montreal</text></tz>
<url>
<parameters><type><text>home</text></type></parameters>
<uri>http://nomis80.org</uri>
</url>
</vcard>
</vcards>
5. Design Considerations π
The big idea is to map vCard parameters, properties, and value types to XML elements. For example, the "FN" property becomes the "fn" element. That element then holds a text element whose content matches the property's value π¦
vCard parameters get the same treatment and become XML elements too. They live inside the <parameters> element, which sits inside the property elements. For example, the "TYPE" parameter on the "TEL" property would look like this in XML π
<tel>
<parameters>
<type>
<text>voice</text>
<text>video</text>
</type>
</parameters>
<uri>tel:+1-555-555-555</uri>
</tel>
Parameters that take a list of values just get repeated, once for each value in the list. Simple, iconic π
Properties with structured values (like the "N" property) are written as XML element trees. The element names in that tree (like "surname", "given", and so on) have no vCard equivalent, because plain vCard identifies them by position instead π§
Line folding is a non-issue in XML π So the mapping from vCard to XML happens after unfolding is done. And going the other way, the mapping from XML to vCard happens before folding is done π
A top-level <vcards> element works as the root. It holds one or more <vcard> elements, and each one represents a complete vCard. The <vcards> element MUST be present even when only a single vCard is present in an XML document. No skipping it, babe π«Ά
The group construct (Section 3.2 in [RFC6350]) gets represented with the <group> element, and the "name" attribute holds the group's name. Check out this example π
<vcards>
<vcard>
<group name="contact">
<fn>...</fn>
<email>...</email>
</group>
<group name="media">
<photo>...</photo>
</group>
<categories>...</categories>
</vcard>
</vcards>
That's equivalent to this πΈ
BEGIN:VCARD
VERSION:4.0
contact.FN=...
contact.EMAIL=...
media.PHOTO=...
CATEGORIES=...
END:VCARD
5.1. Extensibility π¦
The original vCard format is extensible, which is very much a main character trait β¨ New properties, parameters, data types, and values (collectively called vCard elements, not to be mixed up with XML elements) can be registered with IANA (see [RFC6350], Section 10.2). It's expected that these vCard extensions will also specify extensions to the XML format in this document. Iykyk π
New XML vCard property and parameter element names MUST be lower-case. This is needed so round-tripping between XML and plain-text vCard works correctly π
Unregistered extensions (the ones starting with "X-" and "VND-...-") get expressed in XML using elements that start with "x-" and "vnd-...-". Using XML namespaces [W3C.REC-xml-names-20091208] for extensibility is RECOMMENDED for extensions that have no equivalent in plain-text vCard. Check Section 6 for what changes when you convert between plain-text vCard and XML π§
Examples, because you know I love them π
<x-my-prop>
<parameters>
<pref><integer>1</integer></pref>
</parameters>
<text>value goes here</text>
</x-my-prop>
<ext:my-prop
ext:xmlns="http://example.com/extensions/my-vcard">
<parameters>
<pref><integer>1</integer></pref>
</parameters> <!-- Core vCard elements -->
<text>value goes here</text> <!-- are still accessible -->
</ext:my-prop>
Extension elements don't need the "X-" or "VND-" prefix in XML. The XML namespace mechanism is enough on its own π«Ά
A vCard XML parser MUST ignore XML elements and attributes whose expanded name it doesn't recognize. The normal behavior of ignoring XML processing instructions whose target is not recognized MUST also be followed. Ignore the stuff you don't know, it's giving self-respect π
In the original vCard format, the "VERSION" property was mandatory and played a role in extensibility. In XML, that property is gone. Its job is handled by the vCard core namespace identifier, which includes the version number. Future vCard revisions will use a different namespace π
Parameters that hold a list of values are expressed as a list of elements in XML (for example, the <type> element) π
5.2. Limitations π
The schema does not validate the cardinality of properties. That's a limitation of the schema definition language, not a vibe check on the spec π Cardinalities from the original vCard format [RFC6350] MUST still be respected. No excuses π
Some constructs (like value enumerations in type parameters) have extra ordering constraints in XML. This comes from limitations of the schema definition language, and the order itself is arbitrary π§ The order MUST be respected in XML for the vCard to be valid. However, reordering as part of converting to or from plain vCard MAY happen π¦
6. Format Conversions πβ¨
Okay bestie, so here's the tricky bit. When a brand-new property or an X- property shows up, a vCard<->xCard converter might not recognize it or know its default value type π, but it still has to keep the values safe. Same deal with parameters nobody has seen before. So the rules below say exactly what to do with anything unrecognized. π
Here's how it goes:
- When converting from vCard to xCard:
- Any property that does not include a
VALUEparameter and whose default value type is not known MUST be converted using the value type XML element<unknown>. The content of that element is the unprocessed value text. πΈ - Any unrecognized property parameter MUST be converted using the value type XML element
<unknown>, with its content set to the parameter value text, treated as if it were a text value, or list of text values. π¦ - The content of "XML" properties is copied as is to XML.
- Property and parameter XML element names are converted to lower-case.
- Property value escaping is undone. For example,
"\n"becomes a NEWLINE character (ASCII decimal 10). π - Double-quoting of parameter values, as well as backslash escaping in parameter values, is undone. For example,
PARAM="\"foo\",\"bar\""becomes<param>"foo","bar"</param>. π
- Any property that does not include a
- When converting xCard to vCard:
- Properties in the vCard 4 namespace:
- If the converter knows of a specific plain-text representation for this property, it uses it. For example, the
<adr>element corresponds to the "ADR" property, which is encoded using comma-separated lists separated by semicolons. π§ - Otherwise, the property name is taken from the element name, property parameters are taken from the
<parameters>element, and the content of the property is taken from the content of the value element. If the property element has attributes or contains other XML elements, they are dropped. - If a standard property's XML element contains XML elements and attributes for which the converter doesn't recognize the expanded name, they are dropped. Therefore, it is RECOMMENDED to limit extensions to the property level to ensure that all data is preserved intact in round-trip conversions. π
- If the converter knows of a specific plain-text representation for this property, it uses it. For example, the
- Properties in other namespaces are wrapped as is inside an
XMLproperty. - Any
<unknown>property value XML elements are converted directly into vCard values. The containing property MUST NOT have aVALUEparameter. π - Any
<unknown>parameter value XML elements are converted as if they were<text>value type XML elements. - Property and parameter names are converted to upper-case.
- Property value escaping (Section 3.3 of [RFC6350]) is carried out. For example, a NEWLINE character (ASCII decimal 10) becomes
"\n". β¨ - Double-quoting of parameter values, as well as backslash escaping in parameter values, is carried out. For example,
<param>"foo","bar"</param>becomesPARAM="\"foo\",\"bar\"". π
- Properties in the vCard 4 namespace:
Now let's look at a pair of example vCards that mean the exact same thing. The XML one first:
<?xml version="1.0"?>
<vcards xmlns="urn:ietf:params:xml:ns:vcard-4.0">
<vcard>
<fn><text>J. Doe</text></fn>
<n>
<surname>Doe</surname>
<given>J.</given>
<additional/>
<prefix/>
<suffix/>
</n>
<x-file>
<parameters>
<mediatype><text>image/jpeg</text></mediatype>
</parameters>
<unknown>alien.jpg</unknown>
</x-file>
<a xmlns="http://www.w3.org/1999/xhtml"
href="http://www.example.com">My web page!</a>
</vcard>
</vcards>
And the plain-text one, which is the same card:
BEGIN:VCARD
VERSION:4.0
FN:J. Doe
N:Doe;J.;;
X-FILE;MEDIATYPE=image/jpeg:alien.jpg
XML:<a xmlns="http://www.w3.org/1999/xhtml"\n
href="http://www.example.com">My web page!</a>
END:VCARD
7. Security Considerations π
All the security considerations applicable to plain vCard [RFC6350] are applicable to this document as well. Read those, bestie, because they all still apply. π«Ά
XML Signature [W3C.CR-xmldsig-core1-20110303] and XML Encryption [W3C.CR-xmlenc-core1-20110303] can be used with xCard to provide authentication and confidentiality. πβ¨
8. IANA Considerations π
8.1. Registration of the XML Namespace
Here's the namespace registration template, verbatim:
URI: urn:ietf:params:xml:ns:vcard-4.0
Registrant Contact: The IESG <iesg@ietf.org>
XML: None. Namespace URIs do not represent an XML specification.
8.2. Media Type
This section defines the MIME media type [RFC4288] for use with vCard-in-XML data. It's giving official paperwork energy ππ
Here's the registration form, copied exactly:
To: ietf-types@iana.org
Subject: Registration of media type application/vcard+xml
Type name: application
Subtype name: vcard+xml
Required parameters: none
Optional parameters: charset as defined for application/xml in
[RFC3023]; per [RFC3023], use of the charset parameter with the
value "utf-8" is "STRONGLY RECOMMENDED".
Encoding considerations: Same as encoding considerations of
application/xml as specified in [RFC3023].
Security considerations: This media type has all of the security
considerations described in [RFC3023], plus those listed in
Section 7.
Interoperability considerations: This media type provides an
alternative syntax to vCard data [RFC6350] based on XML.
Published specification: This specification.
Applications that use this media type: Applications that currently
make use of the text/vcard media type can use this as an
alternative. In general, applications that maintain or process
contact information can use this media type.
Additional information:
Magic number(s): none
File extension(s): XML data should use ".xml" as the file
extension.
Macintosh file type code(s): none
Person & email address to contact for further information: Simon
Perreault <simon.perreault@viagenie.ca>
Intended usage: COMMON
Restrictions on usage: none
Author: Simon Perreault
Change controller: IETF
9. Acknowledgments π
Thanks to the following people for their input, you're all legends π:
Alexey Melnikov, Barry Leiba, Bjorn Hoehrmann, Cyrus Daboo, Joe Hildebrand, Joseph Smarr, Marc Blanchet, Mike Douglass, Peter Saint-Andre, Robins George, Zahhar Kirillov, Zoltan Ordogh.
10. References π
10.1. Normative References
- [ISO.19757-2.2008] International Organization for Standardization, "Information technology -- Document Schema Definition Language (DSDL) -- Part 2: Regular-grammar-based validation -- RELAX NG", ISO International Standard 19757-2, October 2008.
- [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.
- [RFC3023] Murata, M., St. Laurent, S., and D. Kohn, "XML Media Types", RFC 3023, January 2001.
- [RFC6350] Perreault, S., "vCard Format Specification", RFC 6350, August 2011.
- [W3C.REC-xml-20081126] Paoli, J., Yergeau, F., Maler, E., Bray, T., and C. Sperberg-McQueen, "Extensible Markup Language (XML) 1.0 (Fifth Edition)", World Wide Web Consortium Recommendation REC-xml-20081126, November 2008,
<http://www.w3.org/TR/2008/REC-xml-20081126>. - [W3C.REC-xml-names-20091208] Bray, T., Hollander, D., Layman, A., Tobin, R., and H. Thompson, "Namespaces in XML 1.0 (Third Edition)", World Wide Web Consortium Recommendation REC-xml-names-20091208, December 2009,
<http://www.w3.org/TR/2009/REC-xml-names-20091208>.
10.2. Informative References
- [RFC4288] Freed, N. and J. Klensin, "Media Type Specifications and Registration Procedures", BCP 13, RFC 4288, December 2005.
- [VCARD-DTD] Dawson, F., "The vCard v3.0 XML DTD", Work in Progress, June 1998.
- [W3C.CR-xmldsig-core1-20110303] Roessler, T., Solo, D., Yiu, K., Reagle, J., Hirsch, F., Eastlake, D., and M. Nystroem, "XML Signature Syntax and Processing Version 1.1", World Wide Web Consortium CR CR-xmldsig-core1-20110303, March 2011,
<http://www.w3.org/TR/2011/CR-xmldsig-core1-20110303>. - [W3C.CR-xmlenc-core1-20110303] Eastlake, D., Reagle, J., Roessler, T., and F. Hirsch, "XML Encryption Syntax and Processing Version 1.1", World Wide Web Consortium CR CR-xmlenc-core1-20110303, March 2011,
<http://www.w3.org/TR/2011/CR-xmlenc-core1-20110303>.
Appendix A. Relax NG Schema π§©
default namespace = "urn:ietf:params:xml:ns:vcard-4.0"
### Section 3.3: vCard Format Specification
#
# 3.3
iana-token = xsd:string { pattern = "[a-zA-Z0-9-]+" }
x-name = xsd:string { pattern = "x-[a-zA-Z0-9-]+" }
### Section 4: Value types
#
# 4.1
value-text = element text { text }
value-text-list = value-text+
# 4.2
value-uri = element uri { xsd:anyURI }
# 4.3.1
value-date = element date {
xsd:string { pattern = "\d{8}|\d{4}-\d\d|--\d\d(\d\d)?|---\d\d" }
}
# 4.3.2
value-time = element time {
xsd:string { pattern = "(\d\d(\d\d(\d\d)?)?|-\d\d(\d\d?)|--\d\d)"
~ "(Z|[+\-]\d\d(\d\d)?)?" }
}
# 4.3.3
value-date-time = element date-time {
xsd:string { pattern = "(\d{8}|--\d{4}|---\d\d)T\d\d(\d\d(\d\d)?)?"
~ "(Z|[+\-]\d\d(\d\d)?)?" }
}
# 4.3.4
value-date-and-or-time = value-date | value-date-time | value-time
# 4.3.5
value-timestamp = element timestamp {
xsd:string { pattern = "\d{8}T\d{6}(Z|[+\-]\d\d(\d\d)?)?" }
}
# 4.4
value-boolean = element boolean { xsd:boolean }
# 4.5
value-integer = element integer { xsd:integer }
# 4.6
value-float = element float { xsd:float }
# 4.7
value-utc-offset = element utc-offset {
xsd:string { pattern = "[+\-]\d\d(\d\d)?" }
}
# 4.8
value-language-tag = element language-tag {
xsd:string { pattern = "([a-z]{2,3}((-[a-z]{3}){0,3})?|[a-z]{4,8})"
~ "(-[a-z]{4})?(-([a-z]{2}|\d{3}))?"
~ "(-([0-9a-z]{5,8}|\d[0-9a-z]{3}))*"
~ "(-[0-9a-wyz](-[0-9a-z]{2,8})+)*"
~ "(-x(-[0-9a-z]{1,8})+)?|x(-[0-9a-z]{1,8})+|"
~ "[a-z]{1,3}(-[0-9a-z]{2,8}){1,2}" }
}
### Section 5: Parameters
#
# 5.1
param-language = element language { value-language-tag }?
# 5.2
param-pref = element pref {
element integer {
xsd:integer { minInclusive = "1" maxInclusive = "100" }
}
}?
# 5.4
param-altid = element altid { value-text }?
# 5.5
param-pid = element pid {
element text { xsd:string { pattern = "\d+(\.\d+)?" } }+
}?
# 5.6
param-type = element type { element text { "work" | "home" }+ }?
# 5.7
param-mediatype = element mediatype { value-text }?
# 5.8
param-calscale = element calscale { element text { "gregorian" } }?
# 5.9
param-sort-as = element sort-as { value-text+ }?
# 5.10
param-geo = element geo { value-uri }?
# 5.11
param-tz = element tz { value-text | value-uri }?
### Section 6: Properties
#
# 6.1.3
property-source = element source {
element parameters { param-altid, param-pid, param-pref,
param-mediatype },
value-uri
}
# 6.1.4
property-kind = element kind {
element text { "individual" | "group" | "org" | "location" |
x-name | iana-token }*
}
# 6.2.1
okay so property-fn is first up, and it's giving formatted name π
property-fn = element fn {
element parameters { param-language, param-altid, param-pid,
param-pref, param-type }?,
value-text
}
6.2.2 π
okay this one is the structured name, and it's giving a whole lot of parts π
property-n = element n {
element parameters { param-language, param-sort-as, param-altid }?,
element surname { text }+,
element given { text }+,
element additional { text }+,
element prefix { text }+,
element suffix { text }+
}
6.2.3 πΈ
nickname time, bestie π§
property-nickname = element nickname {
element parameters { param-language, param-altid, param-pid,
param-pref, param-type }?,
value-text-list
}
6.2.4 πΈ
photo, but make it a URI π¦
property-photo = element photo {
element parameters { param-altid, param-pid, param-pref, param-type,
param-mediatype }?,
value-uri
}
6.2.5 π
okay birthday β¨ it can be a date-and-or-time or plain text, which is so flexible π
property-bday = element bday {
element parameters { param-altid, param-calscale }?,
(value-date-and-or-time | value-text)
}
6.2.6 π₯
anniversary, same vibe as the birthday π
property-anniversary = element anniversary {
element parameters { param-altid, param-calscale }?,
(value-date-and-or-time | value-text)
}
6.2.7 π
gender, and the sex part only takes the empty string or one of those single letters. no cap, it's very specific π
property-gender = element gender {
element sex { "" | "M" | "F" | "O" | "N" | "U" },
element identity { text }?
}
6.3.1 π‘
address time π the label param lives right here too, so we're literally building the whole thing in one go β¨
param-label = element label { value-text }?
property-adr = element adr {
element parameters { param-language, param-altid, param-pid,
param-pref, param-type, param-geo, param-tz,
param-label }?,
element pobox { text }+,
element ext { text }+,
element street { text }+,
element locality { text }+,
element region { text }+,
element code { text }+,
element country { text }+
}
6.4.1 π
phone numbers, and the type text values are a whole list. iykyk π±
property-tel = element tel {
element parameters {
param-altid,
param-pid,
param-pref,
element type {
element text { "work" | "home" | "text" | "voice"
| "fax" | "cell" | "video" | "pager"
| "textphone" }+
}?,
param-mediatype
}?,
(value-text | value-uri)
}
6.4.2 π§
email, very simple, very iconic π
property-email = element email {
element parameters { param-altid, param-pid, param-pref,
param-type }?,
value-text
}
6.4.3 π¬
IMPP, which is basically your messaging accounts, but as a URI π«Ά
property-impp = element impp {
element parameters { param-altid, param-pid, param-pref,
param-type, param-mediatype }?,
value-uri
}
6.4.4 π£οΈ
language time, and it takes a language tag value π
property-lang = element lang {
element parameters { param-altid, param-pid, param-pref,
param-type }?,
value-language-tag
}
6.5.1 π°οΈ
timezone, and it can be text, a URI, or a UTC offset. so many options, I'm obsessed π
property-tz = element tz {
element parameters { param-altid, param-pid, param-pref,
param-type, param-mediatype }?,
(value-text | value-uri | value-utc-offset)
}
6.5.2 πΊοΈ
geo, and the value is a URI. that's it, that's the whole vibe β¨
property-geo = element geo {
element parameters { param-altid, param-pid, param-pref,
param-type, param-mediatype }?,
value-uri
}
6.6.1 πΌ
title time π
property-title = element title {
element parameters { param-language, param-altid, param-pid,
param-pref, param-type }?,
value-text
}
6.6.2 π¬
role, same energy as title π
property-role = element role {
element parameters { param-language, param-altid, param-pid,
param-pref, param-type }?,
value-text
}
6.6.3 πΌοΈ
logo, which is a URI with a media type param π
property-logo = element logo {
element parameters { param-language, param-altid, param-pid,
param-pref, param-type, param-mediatype }?,
value-uri
}
6.6.4 π’
org, and it can take a sort-as param too. the org list is giving team roster π«Ά
property-org = element org {
element parameters { param-language, param-altid, param-pid,
param-pref, param-type, param-sort-as }?,
value-text-list
}
6.6.5 π₯
member, and it's a URI π
property-member = element member {
element parameters { param-altid, param-pid, param-pref,
param-mediatype }?,
value-uri
}
6.6.6 π
related, and the type list is a whole social map. friend, sibling, muse, and yes, even "me" ππ«£
property-related = element related {
element parameters {
param-altid,
param-pid,
param-pref,
element type {
element text {
"work" | "home" | "contact" | "acquaintance" |
"friend" | "met" | "co-worker" | "colleague" | "co-resident" |
"neighbor" | "child" | "parent" | "sibling" | "spouse" |
"kin" | "muse" | "crush" | "date" | "sweetheart" | "me" |
"agent" | "emergency"
}+
}?,
param-mediatype
}?,
(value-uri | value-text)
}
6.7.1 π·οΈ
categories, a text list, very cute and organized π
property-categories = element categories {
element parameters { param-altid, param-pid, param-pref,
param-type }?,
value-text-list
}
6.7.2 π
note time, plain text with the usual params π
property-note = element note {
element parameters { param-language, param-altid, param-pid,
param-pref, param-type }?,
value-text
}
6.7.3 π
prodid, just a single text value, no params, very minimalist π€
property-prodid = element prodid { value-text }
6.7.4 β°
rev is a timestamp, and that's literally the entire thing π
property-rev = element rev { value-timestamp }
6.7.5 π
sound, a URI with the media type option π΅
property-sound = element sound {
element parameters { param-language, param-altid, param-pid,
param-pref, param-type, param-mediatype }?,
value-uri
}
6.7.6 πͺͺ
uid is a URI, and that's the whole thing β¨
property-uid = element uid { value-uri }
6.7.7 ποΈ
clientpidmap, which has a sourceid that's a positive integer, then a URI. it's giving very structured π€
property-clientpidmap = element clientpidmap {
element sourceid { xsd:positiveInteger },
value-uri
}
6.7.8 π
url, the classic πΈοΈ
property-url = element url {
element parameters { param-altid, param-pid, param-pref,
param-type, param-mediatype }?,
value-uri
}
6.8.1 π
key, which can be a URI or text. it's the public key moment ποΈ
property-key = element key {
element parameters { param-altid, param-pid, param-pref,
param-type, param-mediatype }?,
(value-uri | value-text)
}
6.9.1 π
fburl, free/busy info but as a URI ποΈ
property-fburl = element fburl {
element parameters { param-altid, param-pid, param-pref,
param-type, param-mediatype }?,
value-uri
}
6.9.2 π
caladruri, the calendar address URI. ngl, the names are a lot π
property-caladruri = element caladruri {
element parameters { param-altid, param-pid, param-pref,
param-type, param-mediatype }?,
value-uri
}
6.9.3 ποΈ
caluri, another calendar URI, and yes it's basically the same shape π
property-caluri = element caluri {
element parameters { param-altid, param-pid, param-pref,
param-type, param-mediatype }?,
value-uri
}
Top-level grammar π
the top-level grammar is where all the properties come together. it's the whole cast assembled, periodt π
property = property-adr | property-anniversary | property-bday
| property-caladruri | property-caluri | property-categories
| property-clientpidmap | property-email | property-fburl
| property-fn | property-geo | property-impp | property-key
| property-kind | property-lang | property-logo
| property-member | property-n | property-nickname
| property-note | property-org | property-photo
| property-prodid | property-related | property-rev
| property-role | property-gender | property-sound
| property-source | property-tel | property-title
| property-tz | property-uid | property-url
start = element vcards {
element vcard {
(property
| element group {
attribute name { text },
property*
})+
}+
}
Author's Address π¦
bestie, this is where you find Simon π Viagenie, Quebec, the whole address, plus the phone, email, and URI. slay π
Simon Perreault
Viagenie
2600 boul. Laurier, Suite 625
Quebec, QC G1V 4W1
Canada
Phone: +1 418 656 9254
EMail: simon.perreault@viagenie.ca
URI: http://www.viagenie.ca
π¦ where this page comes from
- ietf: rfc6351 2011-08
- π girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms