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

Kit : Améliorations de la gestion du code

Date de publication : 16/11/2006 , Date de mise à jour : 28/01/2006



1. En résumé
2. Nouvelles fonctionnalités
2.1. Numérotation des lignes de code
2.2. Liaison avec un fichier
2.3. Code dissimulable
2.4. Overflow
2.5. Meilleure coloration
2.5.1. Avantages
2.5.2. Inconvénients
3. Nouveau système de coloration
3.1. L'API de coloration
3.2. Créez vos propres modes
3.3. Personnalisez la coloration


1. En résumé

Je vais vous présenter quelques modifications que j'ai apportées au Kit actuel (version 5.9) pour améliorer la gestion des codes.

Pour commencer, on va faire le tour de quelques petites fonctionnalités du style : numérotation des lignes de code, liens avec un fichier ou encore les codes enroulables.

Dans la seconde partie, je vais détailler les modifications faites au système de coloration syntaxique. Différences, avantages et inconvénients par rapport à l'ancien système. Je vais aussi vous montrer comment créer un système de coloration si votre langage favori ne se trouve pas dans la centaine proposée. Par la même occasion, vous verrez comment modifier/étendre un langage, s'il ne vous convient pas dans l'état actuel.

Dans les deux parties suivantes, vous pourrez voir quelques exemples de coloration syntaxique. La première contient les langages déjà présents avec l'ancien système de coloration (ainsi, vous pourrez me dire ce qu'il y a à modifier, puisqu'il y a des différences), et la seconde quelques nouveaux.

Pour finir, vous trouverez en fin d'article les liens vers les sources (l'API Java utilisée) et vers une version du kit utilisant les binaires.


2. Nouvelles fonctionnalités


2.1. Numérotation des lignes de code

Si on met en place ce nouveau système de gestion du code, vous pourrez numéroter les codes que vous proposez en exemple dans vos cours, tutoriels ou FAQs. Cela peut faciliter les explications ultérieures que vous ferrez sur ces mêmes codes. Voici un exemple :
  1. /** 
  2.   * HelloWorld.java 
  3.   */ 
  4. package hello; 
  5. public class HelloWorld { 
  6. 	public static void main(String[] args) { 
  7. 		System.out.println("Hello world !!!"); 
  8. 	} 
  9. } 
Regardez, tout se joue en ligne 7. ;)

Vous pouvez aussi spécifier la "ligne de départ" pour des extraits de fichiers. Par exemple :
  1. public static void main(String[] args) { 
  2. 	System.out.println("Hello world !!!"); 
  3. } 
Voici le code qui a permis de générer les extraits ci-dessus :
<code langage="java" showLines="1">...</code>
...
<code langage="java" showLines="1" startLine="5">...</code>

2.2. Liaison avec un fichier

Si vous utilisez la possibilité de numéroter vos codes, il peut être intéressant, nottament dans le cas d'extraits, de fournir le fichier complet à télécharger. Voici un exemple :
Télécharger
  1. /** 
  2.   * HelloWorld.java 
  3.   */ 
  4. package hello; 
  5. public class HelloWorld { 
  6. 	public static void main(String[] args) { 
  7. 		System.out.println("Hello world !!!"); 
  8. 	} 
  9. } 
Et voici le code pour le kit :
Télécharger
<code langage="java" showLines="1" fichier="./fichiers/HelloWorld.java.txt">...</code>
Voyons maintenant comment vous pouvez "dissimuler" votre code, si celui-ci est trop long/volumineux/laid ;)


2.3. Code dissimulable

Si certains de vos exemples sont trop "longs", il peut être pas mal de pouvoir les cacher, au moins temporairement, pour pouvoir continuer à lire tranquillement les explications qui tournent autour. Voici un exemple (clickouillez sur les flèches) :
Apache conf
#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# Do not add a slash at the end of the directory path.  If you point
# ServerRoot at a non-local disk, be sure to point the LockFile directive
# at a local disk.  If you wish to share the same ServerRoot for multiple
# httpd daemons, you will need to change at least LockFile and PidFile.
#
ServerRoot "/opt/lampp"

#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to 
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 80

#
# Dynamic Shared Object (DSO) Support
#
# To be able to use the functionality of a module which was built as a DSO you
# have to place corresponding `LoadModule' lines at this location so the
# directives contained in it are actually available _before_ they are used.
# Statically compiled modules (those listed by `httpd -l') do not need
# to be loaded here.
#
# Example:
# LoadModule foo_module modules/mod_foo.so
Le code à utiliser pour l'effet est :
<code langage="apacheconf" titre="Apache conf" dissimulable="0">
warning Ceci dit, pour ces effets, il faudra bien veiller à ce qu'ils ne soient pas bloquants pour certains visiteurs, qu'ils ne vont pas casser la validité XHTML du truc et que la fonctionnalité qu'ils proposent est accessible même sans JS. Il faudra aussi penser que ces effets ne seront pas transposables à d'autres formats (au hasard le PDF;).
info Si dissimulable vaut 1 le code est dissimulable et dissimulé, si par contre dissimulable vaut 0 le code est dissimulable et visible par défaut.
Apache conf
Télécharger
  1. # 
  2. # ServerRoot: The top of the directory tree under which the server's 
  3. # configuration, error, and log files are kept. 
  4. # 
  5. # Do not add a slash at the end of the directory path.  If you point 
  6. # ServerRoot at a non-local disk, be sure to point the LockFile directive 
  7. # at a local disk.  If you wish to share the same ServerRoot for multiple 
  8. # httpd daemons, you will need to change at least LockFile and PidFile. 
  9. # 
  10. ServerRoot "/opt/lampp" 
  11.  
  12. # 
  13. # Listen: Allows you to bind Apache to specific IP addresses and/or 
  14. # ports, instead of the default. See also the <VirtualHost> 
  15. # directive. 
  16. # 
  17. # Change this to Listen on specific IP addresses as shown below to  
  18. # prevent Apache from glomming onto all bound IP addresses. 
  19. # 
  20. #Listen 12.34.56.78:80 
  21. Listen 80 
  22.  
  23. # 
  24. # Dynamic Shared Object (DSO) Support 
  25. # 
  26. # To be able to use the functionality of a module which was built as a DSO you 
  27. # have to place corresponding `LoadModule' lines at this location so the 
  28. # directives contained in it are actually available _before_ they are used. 
  29. # Statically compiled modules (those listed by `httpd -l') do not need 
  30. # to be loaded here. 
  31. # 
  32. # Example: 
  33. # LoadModule foo_module modules/mod_foo.so 

2.4. Overflow

En voila une nouveauté qu'elle est bien pour la conduire. En plus ca ne m'a pas pris plus d'une ligne de code et grâce à elle vous allez pouvoir poser de gros paquets de code qui ne vont pas casser la mise en page de votre article. Par exemple :
Code beaucoup trop long
<paragraph>Ceci dit, pour ces effets, il faudra bien veiller à ce qu'ils ne soient pas bloquants pour certains visiteurs, qu'ils ne vont pas casser la validité XHTML du truc et que la fonctionnalité qu'ils proposent est accessible même sans JS. Il faudra aussi penser que ces effets ne seront pas transposables à d'autres formats (au hasard le PDF;).</paragraph>
<paragraph>Ceci dit, pour ces effets, il faudra bien veiller à ce qu'ils ne soient pas bloquants pour certains visiteurs, qu'ils ne vont pas casser la validité XHTML du truc et que la fonctionnalité qu'ils proposent est accessible même sans JS. Il faudra aussi penser que ces effets ne seront pas transposables à d'autres formats (au hasard le PDF;).</paragraph>
warning Cette possibilité est seulement là pour veiller à ce que la mise en page n'est pas cassée par vos codes trop longs, même si le visiteur est en 800x600, c'est tout. Ce n'est pas une raison pour écrire des gros pâtés illisibles et qui de toutes facons ne passeront pas en PDF ;)
info Errata : 'En plus ca ne m'a pas pris plus d'une ligne de code'
Précisons que ca ne m'a pas pris plus d'une ligne de code pour que ca fonctionne avec Firefox, la suite Mozilla, Seamonkey, Opera, etc. J'avais oublié de tester avec IE. Du coup c'est à completer... Merci IE ... (¬_¬)
Passons maintenant aux améliorations apportées à la coloration syntaxique.


2.5. Meilleure coloration


2.5.1. Avantages

Dans cette partie, je vais juste vous détailler pourquoi c'est une alternative intéressante par rapport au système actuel. Je détaillerais son fonctionnement, le format XML utilisé pour décrire les langages, etc. un peu plus loin.

Pour faire bref, l'ancien système devenait (à mon avis) trop complexe à maintenir et à faire évoluer. Ce nouveau système va permettre d'avoir :

  • Une base d'un peu plus d'une centaine de langages (voir ci dessous). Même s'il est peu probable qu'on ai à tous les utiliser, au moins, on sait qu'ils sont disponibles. Et puis, si on retrouve quelqu'un qui fait du cobol, il sera surement ravi de savoir que le kit gère la colloration syntaxique de la chose ;)
  • Un traitement plus fin au niveau de chaque langage : une quizaine de marqueurs disponibles (label, litteral, keyword, etc.).
  • Une facilité d'évolution : la définition des langages se faisant de manière modulaire, il est facile de faire de l'assemblage. Par exemple à partir de la définition de Ruby et de HTML, ca prends quelques lignes (facilement lisibles) pour définir le RHTML. Je vous montrerais tout à l'heure comment avec du VB et quelques balises ont crée du VB.NET :p
  • Une meilleure mise en page des "codes imbriqués". Par codes imbriqués, j'entends par exemple tout ce qui est développement web, ou il n'est pas rare de voir du HTML, cotoyer le langage de script serveur avec éventuellment une pointe de CSS/JS/etc. Voici un exemple, pour vous donner une idée :
JSP, Scriptlet Java, CSS et JS (pour avoir un mélange bien horrible : à ne surtout pas essayer à la maison)
  1. <%@page contentType="text/html"%> 
  2. <%@page pageEncoding="UTF-8"%> 
  3. <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>  
  4. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
  5.    "http://www.w3.org/TR/html4/loose.dtd"> 
  6. <html> 
  7.     <head> 
  8.         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
  9.         <title>Hello</title> 
  10.         <style type="text/css"> 
  11.             body{ 
  12.                 font-family: Verdana, sans-serif; 
  13.                 font-size: 14px; 
  14.                 font-style: italic; 
  15.             } 
  16.             h1.hello{ 
  17.                 color: #0000ff; 
  18.             } 
  19.         </style> 
  20.         <script type="text/javascript"> 
  21.             function sayHello(name){ 
  22.                 alert('Hello '+name+''); 
  23.             } 
  24.         </script> 
  25.     </head> 
  26.     <body>ééé 
  27.     <% 
  28.         boolean needToSayHello = Boolean.valueOf(request.getParameter("sayHello")); boolean needToSayHello = Boolean.valueOf(request.getParameter("sayHello")); 
  29.         request.setAttribute("needToSayHello", needToSayHello); 
  30.     %> 
  31.     <%-- bla --%> 
  32.     <c:if test="${needToSayHello}"> 
  33.         <h1 class="hello"> 
  34.             <a href="#" onclick="return sayHello('${param.name}');"> 
  35.                 Say hello! 
  36.             </a> 
  37.         </h1> 
  38.     </c:if> 
  39.     </body> 
  40. </html> 
Voici les quelques langages gérés actuellement par cette API :
Fichiers de définition des modes (un mode pouvant regrouper plusieurs langages)
ioan@ubuntu:~/java/projets/dvp/kit/coloration$ ls *.xml
actionscript.xml      icon.xml              psp.xml
ada95.xml             idl.xml               ptl.xml
antlr.xml             inform.xml            pvwave.xml
apacheconf.xml        ini.xml               pyrex.xml
apdl.xml              inno-setup.xml        python.xml
applescript.xml       interlis.xml          rd.xml
aspect-j.xml          io.xml                rebol.xml
aspnet.xml            javacc.xml            redcode.xml
asp.xml               javascript.xml        relax-ng-compact.xml
assembly-m68k.xml     java.xml              rest.xml
assembly-macro32.xml  jcl.xml               rhtml.xml
assembly-mcs51.xml    jhtml.xml             rib.xml
assembly-parrot.xml   jmk.xml               rpmspec.xml
assembly-r2000.xml    jsp.xml               rtf.xml
assembly-x86.xml      latex.xml             ruby.xml
awk.xml               lilypond.xml          rview.xml
batch.xml             lisp.xml              sas.xml
bbj.xml               literate-haskell.xml  scheme.xml
bcel.xml              lotos.xml             sdl_pr.xml
bibtex.xml            lua.xml               sgml.xml
b.xml                 mail.xml              shellscript.xml
chill.xml             makefile.xml          shtml.xml
cil.xml               maple.xml             slate.xml
cobol.xml             ml.xml                smalltalk.xml
coldfusion.xml        modula3.xml           smi-mib.xml
cplusplus.xml         moin.xml              splus.xml
csharp.xml            mqsc.xml              sqr.xml
css.xml               myghty.xml            squidconf.xml
cvs-commit.xml        netrexx.xml           ssharp.xml
c.xml                 nqc.xml               svn-commit.xml
doxygen.xml           nsis2.xml             swig.xml
dsssl.xml             objective-c.xml       tcl.xml
d.xml                 objectrexx.xml        texinfo.xml
eiffel.xml            occam.xml             text.xml
embperl.xml           omnimark.xml          tex.xml
erlang.xml            pascal.xml            tpl.xml
factor.xml            patch.xml             tsql.xml
forth.xml             perl.xml              twiki.xml
fortran.xml           php.xml               typoscript.xml
foxpro.xml            pike.xml              uscript.xml
freemarker.xml        pl1.xml               vbscript.xml
gettext.xml           pl-sql.xml            velocity.xml
gnuplot.xml           pop11.xml             verilog.xml
groovy.xml            postscript.xml        vhdl.xml
haskell.xml           povray.xml            xml.xml
hex.xml               powerdynamo.xml       xq.xml
htaccess.xml          progress.xml          xsl.xml
html.xml              prolog.xml            zpt.xml
i4gl.xml              props.xml
ioan@ubuntu:~/java/projets/dvp/kit/coloration$
En plus des langages correspondant aux fichiers xml ci dessus, quelques alias sont disponibles (histoire de garder la compatibilité avec le kit actuel et/ou proposer une alterntive pour les langages non encore définis) :
pascal=delphi, delphinet
actionscript=as
vbscript=asp, vb, vbnet
cplusplus=bcb, cpp
javascript=js
shellscript=linux
pl-sql=oracle,sql, postgresql
text=other, perso

2.5.2. Inconvénients

Il y aura quand même du travail pour tout intégrer. Certains langages sont de base mieux définis que dans l'ancien système, pour d'autres, c'est malheureusement le contraire. Donc, il va y avoir un peu de travail à faire la dessus pour que tout le monde puisse s'y retrouver :)

Théoriquement, comme l'ensemble est modulaire et qu'une très grosse partie est faite, ca devrait aller assez vite. J'aurais par contre besoin de votre aide, si naturellement ca vous tente, afin que vous testiez la coloration sur vos nouveaux/anciens articles/FAQs/etc.

Voyons maintenant comment "ca marche" :)


3. Nouveau système de coloration


3.1. L'API de coloration

Cette API joue exactement le même rôle que les fichiers de coloration perl utilisés précedemment : ils vont mettre en page les balises <code> avant que la "moulinette" XSLT prenne le relais pour créer les pagesHTML, XSL-FO, etc. Les prérequis sont Java 5.0 (dispo dans le PATH), dvp-coloration.jar et commons-lang.jar (dispos dans le CLASSPATH) et les fichiers de définition des langages.

Son mode d'emploi se limite à ca :
java -jar /chemin/vers/dvp-coloration.jar /chemin/vers/documents/original.xml /chemin/vers/resultat.xml /chemin/vers/definitions
Par exemple, pour les articles (sachant que j'ai placé les définitions des langages dans coloration, les jars dans lib et que je suis au niveau du répertoire script) :
java -jar ./lib/dvp-coloration.jar ../documents/$1/$1.xml ../ArtTmp.xml ./coloration
Pour ceux que ca intéresse, les sources sont dispo en bas de l'article.

Passons maintenant à la définition des langages ou modes.


3.2. Créez vos propres modes

Voici à quoi ressemble un fichier de définition de langage :
Pascal
  1. <?xml version="1.0"?> 
  2.  
  3. <!DOCTYPE MODE SYSTEM "xmode.dtd"> 
  4.  
  5. <!-- Pascal mode by Kristian Ovaska. 
  6.      Delphi 3 was used as reference. 
  7.      Modified by Barry Carr (Ixian Software Components Ltd) 
  8.      Delphi 6 was used as reference. 
  9.      Modified by Barry Carr (Ixian Software Components Ltd) Feb '04 
  10.      Delphi 8 (for .NET) was used as reference 
  11.      Keywords   = KEYWORD1 
  12.      Directives = KEYWORD2. 
  13.      Everything else as is--> 
  14. <MODE> 
  15.     <PROPS> 
  16.         <PROPERTY NAME="commentStart" VALUE="{" /> 
  17.         <PROPERTY NAME="commentEnd" VALUE="}" /> 
  18.         <PROPERTY NAME="lineComment" VALUE="//" /> 
  19.     </PROPS> 
  20.  
  21.     <RULES IGNORE_CASE="TRUE" HIGHLIGHT_DIGITS="TRUE"> 
  22.         <!-- Compiler directives. --> 
  23.         <SPAN TYPE="COMMENT3"> 
  24.             <BEGIN>{$</BEGIN> 
  25.             <END>}</END> 
  26.         </SPAN> 
  27.         <SPAN TYPE="COMMENT3"> 
  28.             <BEGIN>(*$</BEGIN> 
  29.             <END>*)</END> 
  30.         </SPAN> 
  31.  
  32.         <!-- Normal comments. --> 
  33.         <SPAN TYPE="COMMENT1"> 
  34.             <BEGIN>{</BEGIN> 
  35.             <END>}</END> 
  36.         </SPAN> 
  37.  
  38.         <SPAN TYPE="COMMENT1"> 
  39.             <BEGIN>(*</BEGIN> 
  40.             <END>*)</END> 
  41.         </SPAN> 
  42.  
  43.         <EOL_SPAN TYPE="COMMENT2">//</EOL_SPAN> 
  44.  
  45.         <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE"> 
  46.             <BEGIN>'</BEGIN> 
  47.             <END>'</END> 
  48.         </SPAN> 
  49.  
  50.         <SEQ TYPE="OPERATOR">)</SEQ> 
  51.         <SEQ TYPE="OPERATOR">(</SEQ> 
  52.         <SEQ TYPE="OPERATOR">]</SEQ> 
  53.         <SEQ TYPE="OPERATOR">[</SEQ> 
  54.         <SEQ TYPE="OPERATOR">.</SEQ> 
  55.         <SEQ TYPE="OPERATOR">,</SEQ> 
  56.         <SEQ TYPE="OPERATOR">;</SEQ> 
  57.         <SEQ TYPE="OPERATOR">^</SEQ> 
  58.         <SEQ TYPE="OPERATOR">@</SEQ> 
  59.         <SEQ TYPE="OPERATOR">:=</SEQ> 
  60.         <SEQ TYPE="OPERATOR">:</SEQ> 
  61.         <SEQ TYPE="OPERATOR">=</SEQ> 
  62.         <SEQ TYPE="OPERATOR">&lt;&gt;</SEQ> 
  63.         <SEQ TYPE="OPERATOR">&gt;</SEQ> 
  64.         <SEQ TYPE="OPERATOR">&lt;</SEQ> 
  65.         <SEQ TYPE="OPERATOR">&gt;=</SEQ> 
  66.         <SEQ TYPE="OPERATOR">&lt;=</SEQ> 
  67.         <SEQ TYPE="OPERATOR">+</SEQ> 
  68.         <SEQ TYPE="OPERATOR">-</SEQ> 
  69.         <SEQ TYPE="OPERATOR">/</SEQ> 
  70.         <SEQ TYPE="OPERATOR">*</SEQ> 
  71.  
  72.         <KEYWORDS> 
  73.             <!-- Reserved words. Standard directives are not included, except 
  74.                  private, protected, public, published, and automated. --> 
  75.             <KEYWORD1>and</KEYWORD1> 
  76.             <KEYWORD1>array</KEYWORD1> 
  77.             <KEYWORD1>as</KEYWORD1> 
  78.             <KEYWORD1>at</KEYWORD1> 
  79.             <KEYWORD1>asm</KEYWORD1> 
  80.             <KEYWORD1>begin</KEYWORD1> 
  81.             <KEYWORD1>case</KEYWORD1> 
  82.             <KEYWORD1>class</KEYWORD1> 
  83.             <KEYWORD1>const</KEYWORD1> 
  84.             <KEYWORD1>constructor</KEYWORD1> 
  85.             <KEYWORD1>destructor</KEYWORD1> 
  86.             <KEYWORD1>dispinterface</KEYWORD1> 
  87.             <KEYWORD1>div</KEYWORD1> 
  88.             <KEYWORD1>do</KEYWORD1> 
  89.             <KEYWORD1>downto</KEYWORD1> 
  90.             <KEYWORD1>else</KEYWORD1> 
  91.             <KEYWORD1>end</KEYWORD1> 
  92.             <KEYWORD1>except</KEYWORD1> 
  93.             <KEYWORD1>exports</KEYWORD1> 
  94.             <KEYWORD1>file</KEYWORD1> 
  95.             <KEYWORD1>final</KEYWORD1> 
  96.             <KEYWORD1>finalization</KEYWORD1> 
  97.             <KEYWORD1>finally</KEYWORD1> 
  98.             <KEYWORD1>for</KEYWORD1> 
  99.             <KEYWORD1>function</KEYWORD1> 
  100.             <KEYWORD1>goto</KEYWORD1> 
  101.             <KEYWORD1>if</KEYWORD1> 
  102.             <KEYWORD1>implementation</KEYWORD1> 
  103.             <KEYWORD1>in</KEYWORD1> 
  104.             <KEYWORD1>inherited</KEYWORD1> 
  105.             <KEYWORD1>initialization</KEYWORD1> 
  106.             <KEYWORD1>inline</KEYWORD1> 
  107.             <KEYWORD1>interface</KEYWORD1> 
  108.             <KEYWORD1>is</KEYWORD1> 
  109.             <KEYWORD1>label</KEYWORD1> 
  110.             <KEYWORD1>mod</KEYWORD1> 
  111.             <KEYWORD1>not</KEYWORD1> 
  112.             <KEYWORD1>object</KEYWORD1> 
  113.             <KEYWORD1>of</KEYWORD1> 
  114.             <KEYWORD1>on</KEYWORD1> 
  115.             <KEYWORD1>or</KEYWORD1> 
  116.             <KEYWORD1>out</KEYWORD1> 
  117.             <KEYWORD1>packed</KEYWORD1> 
  118.             <KEYWORD1>procedure</KEYWORD1> 
  119.             <KEYWORD1>program</KEYWORD1> 
  120.             <KEYWORD1>property</KEYWORD1> 
  121.             <KEYWORD1>raise</KEYWORD1> 
  122.             <KEYWORD1>record</KEYWORD1> 
  123.             <KEYWORD1>repeat</KEYWORD1> 
  124.             <KEYWORD1>resourcestring</KEYWORD1> 
  125.             <KEYWORD1>set</KEYWORD1> 
  126.             <KEYWORD1>sealed</KEYWORD1> 
  127.             <KEYWORD1>shl</KEYWORD1> 
  128.             <KEYWORD1>shr</KEYWORD1> 
  129.             <KEYWORD1>static</KEYWORD1> 
  130.             <KEYWORD1>string</KEYWORD1> 
  131.             <KEYWORD1>then</KEYWORD1> 
  132.             <KEYWORD1>threadvar</KEYWORD1> 
  133.             <KEYWORD1>to</KEYWORD1> 
  134.             <KEYWORD1>try</KEYWORD1> 
  135.             <KEYWORD1>type</KEYWORD1> 
  136.             <KEYWORD1>unit</KEYWORD1> 
  137.             <KEYWORD1>unsafe</KEYWORD1> 
  138.             <KEYWORD1>until</KEYWORD1> 
  139.             <KEYWORD1>uses</KEYWORD1> 
  140.             <KEYWORD1>var</KEYWORD1> 
  141.             <KEYWORD1>while</KEYWORD1> 
  142.             <KEYWORD1>with</KEYWORD1> 
  143.             <KEYWORD1>xor</KEYWORD1> 
  144.  
  145.             <KEYWORD2>absolute</KEYWORD2> 
  146.             <KEYWORD2>abstract</KEYWORD2> 
  147.             <KEYWORD2>assembler</KEYWORD2> 
  148.             <KEYWORD2>automated</KEYWORD2> 
  149.             <KEYWORD2>cdecl</KEYWORD2> 
  150.             <KEYWORD2>contains</KEYWORD2> 
  151.             <KEYWORD2>default</KEYWORD2> 
  152.             <KEYWORD2>deprecated</KEYWORD2> 
  153.             <KEYWORD2>dispid</KEYWORD2> 
  154.             <KEYWORD2>dynamic</KEYWORD2> 
  155.             <KEYWORD2>export</KEYWORD2> 
  156.             <KEYWORD2>external</KEYWORD2> 
  157.             <KEYWORD2>far</KEYWORD2> 
  158.             <KEYWORD2>forward</KEYWORD2> 
  159.             <KEYWORD2>implements</KEYWORD2> 
  160.             <KEYWORD2>index</KEYWORD2> 
  161.             <KEYWORD2>library</KEYWORD2> 
  162.             <KEYWORD2>local</KEYWORD2> 
  163.             <KEYWORD2>message</KEYWORD2> 
  164.             <KEYWORD2>name</KEYWORD2> 
  165.             <KEYWORD2>namespaces</KEYWORD2> 
  166.             <KEYWORD2>near</KEYWORD2> 
  167.             <KEYWORD2>nodefault</KEYWORD2> 
  168.             <KEYWORD2>overload</KEYWORD2> 
  169.             <KEYWORD2>override</KEYWORD2> 
  170.             <KEYWORD2>package</KEYWORD2> 
  171.             <KEYWORD2>pascal</KEYWORD2> 
  172.             <KEYWORD2>platform</KEYWORD2> 
  173.             <KEYWORD2>private</KEYWORD2> 
  174.             <KEYWORD2>protected</KEYWORD2> 
  175.             <KEYWORD2>public</KEYWORD2> 
  176.             <KEYWORD2>published</KEYWORD2> 
  177.             <KEYWORD2>read</KEYWORD2> 
  178.             <KEYWORD2>readonly</KEYWORD2> 
  179.             <KEYWORD2>register</KEYWORD2> 
  180.             <KEYWORD2>reintroduce</KEYWORD2> 
  181.             <KEYWORD2>requires</KEYWORD2> 
  182.             <KEYWORD2>resident</KEYWORD2> 
  183.             <KEYWORD2>safecall</KEYWORD2> 
  184.             <KEYWORD2>stdcall</KEYWORD2> 
  185.             <KEYWORD2>stored</KEYWORD2> 
  186.             <KEYWORD2>varargs</KEYWORD2> 
  187.             <KEYWORD2>virtual</KEYWORD2> 
  188.             <KEYWORD2>write</KEYWORD2> 
  189.             <KEYWORD2>writeonly</KEYWORD2> 
  190.  
  191.             <!-- Ordinal types. --> 
  192.             <KEYWORD3>shortint</KEYWORD3> 
  193.             <KEYWORD3>byte</KEYWORD3> 
  194.             <KEYWORD3>char</KEYWORD3> 
  195.             <KEYWORD3>smallint</KEYWORD3> 
  196.             <KEYWORD3>integer</KEYWORD3> 
  197.             <KEYWORD3>word</KEYWORD3> 
  198.             <KEYWORD3>longint</KEYWORD3> 
  199.             <KEYWORD3>cardinal</KEYWORD3> 
  200.             <!-- Boolean types. --> 
  201.             <KEYWORD3>boolean</KEYWORD3> 
  202.             <KEYWORD3>bytebool</KEYWORD3> 
  203.             <KEYWORD3>wordbool</KEYWORD3> 
  204.             <KEYWORD3>longbool</KEYWORD3> 
  205.             <!-- Real types. --> 
  206.             <KEYWORD3>real</KEYWORD3> 
  207.             <KEYWORD3>single</KEYWORD3> 
  208.             <KEYWORD3>double</KEYWORD3> 
  209.             <KEYWORD3>extended</KEYWORD3> 
  210.             <KEYWORD3>comp</KEYWORD3> 
  211.             <KEYWORD3>currency</KEYWORD3> 
  212.             <!-- Untyped pointer. --> 
  213.             <KEYWORD3>pointer</KEYWORD3> 
  214.  
  215.             <LITERAL2>false</LITERAL2> 
  216.             <LITERAL2>nil</LITERAL2> 
  217.             <LITERAL2>self</LITERAL2> 
  218.             <LITERAL2>true</LITERAL2> 
  219.         </KEYWORDS> 
  220.     </RULES> 
  221. </MODE> 
Bruno, j'espère que tu es rassuré en voyant que Delphi (même .NET) n'a pas été oublié. Il est simplement défini dans le fichier pascal, l'utilisateur n'a pas à se soucier de ce nom, il pourra toujours utiliser <code langage="delphi"> ;)

Ceci dit, on pourra créer un fichier de définition spécial pour Delphi .NET, si celui actuellement disponible n'est pas suffisant :)

C'est justement ce que l'on va voir tout de suite en étendant la définition de VB pour mieux prendre en compte VB.NET. Voici le fichier original de définition de VB :
Langage VB (extrait)
<?xml version="1.0"?>

<!DOCTYPE MODE SYSTEM "xmode.dtd">

<MODE>
	<PROPS>
		<PROPERTY NAME="lineComment" VALUE="'" />
	</PROPS>

	<RULES IGNORE_CASE="TRUE" HIGHLIGHT_DIGITS="TRUE">
		<SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
			<BEGIN>"</BEGIN>
			<END>"</END>
		</SPAN>

		<!-- conditional compilation -->
		<EOL_SPAN TYPE="KEYWORD2">#if</EOL_SPAN>
		<EOL_SPAN TYPE="KEYWORD2">#else</EOL_SPAN>
		<EOL_SPAN TYPE="KEYWORD2">#end</EOL_SPAN>

		<EOL_SPAN TYPE="COMMENT1">'</EOL_SPAN>
		<EOL_SPAN TYPE="COMMENT1">rem </EOL_SPAN>

		<!-- Comparison operators -->
		<SEQ TYPE="OPERATOR">&lt;</SEQ>
		<SEQ TYPE="OPERATOR">&lt;=</SEQ>
		<SEQ TYPE="OPERATOR">&gt;=</SEQ>
		<SEQ TYPE="OPERATOR">&gt;</SEQ>
		<SEQ TYPE="OPERATOR">=</SEQ>
		<SEQ TYPE="OPERATOR">&lt;&gt;</SEQ>
		<SEQ TYPE="OPERATOR">.</SEQ>
		
		<!-- Instruction separator -->
		<MARK_PREVIOUS TYPE="LABEL" EXCLUDE_MATCH="TRUE"
			AT_LINE_START="TRUE">:</MARK_PREVIOUS>

		<KEYWORDS>
			<!-- Conditional Statements -->
			<KEYWORD1>if</KEYWORD1>
			<KEYWORD1>then</KEYWORD1>
			<KEYWORD1>else</KEYWORD1>
			<KEYWORD1>elseif</KEYWORD1>
			<KEYWORD1>select</KEYWORD1>
			<KEYWORD1>case</KEYWORD1>

			<!-- Operators -->
			<!-- Comparison operators -->
			<OPERATOR>is</OPERATOR>
			<!-- Arithmetic operators -->
			<OPERATOR>mod</OPERATOR>
			<!-- Logical operators -->
			<OPERATOR>and</OPERATOR>
			<OPERATOR>or</OPERATOR>
			<OPERATOR>not</OPERATOR>
			<OPERATOR>xor</OPERATOR>
			<OPERATOR>imp</OPERATOR>

			<!-- Datatypes Constants/Literals -->
			<KEYWORD3>false</KEYWORD3>
			<KEYWORD3>true</KEYWORD3>
			<KEYWORD3>empty</KEYWORD3>
			<KEYWORD3>nothing</KEYWORD3>
			<KEYWORD3>null</KEYWORD3>

			<!-- VBScript Constants -->
			<!-- Color constants -->
			<LITERAL2>vbblack</LITERAL2>
			<LITERAL2>vbred</LITERAL2>
			<LITERAL2>vbgreen</LITERAL2>
			<LITERAL2>vbyellow</LITERAL2>
			<LITERAL2>vbblue</LITERAL2>
			<LITERAL2>vbmagenta</LITERAL2>
			<LITERAL2>vbcyan</LITERAL2>
			<LITERAL2>vbwhite</LITERAL2>


			<!-- Date Format Constants -->
			<LITERAL2>vbGeneralDate</LITERAL2>
			<LITERAL2>vbLongDate</LITERAL2>
			<LITERAL2>vbShortDate</LITERAL2>
			<LITERAL2>vbLongTime</LITERAL2>
			<LITERAL2>vbShortTime</LITERAL2>

			<!-- Miscellaneous  -->
			<LITERAL2>vbObjectError</LITERAL2>
			<KEYWORD2>Err</KEYWORD2>

		</KEYWORDS>
	</RULES>
</MODE>
A priori des mots clefs comme Imports et Namespace sont spécifiques à VB.NET. Créons un fichier pour y définir ce langage (en gros vb.net = vb + qques mots clefs supplémentaires).
vbnet.xml
<?xml version="1.0"?>

<!DOCTYPE MODE SYSTEM "xmode.dtd">

<MODE>
	<!-- Aucune propriété particulière, on va juste définir un ensemble de règles -->
	
	<!-- Ensemble de règles principal-->
	<RULES IGNORE_CASE="TRUE">
		
		<!-- On importe les règles définies dans vbscript, puisqu'on va toutes les réutiliser -->
		<!-- (NB : on peut importer de manière plus fine, cf les DELEGATE) -->
		<IMPORT DELEGATE="vbscript::MAIN"/>
		
		<!-- On rajoute nos propres mots clefs (spécifiques à VB.NET) -->
		<!-- Imports, NameSpace, Shared pour en prendre trois au hasard -->
		<!-- Pour l'exemple on va les mettre en KEYWORD4 -->
		<KEYWORDS>
			<KEYWORD4>imports</KEYWORD4>
			<KEYWORD4>namespace</KEYWORD4>
			<KEYWORD4>shared</KEYWORD4>
		</KEYWORDS>
	</RULES>
</MODE>
Pour information, voici le même code VB.NET colorié une fois avec vb, une fois avec notre nouveau fichier :
code langage='vb'
' skdjfhskdfh
 ' sdkfsldkjfsldj
 sdfs< ' sfsjldkfjsdf
Imports System
Imports System.Text.RegularExpressions

Dim s As String = "SELECT * FROM matable WHERE madate='aujourd'hui' AND flag=1"

Char &
NameSpace ExemplesRegEx &
	Public Class Verification
		Shared Sub Main()
			Dim verif as Regex = new Regex("[0-9]{10}")
			Dim numero as String = "0123456789"
			Dim isNumero As Boolean = verif.IsMatch(numero)
			If isNumero Then
				Console.WriteLine("Le numéro de téléphone est valide ")
			Else
				Console.WriteLine("Le numéro de téléphone n'est pas valide ")
			End If
		End Sub
	End Class
End NameSpace
code langage='vbnet'
' skdjfhskdfh
 ' sdkfsldkjfsldj
 sdfs< ' sfsjldkfjsdf
Imports System
Imports System.Text.RegularExpressions

Dim s As String = "SELECT * FROM matable WHERE madate='aujourd'hui' AND flag=1"

Char &
NameSpace ExemplesRegEx &
	Public Class Verification
		Shared Sub Main()
			Dim verif as Regex = new Regex("[0-9]{10}")
			Dim numero as String = "0123456789"
			Dim isNumero As Boolean = verif.IsMatch(numero)
			If isNumero Then
				Console.WriteLine("Le numéro de téléphone est valide ")
			Else
				Console.WriteLine("Le numéro de téléphone n'est pas valide ")
			End If
		End Sub
	End Class
End NameSpace
"En gros", c'est pas plus compliqué que ca. Il faut relativiser, car il faut se taper la dtd xmode (c'est la seule doc disponible). D'un autre côté, il y a assez d'exemples pour que ce ne soit pas problématique.

Avant de passer aux exemples, voyons quelles possibilités (autres que de rajouter des règles) on a pour personnaliser la coloration d'un code.


3.3. Personnalisez la coloration

En fait, on a deux possibilités :

  • Premièrement, on peut jouer sur les CSS (voir code.css), il y a une quizaine de marqueurs différents. Ce fichier css contient une coloration syntaxique générique et les colorations spécifiques. Voici la coloration générique :
    Coloration générique
    /*Coloration générique*/
    .keyword1 {
    	font-weight: bold;
    	color: #7F0055;
    }
    
    .keyword2 {
    	color: #0033FF;
    }
    
    .keyword3 {
    	color: #FF8040;
    }
    
    .keyword4 {
    	font-weight: bold;
    	color: #3366CC;
    }
    
    .function,.markup {
    	color: navy;
    }
    
    .operator {
    	color: #7F0055;
    }
    
    .label {
    	color: olive;
    }
    
    .digit{
    	color: red;
    }
    
    .comment1 {
    	color: #3f7f5f;
    }
    
    .comment2 {
    	color: #999999;
    }
    
    .comment3 {
    	color: #3f5fbf;
    }
    
    .comment4 {
    	font-style: italic;
    	color: #000080;
    }
    
    .literal1 {
    	color: #2a00ff;
    }
    
    .literal2 {
    	color: teal;
    }
    
    Pour rajouter une coloration spécifique à votre langage, trois étapes :

    1. Créez votre propre feuille de style et demandez son inclusion dans code.css. Par exemple :
      Coloration générique
      /*Coloration langage java */
      .java_keyword1 {
      	font-weight: bold;
      	color: #7F0055;
      	font-style: italic;
      }
      
      .java_keyword2 {
      	color: #0033FF;
      	font-style: italic;
      }
      
      .java_keyword3 {
      	color: #FF8040;
      	font-style: italic;
      }
      
      .java_keyword4 {
      	font-weight: bold;
      	color: #3366CC;
      	font-style: italic;
      }
      /* etc .*/
      
    2. Indiquez au kit, qu'il y a une coloration spécifique à mettre en place pour votre langage. Rajoutez le nom de votre langage dans le fichier $KIT_HOME/script/coloration/languages.properties au niveau de colorations.connues. Par exemple :
      #Colorations spécifiques connues (pour lesquelles il y a des css spécifiques)
      colorations.connues=java, truc, bidulle
      
    3. Prévenez les responsables du kit pour que ces modifications soient intégrées dans les autres formats (par exemple, il n'y a pas moyen d'intégrer une css pour les pdf, il faut donc coder tout ca dans les xsl).

  • La seconde facon de chambouler tout ca est de changer le "marquage" des mots clefs (en passer en littéral, d'autres en keyword1,2,3, etc.)
Enfin, voila, voila, je pense qu'entre la centaine de langages déjà dispoibles, la possibilité de rajouter facilement nos règles à des langages existants et les possibilités de changer la mise en page du tout, on est tranquille avec la coloration syntaxique pour quelques années :)

Je vous laisse découvrir les exemples de coloration syntaxique, et j'attends vos remarques, critiques, avis, coups de main, coup de tête, etc. ;)


 

Valid XHTML 1.1!Valid CSS!

Ce document ment ment est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.