Use ASDoc with Google Prettify
Par eKameleon le vendredi, mars 14 2008, 23:16 - AS3 - Flex - Air - Lien permanent
Il n'y a pas de secret. Le code ne passe pas seulement par des interminables lignes de code mais surtout par d'interminables lignes de documentation (en général plus nombreuses). Un framework, une classe, un bout de code non documenté et c'est très rapidement l'anarchie.
Pour générer nos documentations en AS3 ou MXML, Adobe nous propose ASDoc une application en ligne de commande assez complexe mais qui a le mérite de générer une documentation HTML bien complète.
Je ne vais pas entrer dans mon article sur une explication super détaillée de toutes les options proposées par ASDoc ou encore sur la "meilleure manière" de générer sa documentation via une tache ANT ... Je préfère vous parler d'une fonctionnalité à mes yeux importante et pourtant non prévue dans ASDoc : la colorisation syntaxique du code contenu dans la documentation.
En effet, même si ASDoc propose via les balises code et listing une "solution" pour afficher une partie du texte contenu dans vos documentations avec un formatage "spécifique".. on peut pas dire que le résultat soit très explicite !
A côté de cela Google a sorti il y a un petit moment maintenant un petit module opensource écrit en JAVAScript qui permet de coloriser un code HTML efficacement via le script Google Code Prettify. L'intérêt de ce module réside dans le fait qu'il ne nécessite pas, comme GESHI (PHP) par exemple, d'un script serveur pour coloriser le code d'un texte HTML.
Google Code Prettify permet de coloriser un bon nombre de langages et fonctionne vraiment bien avec les langages basés sur une écriture C, Java, Python, Bash, SQL, HTML, XML, CSS et Javascript.
Pour faire simple Google Code Prettify permets de modifier dynamiquement dans une page HTML les balises pre et code possédant un attribut "class" avec la valeur "prettyprint" comme ceci :
<html> <header> <link href="prettify.css" type="text/css" rel="stylesheet" /> <script type="text/javascript" src="prettify.js"></script> </header> <body onload="prettyPrint()"> <p> <pre class=prettyprint> var s = "hello world" ; var sum = function( n1 , n2 ) { return n1 + n2 ; } trace( 2 + 3 ) ; </pre> </p> <p>The previous script return <code class="prettyprint">5</p></p> </body> </html>
Au final, nous avons d'un côté ASDoc un applicatif en ligne de commande qui permet de documenter nos classes via la notation JAVADOC et un texte au format HTML distribué officiellement par Adobe et de l'autre côté
Google Code Prettify qui permet de formater un texte HTML si il contient des scripts. L'idée est de pouvoir utiliser les 2 pour créer nos documentations AS3 
Hacker le template de ASDoc pour utiliser Google Prettify
ASDoc est basé sur un template utilisant de nombreux fichiers xsl, js, html etc.
Le répertoire par défaut du template de ASDoc se trouve dans le répertoire sdk 3.0.0/asdoc/templates du Flex SDK 3. Pour ma part pour créer mon propre template pour ASDoc j'ai copié ce répertoire dans le repository SVN de mon framework pour éviter tout soucis. Vous pouvez bien entendu modifier directement les sources du template de ASDoc fourni dans le SDK de Flex 3 mais bon.... en général ce n'est pas trop conseillé 
Détaillons maintenant la procédure pour transformer ASDoc :
1 - Télécharger Google Code Prettify
Pour cela il suffit de récupérer la dernière version disponible sur Google Code : Google Prettify sur Google Code.
Ensuite il suffit de placer les 2 fichiers prettify.js et prettify.css à la racine du répertoire template. Vous pouvez ensuite personnaliser comme vous le désirez les couleurs des mots clés dans votre code en éditant simplement la feuille de style contenue dans le fichier "prettify.css".
2 - Modifier le fichier asdoc.js du répertoire template de ASDoc.
Avec n'importe quel éditeur de texte (JSEclipse ou NotePad++ par exemple) vous cherchez la fonction configPage() dans le fichier asdoc.js et il suffit d'ajouter ensuite à la fin de la fonction l'instruction prettyPrint() ; :
function configPage() { // ... asdoc code here prettyPrint() ; }
Cette méthode est invoquée lors de l'appel de l'événement window.onLoad dans chacune des pages de la documentation.
3 - Modifier le fichier adoc-util.xsl.
Tout d'abord il faut faire une recherche dans le fichier pour trouver l'élément XSL : getStyleLink. Ce noeud XSL contient les définitions des feuilles de style utilisées dans les pages HTML de la documentation. Il suffit donc d'ajouter dans ce noeud le tag suivant :
<xsl:template name="getStyleLink"> .... <xsl:element name="link"> <xsl:attribute name="rel">stylesheet</xsl:attribute> <xsl:attribute name="href"> <xsl:value-of select="$baseRef"/>prettify.css</xsl:attribute> <xsl:attribute name="type">text/css</xsl:attribute> </xsl:element> </xsl:otherwise> </xsl:choose> </xsl:template>
En cas de doute vous pouvez consulter le fichier modifier sur le SVN de VEGAS : asdoc_util.xsl modifié
Ensuite il faut faire une nouvelle recherche dans le fichier pour trouver l'élément XSL avec l'identifiant : getTitleScript. Ce noeud contient les appels des scripts Javascript externes nécessaires dans l'application. Nous rajoutons donc comme pour les balises de style le code suivant :
<script language="javascript" type="text/javascript"> <xsl:attribute name="src"> <xsl:value-of select="$baseRef"/> <xsl:text>prettify.js</xsl:text> </xsl:attribute> </script>
Vous pouvez ajouter cet élément juste avant l'élément qui permet de gérer le chargement du fichier asdoc.js.
Conclusion en tout genre
Résultat des opérations... Voici quelques petits exemples en parcourant la documentation de la version AS3 de VEGAS mon framework opensource :
- La classe andromeda.ioc.factory.ECMAObjectFactory
- La classe asgard.net.remoting.RemotingService
- La classe asgard.text.FontLoader
Bon pour le moment j'ai pas encore eu le temps de totalement personnaliser la charte graphique de la documentation de VEGAS. Mais la possibilité d'afficher du code avec la colorisation syntaxique qu'il faut, c'est tout de même une bonne chose 
Pour utiliser Google Prettify dans votre Javadoc il faut donc changer très légèrement vos habitudes. Il faut à présent remplacer les balises <code> et <listing> de ASDoc avec respectivement les balises <code class="prettyprint"> et <pre class="prettyprint">, exemple :
package vegas.core { import system.ISerializable; import system.Reflection; import vegas.logging.ILogable; import vegas.logging.ILogger; import vegas.logging.Log; /** * CoreObject offers a default implementation of the IFormattable, IHashable and ISerializable interfaces. * <p> * <pre class="prettyprint"> * import vegas.core.CoreObject ; * * var core:CoreObject = new CoreObject() ; * trace("> core : " + core) ; * trace("> hashcode : " + core.hashCode()) ; * trace("> toSource : " + core.toSource()) ; * </pre> * </p> * @author eKameleon * @version 1.0.0.0 */ public class CoreObject extends Object implements IFormattable, IHashable, ILogable, ISerializable { /** * Creates a new <code class="prettyprint">CoreObject</code> instance. */ function CoreObject() { _logger = Log.getLogger( Reflection.getClassPath(this) ) ; } // etc... } }
Voici le résultat du code précédent : vegas.core.CoreObject
A noter pour ceux que cela intéresse que j'ai placé dans le SVN AS3 de VEGAS ma tache ANT qui me permet de générer ma documentation via ASDoc : http://svn1.cvsdude.com/osflash/vegas/AS3/trunk/build/asdoc/
Pour finir... faut bien entendu avant de vous quitter que je vous parle des petits points noirs de ASDoc... ASDoc est vraiment très pratique pour créer de la documentation mais franchement je trouve que le choix de Adobe pour un template super compliqué rempli de tas de fichiers XSL n'est pas forcément des plus judicieux. Je trouve franchement très lourde la gestion des éléments du template par des fichiers XSL vraiment "trop fourni" !
Ensuite... ASDoc n'est vraiment pas stable... Il faut faire énormément attention en créant la documentation car de nombreux problèmes apparaissent lors de la compilation de la documentation. Par exemple :
- Problème avec les @ dans la documentation.. exemple écrire un mail test@test.com dans un script entraîne des instabilités et des oublis dans la documentation.
- Coller dans une boucle for le symbole < ... exemple for( var i:uint = 0 ; i<n. Ici la documentation va arrêter le parsing après le <. Il faut absolument aérer le code et ne pas coller le caractère <.
- L'Utilisation de certains caractères UTF8 pour valeur des propriétés des classes (voir par exemple mon hack de la classe vegas.string.UnicodeChar avec ce code source pas très propre pour le coup ! J'ai du rentrer les valeurs de mes constantes dans des Array pour éviter les bugs de ASDoc :()
- Pour écrire dans un script <?php .. il faut utiliser la notation html &...
- Problème avec l'utilisation du caractère * dans les exemples et les bouts de code : ... style trace( "vegas.errors.*" ) ; ..
Il va falloir que j'aille faire un tour du côté de la bug liste de Flex pour voir si on peut leur faire remonter les erreurs (qu'ils doivent sûrement déjà connaître...)
Sinon malgré ces petits problèmes, le rendu HTML de ASDoc reste vraiment propre... et je préfère pour le moment la documentation générée par ASDoc par rapport à celle de NaturalDocs (malgré le fait que je préfère la gestion de template de NaturalDocs)
Pour toutes vos questions sur cet article vous pouvez utiliser les commentaires de ce blog mais je vous propose d'aller discuter sur le Google Groups de mon blog.
Commentaires
Salut Eka,

Est-ce que tu as eu des soucis concernant les noms d'interfaces dans la documentation ? Par exemple, si tu prends la doc de masapi (www.astorm.ch/masapi/doc) et que tu check l'interface IList, tu vois que la classe BasicListElement l'implémente alors qu'elle implémente en fait l'interface IListElement...
Ceci dit, j'ai rapidos fait une petite application desktop très basique pour ASDoc : www.astorm.ch/blog/index....
@++
Hello
Je ferais attention en la relisant ce week end.




Pour le moment je n'ai pas noté de problème au niveau des interfaces.. mais je t'avoue que j'en ai beaucoup dans les différentes extensions de VEGAS et j'ai pu raté des bugs
D'ailleurs si vous consultez ma documentation et que vous notez des soucis, faut pas hésiter à me le faire savoir sur la issue list de VEGAS sur Google Code
Pour ce qui est de ton application desktop pour générer la doc avec ASDoc.. elle ne permet pas à ce que j'ai vu pour le moment de switcher le répertoire des templates etc.. donc manque des petites choses pour être vraiment utile
Je t'avoue que ma tache ANT est super simple et que sinon je préfère un bon .bat de base pour lancer mes lignes de commandes...
le truc qui aurait était bien c'est une application en AIR mais malheureusement cela se complique vite avec AIR car on peut pas contrôler nativement des applications externes pour le moment
EKA+
excellent ! je connaissais pas ce pti outil de google. merci ! et bon WE
Salut,

Yep je dois dire que j'ai pas vraiment approfondi mon truc pour l'application, c'est vraiment juste pour éviter la ligne de commande basique
Maintenant, je vois pas en quoi ça limite le système de template ? Tu peux toujours aller modifier le template dans les fichiers non ?
@++
L'idée c'est que si je crée un template différent pour plusieurs projets, je me vois mal modifier uniquement le template du SDK de Flex directement.


Idem si je change de machine et que je dois installer le SDK à chaque fois, je me vois mal à chaque fois copier/coller mon template qui en général se trouve sur le SVN du projet que j'utilise
Sinon à mon sens, le ASDoc.jar propose plusieurs commandes intéressantes selon les besoins et il est dommage dans une utilisation avancée de ne pas pouvoir les utiliser. A mon sens, une tache ANT ou autre .bat c'est tout de même pas la mort finalement à écrire.
Il est évidant qu'une petite application comme la tienne peut avoir du bon pour faire un rendu rapide mais je pense sérieusement qu'il lui manque au moins un champ de saisie (multiligne ou non) pour ajouter les commandes que l'on souhaite (okou ;))
EKA+
Ah tiens ça peut être une bonne idée ça ! Je vais le faire asap ^^
good article!
Décidement ekameleon t'es partout en ce moment ?!

Bon, c'est vrai qu'j'sui un peu chez toi là . Mais en ce moment je découvre Vegas et j'y passe du temps...
MERCI pour tout !
Sinon, je vais de ce pas, koikaci, regarder l'ASDoc, j'vais en avoir b'zoin !
Salut Eka, bravo et merci pour l'info.
Alors, j'ai fais tout ce que tu as expliqué, après génération de ma Doc, j'ai bien le preetify.js et son css a la racine de ma Doc.
Par contre, mes blocs de codes ne se colorisent pas! j'ai édité le html, le prettify est bien changer dans le header, mais j'ai remarqué que le ASDocGen m'a viré mes balises class="prettyprint".
en effet, dans mon AS, j'ai ceci:
* <p> Exemple:
* <code class="prettyprint">
* instance.fillcolorArray = [0x425897, 0xff0099,..]
* </code>
* </p>
Et dans mon HTML de doc, je me retrouve avec ceci:
<p> Exemple:
<code class="prettyprint">
instance.fillcolorArray = [0x425897, 0xff0099,..]
</code>
</p>
Une idée du pourquoi??
Si je rajoute le class =..etc" là , ca marche, mon html se colorise bien!
Mais pourquoi le ASGEN me vire ces définition de classe???
Sinon, merci pour toutes tes infos
Errata!
Dans mon code de message précédent, il y a la balise
<code class="prettyprint">
En fait, je l'ai ajoutée manuellement dans mon HTML
Apres Génération, en réalité, j'ai ceci:
<p> Exemple:
<code>
instance.fillcolorArray = [0x425897, 0xff0099,..]
</code>
</p>
Hello
Tu utilises quelle version du Flex SDK (pour voir si tu utilises un ASDoc différent du mien ?)
Tu peux envoyer un exemple de classe et de doc que tu obtiens ?
En cas de gros soucis, je te conseille de poser une question sur le Google Groups de mon blog
http://groups.google.com/group/ekam...
EKA +
Pour le moment, là 4.0 avec FD3.0
je m'apprete a revérifier toutes tes étapes une à une, car le générateur me vire le class="prettyprint" les " sont obligatoire dans l'AS? je vais essayé sans, on ne sait jamais..
Sinon, j'ai trouvé ceci:
http://blog.lunar-dev.net/2008/06/2...
J'ai modifié toutes mes balises dans ce fichier, et j'ai bien toute la doc colorisée! sauf bien sur ce que je défini manuellement dans les commentaires de l'AS.
je t'envois où les exemples? je les poste ici? ou apr mail?
Voici ma classe:
http://www.covergraph.com/alama/pie...
et le résult Doc:
http://www.covergraph.com/alama/pie...
Il reste des fautes d'ortho dans ma classe, n'y fais pas attention
Pour ma part j'utilise pas ASDocGen mais juste ASDoc avec une tache ANT et aucun soucis...
Regarde les fichiers build.properties et build.xml :
http://code.google.com/p/vegas/sour...
C'est super simple et sans soucis niveau de l'utilisation ensuite.
EKA +
Merci Eka, mais c'est bien asdoc.exe que j'utilise.. celui du /bin/ du flex sdk 4.0
je me suis trompé de nom dans le post précedent :D
sinon, pour mieux comprendre le souci, j'ai posté en détail ici:
http://blog.lunar-dev.net/2008/06/2...
Là , dans l'immédiat, je cherche à intégré automatiquement un lien Example dans le header de ma doc, à coté de methods, properties, etc.
ça devrait pointer vers le bas de page, même si vide! apres, je compte éditer mes html généré pour inclure des images, et swf demo.
Ensuite, j'aimerais arriver à ajouter un lien vers les propriété héritées comme le fait la doc AS3 adobe...
Et quand je maîtriserai asdoc, j'aimerais me lancer dans la réa d'un GUI pour faciliter tout ça pour tout le monde..
Merci bcp pour ton blog et tout ce que tu fais pour les geek :P
Ha oui, j'avais déjà vu tes 2 fichiers, je vais un peu essayer.. mais celà ne me dit pas comment inserer mes exemples.
Sinon, je vois que dans ta Doc VEGAS, l'index.html contient le body onload pretty.. mon index généré ne contient pas cette ligne! tu l'as inserée toit même? ou autogénérée?
ceci dit, ca ne changera rien, car mes html doc de classe importe bien le pretty.. donc, je ne pense pas que le pb vienne de là ..
je me demande tjrs pk mon asdoc me vire mes balises :S
j'ai chargé la gestion des balises listing aussi, je voulais tenter de leur ajouter la class prettyprint, mais je n'ai rien trouvé de convainquant dans les fichiers xslt du template..
bha, j'finirai bien par trouver une soluce.. au pire, je me bricole un script regex qui cherche à postériori mes balises code, etc.. dans les htm générésl et qui remplace.. mais bon, j'aimerais faire + propre et direct dans le template..
Tout est dans le tuto au dessus
rien de plus et rien de moins 
Sinon utilisation de ANT est primordial pour aller + loin
EKA +
Hey Eka, juste pour te dire que j'avance..
là , j'essaye d'analiser le template asdoc pour modifier nativement le truc afin qu'il prenne en compte pretty d'office sur les balises natives, sans passer par d'autres balises persos dnas l'AS j'essaye de l'intégrer aux @example, @includeExamples, etc.. aux "listing" et "code" et "pre" définies manuellement dans les AS.
je suis déjà allergique au XML, car même si de principe simple.. parfois :S mais alors, les XSLT, c'pas mieux.. :S
je ne sais même pas ce qu'est une tâche ANT, j'pensais que c'etait une tâche serveur..
pour l'histoire, ca fait +/- 9 ans que je fais du flash, mais je suis tjrs resté comme un brave dans l'IDE adobe.. ce n'est que depuis peu que je me suis lancé à l'assaut de AS3 et du coup, de FlexBuilder, FD3.0, eclipse, les nouveaux trucs MySQL (view, function, triger, etc..) la POO en php5.2 etc..
bcp de chose à apprendre, car j'ai un train de retard là ..
je suis fort actif avec AMFPHP aussi, la bet 1.9 et les services qui n'en sont plus, car aujourd'hui, je fais des classes PHP sans méthode table, etc.. enfin, plein de truc ont évoluer en programmation internet..
J'aimerais apprendre a utiliser tortoise SVN aussi, celà me semble indispensable pour gerer mes versions et bosser a plusieurs.
voilà quoi.. :P
Ha ben, pour le souci de colorisation, apparament, c'etait un souci de version de prettufy.js.
Apres avoir édité le .js et viré les conditions:
if (cs.className && cs.className.indexOf('prettyprint') >= 0)
et
p.className && p.className.indexOf('prettyprint') >= 0)
Tout fonctionne et toute ma doc se colorise bien! :D
Merci à Jiro d'avoir trouvé ces deux lignes!!
Jiro est un pote qui jongle avec CSS .
Faudrait que tu précises la version qui ne marche pas et si il faut que tu sois peut être plus clair sur ton patch... car pour ma part comme je te l'ai dit j'ai pas ce problème
PS : quand je t'ai proposé d'utiliser mon google groups pour discuter de tout cela c'est pour éviter de transformer les commentaires de mon blog en forum
EKA +
Ben on a dû enlever les 2 conditions ci dessus pour que ca passe... on a essayé au hasard..
Mais ceci dit, plus fort! le prettify.js possède déjà les filtres adéquats pour coloriser ceci ou celà ..
voici les filtres actuels:
document.getElementsByTagName('pre'),
document.getElementsByTagName('code'),
document.getElementsByTagName('xmp') ];
Du coup, sans rien modifier, ni ta méthode, ni celle de Lunar, mais simplement en éditant le asdoc.js et en fesant passer tout le parser par la fonction prettyprint, ben tout se colorise nickel.. juste le les "code" et "pre"
Grâce à celà , a permit de coloriser la doc locale d'origine adobe AS3 de flash. :D
Merci à Jiro pour son aide et ses recherches!
c'est une bonne info, non? :P
ha ok, désolé de squatter ton blog... je vais aller sur le forum
Merci beaucoup pour cette info
En effet cela ouvre de nouvelles perspectives intéressantes qui complètent mon tuto parfaitement 
EKA +
Coucou, dernier post sur ton blog promis!
mais c'est pour la bonne cause..
A partir d'un template tout d'origine!!!
voici les deux fichiers à changer dans le template:
www.covergraph.com/alama/asdoc_with_prettify/asdoc_mod_pretty.rar
on peut meme les placer dans l'aide de flash :D
on a édité le pretty.js, on a viré la notion de class pretty etc.. adieu ce truc! les balise coloriées sont code et pre. et de ce fait, les 'listing' de asdoc..
Voili voilou.. :D
Sympa mais attention ... car pas mintenable ton code
Google Prettify est un projet opensource et c'est toujours préférable de l'utiliser sous sa forme stable.
Pour ce qui est des patch ou autre à inclure comme tu le fais dans un fichier maison pour ma part je trouve que cela dénature la philosophie du projet originel..
Vu que Google Prettify est opensource tu devrais proposer un patch plutôt un patch propre et pas un bidouillage
EKA+
Ben, pour le faire aller sur une aide compilée comme celle d'adobe, t'as pas trop le choix.. bon, si l'include dans l'asdoc, mais pour le CSS, pas le choix..
bha, c'est une soluce simple koi.. surtout que le fichier et bien divisé en 2 parties distinctes..
Sinon, pour patcher Pretty proprement, c'est un peu compliqué pour moi, avoir supprimé les class pretty était plus facile dans mon cas.
ou alors, une version propre serait de les laisser, mais qu'on puisse les bypasser par appel d'une fonction.. si tu fais un truc propre, je suis preneur :D