Appendix A. Implementation Hints (Conseils d'implémentation)
Les sections normatives sur l'expansion décrivent chaque opérateur avec un processus d'expansion distinct par souci de clarté descriptive. Dans les implémentations réelles, nous nous attendons à ce que les expressions soient traitées de gauche à droite en utilisant un algorithme commun qui n'a que des variations mineures de processus par opérateur. Cette annexe non normative décrit un tel algorithme.
Initialisez une chaîne de résultat vide et son état non-erreur.
Scannez le modèle et copiez les littéraux dans la chaîne de résultat (comme dans la Section 3.1) jusqu'à ce qu'une expression soit indiquée par un "{", qu'une erreur soit indiquée par la présence d'un caractère non-littéral autre que "{", ou que le modèle se termine. Lorsqu'il se termine, retournez la chaîne de résultat et son état d'erreur ou de non-erreur actuel.
- Si une expression est trouvée, scannez le modèle jusqu'au prochain
"}"et extrayez les caractères entre les accolades. - Si le modèle se termine avant un
"}", alors ajoutez le"{"et les caractères extraits à la chaîne de résultat et retournez avec un état d'erreur indiquant que l'expression est mal formée.
Examinez le premier caractère de l'expression extraite pour un opérateur.
- Si l'expression s'est terminée (c'est-à-dire est ""), un opérateur inconnu ou non implémenté est trouvé, ou le caractère n'est pas dans l'ensemble varchar (Section 2.3), alors ajoutez ", l'expression extraite, et " à la chaîne de résultat, mémorisez que le résultat est dans un état d'erreur, puis retournez pour scanner le reste du modèle.
- Si un opérateur connu et implémenté est trouvé, stockez l'opérateur et passez au caractère suivant pour commencer la varspec-list.
- Sinon, stockez l'opérateur comme NUL (expansion de chaîne simple).
Utilisez la table de valeurs suivante pour déterminer le comportement de traitement par opérateur de type d'expression. L'entrée pour "first" est la chaîne à ajouter au résultat en premier si l'une des variables de l'expression est définie. L'entrée pour "sep" est le séparateur à ajouter au résultat avant toute deuxième (ou ultérieure) expansion de variable définie. L'entrée pour "named" est un booléen indiquant si l'expansion inclut le nom de variable ou de clé lorsqu'aucun modificateur d'explosion n'est donné. L'entrée pour "ifemp" est une chaîne à ajouter au nom si sa valeur correspondante est vide. L'entrée pour "allow" indique quels caractères autoriser non encodés dans l'expansion de valeur : (U) signifie que tout caractère non dans l'ensemble non réservé sera encodé ; (U+R) signifie que tout caractère non dans l'union de (unreserved / reserved / pct-encoding) sera encodé ; et, pour les deux cas, chaque caractère non autorisé est d'abord encodé comme sa séquence d'octets en UTF-8, puis chaque octet est encodé comme un triplet encodé en pourcentage.
┌──────────────────────────────────────────────────────────────┐
│ NUL + . / ; ? & #│
├──────────────────────────────────────────────────────────────┤
│ first │ "" "" "." "/" ";" "?" "&" "#"│
│ sep │ "," "," "." "/" ";" "&" "&" "," │
│ named │ false false false false true true true false│
│ ifemp │ "" "" "" "" "" "=" "=" "" │
│ allow │ U U+R U U U U U U+R │
└──────────────────────────────────────────────────────────────┘
Avec la table ci-dessus à l'esprit, traitez la liste de variables comme suit :
Pour chaque varspec, extrayez un nom de variable et un modificateur optionnel de l'expression en scannant la liste de variables jusqu'à ce qu'un caractère non dans l'ensemble varname soit trouvé ou que la fin de l'expression soit atteinte.
- Si c'est la fin de l'expression et que le varname est vide, retournez pour scanner le reste du modèle.
- Si ce n'est pas la fin de l'expression et que le dernier caractère trouvé indique un modificateur ("" ou ":"), mémorisez ce modificateur. Si c'est une explosion (""), scannez le caractère suivant. Si c'est un préfixe (":"), continuez à scanner les un à quatre caractères suivants pour le max-length représenté comme un entier décimal et ensuite, si ce n'est toujours pas la fin de l'expression, scannez le caractère suivant.
- Si ce n'est pas la fin de l'expression et que le dernier caractère trouvé n'est pas une virgule (","), ajoutez ", l'opérateur stocké (le cas échéant), le varname et modificateur scannés, l'expression restante, et " à la chaîne de résultat, mémorisez que le résultat est dans un état d'erreur, puis retournez pour scanner le reste du modèle.
Recherchez la valeur du nom de variable scanné, puis
- Si le varname est inconnu ou correspond à une variable avec une valeur non définie (Section 2.3), alors passez au varspec suivant.
- Si c'est la première variable définie pour cette expression, ajoutez la chaîne first pour ce type d'expression à la chaîne de résultat et mémorisez que cela a été fait. Sinon, ajoutez la chaîne sep à la chaîne de résultat.
- Si la valeur de cette variable est une chaîne, alors
- si named est true, ajoutez le varname à la chaîne de résultat en utilisant le même processus d'encodage que pour les littéraux, et
- si la valeur est vide, ajoutez la chaîne ifemp à la chaîne de résultat et passez au varspec suivant ;
- sinon, ajoutez "=" à la chaîne de résultat.
- si un modificateur de préfixe est présent et que la longueur du préfixe est inférieure à la longueur de la chaîne de valeur en nombre de caractères Unicode, ajoutez ce nombre de caractères du début de la chaîne de valeur à la chaîne de résultat, après encodage en pourcentage des caractères qui ne sont pas dans l'ensemble allow, en veillant à ne pas diviser les caractères multi-octets ou les triplets encodés en pourcentage qui représentent un seul point de code Unicode ;
- sinon, ajoutez la valeur à la chaîne de résultat après encodage en pourcentage des caractères qui ne sont pas dans l'ensemble allow.
- si named est true, ajoutez le varname à la chaîne de résultat en utilisant le même processus d'encodage que pour les littéraux, et
- sinon si aucun modificateur d'explosion n'est donné, alors
- si named est true, ajoutez le varname à la chaîne de résultat en utilisant le même processus d'encodage que pour les littéraux, et
- si la valeur est vide, ajoutez la chaîne ifemp à la chaîne de résultat et passez au varspec suivant ;
- sinon, ajoutez "=" à la chaîne de résultat ; et
- si la valeur de cette variable est une liste, ajoutez chaque membre de liste défini à la chaîne de résultat, après encodage en pourcentage des caractères qui ne sont pas dans l'ensemble allow, avec une virgule (",") ajoutée au résultat entre chaque membre de liste défini ;
- si la valeur de cette variable est un tableau associatif ou toute autre forme de structure pairée (name, value), ajoutez chaque paire avec une valeur définie à la chaîne de résultat comme "name,value", après encodage en pourcentage des caractères qui ne sont pas dans l'ensemble allow, avec une virgule (",") ajoutée au résultat entre chaque paire définie.
- si named est true, ajoutez le varname à la chaîne de résultat en utilisant le même processus d'encodage que pour les littéraux, et
- sinon si un modificateur d'explosion est donné, alors
- si named est true, alors pour chaque membre de liste défini ou paire de tableau (name, value) avec une valeur définie, faire :
- si ce n'est pas le premier membre/valeur défini, ajoutez la chaîne sep à la chaîne de résultat ;
- si c'est une liste, ajoutez le varname à la chaîne de résultat en utilisant le même processus d'encodage que pour les littéraux ;
- si c'est une paire, ajoutez le name à la chaîne de résultat en utilisant le même processus d'encodage que pour les littéraux ;
- si le membre/valeur est vide, ajoutez la chaîne ifemp à la chaîne de résultat ; sinon, ajoutez "=" et le membre/valeur à la chaîne de résultat, après encodage en pourcentage des caractères membre/valeur qui ne sont pas dans l'ensemble allow.
- sinon si named est false, alors
- si c'est une liste, ajoutez chaque membre de liste défini à la chaîne de résultat, après encodage en pourcentage des caractères qui ne sont pas dans l'ensemble allow, avec la chaîne sep ajoutée au résultat entre chaque membre de liste défini.
- si c'est un tableau de paires (name, value), ajoutez chaque paire avec une valeur définie à la chaîne de résultat comme "name=value", après encodage en pourcentage des caractères qui ne sont pas dans l'ensemble allow, avec la chaîne sep ajoutée au résultat entre chaque paire définie.
- si named est true, alors pour chaque membre de liste défini ou paire de tableau (name, value) avec une valeur définie, faire :
Lorsque la liste de variables pour cette expression est épuisée, retournez pour scanner le reste du modèle.