IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[Debian 11] Tentative de transformation d'une grande chaine de caractères en tableau multi-lignes


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 159
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 159
    Par défaut [Debian 11] Tentative de transformation d'une grande chaine de caractères en tableau multi-lignes
    Bonjour,

    tout est dans le titre, alors je détaille : la grande chaine du titre vient de la récupération d'informations relatives aux polices de caractères, extraites en utilisant un binaire (à peine modifié par mes soins) venant de FontForge, je veux parler de showttf à qui j'ai rajouté la possibilité de sortir les données de la table "NAME".
    Ce qui est curieux c'est que les données, je les vois dans la console et j'aimerais bien les avoir sous forme de liste de chaines, comme je les vois (pour une fonte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    platform=1 plat_spec_encoding=0 language=0 name=1 Family
    offset=  59 lenght=  14   Lucida Console
    platform=1 plat_spec_encoding=0 language=0 name=2 Subfamily
    offset=  73 lenght=   7   Regular
    platform=1 plat_spec_encoding=0 language=0 name=3 UniqueID
    offset=  80 lenght=  35   Lucida Console Regular; B&H alpha25
    platform=1 plat_spec_encoding=0 language=0 name=4 FullName
    offset= 115 lenght=  14   Lucida Console
    platform=1 plat_spec_encoding=0 language=0 name=5 Version
    offset= 129 lenght=  12   Version 1.60
    platform=1 plat_spec_encoding=0 language=0 name=6 Postscript
    offset= 141 lenght=  13   LucidaConsole
    platform=1 plat_spec_encoding=0 language=0 name=7 Trademark
    offset= 154 lenght=  57   Lucida is a registered trademark of Bigelow & Holmes Inc.
    voilà donc 14 lignes ou plutôt, 7 groupes de deux) mais je n'y arrive pas : quand je demande la taille du tableau, ça me répond "1"...
    Et pourtant, il doit bien y avoir des n dans la liste, puisqu'on voit que les données sont correctement alignées à gauche.

    J'aimerais bien avoir un tableau qui me dise "14", parce que j'ai d'autres données à lui extraire.

    J'ai appelé mon tableau atab, et je le remplis ainsi, en utilisant la fonte Lucida Console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    atab=$(./showttfcustom -n /usr/share/fonts/AutresFontes/Machine/LUCON.TTF | grep -I -v Copyright | grep platform=1 -A1 | head -n 14)
    echo $atab
    platform=1 plat_spec_encoding=0 language=0 name=1 Family offset= 59 lenght= 14 Lucida Console platform=1 plat_spec_encoding=0 language=0 name=2 Subfamily offset= 73 lenght= 7 Regular platform=1 plat_spec_encoding=0 language=0 name=3 UniqueID offset= 80 lenght= 35 Lucida Console Regular; B&H alpha25 platform=1 plat_spec_encoding=0 language=0 name=4 FullName offset= 115 lenght= 14 Lucida Console platform=1 plat_spec_encoding=0 language=0 name=5 Version offset= 129 lenght= 12 Version 1.60 platform=1 plat_spec_encoding=0 language=0 name=6 Postscript offset= 141 lenght= 13 LucidaConsole platform=1 plat_spec_encoding=0 language=0 name=7 Trademark offset= 154 lenght= 57 Lucida is a registered trademark of Bigelow & Holmes Inc.
    Par ailleurs, j'ai trouvé ça, quelque part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    To read a whole line at once, use:
    IFS=""
    Alors j'ai testé, mais ça n'a rien changé, le tableau a toujours une taille de "1"...
    Une idée ?

    Grand merci par avance,

    Tout le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash
    OLDIFS=$IFS
    IFS=$'n'
    ou (voir texte)
    #IFS=""
    declare -a atab
     
    atab=$(while read -r f; do echo "$f"; done < <( (/data/_share/programmation/Fonts/progs4TrueType/Showttf_from_FontForge/showttfcustom -n /usr/share/fonts/AutresFontes/Machine/LUCON.TTF | grep -I -v Copyright | grep platform=1 -A1 | head -n 14) ))
    echo "${!atab[@]}" # "0"
    # doubles parenthèses obligatoires !
    for ((i=0; i<"${#atab[@]}"; i++)); do echo "$i"; echo "${atab[$i]}"; done # un seul 0
    IFS=$OLDIFS
    PS : ce post fait suite à celui du 6/8/24, magistralement géré par disedorgue : https://www.developpez.net/forums/d2.../#post12038076

    Et des infos relatives à FontForge et Showttf sont là : https://forum.lazarus.freepascal.org...7mc6#msg525854

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 297
    Par défaut
    Bonjour

    Et ben alors ? On parenthèse à tout va ? Es-tu au courant qu'en shell c'est un sous-processus ? On identifie deux choses : (ligne 8 de ton code)
    • Tu as mis ( ) (sous-processus) quand tu voulais mettre $( ) (substitution de commande).
    • Et tu as mis ( ) dans une substitution de processus, alors que tu n'as besoin ni de substitution de commande, ni de sous-processus.


    J'espère être clair.

    Et par suite, bash renvoie le résultat du sous-processus qui n'est qu'un code erreur, donc remplit ton tableau d'une seule donnée. N'est-ce pas ?

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 677
    Par défaut
    Bonjour,

    atab n'est pas un tableau.
    là, tu aurais un tableau.

    on ne modifie pas l'IFS globalement.

    admettons :

    je reproduis la sortie que tu veux traiter (si j'ai bien compris)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ cmd() {
        echo 'platform=1 plat_spec_encoding=0 language=0 name=1 Family
    offset=  59 lenght=  14   Lucida Console
    platform=1 plat_spec_encoding=0 language=0 name=2 Subfamily
    offset=  73 lenght=   7   Regular
    platform=1 plat_spec_encoding=0 language=0 name=3 UniqueID
    offset=  80 lenght=  35   Lucida Console Regular; B&H alpha25
    platform=1 plat_spec_encoding=0 language=0 name=4 FullName
    offset= 115 lenght=  14   Lucida Console
    platform=1 plat_spec_encoding=0 language=0 name=5 Version
    offset= 129 lenght=  12   Version 1.60
    platform=1 plat_spec_encoding=0 language=0 name=6 Postscript
    offset= 141 lenght=  13   LucidaConsole
    platform=1 plat_spec_encoding=0 language=0 name=7 Trademark
    offset= 154 lenght=  57   Lucida is a registered trademark of Bigelow & Holmes Inc.';}
    je mets la sortie, ligne par ligne, dans un tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ mapfile -t cmdArray < <(cmd)
    j'affiche la totalité du tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ printf '%s\n' "${cmdArray[@]}"
    platform=1 plat_spec_encoding=0 language=0 name=1 Family
    offset=  59 lenght=  14   Lucida Console
    platform=1 plat_spec_encoding=0 language=0 name=2 Subfamily
    offset=  73 lenght=   7   Regular
    platform=1 plat_spec_encoding=0 language=0 name=3 UniqueID
    offset=  80 lenght=  35   Lucida Console Regular; B&H alpha25
    platform=1 plat_spec_encoding=0 language=0 name=4 FullName
    offset= 115 lenght=  14   Lucida Console
    platform=1 plat_spec_encoding=0 language=0 name=5 Version
    offset= 129 lenght=  12   Version 1.60
    platform=1 plat_spec_encoding=0 language=0 name=6 Postscript
    offset= 141 lenght=  13   LucidaConsole
    platform=1 plat_spec_encoding=0 language=0 name=7 Trademark
    offset= 154 lenght=  57   Lucida is a registered trademark of Bigelow & Holmes Inc.
    j'affiche le tableau deux lignes par deux lignes, séparées par une ligne vide (ce n'est que du formatage)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    $ for ((n=0;n<${#cmdArray[*]};n+=2)); do printf '%s\n' "${cmdArray[@]:$n:2}"; echo; done
    platform=1 plat_spec_encoding=0 language=0 name=1 Family
    offset=  59 lenght=  14   Lucida Console
     
    platform=1 plat_spec_encoding=0 language=0 name=2 Subfamily
    offset=  73 lenght=   7   Regular
     
    platform=1 plat_spec_encoding=0 language=0 name=3 UniqueID
    offset=  80 lenght=  35   Lucida Console Regular; B&H alpha25
     
    platform=1 plat_spec_encoding=0 language=0 name=4 FullName
    offset= 115 lenght=  14   Lucida Console
     
    platform=1 plat_spec_encoding=0 language=0 name=5 Version
    offset= 129 lenght=  12   Version 1.60
     
    platform=1 plat_spec_encoding=0 language=0 name=6 Postscript
    offset= 141 lenght=  13   LucidaConsole
     
    platform=1 plat_spec_encoding=0 language=0 name=7 Trademark
    offset= 154 lenght=  57   Lucida is a registered trademark of Bigelow & Holmes Inc.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 159
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 159
    Par défaut
    Bonsoir,

    une petite image juste pour vous montrer ce que je vis au quotidien depuis au moins, oh..., 30 ans ?
    (oui, la typographie m'a pris dans ses bras vers 1994 et ne m'a plus lâché).

    Nom : broken_font.jpg
Affichages : 94
Taille : 62,1 Ko

    Bref, vous le voyez le trou au milieu ? 3 champs non remplis ! Et ça me fait ça pour 17 fontes (sur 935).

    L'idée est donc, lors du remplissage de cette liste, que si un champ est vide alors j'utilise l'autre outil, celui qui m'a fait misérer avec les quotes, pour récupérer la(es) valeur(s) manquante(s) (ou je l'utiliserai directement, faut que je revois mes notes, que je retrouve mes marques).

    Le gag c'est que dans ma liste de fontes mal fichues, il y en a quand même 5 qui viennent de chez KroSoft, hé ouais : même les cadors se prennent des gamelles...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Problème avec
    /usr/share/fonts/AutresFontes/Machine/Linedraw.ttf
    /usr/share/fonts/AutresFontes/Ornements/webdings.ttf
    /usr/share/fonts/AutresFontes/Ornements/wingding.ttf
    /usr/share/fonts/AutresFontes/Ornements/WINGDNG2.TTF
    /usr/share/fonts/AutresFontes/Ornements/WINGDNG3.TTF
    Par contre aucun problème avec Arial, même avec la toute dernière version, ArialNova de 2019.
    C'est comme ça, c'est le bronx...

    EDIT : ah, j'allais oublier, un peu de code, le cœur de l'outil de listage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    var
      i: Integer;
      slError: TStringList;
    begin
      slError:= TStringList.Create;
      with CacheList do  // created in FormActivate
    //for i:= 0 to 2 do begin // fast test
      for i:= 0 to Count-1 do begin // full job
        try
          CacheItem := TFPFontCacheItem.Create(Items[i].FileName);
          if CacheItem <> nil then begin
            with CacheItem.FontData do begin
              MemoVisu.Lines.Add('FileName          '+ FileName);
              MemoVisu.Lines.Add('FamilyName        '+ FamilyName);
              MemoVisu.Lines.Add('HumanFriendlyName '+ HumanFriendlyName);
              MemoVisu.Lines.Add('PostScriptName    '+ PostScriptName);
              if (FamilyName='') or (HumanFriendlyName='') or (PostScriptName='')
                then slError.Add(FileName);
            end;
            CacheItem.Free;
          end;
        except
          on E: Exception do
            ShowMessage(Format('Error with font, index [%d]:'+sLineBreak+'%s'+sLineBreak+'%s',
              [i, ExtractFileName(Items[i].FileName), E.Message]));
        end;
    Ça s'appuie donc sur du FreePascal animé par Lazarus.

    Allez, je vous ai assez embêté avec tout ça, bonne semaine.

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 324
    Par défaut
    plus de 1000 ttf sur ma machine (merci noto )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     pacman -Qql | grep 'ttf$' | wc -l
    1009
    1009 infos ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    fc-scan -b $(pacman -Qql | grep 'ttf$' )
     
    Pattern has 26 elts (size 32)
            family: "Noto Emoji"(s) "Noto Emoji SemiBold"(s)
            familylang: "en"(s) "en"(s)
            style: "SemiBold"(s) "Regular"(s)
            stylelang: "en"(s) "en"(s)
            fullname: "Noto Emoji"(s) "Noto Emoji SemiBold"(s)
            fullnamelang: "en"(s) "en"(s)
            slant: 0(i)(s)
            weight: 180(f)(s)
            width: 100(f)(s)
            foundry: "GOOG"(s)
            file: "/usr/share/fonts/TTF/NotoEmoji-SemiBold.ttf"(s)
            index: 0(i)(s)
            outline: True(s)
            scalable: True(s)
            fontversion: 131138(i)(s)
            capability: "otlayout:DFLT"(s)
            fontformat: "TrueType"(s)
            decorative: False(s)
            postscriptname: "NotoEmoji-SemiBold"(s)
            color: False(s)
            symbol: False(s)
            variable: False(s)
            fonthashint: False(s)
            order: 0(i)(s)
            namedinstance: False(s)
            fontwrapper: "SFNT"(s)
     
    Pattern has 25 elts (size 32)
            family: "FreeSans"(s)
            familylang: "en"(s)
            style: "Medium"(s) "渀愀瘀愀搀渀漀"(s)
            stylelang: "en"(s) "sl"(s)
            fullname: "Free Sans"(s)
            fullnamelang: "en"(s)
            slant: 0(i)(s)
            weight: 80(f)(s)
            width: 100(f)(s)
            foundry: "PfEd"(s)
            file: "/usr/share/vlc/skins2/fonts/FreeSans.ttf"(s)
            index: 0(i)(s)
            outline: True(s)
            scalable: True(s)
            fontversion: 79953(i)(s)
            fontformat: "TrueType"(s)
            decorative: False(s)
            postscriptname: "FreeSans"(s)
            color: False(s)
            symbol: False(s)
            variable: False(s)
            fonthashint: False(s)
            order: 0(i)(s)
            namedinstance: False(s)
            fontwrapper: "SFNT"(s)
     
    Pattern has 25 elts (size 32)
            family: "FreeSans"(s)
            familylang: "en"(s)
            style: "Bold"(s) "polkrepko"(s)
            stylelang: "en"(s) "sl"(s)
            fullname: "Free Sans Bold"(s)
            fullnamelang: "en"(s)
            slant: 0(i)(s)
            weight: 200(f)(s)
            width: 100(f)(s)
            foundry: "PfEd"(s)
            file: "/usr/share/vlc/skins2/fonts/FreeSansBold.ttf"(s)
            index: 0(i)(s)
            outline: True(s)
            scalable: True(s)
            fontversion: 117964(i)(s)
            fontformat: "TrueType"(s)
            decorative: False(s)
            postscriptname: "FreeSansBold"(s)
            color: False(s)
            symbol: False(s)
            variable: False(s)
            fonthashint: False(s)
            order: 0(i)(s)
            namedinstance: False(s)
            fontwrapper: "SFNT"(s)
    ...
    EDIT moins dépendant de l'os
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fc-scan -b $(find "/usr/share/fonts/" -iname "*.ttf")     # | awk '/postscriptname/ {print $2}' | sort

  6. #6
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 159
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 159
    Par défaut
    Citation Envoyé par papajoker Voir le message
    plus de 1000 ttf sur ma machine (merci noto )
    L'enfer, quand il faut en trouver une...
    Et c'est bien pour ça que très vite (début 2000) j'ai commencé à tout trier dans une douzaine de dossiers précis (sérif, sans-sérif, fantaisie, machine, etc.) et avant de jouer avec l'ascenseur du traitement de texte, j'étudie mon classeur papier où elles sont (presque) toutes répertoriées.

    Tellement plus agréable pour comparer et choisir, on peut mettre plusieurs pages papier côte à côte, que du bonheur, et quelle efficacité !
    Et rapidité aussi.

    Citation Envoyé par papajoker Voir le message
    EDIT moins dépendant de l'os
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fc-scan -b $(find "/usr/share/fonts/" -iname "*.ttf")     # | awk '/postscriptname/ {print $2}' | sort
    Merci, car pacman je ne connais pas.

    Et du coup j'ai joué comme toi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fc-scan -b $(find "/usr/share/fonts/" -iname "*.ttf") | grep 'Pattern' | wc -l # famille DéjaVu, celles qui font fonctionner le système
    22
    fc-scan -b $(find "/usr/share/fonts/AutresFontes/" -iname "*.ttf") | grep 'Pattern' | wc -l # toutes les autres
    833
    fc-scan -b $(find "/usr/share/fonts/AutresFontes/" -iname "*.otf") | grep 'Pattern' | wc -l # à trier...
    53
    Ce qui est curieux, c'est que 22 + 833 + 53 = 908, alors qu'un autre outil m'en donne 935. Si j'enlève les 17 en erreur, il m'en resterait 918.
    Une erreur de 10 quelque part...

    Ah, je n'ai pas testé ton ajout awk, je le découvre après avoir posté ma réponse.
    Je vais regarder ça.

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 159
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 159
    Par défaut
    Vu, merci !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    XX="a   b       c       d" # avec ctrl v puis TAB entre a et b puis pareil entre b et c puis pareil entre c et d : ça roule !
    echo "$XX"
    a	b	c	d
    echo $XX
    a b c d
    Et bon dimanche aprème,

  8. #8
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 159
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 159
    Par défaut
    Bonjour,

    je ne vous remercierai jamais assez !

    Vous m'avez ôté une épine du pied qui ressemblait à un javelot de sportif olympique, et en quelques lignes mon problème est résolu.
    MERCI !

    Voilà à quoi ça ressemble, maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    binaryPath="/data/_share/programmation/Fonts/progs4TrueType/Showttf_from_FontForge"
    fonte="/usr/share/fonts/AutresFontes/Machine/LUCON.TTF"
    mapfile -t cmdArray < <($binaryPath/showttfcustom -n $fonte | grep -I -v Copyright | grep platform=1 -A1 | head -n 14)
    # 1 ligne de vérif 
    #printf '%s\n' "${cmdArray[@]}"
    #echo "suite"
    #for ((n=0; n<${#cmdArray[*]}; n+=2)); do printf '%s\n' "${cmdArray[@]:$n:2}"; echo; done # ligne d'origine
    #for ((n=0; n<${#cmdArray[*]}; n+=2)); do printf '%s\n' "${cmdArray[@]:$n:2}"; done
    #for ((n=0; n<${#cmdArray[*]}; n+=2)); do printf '%s\n' "${cmdArray[@]:$n:1}"; done # affiche les lignes platform
     for ((n=1; n<${#cmdArray[*]}; n+=2)); do printf '%s\n' "${cmdArray[@]:$n:1}"; done # affiche les lignes offset
    echo ${#cmdArray[*]} # 14 
    echo ${#cmdArray[@]} # 14
    echo ${cmdArray[0]}  # platform=1 plat_spec_encoding=0 language=0 name=1 Family
    echo ${cmdArray[1]}  # offset=  59 lenght= 14 Lucida Console
    echo ${cmdArray[3]}  # offset=  73 lenght=  7 Regular
    echo ${cmdArray[5]}  # offset=  80 lenght= 35 Lucida Console Regular; B&H alpha25
    echo ${cmdArray[7]}  # offset= 115 lenght= 14 Lucida Console
    echo ${cmdArray[9]}  # offset= 129 lenght= 12 Version 1.60
    echo ${cmdArray[11]} # offset= 141 lenght= 13 LucidaConsole
    echo ${cmdArray[13]} # offset= 154 lenght= 57 Lucida is a registered trademark of Bigelow & Holmes Inc.
    Il m'appartiendra de récupérer le dernier champ de chaque ligne "offset..." mais ça, je devrais y arriver.

    PS : Flodelarab, je n'ai strictement rien compris à ton explication, désolé.

    Excellente journée (suis absent jusqu'à demain), encore merci !

  9. #9
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 297
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Flodelarab, je n'ai strictement rien compris à ton explication, désolé.
    Ben c'est bien dommage car c'est l'explication la plus crue de ton problème. Il fallait juste enlever les parenthèses. Mais tu as préféré mettre tout ton travail à la poubelle au profit d'une solution que tu ne comprends pas plus, au prétexte qu'elle "marche". Tu aurais pu utiliser ta mésaventure pour apprendre définitivement la différence entre ( ), $( ), <( ), (( )), { ;}.


  10. #10
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 159
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 159
    Par défaut
    Bonjour,

    Citation Envoyé par Flodelarab Voir le message
    Ben c'est bien dommage car c'est l'explication la plus crue de ton problème.
    Pour moi il n'y a aucune explication...

    Regarde, tu écris :
    Citation Envoyé par Flodelarab Voir le message
    Tu as mis ( ) (sous-processus) quand tu voulais mettre $( ) (substitution de commande).
    j'aurais surement mieux compris si tu avais écrit
    Tu as mis ( ) (sous-processus) quand il fallait mettre $( ) (substitution de commande) parce que le sous-processus renvoie ... quand la substitution de commande renvoie ...
    De plus,
    Citation Envoyé par Flodelarab Voir le message
    Il fallait juste enlever les parenthèses.
    Admettons.
    Mais alors, pourquoi je les retrouve dans ta réponse ?
    Citation Envoyé par Flodelarab Voir le message
    Tu as mis ( ) quand tu voulais mettre $( ).
    Tu vois les points d'interrogation dans mes yeux ?


    Regarde ce qu'a écrit N_BaH :
    atab n'est pas un tableau.là, tu aurais un tableau.
    Simple et efficace !

    Citation Envoyé par Flodelarab Voir le message
    Tu aurais pu utiliser ta mésaventure pour apprendre définitivement ...
    Je te te cacherai pas qu'au départ, c'est un petit outil de management des fontes que je veux construire, tout ce que j'ai vu sur le web ne me satisfaisant pas.
    Au début je pensais que ça serait simple mais c'était sans compter avec la sournoiserie du contenu des .ttf et autres .otf...
    Et donc, comme d'habitude, il faut être ingénieur 5e niveau en technologie nucléaire juste pour allumer la lumière du salon et pouvoir enfin lire un livre.
    Bon, j'exagère un peu, mais tu vois l'idée,

    Bises et bon week-end,

  11. #11
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 159
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 159
    Par défaut
    Bonsoir,

    Citation Envoyé par Jipété Voir le message
    Il m'appartiendra de récupérer le dernier champ de chaque ligne "offset..." mais ça, je devrais y arriver.
    J'ai présumé de mes forces...

    J'ai d'abord commencé par une simulation toute simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    aline="offset=  59 lenght= 14 Lucida Console" # simulation d'une ligne parmi 7
    echo $aline
    offset= 59 lenght= 14 Lucida Console
    qui a bien fonctionné, alors je me suis enhardi, en comptant sur mes doigts quel était le champ à récupérer : le 5e et plus si affinités.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo $aline | cut -d ' ' -f 5
    Lucida
    et comme on peut le voir ci-dessous, après un petit parcours du man, tout est bon. En simulation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo $aline | cut -d ' ' -f 5- # le '-' indique qu'il faut récupérer jusqu'à la fin de la ligne, et effectivement :
    Lucida Console
    avec un seul mot à récupérer ça fonctionne aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    aline="offset=  59 lenght= 14 Lucida"
    echo $aline
    offset= 59 lenght= 14 Lucida
    echo $aline | cut -d ' ' -f 5
    Lucida
    echo $aline | cut -d ' ' -f 5-
    Lucida
    Mais plus dans le script, où ça ne fonctionne pas, et c'est ça que je ne comprends pas.
    La sortie montrée ce matin ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    offset= 59 lenght= 14 Lucida Console
    offset= 73 lenght= 7 Regular
    offset= 80 lenght= 35 Lucida Console Regular; B&H alpha25
    offset= 115 lenght= 14 Lucida Console
    offset= 129 lenght= 12 Version 1.60
    offset= 141 lenght= 13 LucidaConsole
    offset= 154 lenght= 57 Lucida is a registered trademark of Bigelow & Holmes Inc.
    7 lignes parfaites, auxquelles je rajoute le "cut" précédent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ((n=1; n<${#cmdArray[*]}; n+=2)); do printf '%s\n' "${cmdArray[@]:$n:1}" | cut -d ' ' -f 5-; done
    mais le résultat est foireux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    lenght=  14   Lucida Console
    lenght=   7   Regular
    lenght=  35   Lucida Console Regular; B&H alpha25
     14   Lucida Console
     12   Version 1.60
     13   LucidaConsole
     57   Lucida is a registered trademark of Bigelow & Holmes Inc.
    Je tente plus sophistiqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ((n=1; n<${#cmdArray[*]}; n+=2)); do aline=$(printf '%s\n' "${cmdArray[@]:$n:1}"); echo "$aline" | cut -d ' ' -f 5-; done
    mais j'ai strictement le même résultat que précédemment.

    C'est quoi la différence entre les lignes 1 et 4 de la sortie sans "cut", qui sont identiques (sauf pour l'offset, que je n'utilise pas) ?
    Ou entre les lignes 2 et 6 qui n'ont qu'un seul champ ?

    Je reste un peu sans voix et sans voie pour avancer, là...

  12. #12
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 159
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 159
    Par défaut
    Tests de ce soir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # script.sh complet :
    binaryPath="/data/_share/programmation/Fonts/progs4TrueType/Showttf_from_FontForge"
    fonte="/usr/share/fonts/AutresFontes/Machine/LUCON.TTF"
    mapfile -t cmdArray < <($binaryPath/showttfcustom -n $fonte | grep -I -v Copyright | grep platform=1 -A1 | head -n 14) 
     
    for ((n=1; n<"${#cmdArray[@]}"; n+=2)); do aline=$(printf '%s\n' "${cmdArray[@]:$n:1}"); echo "$aline" | cut -d ' ' -f 5-; done 
    for ((n=1; n<"${#cmdArray[@]}"; n+=2)); do aline=$(printf '%s\n' "${cmdArray[*]:$n:1}"); echo "$aline" | cut -d ' ' -f 5-; done 
    for ((n=1; n<"${#cmdArray[*]}"; n+=2)); do aline=$(printf '%s\n' "${cmdArray[@]:$n:1}"); echo "$aline" | cut -d ' ' -f 5-; done 
    for ((n=1; n<"${#cmdArray[*]}"; n+=2)); do aline=$(printf '%s\n' "${cmdArray[*]:$n:1}"); echo "$aline" | cut -d ' ' -f 5-; done
    Les 4 lignes précédentes retournent à chaque fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    lenght=  14   Lucida Console
    lenght=   7   Regular
    lenght=  35   Lucida Console Regular; B&H alpha25
     14   Lucida Console
     12   Version 1.60
     13   LucidaConsole
     57   Lucida is a registered trademark of Bigelow & Holmes Inc.
    et malheureusement pour moi, shellcheck script.sh ne retourne ni erreur ni warning.

    Je suis sec, là...

  13. #13
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 324
    Par défaut
    bonjour

    je ne comprend rien a ton problème, il me semble que tu cherches a compliquer les choses ...

    Pourquoi vouloir un "tableau" ?
    Pourquoi faire un traitement après avoir ton tableau ?

    Tu ne désires pas une chose du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ta_commande |  awk -F'lenght=' '/lenght/ {print substr($2,6,99)}'
    EDIT: attention, ici, ne fonctionne que si noms sont inférieurs à 100 !

  14. #14
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 159
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 159
    Par défaut
    Bonjour aussi,

    Citation Envoyé par papajoker Voir le message
    je ne comprends rien a ton problème, il me semble que tu cherches a compliquer les choses ...
    Oh tu sais, ce n'est pas moi qui ai compliqué les choses, c'est les concepteurs du format ttf...

    C'est un peu l'enfer dans ces fichiers, même pour les pros puisqu'en utilisant les outils de haut niveau (fpTTF dans FreePascal, piloté par Lazarus) sur une liste de fontes, certains remontent bien le nom du fichier et d'autres rien du tout, alors qu'en examinant le .ttf avec un éditeur hexa, on voit bien que les données y sont présentes.
    D'où l'utilisation (avec ma modif pour accéder à la table NAME sinon c'est l'enfer) de l'outil showttf produit par FontForge, qui permet d'accéder aux données.

    Et cette foutue ligne (printf un peu plus bas, que je n'arrive pas à parser...) commençant par "Offset" contient dans son dernier champ les données dont j'ai besoin.
    Je commence à comprendre que "cut" a des problèmes car les champs seraient séparés par des "tab", ce matin j'ai trouvé cette commande :
    Or, if you only want to print that one column, use cut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cut -d$'\t' -f 6  < file.txt
    là, presque tout à la fin : https://unix.stackexchange.com/quest...b-as-delimiter

    j'essaie de l'adapter à mes besoins ainsi :
    d'abord un test, le résultat au bout de la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf '%s\n' "${cmdArray[@]:1:1}" ###--> offset=  59 lenght=  14   Lucida Console --OK
    ensuite 3 essais :
    (le "f 5-" signifie que je veux le 5e champ et ce qui le suit sur la ligne s'il y a (et des fois il y a)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cut -d$'\t' -f 5- < $(printf '%s\n' "${cmdArray[@]:1:1}") ###--> $(printf '%s\n' "${cmdArray[@]:1:1}") : redirection ambiguë
    cut -d$'\t' -f 5- < ${printf '%s\n' "${cmdArray[@]:1:1}"} ###--> ${printf '%s\n' "${cmdArray[@]:1:1}"} : mauvaise substitution
    cut -d$'\t' -f 5- < printf '%s\n' "${cmdArray[@]:1:1}" ###--> printf: Aucun fichier ou dossier de ce type
    J'en suis là, à l'heure où tu as posté, et je ne vois pas comment avancer,

    J'ai lu quelque part que "Redirection ambigue" voulait dire qu'un champ avait plusieurs données et qu'il fallait donc double-quoter, mais j'ai l'impression que je l'ai déjà fait, non ?

    EDIT : disedorgue, je te répondrai + tard, j'attends un livreur de frigo d'une minute à l'autre...

  15. #15
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 376
    Par défaut
    Si on revient sur ta syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ((n=1; n<"${#cmdArray[@]}"; n+=2)); do aline=$(printf '%s\n' "${cmdArray[@]:$n:1}"); echo "$aline" | cut -d ' ' -f 5-; done
    comme ceci, cela devrait fonctionner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ((n=1; n<"${#cmdArray[@]}"; n+=2)); do aline=$(printf '%s\n' "${cmdArray[@]:$n:1}"); echo $aline | cut -d ' ' -f 5-; done

  16. #16
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 324
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Oh tu sais, ce n'est pas moi qui ai compliqué les choses, c'est les concepteurs du format ttf...
    ...
    C'est quand même toi qui fait un xxx | grep -I -v Copyright | grep platform=1 -A1 | head -n 14) pour après :
    - mettre le résultat dans un tableau
    - boucler sur ce tableau pour encore appliquer des filtres


    Le tableau existe pourquoi ? pour compliquer ? tu ne sembles pas l'utiliser par la suite puisque contenu non valide
    Pourquoi ne pas appliquer dés le début un filtre sur ta commande "showttfcustom" ? comme j'ai proposé (le principe)en #9 (et /éventuellement/ ne pas utiliser inutilement un tableau)

  17. #17
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 376
    Par défaut
    cut n'est pas adapté dans ton cas qui semble mélanger des espace et des tabulations comme séparateur.

    Si on prend ton exemple parfait que tu donnes pour tester cela fonctionne donc celui-ci n'est pas représentatif du problème.

    de plus , je ne comprend pas trop pourquoi tu passes par ${array[@]:x:1} au lieu de ${array[x]}.

  18. #18
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 159
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 159
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    comme ceci, cela devrait fonctionner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ((n=1; n<"${#cmdArray[@]}"; n+=2)); do aline=$(printf '%s\n' "${cmdArray[@]:$n:1}"); echo $aline | cut -d ' ' -f 5-; done
    Bravo !
    Tu es vraiment un champion,

    Mais maintenant, je dirais que c'est complètement fou, ce résultat good, quand on constate que la seule différence entre ta 1re ligne (qui est aussi la mienne) et ta seconde, c'est que la variable aline de la 1re est quotée et la variable de la seconde ne l'est pas alors qu'on sait bien qu'il vaut mieux quoter les variables !
    Je pensais donc bien faire en quotant, tout en me protégeant de variables non initialisées.
    Moi y en a plus rien comprendre...

    En attendant, voilà le résultat, parfait avec cette fonte, plus qu'à tester avec le millier d'autres qui se trainent ici et là...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Lucida Console
    Regular
    Lucida Console Regular; B&H alpha25
    Lucida Console
    Version 1.60
    LucidaConsole
    Lucida is a registered trademark of Bigelow & Holmes Inc.

    Et pour ça :
    Citation Envoyé par disedorgue Voir le message
    cut n'est pas adapté dans ton cas qui semble mélanger des espaces et des tabulations comme séparateur.
    Pourquoi l'as-tu conservé dans ta solution ? Pas moyen de faire autrement ?

    +++

    Citation Envoyé par papajoker Voir le message
    ...- mettre le résultat dans un tableau
    Plus sympa pour moi de travailler avec un tableau de données.

    Citation Envoyé par papajoker Voir le message
    ...Le tableau existe pourquoi ? pour compliquer ?
    relire la ligne précédente.

    Citation Envoyé par papajoker Voir le message
    ...tu ne sembles pas l'utiliser par la suite puisque contenu non valide
    Si le contenu avait été valide, je l'aurais utilisé.

    Citation Envoyé par papajoker Voir le message
    ...Pourquoi ne pas appliquer dés le début un filtre sur ta commande "showttfcustom" ? comme j'ai proposé (le principe) en #9
    Parce que je n'ai pas vu que tu avais ajouté ce texte.

    Citation Envoyé par papajoker Voir le message
    ...- boucler sur ce tableau pour encore appliquer des filtres
    Oui, je fais les choses en plusieurs temps, c'est déjà suffisament compliqué comme ça, relis ce que je réponds à disedorgue quelques lignes plus haut...

    Bon, le frigo est en place, tout va bien, je peux recocher

    Merci à tous, en espérant ne pas revenir en trainant un cauchemar derrière moi.
    Bon wik,

  19. #19
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 376
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Mais maintenant, je dirais que c'est complètement fou, ce résultat good, quand on constate que la seule différence entre ta 1re ligne (qui est aussi la mienne) et ta seconde, c'est que la variable aline de la 1re est quotée et la variable de la seconde ne l'est pas alors qu'on sait bien qu'il vaut mieux quoter les variables !
    Je pensais donc bien faire en quotant, tout en me protégeant de variables non initialisées.
    Moi y en a plus rien comprendre...
    Ici, la devise s'applique:
    on doit toujours quoter les variables sauf si on sait pourquoi on ne le fait pas


    Citation Envoyé par Jipété Voir le message
    Pourquoi l'as-tu conservé dans ta solution ? Pas moyen de faire autrement ?
    Je n'ai pas cherché de solution alternative, j'ai juste contourné le problème de cut qui ne sait pas prendre une classe de caractère au lieu du caractère lui-même.

    De mon point de vu, je serais plus en accord avec papajoker.

  20. #20
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 159
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 159
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Ici, la devise s'applique :
    on doit toujours quoter les variables sauf si on sait pourquoi on ne le fait pas
    Explique-nous, qu'on ne meure pas idiots.

    Citation Envoyé par disedorgue Voir le message
    Je n'ai pas cherché de solution alternative, j'ai juste contourné le problème de cut qui ne sait pas prendre une classe de caractère au lieu du caractère lui-même.

    De mon point de vue, je serais plus en accord avec papajoker.
    Mais je ne demande qu'à apprendre.
    Comme quand j'étais petit garçon et qu'on me prenait par la main pour traverser la rue.

    De mon point de vue, je suis parti avec l'idée de récupérer les chemins des fichiers ttf mais ça n'est pas aussi simple qu'on le croit puisque les procédures et autres fonctions écrites en Pascal ne réussissent pas toujours à trouver les données dans les .ttf et/ou .otf.

    À partir de là, ça devient un peu de l'improvisation, et j'avoue que si je n'avais pas débusqué ce fichier showttf.c chez FontForge, j'aurais abandonné mon idée de gestion perso de mes fontes.

    Alors que là, je vais m'y remettre, dans quelques jours.
    Et, oui, j'ai trouvé que pour réunir un nom de fichier et son emplacement dans l'arborescence du système de fichiers un tableau irait très bien, à condition de réussir à s'affranchir des galères de \t.
    Merci à toi.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Crystal] transformation d'une date en numéro de semaine
    Par barna dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 24/03/2017, 09h41
  2. [RegEx] Extraire un nombre d'une grande chaine de caractères
    Par casier dans le forum Langage
    Réponses: 1
    Dernier message: 27/07/2011, 15h35
  3. Réponses: 1
    Dernier message: 26/02/2009, 18h13
  4. Découpage d'une grande image vers des textures
    Par djar dans le forum OpenGL
    Réponses: 14
    Dernier message: 26/02/2005, 18h46
  5. [C#] [ADO] Parcours d'une grande quantité d'enregistrements
    Par Wavyx dans le forum Windows Forms
    Réponses: 4
    Dernier message: 21/09/2004, 09h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo