zestedesavoir / zds-site

Cœur du projet technique de Zeste de Savoir
https://zestedesavoir.com
Other
268 stars 162 forks source link

Implement a .tuto (xml) to markdown converter #13

Closed firm1 closed 10 years ago

firm1 commented 10 years ago

Implementer un convertisseur du formats .tuto vers markdown en langage python.

Il s' agit donc de corriger la fonction tuto_to_markdown presente dans la view.py des tutorial.

La principale difficulté reside en l'ecriture de la regxp associée.

La spécification du markdown utilisé sur ZdS est ici

Pour info, le texte qui sert d'exemple est celui-ci :

Coy0te commented 10 years ago

kristofjé avait prévu de s'occuper de ce chantier, c'est en stand by ?

Coy0te commented 10 years ago

Si jamais kristofjé est trop occupé dans les jours à venir et que cet outil est urgent, voilà un extrait de là où j'en étais quand j'ai fait une ébauche en Java. Ça ne gère pas toutes les balises, mais ça nettoie le zCode présent dans les fichiers .tuto (parfois c'est bien bien crade...), et ça remplace par le markdown pour les balises les plus simples à gérer :

    // Correction des balises simples où le zCode a mangé l'espace d'avant ou d'après
    contenu = contenu.replaceAll( "<gras>\\s+", " <gras>" );
    contenu = contenu.replaceAll( "\\s+</gras>", "</gras> " );
    contenu = contenu.replaceAll( "<italique>\\s+", " <italique>" );
    contenu = contenu.replaceAll( "\\s+</italique>", "</italique> " );
    contenu = contenu.replaceAll( "<barre>\\s+", " <barre>" );
    contenu = contenu.replaceAll( "\\s+</barre>", "</barre> " );
    contenu = contenu.replaceAll( "<titre1>\\s+", " <titre1>" );
    contenu = contenu.replaceAll( "\\s+</titre1>", "</titre1> " );
    contenu = contenu.replaceAll( "<titre2>\\s+", " <titre2>" );
    contenu = contenu.replaceAll( "\\s+</titre2>", "</titre2> " );
    contenu = contenu.replaceAll( "<touche>\\s+", " <touche>" );
    contenu = contenu.replaceAll( "\\s+</touche>", "</touche> " );
    contenu = contenu.replaceAll( "<question>\\s+", " <question>" );
    contenu = contenu.replaceAll( "\\s+</question>", "</question> " );
    contenu = contenu.replaceAll( "<information>\\s+", " <information>" );
    contenu = contenu.replaceAll( "\\s+</information>", "</information> " );
    contenu = contenu.replaceAll( "<attention>\\s+", " <attention>" );
    contenu = contenu.replaceAll( "\\s+</attention>", "</attention> " );
    contenu = contenu.replaceAll( "<erreur>\\s+", " <erreur>" );
    contenu = contenu.replaceAll( "\\s+</erreur>", "</erreur> " );
    contenu = contenu.replaceAll( "<puce>\\s+", " <puce>" );
    contenu = contenu.replaceAll( "\\s+</puce>", "</puce> " );
    contenu = contenu.replaceAll( "<tableau>\\s+", "<tableau>" );
    contenu = contenu.replaceAll( "\\s+</tableau>", "</tableau>" );
    contenu = contenu.replaceAll( "<ligne>\\s+", "<ligne>" );
    contenu = contenu.replaceAll( "\\s+</ligne>", "</ligne>" );
    contenu = contenu.replaceAll( "</ligne>\\s+", "</ligne>" );
    contenu = contenu.replaceAll( "<entete>\\s+", "<entete>" );
    contenu = contenu.replaceAll( "\\s+</entete>", "</entete>" );
    contenu = contenu.replaceAll( "</entete>\\s+", "</entete>" );
    contenu = contenu.replaceAll( "<cellule>\\s+", "<cellule>" );
    contenu = contenu.replaceAll( "\\s+</cellule>", "</cellule>" );
    contenu = contenu.replaceAll( "</cellule>\\s+", "</cellule>" );

    // Correction des balises complexes où le zCode a bouffé l'espace d'avant ou d'après
    contenu = contenu.replaceAll( "<couleur([^>]*?)>\\s+", " <couleur$1>" );
    contenu = contenu.replaceAll( "\\s+</couleur>", "</couleur> " );
    contenu = contenu.replaceAll( "<lien([^>]*?)>\\s+", " <lien$1>" );
    contenu = contenu.replaceAll( "\\s+</lien>", "</lien> " );
    contenu = contenu.replaceAll( "<image([^>]*?)>\\s+", " <image$1>" );
    contenu = contenu.replaceAll( "\\s+</image>", "</image> " );
    contenu = contenu.replaceAll( "<acronyme([^>]*?)>\\s+", " <acronyme$1>" );
    contenu = contenu.replaceAll( "\\s+</acronyme>", "</acronyme> " );
    contenu = contenu.replaceAll( "<minicode([^>]*?)>\\s+", " <minicode$1>" );
    contenu = contenu.replaceAll( "\\s+</minicode>", "</minicode> " );
    contenu = contenu.replaceAll( "<code([^>]*?)>\\s+", " <code$1>" );
    contenu = contenu.replaceAll( "\\s+</code>", "</code> " );
    contenu = contenu.replaceAll( "<liste([^>]*?)>\\s+", " <liste$1>" );
    contenu = contenu.replaceAll( "\\s+</liste>", "</liste> " );

    // Remplacement des balises simples par du markdown
    contenu = contenu.replace( "<gras>", " **" );
    contenu = contenu.replace( "</gras>", "** " );
    contenu = contenu.replace( "<italique>", " *" );
    contenu = contenu.replace( "</italique>", "* " );
    contenu = contenu.replace( "<barre>", "<del>" );
    contenu = contenu.replace( "</barre>", "</del>" );
    contenu = contenu.replace( "<titre1>", "\n#" );
    contenu = contenu.replace( "</titre1>", "\n" );
    contenu = contenu.replace( "<titre2>", "\n##" );
    contenu = contenu.replace( "</titre2>", "\n" );
    contenu = contenu.replace( "<touche>", "<kbd>" );
    contenu = contenu.replace( "</touche>", "</kbd>" );
    contenu = contenu.replaceAll( "<minicode(.*?)>", " `" );
    contenu = contenu.replace( "</minicode>", "` " );
    contenu = contenu.replaceAll( "<code(.*?)>", "\n````\n" );
    contenu = contenu.replace( "</code>", "\n````\n" );
    contenu = contenu.replaceAll( "<lien>(.+?)</lien>", "[$1]($1)" );
    contenu = contenu.replaceAll( "<lien url=\"(.*?)\">(.+?)</lien>", "[$2]($1)" );
    contenu = contenu.replaceAll( "<image>(.+?)</image>", "![image]($1)" );
    contenu = contenu.replaceAll( "<image(.*?)legende=\"(.*?)\"(.*?)>(.+?)</image>", "![$2]($4)" ); // les groupes 1 et 3 capturent "legendvisible" ou "titre"...

    // pour les acronymes, il faut d'abord enregistrer les match dans une Map, et non pas faire un simple replaceAll.
    Map<String, String> acronymes = new HashMap<String, String>();
    Pattern acronyme = Pattern.compile( "<acronyme valeur=\\\"(.*?)\\\">(.+?)</acronyme>" );
    Matcher matcher = acronyme.matcher( contenu );
    while ( matcher.find() ) {
        acronymes.put( matcher.group( 2 ), matcher.group( 1 ) );
    }
    contenu = contenu.replaceAll( "<acronyme valeur=\\\"(.*?)\\\">(.+?)</acronyme>", "$2" );
    contenu += "\n\n";
    for ( Map.Entry<String, String> item : acronymes.entrySet() )
    {
        contenu += "*[" + item.getKey() + "]: " + item.getValue() + "\n";
    }

C'est très basique, mais fonctionnel. Il manque la gestion des tableaux, des puces, des citations, des positions, des flottants, des tailles, des couleurs, et des balises questions/info/attention/erreur (à l'époque, on n'avait pas encore fait les choix au sujet de toutes ces balises).

Je peux me charger de rajouter ça au parseur si jamais on n'a toujours rien de neuf d'ici la semaine prochaine, et suffira de porter ça en python (ça doit pas être bien différent).

firm1 commented 10 years ago

Ah mais c'est intéressant ce que tu as fais. Mais je vise des performances minimales pour éviter de faire tomber le serveur lors de l'import d'un .tuto en ligne.

Dans ce que j'ai fait jusqu'a présent (voir fonction tuto_to_markdown), je n'ai pas besoin de passer par ta première étape de correction des balises dont l'espace à été mangée, et ça marche plutôt bien.

Pour le moment il gère :

Tout ceci se joue sur les regxp.

Je me demandais bien comment géré les acronyme, ton astuce est bonne.

Et merci pour les expressions régulières ça m'évitera bien des emmerdes.

Coy0te commented 10 years ago

Ok, j'avais pas vérifié où en était ta méthode. Bon ben il manque pas grand chose alors, c'est cool.

Par contre tu feras attention, je pense que t'as omis quelques trucs :

Pour les performances, y'a vraiment pas à s'inquiéter, avec un truc aussi peu optimisé que mon parseur pourri je traite 450 tutos en moins d'une minute depuis une instance lancée via Eclipse sur un pc moyen sous windows 7, donc sur un VPS aucun pb, encore moins pour de l'import unitaire. T'embêtes pas avec ça.

D'ailleurs, je me trompe peut-être, mais pour moi c'est supposé être un outil "one-shot" : il me semble judicieux de tout importer d'un seul coup (on a déjà les 700+ tutos du SdZ au format .tuto en notre possession), et de ne pas rendre publique cette fonction d'import : tout tuto existant sera déjà prêt à l'usage, suffira que les auteurs les revendique et on aura juste besoin d'un moyen de leur (ré)attribuer leur cours.

Coy0te commented 10 years ago

À propos, est-ce que tu as déjà géré les images contenues dans les cours ? (actuellement hébergées sur OC)

P.S : quand je vois ta fonction d'import et celle que j'avais faite, je me rends qu'à part les questions/réponses des QCM, on a codé presque exqctement la même chose. xD

firm1 commented 10 years ago

À propos, est-ce que tu as déjà géré les images contenues dans les cours ? (actuellement hébergées sur OC)

Pour les images des cours, actuellement, je me contente de conserver le lien qui pointe vers OC, car si on doit télécharger toutes les images d'un cours, et recréer les lien directement via l'import en ligne, ça risque d'être galère.

Pour moi l'import en ligne doit être disponible pour tous les membres qui consultent le site. Je reste persuadé que pour une meilleure coopération, il faut que les auteurs décident eux même d'importer leurs cours sur ZdS. Et si le traitement d'import est trop lourd, ça ne va pas le faire. J'ai testé un tuto de 6 parties avec 5 chapitres en moyenne par partie, et j'en ai eu pour environ 6,7 secondes.

Thunderseb commented 10 years ago

Est-ce que ce bidule d'upload serait capable de gérer les images locales ? Par exemple, j'ai récupéré tous les tutos du SdZ et mon script a modifié le .tuto pour changer les liens des images en "images/image.png", en même temps que de les télécharger. (of course). Donc j'ai les .tuto, et chacun a un dossier images/.

A la limite, filez-moi un accès FTP/SFTP et j'uploaderai ce que j'ai.

Coy0te commented 10 years ago

Il y a 2 mois de ça j'avais fait un wget sur toutes les images référencées dans les .tutos également, mais j'avais pas encore pris le temps de trier et renommer les images... C'est cool que tu l'aies déjà fait ! =)

@dralliw : presque aucun auteur ne dispose de son .tuto ! Si on attend que chaque auteur fasse la demande auprès d'OC et le récupère, on n'est pas rendus... C'est dans notre intérêt et dans le leur également de prendre les devants et de s'occuper de ça pour eux, et on peut éventuellement ne pas afficher les cours en ligne tant que les auteurs n'ont pas dit "OK".

firm1 commented 10 years ago

O_o THS tu égaye ma journée là. C'est du bon travail que tu as fait là.

Mes prochaines actions de dev concernent ce point précis que sont les chemins relatifs (dans un fichier TOC) et les images associés.

Pour le compte SFTP je te fais un mail.

Thunderseb commented 10 years ago

Btw, s'il faut encore récupérer des choses sur la V3 je peux encore le faire, car j'ai tjs mon compte de validateur sur cette version ^^

Coy0te commented 10 years ago

Il date de quand ton dernier backup des .tuto + images ? Si tu l'as fait début 2013 ou après, alors on n'a rien d'autre à récupérer, il s'est quasi rien passé sur les tutos de la v4.

Thunderseb commented 10 years ago

Je l'avais fait en même temps que toi plus ou moins. Mais moi j'avais tout choppé, même les licences non-libre ^^

Coy0te commented 10 years ago

Haha, le fourbe ! Faudra penser à faire le tri du coup, qu'on récupère que ce qui est libre ou CC.

Thunderseb commented 10 years ago

Pas nécessairement. Beaucoup d'auteurs (dont moi), n'avaient pas passé leurs tutos en CC. Mais je vais quand même les contacter pour savoir s'ils sont OK pour que nous les publions ^^ . Donc je vais tout uploader, et on verra après :p .

Thunderseb commented 10 years ago

Bon, j'ai uppé le tout dans /home/zds/tutos_sdzv3/

A la racine y'a un fichier .xml (lisible grâce au .xsl + .css) qui liste tous les tutos.

Et un dossier Source qui contient tous les tutos, un dossier par tuto.

Normalement tout devrait être bon, mais vu la masse, il se peut qu'il y ait eu des erreurs : je n'ai sondé que quelques tutos...

Coy0te commented 10 years ago

Si je me souviens bien, il faut vérifier en particulier le .tuto du cours sur GTK, il me semble que son zCode était particulièrement dégueulasse et non valide.

firm1 commented 10 years ago

Merci THS. Je les importerai sur le site lorsque j'aurai terminé l'intégration des fichiers TOC dans les tutos. Autant partir sur un bon historique.

cgabard commented 10 years ago

Moi aussi j'ai un début de convertisseur zcode -> markdown mais je ne l'ai pas terminé tant que je n'avais pas le format markdown de définit.

Du coup je vais tenter de finir rapidement le parseur markdown -> html pour correspondre à nos besoin. je fais comme je peux avec mon nouveau taf par contre. Et ensuite je pensais finir la parseur zcode -> markdown. Mais si quelqu'un veut s'en occuper, qu'il le fasse.

Perso je pense qu'on se tape totalement de l'implémentation, rapide ou pas, car de toute façon la majorité des tutos on le fera une fois pour toute. Pour les quelques personnes qui auraient des .tuto qu'on ai pas, ce n'est pas ça qui va faire tomber le serveur.

firm1 commented 10 years ago

Moi aussi j'ai un début de convertisseur zcode -> markdown mais je ne l'ai pas terminé tant que je n'avais pas le format markdown de définit.

Peux-tu compléter le mien (aka lui ) ou l'améliorer ?

Du coup je vais tenter de finir rapidement le parseur markdown -> html

pour moi tu devrais le mettre dans le top de ta liste de priorité

cgabard commented 10 years ago

Oui ça l'est mais j'ai une vie willy moi, je n'ai pas ma copine à 500m qui vient me livrer ma bouffe et repart juste pour pas que je perde du temps :-p

Je vais essayer de faire ça rapidement mais il faut que je dégage du temps.

firm1 commented 10 years ago

Oui ça l'est mais j'ai une vie willy moi, je n'ai pas ma copine à 500m qui vient me livrer ma bouffe et repart juste pour pas que je perde du temps :-p

C'est pas de ma faute si tu fais des mauvais choix conceptuels dans la gestion de ton couple. :-P

Je ne voulais pas dire de le faire vite (et donc potentiellement à l'arrache), mais juste de commencer par là (priorité toussa).

Coy0te commented 10 years ago

Petite update sur la situation au niveau du parseur zCode -> markdown.

Le parseur actuel gère tout correctement (sauf oubli de cas tordu de ma part), à l'exception des tableaux :

J'espère avoir du temps à passer dessus cet après-midi pour essayer de rectifier ça.

cgabard commented 10 years ago

Cool !

Si tu trouve des bugs dans le markdown, n'hesite pas. Je crois que je suis arrivé au point d'avoir le code a peut pret complet niveau fonctionnalité, donc je vais m'occuper des détails.

Au passage, ne pourrait on pas inclure le convertisseur dans l'arbre de source ? Histoire de conserver le convertisseur de coté au besoin ? Ou au pire dans un dépot séparré ?

Coy0te commented 10 years ago

Il est déjà dans mon dépôt GH (parseTuto), mais le code date de 2 jours, j'ai pas encore eu l'occasion d'envoyer la dernière version.

cgabard commented 10 years ago

J'avais pas vu, désolé :)

Coy0te commented 10 years ago

J'ai fini par trouver le temps de réécrire la méthode de conversion en grid_table des tableaux zCode.

Dorénavant, le parseur gère correctement les cellules multi-lignes, donc tous les tableaux barbares dont les cellules contiennent des listes et/ou autres pavés multi-lignes fonctionnent.

Le seul truc qui n'est pas (encore) vraiment géré, c'est le colspan/rowspan. Pour le moment, je "corrige" le tableau en amont (je l'éclate en un tableau sans spanning), avant de le convertir proprement en markdown.

Je pousserai le code sur GH ce soir. Si j'ai le temps, je regarderai comment gérer le spanning d'ici ce week-end.

firm1 commented 10 years ago

Ah ouais, pas mal.

Du coup, tu gère la mise en évidence des lignes de codes dans le convertisseur ?

cgabard commented 10 years ago

:+1:

Coy0te commented 10 years ago

Du coup, tu gère la mise en évidence des lignes de codes dans le convertisseur ?

Oui. Je gèrerai aussi le décalage de numérotation si on l'implémente dans notre syntaxe md.

firm1 commented 10 years ago

O_o Nice ... bon boulot alors. Plus que le spanning et tu peux lancer la conversion sur tous les tutos.

cgabard commented 10 years ago

Oui. Je gèrerai aussi le décalage de numérotation si on l'implémente dans notre syntaxe md.

Alors ça, en gros, il faut encore que je patch python-markdown, je ne peux pas vraiment le faire avec une extension. Donc j'attend de voir comment va passer celle sur les intervalles sur le projet officiel avant de voir si je dois repartir de ma version modifié ou de celle officiel.

Mais dans tous les cas je l'implémenterais si firm1 accepte de conserver une version installé depuis les sources plutôt que une fournit par les dépots. Manifestement il faudrat attendre un certain temps avant que ça arrive dans les dépots si je me fit à ce que j'ai lu (encore trop d'issues ouvertes)

Coy0te commented 10 years ago

Plus que le spanning et tu peux lancer la conversion sur tous les tutos.

J'ai de gros doutes concernant la gestion du spanning, ça va compliquer énormément le calcul des largeurs et hauteurs max des cellules/lignes/colonnes, le remplissage des cellules du tableau ascii et le dessin des contours.

Je verrai ça à tête reposée, plus tard. Je me demande d'ailleurs si je ferai pas mieux de détecter le spanning après coup, une fois le tableau au format grid_table généré, et de modifier directement ce format-là.

cgabard commented 10 years ago

Il y a beaucoup de tutos qui l'utilisent ?

Coy0te commented 10 years ago

Si tu parles du spanning, ouai. Sur les 500+ tutos que j'ai en local :

Si tu parles du décalage de numérotation des codes, ouai aussi :

Et pour terminer avec les stats, voilà les occurrences de blocs de code sur lesquels il y a un attribut " titre" :

Si c'est pas chiant, ça peut valoir le coup de leur appliquer la légende comme on l'a fait pour les tableaux. Si c'est trop chiant, je peut simplement récupérer l'info et la caler à la suite des blocs de code, en gras/centré. Tiens-moi au courant.

firm1 commented 10 years ago

De toute façon pour le spanning tu as une solution de contournement pour le spanning, donc ça devrait déjà régler pas mal de truc.

Pour le décalage de numérotation, je n'ai pas bien saisi le truc. On peut me réexpliquer ?

Cependant, pour le moment en regardant les sources de ton code, tu fais tes tests sur le contenu d'un chapitre et pas forcément sur tout le fichier .tuto

Il faudrait que le convertisseur convertisse un .tuto en entier. En conservant la hierarchie des parties/chapitres en xml et en ne convertissant que ce qui fait référence au contenu. Ainsi l'import de .tuto dispo via zds.com se chargera d'importer en recréant automatiquement la hiérarchie dans la base.

Coy0te commented 10 years ago

Pour le décalage de numérotation, je n'ai pas bien saisi le truc. On peut me réexpliquer ?

Pouvoir numéroter les lignes d'un code à partir d'un certain numéro spécifié, et pas forcément à partir de 1.

Cependant, pour le moment en regardant les sources de ton code, tu fais tes tests sur le contenu d'un chapitre et pas forcément sur tout le fichier .tuto

Ouai, c'est marqué dans la TODO, dans le readme. ;)

D'ailleurs, est-ce que ta méthode d'import gère les QCM ?

cgabard commented 10 years ago

Pour le .tuto, j'ai déjà un script python qui extrait tout dans une structure de donnée. Il n'y a plus qu'a appliquer la conversion des sous parties en zcode vers markdown.

Pour le decalage de numérotation, ce n'est pas dur a mettre en place sur python markdown, mais tres louche via extension (pas gagné que je puisse sans extirper des exentions fournit avec l'implémentation pour les modifier). J'aimerai donc éviter. J'attends juste de voir comment va passer la premiere PR, je ferais en fonction.

Pour les legende de code, je ne me souvenais plus, d'autant que ça n'avait pas été conclu. On est censé obtenir quoi comme code html ?

Coy0te commented 10 years ago

Aucune idée pour le rendu HTML d'un bloc de code. Si y'a pas de sémantique particulière à conserver, je peux me contenter de copier le titre en fin de bloc.

firm1 commented 10 years ago

Perso, je suis d'avis de faire comme @Coy0te c'est à dire, copier le titre en fin de bloc. Parce que bon, il y'a pas forcément de syntaxe html prévue pour ça.

cgabard commented 10 years ago

Je demande sur la ML ce que Alex en pense. En soit le module de coloration va générer un tableau donc peut etre réutiliser le tag "caption" ?

Sinon je serais plus pour faire un div avec une class dédié : a charge du front de le rendre comme il le veut.

Coy0te commented 10 years ago

@cgabard, tu confirmes pour ton script Python ? Est-ce qu'il extrait aussi les QCM ? Si je peux éviter de coder le parse & update de la structure d'un fichier .tuto, ça sera toujours ça de pris.

firm1 commented 10 years ago

D'après ce que je lis, :

Il faudra donc, un dernier script pour rembobiner tous les morceaux de contenu dans un seul fichier (avec la hiérarchie des .tuto)

C'était juste pour être sur qu'on parle bien de la même chose.

cgabard commented 10 years ago

Je n'ai plus mon script en tete. Je crois que je parsais juste le xml et rempliçait une map en conséquence. J'interceptais à ce moment là les zones intro, conclusion et texte pour les faire passer dans un convertisseur zcode -> md. Ensuite la map pouvait donc etre consulté en python ou meme directement enregistré en Json par ex.

J'ai pas testé les QCM, mais en soit ça devrait etre remplit automatiquement dans ma map.

Coy0te commented 10 years ago

Ouai bon vous embêtez pas, je vais compléter le parseur pour qu'il traite un lot de fichiers .tuto directement, ça sera réglé.

cgabard commented 10 years ago

De toute façon, normalement, tu peux utiliser un parseur xml et intercepter les champs into, conclusion et texte. Le reste peut etre recopier directement ou presque. J'avais rajouter des trucs pour convertir les champs connues dans le bon type mais en soit ce n'est pas primoridiale.

Apres si l'ensemble est en Java, ce sera pls cohérent.

Coy0te commented 10 years ago

J'ai mis le code à jour, et fait en sorte que le parseur travaille directement sur les fichiers .tuto.

Pour les légendes de code, j'ai vu que tu allais partir sur le rendu HTML <figure>. Du coup, qu'est-ce que je fais des titres des blocs de code ? Même syntaxe que les légendes des tableaux ?

cgabard commented 10 years ago

Yep, même syntaxe que pour les tableau (avec code au lieu de table en optionnel).

Je tenterai de faire ça ce soir. Avec le start numbering.

Après il reste les vidéos pour les légendes, mais je ne sais pas si il ne faudrait pas en profiter pour en faire une syntaxe dédié comme les images

Coy0te commented 10 years ago

Ok, je place les titres de blocs de code sous la forme "Code: ... ".

Tiens-moi au courant pour les vidéos.

Coy0te commented 10 years ago

J'ai fait plein de tests massifs de conversion des .tuto cet après-midi, il en ressort que :

Pour adapter la conversion à ces cas un peu exotiques, j'ai appliqué des correctifs automatisés là où c'était possible, dans l'ensemble ça se comporte plutôt bien. Au final, il faudra tout de même que je corrige manuellement les endroits problématiques dans certains tutos avant de lancer la conversion finale, mais ça devrait bien se passer.

Je serai en Chine de mecredi prochain jusqu'à mi-février, j'espère que lorsqu'on aura finalisé notre syntaxe markdown, j'aurai une connexion correcte pour m'occuper rapidement de la conversion finale des .tuto.

firm1 commented 10 years ago

Excellent rapport mon colonel.

Il me semble que les tutos en ta possession ne sont pas aussi à jour que ceux de THS. Vaudrait peut-etre mieux faire les tests sur les siens non ?

Aurais-tu une idée du nombre de tuto qui n'ont pas de problème après passage par ton parseur ? Parce que bon, si on a 700/800 tutos qui sont propres, j'ai envie de dire, que le reste fera l'objet d'une relecture pour les bugs atypiques.

De plus, si on réussi à convaincre chaque auteur de faire passer son tuto, il peut déjà faire une petite relecture, ça simplifierai les choses je pense.

Je serai en Chine de mecredi prochain jusqu'à mi-février

O_o mais ça veut dire que tu seras doublement productif :-P