-
Notifications
You must be signed in to change notification settings - Fork 0
/
rfc9555.xml
3706 lines (3556 loc) · 160 KB
/
rfc9555.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc [
<!ENTITY nbsp " ">
<!ENTITY zwsp "​">
<!ENTITY nbhy "‑">
<!ENTITY wj "⁠">
]>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" submissionType="IETF" category="std" consensus="true" docName="draft-ietf-calext-jscontact-vcard-14" number="9555" ipr="pre5378Trust200902" tocInclude="true" tocDepth="4" sortRefs="true" symRefs="true" updates="6350" obsoletes="" xml:lang="en" version="3">
<!--[rfced] *AD, please review the following changes that were
submitted after the document was approved and let us know if you
approve. The updates can be viewed in this diff file:
https://www.rfc-editor.org/authors/rfc9555-ad-diff.html
Section 2.3.10 ("Novelist" instead of "Boss" and "Écrivain"
instead of "Patron" in Figure 5)
Section 2.5.2 (removal of comma in Figure 11)
Section 2.6.1 (removal of comma in Figure 16)
Section 2.9.6 ("organizationId" instead of "organization" - two
instances; "Research Scientist" instead of "Project Leader" and
"Project Leader" instead of "Research Scientist" in Figure 28)
Section 3.2.1 (addition of comma in Figure 51)
Section 3.3.1 (addition of text under "Format definition")
Appendix A ("organizationId" instead of "organization")
-->
<!--[rfced] Would you like to update the short title that spans the
header of the PDF file to be more descriptive? Note that there is
ample room if you want to use the document's title instead.
Please let us know your preference.
Original:
jscontact-vcard
Perhaps:
Converting JSContact and vCard
-->
<!-- xml2rfc v2v3 conversion 3.12.10 -->
<front>
<title abbrev="JSContact: Converting from and to vCard">JSContact: Converting from and to vCard</title>
<seriesInfo name="RFC" value="9555"/>
<author fullname="Mario Loffredo" initials="M." surname="Loffredo">
<organization>IIT-CNR/Registro.it</organization>
<address>
<postal>
<street>Via Moruzzi, 1</street>
<city>Pisa</city>
<country>Italy</country>
<code>56124</code>
</postal>
<email>[email protected]</email>
<uri>https://www.iit.cnr.it</uri>
</address>
</author>
<author fullname="Robert Stepanek" initials="R." surname="Stepanek">
<organization>Fastmail</organization>
<address>
<postal>
<extaddr>PO Box 234</extaddr>
<street>Collins St. West</street>
<city>Melbourne</city>
<region>VIC</region>
<code>8007</code>
<country>Australia</country>
</postal>
<email>[email protected]</email>
<uri>https://www.fastmail.com</uri>
</address>
</author>
<date year="2024" month="March"/>
<area>art</area>
<workgroup>calext</workgroup>
<keyword>JSON</keyword>
<keyword>contacts</keyword>
<keyword>vCard</keyword>
<keyword>jCard</keyword>
<abstract>
<!--[rfced] Since this document does not officially "update" RFC 9553,
should "it updates" be changed to "it expands on" or "it builds
upon" to avoid any confusion for the reader? Please review and
let us know your preference.
Original:
To achieve this, it updates RFC I-D.ietf-calext-jscontact
(JSContact) by registering new JSContact properties.
Perhaps:
To achieve this, it expands on RFC 9553 ("JSContact: A JSON
Representation of Contact Data") by registering new JSContact
properties.
-->
<t>This document defines how to convert contact information between the JSContact and vCard data formats. It defines conversion rules for every JSContact and vCard element registered at IANA at the time of publication. It also defines new JSContact properties as well as vCard properties and parameters, to support converting arbitrary or unknown JSContact and vCard elements.</t>
</abstract>
</front>
<middle>
<section>
<name>Introduction</name>
<section>
<name>Motivation</name>
<t>The JSContact data model and format <xref target="RFC9553"/> aims to be an alternative to the widely used vCard standard <xref target="RFC6350"/> and jCard format <xref target="RFC7095"/>.</t>
<t>While applications might prefer JSContact to exchange contact card data with other systems, they are likely to interoperate with services and clients that only support vCard or jCard. Similarly, existing contact data providers and consumers already using vCard or jCard might also want to represent their contact data in JSContact.</t>
<t>To achieve this, this document defines standard rules to convert contact data between JSContact and vCard (and consequently jCard). </t>
</section>
<section anchor="notational-conventions" numbered="true" toc="default">
<name>Notational Conventions</name>
<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as described in BCP 14 <xref target="RFC2119" format="default" sectionFormat="of" derivedContent="RFC2119"/> <xref target="RFC8174" format="default" sectionFormat="of" derivedContent="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>
</section>
<section anchor="abnf-notations">
<name>ABNF Notations</name>
<t>The ABNF definitions in this document use the notations of <xref target="RFC5234"/>. ABNF rules not defined in this document are defined in either <xref target="RFC5234"/> (such as the ABNF for CRLF, WSP, DQUOTE, VCHAR, ALPHA, and DIGIT) or <xref target="RFC6350"/>.
</t>
</section>
</section>
<section anchor="vcard-jscontact-conversion">
<name>Converting vCard to JSContact</name>
<t>This section contains the conversion rules from the vCard to the JSContact Card. It follows the same structure as vCard v4 <xref target="RFC6350"/>. Properties and parameters of vCard extension RFCs, including those described in "vCard Format Extension for JSContact" <xref target="RFC9554"/>, have been added to the appropriate subsections.</t>
<section>
<name>General Rules</name>
<section>
<!-- [rfced] In the html and pdf outputs, the text enclosed in <tt> is output
in fixed-width font. In the txt output, there are no changes to the font,
and the quotation marks have been removed.
In the html and pdf outputs, the text enclosed in <em> is output in
italics. In the txt output, the text enclosed in <em> appears with an
underscore before and after.
Please review carefully and let us know if the output is acceptable.
Also, please review if each term is consistently tagged and let us
know if any updates are needed. For instance, we notice that some
terms are enclosed with <tt> whereas others are not or are enclosed
with quote marks. Below are a few examples; please see the text for
more instances.
In the XML file (Sections 2.4.3, 2.10.3, and 2.10.4, respectively):
The <tt>kind</tt> property is set to <tt>entry</tt>
The <tt>kind</tt> property is set to "interest".
The kind property is set to directory.
-->
<name>The Card uid Property</name>
<t>The UID property (<xref target="RFC6350" derivedContent="RFC6350" section="6.7.6" sectionFormat="of"/>) in vCard is optional, but the Card object's uid property (<xref target="RFC9553" derivedContent="RFC9553" section="2.1.9" sectionFormat="of"/>) is mandatory. Implementations that convert a vCard without a UID property <bcp14>MUST</bcp14> generate a unique identifier as value for the uid property. This value <bcp14>SHOULD</bcp14> be the same when converting the same vCard multiple times, but how to achieve this is implementation-specific.</t>
</section>
<section>
<name>Choosing Identifiers</name>
<t>Multivalued properties in JSContact are typically represented as a JSON object where the object keys are of the Id type (<xref target="RFC9553" derivedContent="RFC9553" section="1.4.1" sectionFormat="of"/>) and the object values are the converted vCard property. In the absence of the PROP-ID parameter (see <xref target="vcard-param-propid"/>), implementations are free to choose any identifier as key for such entries. Whatever identifier generation scheme implementations use, they <bcp14>MUST</bcp14> generate values that are valid according to the definition of the Id type in <xref target="RFC9553"/>. For example, this could be an incrementing number across all identifier keys in the Card object or only unique within one JSON object.</t>
</section>
</section>
<!--[rfced] Within Sections 2.1 to 2.14, there is inconsistency in the
way the property and parameter names are introduced, i.e., some
of the lead-in sentences begin with "This" and some begin with
the names. We made this consistent by replacing "This" with the
property/parameter names. Please review.
One example
Original:
This converts to the JSContact Boolean type.
Current:
The BOOLEAN type converts to the JSContact Boolean type.
-->
<section anchor="vcard-types">
<name>vCard Value Data Types</name>
<section>
<name>BOOLEAN</name>
<t>The BOOLEAN type (<xref target="RFC6350" derivedContent="RFC6350" section="4.4" sectionFormat="of"/>) converts to the JSContact Boolean type (<xref target="RFC9553" derivedContent="RFC9553" section="1.3.2" sectionFormat="of"/>).</t>
</section>
<section anchor="vcard-type-datetime">
<name>DATE, TIME, DATE-TIME, DATE-AND-OR-TIME, and TIMESTAMP</name>
<t>The TIMESTAMP type (<xref target="RFC6350" derivedContent="RFC6350" section="4.3.5" sectionFormat="of"/>) converts to the UTCDateTime type (<xref target="RFC9553" derivedContent="RFC9553" section="1.4.5" sectionFormat="of"/>), unless for anniversaries. For anniversaries, it converts to the Timestamp type (<xref target="RFC9553" derivedContent="RFC9553" section="2.8.1" sectionFormat="of"/>).</t>
<t>The DATE type (<xref target="RFC6350" derivedContent="RFC6350" section="4.3.1" sectionFormat="of"/>) converts to a PartialDate object (<xref target="RFC9553" derivedContent="RFC9553" section="2.8.1" sectionFormat="of"/>) when used for an anniversary, unless the DATE value only contains a month or a day (but not both).</t>
<t>The following temporal types do not convert to a JSContact datetime type. Instead, vCard properties or parameters having such value types convert as defined in <xref target="new-jscontact"/>.</t>
<ul>
<li>TIME (<xref target="RFC6350" derivedContent="RFC6350" section="4.3.2" sectionFormat="of"/>)</li>
<li>DATE-TIME (<xref target="RFC6350" derivedContent="RFC6350" section="4.3.3" sectionFormat="of"/>)</li>
<li>DATE-AND-OR-TIME (<xref target="RFC6350" derivedContent="RFC6350" section="4.3.4" sectionFormat="of"/>)</li>
<li>DATE type values that only define a month or day (but not both)</li>
</ul>
</section>
<section>
<name>INTEGER</name>
<t>The INTEGER type (<xref target="RFC6350" derivedContent="RFC6350" section="4.5" sectionFormat="of"/>) converts to the JSContact Int and UnsignedInt types (<xref target="RFC9553" derivedContent="RFC9553" section="1.4.2" sectionFormat="of"/>).</t>
</section>
<section>
<name>FLOAT</name>
<t>The FLOAT type (<xref target="RFC6350" derivedContent="RFC6350" section="4.6" sectionFormat="of"/>) converts to the JSContact Number type (<xref target="RFC9553" derivedContent="RFC9553" section="1.3.2" sectionFormat="of"/>).</t>
</section>
<section>
<name>LANGUAGE-TAG</name>
<t>The LANGUAGE-TAG type (<xref target="RFC6350" derivedContent="RFC6350" section="4.8" sectionFormat="of"/>) converts to the JSContact String type (<xref target="RFC9553" derivedContent="RFC9553" section="1.3.2" sectionFormat="of"/>). The value <bcp14>MUST</bcp14> be a language tag as defined in <xref target="RFC5646"/>.</t>
</section>
<section>
<name>TEXT</name>
<t>The TEXT type (<xref target="RFC6350" derivedContent="RFC6350" section="4.1" sectionFormat="of"/>) converts to the JSContact String type (<xref target="RFC9553" derivedContent="RFC9553" section="1.3.2" sectionFormat="of"/>).</t>
</section>
<section>
<name>URI</name>
<t>The URI type (<xref target="RFC6350" derivedContent="RFC6350" section="4.2" sectionFormat="of"/>) converts to the JSContact String type (<xref target="RFC9553" derivedContent="RFC9553" section="1.3.2" sectionFormat="of"/>). The value <bcp14>MUST</bcp14> be a URI as defined in <xref target="RFC3986" sectionFormat="of" section="3"/></t>
</section>
<section>
<name>UTC-OFFSET</name>
<t>The UTC-OFFSET type (<xref target="RFC6350" derivedContent="RFC6350" section="4.7" sectionFormat="of"/>) either converts to a String value containing an IANA Time Zone Database entry name (see <xref target="vcard-prop-tz"/>) or does not convert to any JSContact type. For the latter, vCard properties or parameters having such values convert as defined in <xref target="new-jscontact"/>. </t>
</section>
</section>
<section anchor="vcard-parameters">
<name>vCard Parameters</name>
<t>This section contains the conversion rules for vCard parameters. A rule typically applies only for specific vCard properties. To convert a vCard parameter on an arbitrary vCard property, see <xref target="jscontact-prop-vcardparams"/>.</t>
<section anchor="vcard-param-altid">
<name>ALTID</name>
<t>The ALTID parameter (<xref target="RFC6350" derivedContent="RFC6350" section="5.4" sectionFormat="of"/>) does not convert to an IANA-registered property in JSContact, but several conversion rules make use of this parameter to combine multiple vCard properties into a single JSContact object instance. For an example of this, see <xref target="vcard-prop-adr"/>. To preserve the verbatim value of the ALTID parameter, set the JSContact properties defined in <xref target="new-jscontact"/>.</t>
</section>
<section anchor="vcard-param-author">
<name>AUTHOR</name>
<t>The AUTHOR parameter (<xref target="RFC9554" derivedContent="RFC9554" section="4.1" sectionFormat="of"/>) on a NOTE property converts to the Author object's uri property (<xref target="RFC9553" derivedContent="RFC9553" section="2.8.3" sectionFormat="of"/>). That Author object is set as the value of the Note object's author property (<xref target="RFC9553" derivedContent="RFC9553" section="2.8.3" sectionFormat="of"/>).</t>
<!-- [rfced] Please review whether any of the notes in this document
should be in the <aside> element. It is defined as "a container for
content that is semantically less important or tangential to the
content that surrounds it" (https://authors.ietf.org/en/rfcxml-vocabulary#aside).
Please also consider if any of the notes should perhaps be combined with
the preceding paragraphs. For example:
Original:
The AUTHOR parameter value of a vCard NOTE property converts
to the uri property of the Author object for this note.
Note: This parameter is defined in [RFC9554].
Perhaps:
A) The AUTHOR parameter value [RFC9554] of a vCard NOTE property
converts to the uri property of the Author object for this note.
or
B) The AUTHOR parameter value of a vCard NOTE property converts
to the uri property of the Author object for this note. The
AUTHOR parameter is defined in [RFC9554].
-->
</section>
<section anchor="vcard-param-author-name">
<name>AUTHOR-NAME</name>
<t>The AUTHOR-NAME parameter (<xref target="RFC9554" derivedContent="RFC9554" section="4.2" sectionFormat="of"/>) on a NOTE property converts to the Author object's name property (<xref target="RFC9553" derivedContent="RFC9553" section="2.8.3" sectionFormat="of"/>). That Author object is set as the value of the Note object's author property.</t>
</section>
<section anchor="vcard-param-calscale">
<name>CALSCALE</name>
<t>The CALSCALE parameter (<xref target="RFC6350" derivedContent="RFC6350" section="5.8" sectionFormat="of"/>) set on a BDAY, DEATHDATE, or ANNIVERSARY property converts to the PartialDate object's calendarScale property (<xref target="RFC9553" derivedContent="RFC9553" section="2.8.1" sectionFormat="of"/>).</t>
</section>
<section anchor="vcard-param-cc">
<name>CC</name>
<t>The CC parameter (<xref target="RFC8605" derivedContent="RFC8605" section="3.1" sectionFormat="of"/>) on an ADR property converts to the Address object's countryCode property (<xref target="RFC9553" derivedContent="RFC9553" section="2.5.1.1" sectionFormat="of"/>).</t>
</section>
<section anchor="vcard-param-created">
<name>CREATED</name>
<t>The CREATED parameter (<xref target="RFC9554" derivedContent="RFC9554" section="4.3" sectionFormat="of"/>) on a NOTE property converts to the Note object's created property (<xref target="RFC9553" derivedContent="RFC9553" section="2.8.3" sectionFormat="of"/>).</t>
</section>
<section anchor="vcard-param-derived">
<name>DERIVED</name>
<t>The DERIVED parameter (<xref target="RFC9554" derivedContent="RFC9554" section="4.4" sectionFormat="of"/>) does not convert to JSContact. If the DERIVED parameter is set to "true" on a vCard property, then implementations <bcp14>MAY</bcp14> choose not to convert that property.</t>
</section>
<section anchor="vcard-param-geo">
<name>GEO</name>
<t>The GEO parameter (<xref target="RFC6350" derivedContent="RFC6350" section="5.10" sectionFormat="of"/>) set on an ADR property converts to the Address object's coordinates property (<xref target="RFC9553" derivedContent="RFC9553" section="2.5.1.1" sectionFormat="of"/>).</t>
</section>
<section anchor="vcard-param-group">
<name>GROUP</name>
<t>The GROUP parameter (<xref target="RFC7095" derivedContent="RFC7095" section="7.1" sectionFormat="of"/>) does not convert to JSContact. It exclusively is for use in jCard and <bcp14>MUST NOT</bcp14> be set in a vCard.</t>
<t>Preserving the exact group name when converting from vCard to JSContact and back to vCard is not necessary. Any group identifiers will do, as long as the resulting vCard groups its properties equally to the original vCard. Implementations that still wish to preserve the exact property group name of a vCard property <bcp14>MAY</bcp14> set the jCard "group" parameter in the JSContact properties vCardProps or vCardParams as defined in <xref target="new-jscontact"/>.</t>
<figure anchor="group_conversion_params">
<name>Example of How to Preserve the Group Name in vCardParams during Conversion</name>
<!-- [rfced] We updated <artwork> to <sourcecode> for all examples; please review
and let us know if any further updates are needed.
In addition, please consider whether the "type" attribute should be set for all
sourcecode elements in the XML file. The current list of preferred values for
"type" is available at
https://www.rfc-editor.org/materials/sourcecode-types.txt. If the current
list does not contain an applicable type, feel free to suggest additions
for consideration. Note that it is also acceptable to leave the "type"
attribute not set.
-->
<sourcecode type="vcard"><![CDATA[
item1.TEL;VALUE=uri:tel:+1-555-555-5555
]]></sourcecode>
<sourcecode type="json"><![CDATA[
"phones": {
"p1": {
"number": "tel:+1-555-555-5555",
"vCardParams" : {
"group" : "item1"
}
}
}
]]></sourcecode>
</figure>
<figure anchor="group_conversion_props">
<name>Example of How to Preserve the Group Name in vCardProps during Conversion</name>
<sourcecode><![CDATA[
item2.X-FOO:bar
]]></sourcecode>
<sourcecode type="json"><![CDATA[
"vCardProps": [
["x-foo", {
"group": "item2"
}, "unknown", "bar"]
]
]]></sourcecode>
</figure>
</section>
<section anchor="vcard-param-index">
<name>INDEX</name>
<t>The INDEX parameter (<xref target="RFC6715" derivedContent="RFC6715" section="3.1" sectionFormat="of"/>) set on the EXPERTISE, HOBBY, INTEREST, and ORG-DIRECTORY properties converts to the PersonalInfo (<xref target="RFC9553" derivedContent="RFC9553" section="2.8.4" sectionFormat="of"/>) and Directory (<xref target="RFC9553" derivedContent="RFC9553" section="2.6.2" sectionFormat="of"/>) objects' listAs property.</t>
</section>
<section anchor="vcard-param-language">
<name>LANGUAGE</name>
<t>The LANGUAGE parameter (<xref target="RFC6350" derivedContent="RFC6350" section="5.1" sectionFormat="of"/>) converts to an entry in the Card object's localizations property (<xref target="RFC9553" derivedContent="RFC9553" section="2.7.1" sectionFormat="of"/>) for that vCard property on which this parameter is set on. The value of the LANGUAGE parameter defines the language tag key in the localizations property.</t>
<t>This specification does not define a single standard conversion rule for how to convert the property values. Instead, building the localizations value is implementation-specific.</t>
<t>Two options to populate the localizations property are:</t>
<ul>
<li>One Patch per Property: For each vCard property with a LANGUAGE parameter, set the complete path in the PatchObject to the JSContact property that the vCard property converts to. The value of the patch is the converted property value. This is simple to process and adequate if the vCard only contains a few properties with the LANGUAGE parameter.</li>
<li>Bundle Patches by Parent: If a PatchObject contains multiple paths that have the same parent paths, then it might be possible to combine these patches into one patch that patches the parent property. This is possible if the property in the Card is patched in its entirety.</li>
</ul>
<t>Generally, localizations only localize properties that are present in the non-localized version of this Card. <xref target="language-patch-dominant-language"/> illustrates this.</t>
<figure anchor="language-patch-dominant-language">
<name>LANGUAGE Conversion Example: One Dominant Language</name>
<sourcecode type="vcard"><![CDATA[
FN;LANGUAGE=EN:John Doe
TITLE;ALTID=1;LANGUAGE=EN:Boss
TITLE;ALTID=1;LANGUAGE=fr:Patron
]]></sourcecode>
<sourcecode type="json"><![CDATA[
"language": "en",
"name": {
"full": "John Doe"
},
"titles": {
"t1": {
"name": "Boss"
}
},
"localizations": {
"fr": {
"titles/t1/name": "Patron"
}
}
]]></sourcecode>
</figure>
<!--[rfced] Please clarify "choose them to" in the following
sentence. Does this perhaps mean "add them to" or "place them
under"?
Original:
As a special case, if one or more vCard properties of the
same type do not have the LANGUAGE parameter set, then
choose them to the non-localized Card.
Perhaps:
As a special case, if one or more vCard properties of the
same type do not have the LANGUAGE parameter set, add
them to the non-localized Card.
-->
<t>As a special case, if one or more vCard properties of the same type do not have the LANGUAGE parameter set, add them to the non-localized Card. Convert any with LANGUAGE parameters to the localizations property. <xref target="language-patch-no-language"/> illustrates this.</t>
<figure anchor="language-patch-no-language">
<name>LANGUAGE Conversion Example: Property without Language</name>
<sourcecode type="vcard"><![CDATA[
FN:John Doe
TITLE;ALTID=1:Boss
TITLE;ALTID=1;LANGUAGE=fr:Patron
]]></sourcecode>
<sourcecode type="json"><![CDATA[
"name": {
"full": "John Doe"
},
"titles": {
"t1": {
"name": "Boss"
}
},
"localizations": {
"fr": {
"titles/t1/name": "Patron"
}
}
]]></sourcecode>
</figure>
<!--[rfced] We updated the following text as shown below since the
non-ASCII characters (in Figures 5 and 6) display in the .txt
file as well as in the HTML and PDF files. Please let us know
of any concerns.
Original:
The following example uses non-ASCII characters to demonstrate
multilingual content. The ASCII-formatted version of this
specification might not show the correct characters. Please refer to
the HTML or PDF versions instead.
Current:
The following example uses non-ASCII characters to demonstrate
multilingual content.
-->
</section>
<section anchor="vcard-param-label">
<name>LABEL</name>
<t>The LABEL parameter (<xref target="RFC6350" derivedContent="RFC6350" section="6.3.1" sectionFormat="of"/>) on an ADR property converts to the Address object's full property (<xref target="RFC9553" derivedContent="RFC9553" section="2.5.1" sectionFormat="of"/>).</t>
</section>
<section anchor="vcard-param-level">
<name>LEVEL</name>
<t>The LEVEL parameter (<xref target="RFC6715" derivedContent="RFC6715" section="3.2" sectionFormat="of"/>) converts to the PersonalInfo object's level property (<xref target="RFC9553" derivedContent="RFC9553" section="2.8.4" sectionFormat="of"/>). If this parameter is set on the EXPERTISE property, then its values convert as follows:
</t>
<ul spacing="compact">
<li>"beginner" converts to "low";</li>
<li>"average" converts to "medium"; and</li>
<li>"expert" converts to "high".</li>
</ul>
<t>In all other cases, the values convert verbatim, but lowercase <bcp14>MUST</bcp14> be used for the JSContact value.</t>
</section>
<section anchor="vcard-param-mediatype">
<name>MEDIATYPE</name>
<t>The MEDIATYPE parameter (<xref target="RFC6350" derivedContent="RFC6350" section="5.7" sectionFormat="of"/>) converts to the Resource object's mediaType property (<xref target="RFC9553" derivedContent="RFC9553" section="1.4.4" sectionFormat="of"/>).</t>
</section>
<section anchor="vcard-param-phonetic">
<name>PHONETIC</name>
<!-- [rfced] May we update these 2 sentences for clarity by rephrasing
the lead-in sentence and making the second sentence a complete
sentence as shown below?
Original:
This parameter as well as the SCRIPT (Section 2.3.17) parameter set
on a N or ADR property convert to JSContact as follows:
the values of the phonetic, phoneticScript and phoneticSystem
properties of the NameComponent and Name or AddressComponent and
Address object types, respectively.
Perhaps:
When the PHONETIC parameter as well as the SCRIPT (Section 2.3.17)
parameter are set on an N or ADR property, they convert to JSContact
as described below.
The values of the phonetic, phoneticScript, and phoneticSystem properties
convert to values in the NameComponent, Name or AddressComponent, and
Address object types, respectively.
-->
<t>The PHONETIC parameter (<xref target="RFC9554" derivedContent="RFC9554" section="4.6" sectionFormat="of"/>) converts to the Name (<xref target="RFC9553" derivedContent="RFC9553" section="2.2.1" sectionFormat="of"/>) and Address (<xref target="RFC9553" derivedContent="RFC9553" section="2.5.1" sectionFormat="of"/>) objects' phoneticSystem property unless the parameter value is "script", in which case the phoneticSystem property is not set.</t>
<t>The value of the SCRIPT parameter converts to the phoneticScript property (see <xref target="vcard-param-phonetic"/>).</t>
<t>The related N or ADR property is defined by the vCard ALTID parameter. The conversion rules for the <xref target="vcard-prop-n">N</xref> and <xref target="vcard-prop-adr">ADR</xref> properties define how the vCard components convert to JSContact.</t>
<t>The component values of the property on which the PHONETIC parameter is set, convert to the respective NameComponent or AddressComponent objects' phonetic properties.</t>
<t>If more than one property has the PHONETIC parameter set and relates to the same property, then they convert to the Card object's localizations property according to their LANGUAGE parameter values as outlined in <xref target="vcard-param-language"/>.</t>
<figure anchor="phonetic_conversion">
<name>PHONETIC Conversion Example</name>
<sourcecode type="vcard"><![CDATA[
LANGUAGE=zh-Hant
N;ALTID=1;LANGUAGE=zh-Hant:孫;中山;文,逸仙;;
N;ALTID=1;PHONETIC=jyut;
SCRIPT=Latn;LANGUAGE=yue:syun1;zung1saan1;man4,jat6sin1;;
]]></sourcecode>
<sourcecode type="json"><![CDATA[
"language": "zh-Hant",
"name": {
"components": [
{ "kind": "surname", "value": "孫" },
{ "kind": "given", "value": "中山" },
{ "kind": "given2", "value": "文" },
{ "kind": "given2", "value": "逸仙" }
]
},
"localizations": {
"yue": {
"name/phoneticSystem": "jyut",
"name/phoneticScript": "Latn",
"name/components/0/phonetic": "syun1",
"name/components/1/phonetic": "zung1saan1",
"name/components/2/phonetic": "man4",
"name/components/3/phonetic": "jat6sin1"
}
}
]]></sourcecode>
</figure>
</section>
<section anchor="vcard-param-pid">
<name>PID</name>
<t>The PID parameter (<xref target="RFC6350" derivedContent="RFC6350" section="5.5" sectionFormat="of"/>) converts to the vCardParams property; see <xref target="jscontact-prop-vcardparams"/>.</t>
</section>
<section anchor="vcard-param-pref">
<name>PREF</name>
<t>The PREF parameter (<xref target="RFC6350" derivedContent="RFC6350" section="5.3" sectionFormat="of"/>) converts to the pref property of that JSContact object, to which the vCard property having this parameter converts.</t>
</section>
<section anchor="vcard-param-propid">
<name>PROP-ID</name>
<t>The PROP-ID parameter (<xref target="RFC9554" derivedContent="RFC9554" section="4.7" sectionFormat="of"/>) converts to the Id-typed key of the JSContact object to which the vCard property having this parameter converts.</t>
<figure anchor="propid_conversion">
<name>PROP-ID Conversion Example</name>
<sourcecode type="vcard"><![CDATA[
TEL;PROP-ID=PHONE-A;VALUE=uri;PREF=1;TYPE="voice,home"
:tel:+1-555-555-5555;ext=5555
TEL;PROP-ID=PHONE-B;VALUE=uri;TYPE=home
:tel:+33-01-23-45-67
]]></sourcecode>
<sourcecode type="json"><![CDATA[
"phones": {
"PHONE-A": {
"contexts": { "private": true },
"features": { "voice": true },
"number": "tel:+1-555-555-5555;ext=5555",
"pref": 1
},
"PHONE-B": {
"contexts": { "private": true },
"number": "tel:+33-01-23-45-67"
}
}
]]></sourcecode>
</figure>
</section>
<section anchor="vcard-param-script">
<name>SCRIPT</name>
<t>The SCRIPT parameter (<xref target="RFC9554" derivedContent="RFC9554" section="4.8" sectionFormat="of"/>) converts to the Name (<xref target="RFC9553" derivedContent="RFC9553" section="2.2.1" sectionFormat="of"/>) or Address (<xref target="RFC9553" derivedContent="RFC9553" section="2.5.1" sectionFormat="of"/>) objects' phoneticScript property.</t>
<t>Also see <xref target="vcard-param-phonetic"/>.</t>
</section>
<section anchor="vcard-param-service-type">
<name>SERVICE-TYPE</name>
<t>The SERVICE-TYPE parameter (<xref target="RFC9554" derivedContent="RFC9554" section="4.9" sectionFormat="of"/>) converts to the OnlineService object's service property (<xref target="RFC9553" derivedContent="RFC9553" section="2.3.2" sectionFormat="of"/>).</t>
</section>
<section anchor="vcard-param-sortas">
<name>SORT-AS</name>
<t>The SORT-AS parameter (<xref target="RFC6350" derivedContent="RFC6350" section="5.9" sectionFormat="of"/>) converts to the Name, Organization, and OrgUnit objects' sortAs properties.</t>
</section>
<section anchor="vcard-param-type">
<name>TYPE</name>
<!--[rfced] Would it be correct to say "property-specific kind values"
instead of "property-specific kind property values" to avoid
redundancy?
Original:
This converts to the contexts property as well as property-specific
kind property values defined in later sections.
Perhaps:
The TYPE parameter converts to the contexts property as well as
property-specific kind values defined in later sections.
-->
<t>The TYPE parameter (<xref target="RFC6350" derivedContent="RFC6350" section="5.6" sectionFormat="of"/>) either converts to the contexts property or the kind property, as defined in later sections. If not specified otherwise, the vCard "home" and "work" parameter values convert to the JSContact "private" and "work" contexts, respectively.</t>
</section>
<section anchor="vcard-param-tz">
<name>TZ</name>
<t>The TZ parameter (<xref target="RFC6350" derivedContent="RFC6350" section="5.11" sectionFormat="of"/>) on an ADR property converts to the Address object's timeZone property (<xref target="RFC9553" derivedContent="RFC9553" section="2.5.1" sectionFormat="of"/>). Also see the conversion of the TZ property in <xref target="vcard-prop-tz"/>.</t>
</section>
<section anchor="vcard-param-username">
<name>USERNAME</name>
<t>The USERNAME parameter (<xref target="RFC9554" derivedContent="RFC9554" section="4.10" sectionFormat="of"/>) converts to the OnlineService object's user property (<xref target="RFC9553" derivedContent="RFC9553" section="2.3.2" sectionFormat="of"/>).</t>
</section>
<section anchor="vcard-param-value">
<name>VALUE</name>
<t>The VALUE parameter (<xref target="RFC6350" derivedContent="RFC6350" section="5.2" sectionFormat="of"/>) does not convert to an IANA-registered property in JSContact. To preserve properties with experimental values, see Sections <xref target="jscontact-prop-vcardprops" format="counter"/> and <xref target="jscontact-prop-vcardparams" format="counter"/>.</t>
</section>
</section>
<section>
<name>General Properties</name>
<section>
<name>BEGIN and END</name>
<t>The BEGIN and END properties do not convert to IANA-registered properties in JSContact.</t>
</section>
<section anchor="vcard-prop-kind">
<name>KIND</name>
<t>The KIND property (<xref target="RFC6350" derivedContent="RFC6350" section="6.1.4" sectionFormat="of"/>) converts to the kind property (<xref target="kind_conversion"/>). Allowed values are those described in <xref target="RFC6350" sectionFormat="of" section="6.1.4"/> and extended with the values declared in <xref target="RFC6473"/> and <xref target="RFC6869"/>.</t>
<figure anchor="kind_conversion">
<name>KIND Conversion Example</name>
<sourcecode type="vcard"><![CDATA[
KIND:individual
]]></sourcecode>
<sourcecode type="json"><![CDATA[
"kind": "individual"
]]></sourcecode>
</figure>
</section>
<section anchor="vcard-prop-source">
<name>SOURCE</name>
<t>The SOURCE property (<xref target="RFC6350" derivedContent="RFC6350" section="6.1.3" sectionFormat="of"/>) converts to a Directory object (<xref target="RFC9553" derivedContent="RFC9553" section="2.6.2" sectionFormat="of"/>) in the Card object's directories property (<xref target="source_conversion"/>). The Directory object's kind property is set to "entry". The uri property is set to the SOURCE property value.</t>
<t>The PREF and MEDIATYPE parameters convert according to the rules defined in <xref target="vcard-parameters"/>.</t>
<figure anchor="source_conversion">
<name>SOURCE Conversion Example</name>
<sourcecode type="vcard"><![CDATA[
SOURCE:https://dir.example.com/addrbook/jdoe/Jean%20Dupont.vcf
]]></sourcecode>
<sourcecode type="json"><![CDATA[
"directories": {
"ENTRY-1": {
"kind": "entry",
"uri": "https://dir.example.com/addrbook/jdoe/Jean%20Dupont.vcf"
}
}
]]></sourcecode>
</figure>
</section>
<section anchor="vcard-prop-xml">
<name>XML</name>
<t>The XML property (<xref target="RFC6350" derivedContent="RFC6350" section="6.1.5" sectionFormat="of"/>) converts to the vCardProps property; see <xref target="jscontact-prop-vcardprops"/>.</t>
</section>
</section>
<section>
<name>Identification Properties</name>
<section anchor="vcard-prop-anniversary">
<name>ANNIVERSARY, BDAY, BIRTHPLACE, DEATHDATE, and DEATHPLACE</name>
<t>The following properties all convert to Anniversary objects in the Card object's anniversaries property (<xref target="anniversary_conversion"/>):</t>
<ul spacing="compact">
<li>ANNIVERSARY (<xref target="RFC6350" derivedContent="RFC6350" section="6.2.6" sectionFormat="of"/>)</li>
<li>BDAY (<xref target="RFC6350" derivedContent="RFC6350" section="6.2.5" sectionFormat="of"/>)</li>
<li>BIRTHPLACE (<xref target="RFC6474" derivedContent="RFC6474" section="2.1" sectionFormat="of"/>)</li>
<li>DEATHDATE (<xref target="RFC6474" derivedContent="RFC6474" section="2.3" sectionFormat="of"/>)</li>
<li>DEATHPLACE (<xref target="RFC6474" derivedContent="RFC6474" section="2.2" sectionFormat="of"/>)</li>
</ul>
<t>BDAY and BIRTHPLACE convert to an Anniversary object (<xref target="RFC9553" derivedContent="RFC9553" section="2.8.1" sectionFormat="of"/>) having the date and place properties set. The kind poperty is set to "birth".
</t>
<t>DEATHDATE and DEATHPLACE convert to an Anniversary object having the date and place properties set. The Anniversary object's kind property is set to "death".
</t>
<t>ANNIVERSARY converts to the Anniversary object's date property. The Anniversary object's kind property is set to "wedding".</t>
<t>If the BIRTHPLACE or DEATHPLACE property value is of type URI using the "geo:" URI scheme, then it converts to the Address object's coordinates property. If the value type is TEXT then it converts to the Address object's full property. Otherwise it converts to the vCardProps property; see <xref target="jscontact-prop-vcardprops"/>.</t>
<t>The ALTID and LANGUAGE parameters of both the BIRTHPLACE and DEATHPLACE properties convert according to the rules defined in <xref target="vcard-parameters"/>.</t>
<figure anchor="anniversary_conversion">
<name>BDAY, BIRTHPLACE, DEATHDATE, DEATHPLACE, and ANNIVERSARY Conversion Example</name>
<sourcecode type="vcard"><![CDATA[
BDAY:19531015T231000Z
BIRTHPLACE:
123 Main Street\nAny Town, CA 91921-1234\nU.S.A.
DEATHDATE:19960415
DEATHPLACE:
5 Court Street\nNew England, ND 58647\nU.S.A.
ANNIVERSARY:19860201
]]></sourcecode>
<sourcecode type="json"><![CDATA[
"anniversaries": {
"ANNIVERSARY-1" : {
"kind": "birth",
"date": {
"@type": "Timestamp",
"utc": "1953-10-15T23:10:00Z"
},
"place": {
"full":
"123 Main Street\nAny Town, CA 91921-1234\nU.S.A."
}
},
"ANNIVERSARY-2" : {
"kind": "death",
"date": {
"year": 1996,
"month": 4,
"year": 15
},
"place": {
"full": "5 Court Street\nNew England, ND 58647\nU.S.A."
}
},
"ANNIVERSARY-3" : {
"kind": "wedding",
"date": {
"year": 1986,
"month": 2,
"day": 1
}
}
}
]]></sourcecode>
</figure>
</section>
<section anchor="vcard-prop-fn">
<name>FN</name>
<t>The FN property (<xref target="RFC6350" derivedContent="RFC6350" section="6.2.1" sectionFormat="of"/>) converts to the Name object's full property (<xref target="fn_conversion"/>). If the LANGUAGE parameter is set, then the FN property converts as outlined in <xref target="vcard-param-language"/>. In the unexpected case where the vCard contains more than one FN property without the LANGUAGE parameter, convert the FN property that has the least parameters. If multiple such FN properties are present, choose any of them. All other FN properties convert to the <xref target="jscontact-prop-vcardprops">vCardProps</xref> property.</t>
<figure anchor="fn_conversion">
<name>FN Conversion Example</name>
<sourcecode type="vcard"><![CDATA[
FN:John Q. Public, Esq.
]]></sourcecode>
<sourcecode type="json"><![CDATA[
"name": {
"full": "John Q. Public, Esq."
}
]]></sourcecode>
</figure>
</section>
<section anchor="vcard-prop-gender">
<name>GENDER</name>
<t>The GENDER property (<xref target="RFC6350" derivedContent="RFC6350" section="6.2.7" sectionFormat="of"/>) does not convert to an IANA-registered property in JSContact. To convert this property, see <xref target="jscontact-prop-vcardprops"/>. Alternatively, the Card object's speakToAs property defines how to address and refer to an individual represented by the Card, as do the newly defined vCard GRAMGENDER and PRONOUNS properties of <xref target="RFC9554"/>.</t>
</section>
<section anchor="vcard-prop-gramgender">
<name>GRAMGENDER and PRONOUNS</name>
<t>The GRAMGENDER property (<xref target="RFC9554" derivedContent="RFC9554" section="3.2" sectionFormat="of"/>) converts to the SpeakToAs object's grammaticalGender property (<xref target="grammatical_gender_pronouns_conversion"/>).</t>
<t>The PRONOUNS property (<xref target="RFC9554" derivedContent="RFC9554" section="3.4" sectionFormat="of"/>) converts to the SpeakToAs object's pronouns property (<xref target="grammatical_gender_pronouns_conversion"/>).</t>
<figure anchor="grammatical_gender_pronouns_conversion">
<name>GRAMGENDER and PRONOUNS Conversion Example</name>
<sourcecode type="vcard"><![CDATA[
GRAMGENDER:NEUTER
PRONOUNS;PREF=2:they/them
PRONOUNS;PREF=1:xe/xir
]]></sourcecode>
<sourcecode type="json"><![CDATA[
"speakToAs": {
"grammaticalGender": "neuter",
"pronouns": {
"PRONOUNS-1": {
"pronouns": "they/them",
"pref": 2
},
"PRONOUNS-2": {
"pronouns": "xe/xir",
"pref": 1
}
}
}
]]></sourcecode>
</figure>
</section>
<section anchor="vcard-prop-n">
<name>N</name>
<t>The N property (<xref target="RFC6350" derivedContent="RFC6350" section="6.2.2" sectionFormat="of"/>) converts to a Name object (<xref target="RFC9553" derivedContent="RFC9553" section="2.2.1" sectionFormat="of"/>) in the Card object's name property.
Each component in the N property structured value converts to a NameComponent in the Name object's components property. The following table shows this relation:</t>
<!--[rfced] In Table 1, does "in here" mean "listed in this table" as
shown below?
Original:
To vCard: add any surname2 NameComponent value in here,
after all surname values.
To vCard: add any generation NameComponent value also in here.
Perhaps:
To vCard: add any surname2 NameComponent value listed in this
table, after all surname values.
To vCard: add any generation NameComponent value listed in this
table.
-->
<table anchor="n_kind_conversion">
<name>N Components Conversion</name>
<thead>
<tr>
<th align="left">N component</th>
<th align="left">NameComponent kind</th>
<th align="left">Remarks</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">Family name</td>
<td align="left">surname</td>
<td align="left">To vCard: add any "surname2" NameComponent to the Family name component, after all "surname" values.<br/>From vCard: ignore any value that also occurs in the Secondary surname component.</td>
</tr>
<tr>
<td align="left">Given name</td>
<td align="left">given</td>
<td align="left"/>
</tr>
<tr>
<td align="left">Additional name</td>
<td align="left">given2</td>
<td align="left"/>
</tr>
<tr>
<td align="left">Honorific prefix</td>
<td align="left">title</td>
<td align="left"/>
</tr>
<tr>
<td align="left">Honorific suffix</td>
<td align="left">credential</td>
<td align="left">To vCard: add any "generation" NameComponent to the Honorific suffix component.<br/>From vCard: ignore any value that also occurs in the Generation component.</td>
</tr>
<tr>
<td align="left">Secondary surname</td>
<td align="left">surname2</td>
<td align="left"/>
</tr>
<tr>
<td align="left">Generation</td>
<td align="left">generation</td>
<td align="left"/>
</tr>
</tbody>
</table>
<t>If the <xref target="vcard-param-jscomps">JSCOMPS</xref> parameter is set, then the Name object's isOrdered property value is "true", and the defaultSeparator property and any "separator" NameComponent objects are set according to the parameter value. The order in the components property <bcp14>MUST</bcp14> adhere to the order of the JSCOMPS parameter value.</t>
<t>If the JSCOMPS parameter is not set, then the Name object's isOrdered property value is "false", and the defaultSeparator property <bcp14>MUST NOT</bcp14> be set. The order in the components property <bcp14>MUST</bcp14> follow the order of values in the N structured value when read from left to right.</t>
<t>If the SORT-AS parameter is set, then its structured value converts to the Name object's sortAs property according to <xref target="n_kind_conversion"/>. An empty or non-existent component value indicates that no sort is defined for this kind.</t>
<!--[rfced] The following lines are longer than the 72-character limit
for sourcecode. Please let us know where breaks should be placed
for the following lines:
Original:
(Figure 13)
N;SORT-AS="Stevenson,John Philip":Stevenson;John;Philip,Paul;Dr.;Jr.,M.D.,A.C.P.;;Jr. (16 over)
(Figure 16)
ADR;TYPE=work;CC=US:;;54321 Oak St;Reston;VA;20190;USA;;;;Oak St;54321;;;;; (6 over)
(Under "Format definition" in Section 3.3.1)
(jscomps-entry-sep / "") ";" jscomps-entrylist (4 over)
jscomps-entry-verb = *QSAFE-CHAR ; encode special characters according to RFC 6868 (16 over)
(Figure 53)
N;JSCOMPS=";1;2;2,1;0;6;4,1":Stevenson;John;Philip,Paul;;Jr.,M.D.;;Jr. (4 over)
(Figure 54)
ADR;JSCOMPS="s,\, ;11;s, ;10;3":;;54321 Oak St;Reston;;;;;;;Oak St;54321;;;;;; (12 over)
-->
<figure anchor="n_conversion">
<name>N Conversion Example</name>
<sourcecode type="vcard"><![CDATA[
N;SORT-AS="Stevenson,John Philip":Stevenson;John;Philip,Paul;Dr.;Jr.,M.D.,A.C.P.;;Jr.
]]></sourcecode>
<sourcecode type="json"><![CDATA[
"name": {
"components":[
{ "kind": "surname", "value": "Stevenson" },
{ "kind": "given", "value": "John" },
{ "kind": "given2", "value": "Philip" },
{ "kind": "given2", "value": "Paul" },
{ "kind": "title", "value": "Dr." },
{ "kind": "credential", "value": "M.D." },
{ "kind": "credential", "value": "A.C.P." },
{ "kind": "generation", "value": "Jr." }
],
"sortAs": {
"surname": "Stevenson",
"given": "John Philip"
}
}
]]></sourcecode>
</figure>
<t>See <xref target="vcard-param-jscomps-examples"/> for examples of using the JSCOMPS parameter for vCard-structured property values.</t>
</section>
<section anchor="vcard-prop-nickname">
<name>NICKNAME</name>
<t>The NICKNAME property (<xref target="RFC6350" derivedContent="RFC6350" section="6.2.3" sectionFormat="of"/>) converts to a Nickname object (<xref target="RFC9553" derivedContent="RFC9553" section="2.2.2" sectionFormat="of"/>) in the Card object's nicknames property (<xref target="nickname_conversion"/>). The name property is set to the NICKNAME property value.</t>
<t>The PREF and TYPE parameters convert according to the rules defined in <xref target="vcard-parameters"/>.</t>
<figure anchor="nickname_conversion">
<name>NICKNAME Conversion Example</name>
<sourcecode type="vcard"><![CDATA[
NICKNAME:Johnny
]]></sourcecode>
<sourcecode type="json"><![CDATA[
"nicknames": {
"NICK-1": {
"name": "Johnny"
}
}
]]></sourcecode>
</figure>
</section>
<section anchor="vcard-prop-photo">
<name>PHOTO</name>
<t>The PHOTO property (<xref target="RFC6350" derivedContent="RFC6350" section="6.2.4" sectionFormat="of"/>) converts to a Media object (<xref target="RFC9553" derivedContent="RFC9553" section="2.6.4" sectionFormat="of"/>) in the Card object's media property (<xref target="photo_conversion"/>). The Media object's kind property is set to "photo" and the uri property is set to the PHOTO value.</t>
<t>The PREF and MEDIATYPE parameters convert according to the rules defined in <xref target="vcard-parameters"/>.</t>
<figure anchor="photo_conversion">
<name>PHOTO Conversion Example</name>
<sourcecode type="vcard"><![CDATA[
PHOTO:https://www.example.com/pub/photos/jqpublic.gif
]]></sourcecode>
<sourcecode type="json"><![CDATA[
"media": {
"PHOTO-1": {
"kind": "photo",
"uri": "https://www.example.com/pub/photos/jqpublic.gif"
}
}
]]></sourcecode>
</figure>
</section>
</section>
<section>
<name>Delivery Addressing Properties</name>
<section anchor="vcard-prop-adr">
<name>ADR</name>
<t>The ADR property (<xref target="RFC6350" derivedContent="RFC6350" section="6.3.1" sectionFormat="of"/>) converts to an Address object (<xref target="RFC9553" derivedContent="RFC9553" section="2.5.1" sectionFormat="of"/>) in the Card object's addresses property. Each component in the ADR-structured property value converts to an AddressComponent in the Address object's components property.</t>
<t><xref target="RFC9554"/> defines new components for the ADR property. Implementations <bcp14>SHOULD</bcp14> set these new components, even if all their values are the empty string.</t>
<t>The following table shows how the ADR component and AddressComponent kind relate:</t>
<!--[rfced] In Table 2 (Section 2.6.1), is it necessary to include two
instances of "see Remarks" since the Remarks column is adjacent
to the cells? Please review and let us know these instances may
be deleted as shown below.
Original:
apartment (see Remarks)
name (see Remarks)
Perhaps:
apartment
name
-->
<table anchor="adr_kind_conversion">
<name>ADR Components Conversion</name>
<thead>
<tr>
<th align="left">ADR component</th>
<th align="left">AddressComponent kind</th>
<th align="left">Remarks</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">post office box</td>
<td align="left">postOfficeBox</td>
<td align="left"><xref target="RFC6350"/> recommends that this component not be set, but this is now disputable given the new components. Instead, set this component and use the new ADR value format defined in <xref target="RFC9554"/>.</td>
</tr>
<tr>
<td align="left">extended address</td>
<td align="left">apartment</td>
<td align="left"><t>To vCard: set the values of the following components:</t>
<ul>
<li>room</li>
<li>floor</li>
<li>apartment</li>
<li>building</li>
</ul>
<t>From vCard: ignore if the ADR structured value is of the format defined in <xref target="RFC9554"/>. Otherwise, convert to "apartment".</t></td>
</tr>
<tr>
<td align="left">street address</td>
<td align="left">name</td>
<td align="left"><t>To vCard: set the values of the following components:</t>
<ul>
<li>number</li>
<li>name</li>
<li>block</li>
<li>direction</li>
<li>landmark</li>
<li>subdistrict</li>
<li>district</li>
</ul>
<t>From vCard: ignore if the ADR structured value is of the format defined in <xref target="RFC9554"/>. Otherwise, convert to "name".</t></td>
</tr>
<tr>
<td align="left">locality</td>
<td align="left">locality</td>
<td align="left"/>
</tr>
<tr>
<td align="left">region</td>
<td align="left">region</td>
<td align="left"/>
</tr>
<tr>
<td align="left">postal code</td>
<td align="left">postcode</td>
<td align="left"/>
</tr>
<tr>
<td align="left">apartment</td>
<td align="left">apartment</td>
<td>Defined in <xref target="RFC9554"/>.</td>
</tr>
<tr>
<td align="left">block</td>
<td align="left">block</td>
<td>Defined in <xref target="RFC9554"/>.</td>
</tr>
<tr>
<td align="left">building</td>
<td align="left">building</td>
<td>Defined in <xref target="RFC9554"/>.</td>
</tr>
<tr>
<td align="left">direction</td>
<td align="left">direction</td>
<td>Defined in <xref target="RFC9554"/>.</td>
</tr>
<tr>