To_Pascal_Snake_Case, et que stions dérivées autour de "character mapping"

Thomas De Contes via Ada-france <[email protected]> Sun, 18 Jul 2021 18:30:35 +0200
Newsgroups gmane.comp.lang.ada.france
Message-ID <[email protected]>
Bonjour :-)


Je cherche à convertir un texte quelconque en quelque chose de compatible avec les identificateurs à la façon de "GNAT Coding Style".

(Les questions sont par ordre d'importance, mais à l'inverse de la chronologie dans le programme.)



1
Dans Ada.Characters.Handling, on a To_Lower et To_Upper, mais je ne vois rien qui ressemble à To_Pascal_Snake_Case :-(

Y a t il quelque chose d'équivalent que j'ai raté, ou doit on la fabriquer soi même ?
(Ce qui est parfaitement possible avec tout ce qu'on trouve dans Ada.Characters.Handling - mais si on peut éviter de réinventer la roue ...)


Si je n'applique pas les autres traitements (pour faire du "Start Case", pour l'appliquer à autre chose que des identificateurs Ada),
et si je ne me trompe pas, c'est Is_Alphanumeric qui doit servir de délimiteur pour savoir où placer les majuscules ?


Note :

J'ai trouvé cette expression, "Pascal_Snake_Case", ici :
https://en.wikipedia.org/wiki/Naming_convention_(programming)#Examples_of_multiple-word_identifier_formats

Je ne sais pas si c'est la meilleure, mais je n'aime pan non plus l'expression "Mixed_Case" pour designer la même chose, puisqu'hors contexte Ada, sa signification est beaucoup plus large !
Par exemple dans "Studly caps" : https://en.wikipedia.org/wiki/Letter_case#Special_case_styles

"Start Case" trouvé ici :
https://en.wikipedia.org/wiki/Letter_case#Case_styles
(Je trouve le "Title Case" sympathique, mais si je ne me trompe pas, le "GNAT Coding Style" impose rigoureusement le "Start Case" et n'autorise pas le "Title Case" ?)



2
(J'utilise implicitement Ada.Strings.Maps, Ada.Strings.Maps.Constants, Ada.Characters.Latin_1, et Ada.Strings.Fixed)


Si je ne me trompe pas, voilà le Character_Set qui correspond aux caractères autorisés dans les identificateurs Ada (en ASCII) :

   Allowed_Set := ISO_646_Set and (Alphanumeric_Set or To_Set (Low_Line));

Il me semble que le plus simple et le plus pertinent (pour ASCII), c'est de transformer tous les caractères non-autorisés en Low_Line.
J'aimerais donc faire le Character_Mapping correspondant à ça.

Ça serais pratique d'avoir une fonction ressemblant à :

   function To_Mapping_To_Allowed_Set (Allowed_Set     : in Character_Set;
                                       Substitute      : in Character;
                                       To_Combine_With : in Character_Mapping := Identity)
      return Character_Mapping;

Est ce qu'il y a ça quelque part ?
Sans ça, voilà le chemin le plus court que j'ai trouvé :

   Not_Allowed_Domain     := To_Sequence (not Allowed_Set)
   Mapping_To_Allowed_Set := To_Mapping (Not_Allowed_Domain, Not_Allowed_Domain'Length * Low_Line)

Peut on faire mieux ?


(Si y en a qui cherchent, Ada.Strings.Maps.Value pour le type String s'appelle Ada.Strings.Fixed.Translate !)

(Il me manque encore quelque chose qui ressemble à Ada.Strings.Fixed.Trim pour réduire les chaines de Low_Line au milieu.)



3
Pour transformer du UTF-8 en ASCII, il me semble que la séquence suivante fait l'affaire :

subtype Ada.Strings.UTF_Encoding.UTF_8_String
   function Ada.Strings.UTF_Encoding.Wide_Wide_Strings.Decode
type Standard.Wide_Wide_String
   function Ada.Characters.Conversions.To_String
type Standard.String
   function Ada.Characters.Handling.To_Basic
   function Ada.Characters.Handling.To_ISO_646

(Est ce une manière agréable pour vous de vous présenter ce genre de séquence ?)


Ada.Characters.Handling.To_Basic permet de récupérer les lettres du jeu de caractères Latin-1, c'est toujours plus agréable qu'une conversion brute :-)

Mais j'ai cru comprendre qu'il y a pas mal d'autres lettres dans Wide_Character, même s'il n'y en a pas beaucoup plus dans Wide_Wide_Character.
Or, il n'y a pas de To_Basic dans Ada.Wide_Characters.Handling, c'est dommage.
Est ce que ça existe ailleurs ?




Toutes les contributions sont bienvenues, mais j'ai quelques contraintes du fait que c'est pas un petit programme personnel que je fais dans mon coin :
Il faudra voir :
- si j'ai le droit de faire un copier-coller du code proposé dans le mien (si c'est pas trop long),
- comment ça se passe pour l'intégration de mon logiciel dans les différents environnements, si je crée une nouvelle dépendance.

(J'essaye d'être "professionnel" mais je manque d'expérience dans ce domaine.)


-- 
RAPID maintainer
http://savannah.nongnu.org/projects/rapid/

_______________________________________________
Ada-france mailing list
[email protected]
https://mail.ada-france.org/cgi-bin/mailman/listinfo/ada-france