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 :
et j'ai besoin de :
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.
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 !
Linux c'est comme ...
heu ...
comme ...
c'est bien quoi !
[^]Re: Perl !
Pas assez marrant, on veut une expression régulière en une ligne ;)
(oui, je suis dessus depuis 1 heure maintenant ;))
[^]Re: Perl !
A défaut d'une expression régulière, voilà la version gawk
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 !
Sympathique et astucieux (et pertinenté).
Est-ce un manque grave?Par contre, ça ne gère pas le cas
[^]Re: Perl !
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 !
Si oui, c'est facilement adaptable :
[^]Re: Perl !
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 !
Ah la la, les petits jeunes. Toujours à nous sortir une enclume pour un truc qui prends même pas une ligne:
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 !
UUOC!
(ah la la, les petits jeunes...)
[^]Re: Perdu !
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 !
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 !
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 !
#!/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
Free Softwares Users Group Arlon
[^]Re: Perdu !
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 !