Implement vCard 4 ORG structured values

This commit is contained in:
2026-03-28 20:51:11 -05:00
parent 5cdffd9126
commit 6012989432

View File

@@ -136,7 +136,6 @@ const fixedValueTypeProperties = [
(pnTitle, vtText), (pnTitle, vtText),
(pnRole, vtText), (pnRole, vtText),
(pnLogo, vtUri), (pnLogo, vtUri),
(pnOrg, vtText),
(pnMember, vtUri), (pnMember, vtUri),
(pnRelated, vtTextOrUri), (pnRelated, vtTextOrUri),
(pnCategories, vtTextList), (pnCategories, vtTextList),
@@ -334,6 +333,9 @@ type
sex*: Option[VC4_Sex] sex*: Option[VC4_Sex]
genderIdentity*: Option[string] genderIdentity*: Option[string]
VC4_Org* = ref object of VC4_Property
value*: seq[string]
VC4_Adr* = ref object of VC4_Property VC4_Adr* = ref object of VC4_Property
poBox*: seq[string] poBox*: seq[string]
ext*: seq[string] ext*: seq[string]
@@ -759,6 +761,48 @@ func newVC4_Gender*(
("ALTID", if altId.isSome: @[altId.get] else: @[]))), ("ALTID", if altId.isSome: @[altId.get] else: @[]))),
sex, genderIdentity, group) sex, genderIdentity, group)
func newVC4_Org*(
value: seq[string],
altId: Option[string] = none[string](),
group: Option[string] = none[string](),
language: Option[string] = none[string](),
params: seq[VC_Param] = @[],
pids: seq[PidValue] = @[],
pref: Option[int] = none[int](),
types: seq[string] = @[]): VC4_Org =
if pref.isSome and (pref.get < 1 or pref.get > 100):
raise newException(ValueError, "PREF must be an integer between 1 and 100")
return assignFields(
VC4_Org(params: flattenParameters(params,
("ALTID", if altId.isSome: @[altId.get] else: @[]),
("LANGUAGE", if language.isSome: @[language.get] else: @[]),
("PID", pids --> map($it)),
("PREF", if pref.isSome: @[$pref.get] else: @[]),
("TYPE", types))),
value, group)
func newVC4_Org*(
value: string,
altId: Option[string] = none[string](),
group: Option[string] = none[string](),
language: Option[string] = none[string](),
params: seq[VC_Param] = @[],
pids: seq[PidValue] = @[],
pref: Option[int] = none[int](),
types: seq[string] = @[]): VC4_Org =
return newVC4_Org(
value = asComponentList(value),
altId = altId,
group = group,
language = language,
params = params,
pids = pids,
pref = pref,
types = types)
func newVC4_Adr*( func newVC4_Adr*(
poBox: seq[string] = @[], poBox: seq[string] = @[],
ext: seq[string] = @[], ext: seq[string] = @[],
@@ -1178,6 +1222,10 @@ func serialize*(n: VC4_N): string =
(n.prefixes --> map(serializeValue(it))).join(",") & ";" & (n.prefixes --> map(serializeValue(it))).join(",") & ";" &
(n.suffixes --> map(serializeValue(it))).join(",") (n.suffixes --> map(serializeValue(it))).join(",")
func serialize*(o: VC4_Org): string =
result = o.nameWithGroup & serialize(o.params) & ":" &
(o.value --> map(serializeValue(it))).join(";")
func serialize*(a: VC4_Adr): string = func serialize*(a: VC4_Adr): string =
result = a.nameWithGroup & serialize(a.params) & ":" & result = a.nameWithGroup & serialize(a.params) & ":" &
serializeComponentList(a.poBox) & ";" & serializeComponentList(a.poBox) & ";" &
@@ -1486,6 +1534,14 @@ macro genPropParsers(
postalCode: p.readComponentValueList(requiredPrefix = some(';')), postalCode: p.readComponentValueList(requiredPrefix = some(';')),
country: p.readComponentValueList(requiredPrefix = some(';'))))) country: p.readComponentValueList(requiredPrefix = some(';')))))
block: # ORG
let parseCase = nnkOfBranch.newTree(ident("pnOrg"), newEmptyNode())
result.add(parseCase)
parseCase[1] = genAst(contents):
p.validateType(params, vtText)
contents.add(ac(VC4_Org(
value: p.readComponentValueList(seps = {';'}))))
block: # REV block: # REV
let parseCase = nnkOfBranch.newTree(ident("pnRev"), newEmptyNode()) let parseCase = nnkOfBranch.newTree(ident("pnRev"), newEmptyNode())
result.add(parseCase) result.add(parseCase)