Faire un don ! | | style | statistiques | contactez-nous | plan | lettre d'information

Journal : Créer un livre dont vous êtes le héros avec des outils libres + question sur les regex

Posté par Farvardin (page perso, ) le 17 juillet 2007
Bonjour,

Ce journal est à la fois la présentation d'un petit projet, et une question qui aurait dû figurer dans le forum...

je suis en train de développer un genre de modèle pour réaliser des "livres-jeux" type "Livres dont vous êtes le héros" à partir de txt2tags. Cela permet à partir d'une même source d'exporter le jeu en version html et latex avec un joli rendu (avec liens hypertextes). La syntaxe est super simple, et pas du tout obtrusive. En fait les paragraphes sont délimités par des == chapitre ==, et la référence à ce paragraphe se fait uniquement avec les numéros en fin de ligne.

La page de présentation se trouve ici :

http://anamnese.online.fr/site2/txt2cyoa/txt2cyoa.html

Seulement, ce n'est pas ultra pratique à visualiser une histoire comme cela. J'ai pensé qu'avec graphviz on pouvait faire quelques merveilles supplémentaires, à savoir générer un organigramme directement à partir des chapitres. Je n'ai pas réussi à le faire automatiquement et proprement à partir de txt2tags, par contre à coup de grep j'arrive à avoir une base, et avec quelques ajustements, on peut générer le graphique :

http://anamnese.online.fr/site2/txt2cyoa/txt2cyoa_graph.png

Alors voilà, ma question est de savoir s'il est possible en ligne de commande, en python, en perl ou ce que vous voulez, à modifier le dernier fichier que j'arrive à avoir de sorte qu'il puisse être utilisé directement avec graphviz.

J'obtiens :

digraph G {
1->
8;9;
6;
2->
6;
3;
7;
3->
6;
5;
4;
7;
4->
6;
5;
3;
5->
6;
3;
2;
6->
5;
3;
7->
8->
9->
}


et j'ai besoin de :


digraph G {
1->8;
1->9;
1->6;
2->6;
2->3;
2->7;
3->6;
3->5;
3->4;
3->7;
4->6;
4->5;
4->3;
5->6;
5->3;
5->2;
6->5;
6->3;
}


En fait la mission est "simplement" de pouvoir prendre la première ligne contenant la séquence "nombre->", la mémoriser, et la coller avant chaque ligne qui se termine par un ; jusqu'à une nouvelle séquence nombre-> qui remplace la première et se colle dans les lignes du dessous etc.

Est-ce que cela est possible (sans doute avec sed) ? Comment feriez-vous ? j'ai cherché sur les forums et sur internet, mais je n'ai rien trouvé d'approchant.

Merci d'avance.

> Lire le journal (30 commentaires, moyenne: 4,5).  

Vous avez demandé le commentaire #851800.

Perl !

Posté par arthurr (page perso, ) le 17/07/2007 à 20:10. (lien). Évalué à 4.


#!/usr/bin/perl
use strict;
my $fichier=$ARGV[0];
open (FILE,"<$fichier") || die "ARGH : $!\n";
my $page;
while(){
  chomp $_;
  if($_=~/->/){
      $page=$_;
  }elsif($_=~m/;/){
      @_=split ";",$_;
      foreach(@_){
      print "$page$_;\n";
      }
  }else{
      print "$_\n";
  }
}
close(FILE);

--
Linux c'est comme ...
heu ...
comme ...
c'est bien quoi !
  • [^]Re: Perl !

    Posté par Moonz () le 17/07/2007 à 20:15. (lien). Évalué à 5.

    Pas assez marrant, on veut une expression régulière en une ligne ;)
    (oui, je suis dessus depuis 1 heure maintenant ;))

    • [^]Re: Perl !

      Posté par Plop () le 17/07/2007 à 20:55. (lien). Évalué à 10.

      A défaut d'une expression régulière, voilà la version gawk


      gawk '/->/ { z=$0} /[0-9]+[^->]/ {print z$0}' FIC.txt

      C'est simple et efficace. Comme quoi, c'est utile les "vieux" outils Unix :)

      --
      http://linuxfr.org/board <-- des moules, du sang, de la violence
      • [^]Re: Perl !

        Posté par tripa () le 18/07/2007 à 06:22. (lien). Évalué à 1.

        Sympathique et astucieux (et pertinenté).
        Par contre, ça ne gère pas le cas

        1->
        8;9;
        Est-ce un manque grave?

        • [^]Re: Perl !

          Posté par Farvardin (page perso, ) le 18/07/2007 à 07:08. (lien). Évalué à 2.

          pas trop pour ma part. En fait la règle c'est de toujours terminer une ligne de choix par la valeur de ce choix (numéro de chapitre). Comme cela n'avait pas été fait dans la première ligne, du coup cela ne fonctionne plus comme prévu, mais si on écrit une aventure avec dans l'esprit d'avoir le graphique à la fin, et que l'on respecte la règle, pas de pb.

          Enfin, il doit être possible d'ajouter un filtre supplémentaire pour ajouter un retour à la ligne là où il faut (je peux le faire avec txt2tags à un niveau plus haut...)

          Mais pour utiliser la version gawk, il faut que je vérifie si cela supprime bien les lignes avec un nombre et -> sans rien à la fin...

          --
          Tous ensemble contre l'esclavitude des logiciels privateurs !

          [^]Re: Perl !

          Posté par pi6Lohe () le 18/07/2007 à 07:16. (lien). Évalué à 3.

          Si oui, c'est facilement adaptable :


          gawk -F ';' '/->/ { z=$0} /[0-9]+[^->]/ { for (i=1; i < NF; i++) { print z$i";" } }' FIC.txt

          • [^]Re: Perl !

            Posté par Snarky (Jabber id, page perso, ) le 18/07/2007 à 07:24. (lien). Évalué à 5.

            Zut, j'ai sorti ma version trop tard... (J'ai du ouvrir la doc pour me souvenir du NF :s)
            awk -F';' '!/[0-9]/{print $0}/->/{a=$0}/[0-9]+[^->]/{for(x=1;x<NF;x++)print a$x";"}' src.txt

            Enfin, elle à l'avantage de pas supprimer les entêtes, contrairement à la tienne. :)

            --
            Milite pour un about:black sur les navigateurs ! (Sauvons la planète)

      [^]Re: Perl !

      Posté par Sébastien Koechlin () le 18/07/2007 à 07:30. (lien). Évalué à 10.

      Ah la la, les petits jeunes. Toujours à nous sortir une enclume pour un truc qui prends même pas une ligne:


      cat myfile | perl -pe 'if(m/^(\d+)->/) { $i=$1; $_=""; } else { s/(\d+);\n?/$i->$1;\n/g; }'

      perl -p fait la boucle et le print tout seul pour tout le contenu du fichier passée en entrée.

      perl -e execute le programme passé sur la ligne de commande

      Le if cherche un nombre suivit de '->' et le conserve dans la variable $i; il supprime la sortie en vidant $_

      Le else ajoute "$i->" devant les chiffres et ajoute un saut de ligne.

      Voila, ça ne m'a pas pris 10 minutes.

      • [^]Re: Perl !

        Posté par tripa () le 18/07/2007 à 07:48. (lien). Évalué à 4.

        UUOC!

        (ah la la, les petits jeunes...)

    [^]Re: Perdu !

    Posté par pipo_molo () le 17/07/2007 à 20:58. (lien). Évalué à 10.

    Cette fois ci, c'est clair. On a la réponse en Python 23 minutes après que le journal ait été posté, et la réponse en Perl aura mis 66 minutes à arriver.

    De quoi on peut facilement déduire que Python est 3 fois plus efficace que Perl.

    • [^]Re: Perdu !

      Posté par Sytoka Modon (page perso, ) le 17/07/2007 à 21:18. (lien). Évalué à 9.

      Ou que les mecs qui font du python n'ont rien à foutre que de trainer sur dlfp alors que les perliens bossent encore ;-)

      • [^]Re: Perdu !

        Posté par Jeff_ (Jabber id, ) le 18/07/2007 à 00:50. (lien). Évalué à 8.

        ou que les pythoneux sont au chômage et que les perleux on un taf, eux...

        --->[]

        --
        "L'informatique, c'est comme le sexe : c'est mieux quand c'est gratuit" [Linus]

      [^]Re: Perdu !

      Posté par Rémi Laurent (Jabber id, page perso, ) le 17/07/2007 à 22:07. (lien). Évalué à 4.

      #!/usr/bin/ruby

      module Game
      def Game.parse(filename)
      fd = open(filename, 'r')
      h, k = {}, ""
      fd.each do |l|
      case l.chomp!
      when /^[0-9]+->$/
      k = l.delete("->")
      h[k] ||= []
      when /^([0-9]+;)+$/
      l.split(";").each { |i| h[k] << i }
      end
      end
      return h
      end
      def Game.render(filename)
      parse(filename).each do |key,value|
      value.each {|item| puts "#{key}->#{item};" }
      end
      end
      end

      Game::render("foobar.graph")

      je proteste, j'étais en train de boire une bière devant un film!

      PS: je sais pas comment on affiche du code proprement, frappez pas s'il vous plait
      PPS: je garantis pas que ça soit 100% fool proof ou que je vais pas me faire incendier par des rubyistes plus aguéris que moi

      • [^]Re: Perdu !

        Posté par Farvardin (page perso, ) le 17/07/2007 à 22:13. (lien). Évalué à 3.

        merci de ta contribution, ainsi que celles de tous les autres. Pour le moment je garde celle en python, mais si la version gawk fait exactement la même chose, cela simplifiera un peu, je vais tester. La version perl est un peu plus confuse que python, mais merci quand même. Pour java c'est intéressant de voir comment on peut le faire, mais je vais me contenter de qque chose de plus simple...

        Pour afficher le code, tu tapes autour : <blockquote> ton texte </blockquote>



        --
        Tous ensemble contre l'esclavitude des logiciels privateurs !