🠕

1.3 Lignes

Une ligne est une représentation textuelle d'une partie d'une structure. Une ligne se compose d'un niveau, d'un identifiant de référence croisée facultatif, d'une étiquette, d'une valeur de ligne facultative et d'un terminateur de ligne. Elle correspond à la production Ligne

Ligne    = Level D [Xref D] Tag [D LineVal] EOL

Level   = "0" / nonzero *DIGIT
D       = %x20                            ; space
Xref    = atsign 1*tagchar atsign         ; but not "@VOID@"
Tag     = stdTag / extTag
LineVal = pointer / lineStr
EOL     = %x0D [%x0A] / %x0A              ; CR-LF, CR, or LF

stdTag  = ucletter *tagchar
extTag  = underscore 1*tagchar
tagchar = ucletter / DIGIT / underscore

pointer = voidPtr / Xref
voidPtr = %s"@VOID@"

nonAt   = %x09 / %x20-3F / %x41-10FFFF    ; non-EOL, non-@
nonEOL  = %x09 / %x20-10FFFF              ; non-EOL
lineStr = (nonAt / atsign atsign) *nonEOL ; leading @ doubled

Le niveau correspond au niveau de production Niveau et sert à encoder les relations de sous-structure. Toute ligne de niveau 0 encode un enregistrement ou une pseudo-structure similaire. Toute ligne de niveau x ≥ 0 encode une sous-structure de la structure encodée par la ligne précédente la plus proche de niveau x-1.

Les versions précédentes autorisaient les espaces et les lignes vides en début de ligne. Cette possibilité a été supprimée dans la version 7.0 afin de simplifier l'analyse syntaxique.

L'identificateur de référence croisée correspond à Xref (mais pas à la référence voidPtr) et indique qu'il s'agit d'une structure vers laquelle peuvent pointer des données de type pointeur. Chaque identificateur de référence croisée doit être unique au sein d'un document. Les identificateurs de référence croisée ne sont pas conservés entre les flux de données et ne doivent pas être affichés à l'utilisateur afin d'éviter qu'ils ne fassent référence à des données transitoires dans des notes ou à d'autres données permanentes.

Chaque enregistrement vers lequel pointent d'autres structures doit posséder un identifiant de référence croisée. Un enregistrement vers lequel ne pointent aucune structure peut posséder un identifiant de référence croisée, mais ce n'est pas obligatoire. Une sous-structure ou une pseudo-structure ne doit pas posséder d'identifiant de référence croisée.

L’élément tag correspond à l’élément de production Tag et encode le type de la structure. Les éléments correspondant à l’élément de production stdTag sont définis dans ce document. Les éléments correspondant à l’élément extTag sont définis conformément à Extensions.

Une même étiquette peut représenter plusieurs types de structures. Le type de chaque structure est identifié par son étiquette et le type de sa superstructure. La correspondance entre les paires (type de superstructure, étiquette) et les types de structures est décrite ailleurs dans ce document (pour les types de structures et les étiquettes standard) ou dans le schéma et la documentation des auteurs des extensions (pour les types de structures et les étiquettes des extensions).

La balise ADOP est utilisée dans ce document pour représenter deux types de structures. Le type de structure concerné peut être identifié par le type de superstructure, comme suit:

Type de Superstructure Type de Structure identifiée par son étiquetteADOP
g7:record-INDI g7:ADOP
g7:ADOP-FAMC g7:FAMC-ADOP

Une sous-structure définie par extension pourrait également être utilisée pour placer l'un ou l'autre de ces types de structures dans des superstructures d'extension.

La balise ADOP est également utilisée dans l'ensemble des valeurs énumérées autorisées par les types de structure g7:DATA-EVEN, g7:SOUR-EVEN et g7:NO.

La valeur de ligne correspond à la valeur de ligne de production (LineVal) et encode la valeur utile de la structure. Son contenu suffit à distinguer les pointeurs des chaînes de caractères. Les pointeurs sont encodés comme l'identificateur de référence croisée de la structure pointée. Chaque valeur utile autre qu'un pointeur peut être encodée dans une ou plusieurs chaînes de caractères (les continuations de ligne encodent les valeurs utiles multilignes dans plusieurs chaînes). L'encodage exact des valeurs utiles autres qu'un pointeur dépend de leur type de données, déterminé par le type de structure. Le type de données de ces valeurs utiles ne peut être entièrement déterminé par le seul contenu de la valeur de ligne.

Notez que la valeur de LineVal en production ne correspond pas à une chaîne vide. Étant donné que les valeurs utiles vides et les valeurs utiles manquantes sont considérées comme équivalentes, une structure sans valeur utile et une structure avec une chaîne vide comme valeur utile sont encodées sans LineVal et sans espace après la balise Tag.

La valeur utile d'une structure `MARR` est de type `[Y|<NULL>]`, qui est optionnelle mais ne peut pas être une chaîne vide. La valeur utile d'une structure `EVEN` est de type `Text`, qui n'est pas optionnelle mais peut être une chaîne vide. La `Line` encodant une structure `MARR` sans valeur utile est «1 MARR» et la `Line` encodant une structure `EVEN` sans valeur utile est «1 EVEN». Les deux Line n'ont pas de LineVal et pas d'espace final.

Si la valeur d'une ligne correspond à la production Xref, cette même valeur doit figurer comme identificateur de référence croisée d'une structure au sein du document. La production spéciale voidPtr permet d'encoder les pointeurs nuls.

Si le premier caractère de la chaîne stockée dans une chaîne de ligne est U+0040 (@), la chaîne de ligne doit échapper ce caractère en doublant ce @.

Les versions précédentes exigeaient de doubler tous les caractères @ dans une valeur de ligne, mais cette pratique était peu courante. Dans cette version, @ n'est doublé que s'il s'agit du premier caractère d'une chaîne de caractères.

Une structure avec la balise NOTE, de niveau 1, et une valeur utile de 2 lignes où la première ligne est «me@example.com est mon adresse e-mail» et la seconde ligne est «@me et @I sont mes identifiants sur les réseaux sociaux» serait encodée comme

1 NOTE me@example.com est mon adresse e-mail
2 CONT @@me et @I sont mes identifiants sur les réseaux sociaux

Les valeurs de ligne qui ne correspondent ni à Xref ni à lineStr sont interdites. Elles ont été utilisées dans les versions précédentes (par exemple, une valeur de ligne commençant par @#D était une date dans les versions 4.0 à 5.5.1) et pourront être réutilisées dans une version ultérieure si nécessaire.

Chaque élément d'une ligne est séparé par un seul délimiteur delimiter correspondant à la production D. Un délimiteur est toujours un espace (U+0020). L'utilisation de plusieurs délimiteurs entre les éléments d'une ligne est interdite. Ainsi, si la balise est suivie de deux espaces, le premier espace est un délimiteur et le second fait partie de la valeur de la ligne.

Tous les caractères d'une valeur utile doivent être conservés dans la valeur de ligne correspondante, y compris les espaces de début et de fin.

Chaque ligne se termine par un terminateur de ligne correspondant à la fin de ligne (EOL) de production. Un terminateur de ligne peut être un retour chariot (U+000D), un saut de ligne (U+000A) ou un retour chariot suivi d'un saut de ligne. Le même terminateur de ligne doit être utilisé sur chaque ligne d'un même document.

Les valeurs de ligne ne peuvent pas contenir de terminateurs de ligne internes, mais certaines valeurs utiles peuvent en contenir. Si une valeur utile contient un terminateur de ligne, elle est divisée en plusieurs valeurs utiles en fonction de ces terminateurs. La première de ces valeurs utiles divisées est encodée comme la valeur de ligne de la structure, et chaque valeur utile divisée suivante est encodée comme la valeur de ligne d'une pseudo-structure de continuation de ligne placée immédiatement après la ligne de la structure, à un niveau supérieur. La balise d'une pseudo-structure de continuation de ligne est CONT. L'ordre des pseudo-structures de continuation de ligne correspond à l'ordre des lignes de texte dans la valeur utile.

Les versions antérieures à la version 7.0 utilisaient une autre balise similaire à CONT, CONC, qui permettait de séparer les valeurs de ligne sans insérer de saut de ligne. La balise CONC n'apparaît pas dans la version 7. Afin d'assurer la compatibilité avec les analyseurs GEDCOM multiversions, la balise CONC est réservée et n'apparaîtra pas comme balise d'un type de structure.

Les pseudo-structures de continuation de ligne ne sont pas considérées comme des structures. Bien qu'elles correspondent à la ligne de production Line et que leur niveau et leur position les fassent apparaître comme des sous-structures de la structure, elles constituent en réalité une continuation de l'encodage de la valeur utile de la structure et ne font pas partie de l'ensemble des sous-structures de celle-ci. Elles doivent apparaître immédiatement après la ligne dont elles encodent la valeur utile et avant toute autre ligne.

Étant donné que les terminateurs de ligne dans les valeurs utiles sont codés à l'aide de continuations de ligne, il n'est pas possible de distinguer entre U+000D et U+000A dans les valeurs utiles.

Les versions précédentes limitaient le nombre de caractères pouvant figurer dans une balise, un identifiant de référence croisée et une valeur de ligne. Ces restrictions ont été supprimées dans la version 7.0. La pseudo-structure `CONC`, qui autorisait des valeurs de ligne plus courtes que les valeurs utiles, a également été supprimée.

Voici des exemples de lignes valides mais sans rapport entre elles:

  • Niveau 0, identifiant de référence croisée @I1234@, étiquette INDI, pas de valeur de ligne.

    0 @I1234@ INDI
  • Niveau 1, aucun identifiant de référence croisée, balise CHIL, valeur de ligne de pointeur pointant vers la structure avec l'identifiant de référence croisée « @I1234@ ».

    1 CHIL @I1234@
  • Niveau 1, sans identifiant de référence croisée, balise NOTE, et pseudo-structure valeur de ligne + continuation pour encoder une chaîne de données de 4 lignes: «Ceci est un champ de note qui», «  s'étend sur quatre lignes.», «», et «(la troisième ligne étant vide)». Notez que les espaces de début et de fin sont conservés.

    1 NOTE Ceci est un champ de note qui
    2 CONT   s'étend sur quatre lignes.
    2 CONT
    2 CONT (la troisième ligne étant vide)