page d'accueil

Un éditeur html wysiwyg (2)

Note: les exemples de cette page ne fonctionnent toujours qu'avec Microsoft Internet Explorer 5.5 minimum.

Une barre d'outils

J'ai finalement remis ça et je n'ai pas pu m'empécher de faire quelques améliorations, même si je commence par la barre d'outils qui semble être ce qu'il y a de plus facile à réaliser.

Toujours d'après Microsoft, puis après m'être inspiré de différents articles et avoir récupéré quelques images, je réussi à bidouiller une première barre d'outils toute simple:

<div style="{text-align:left; width:400px; background-color: buttonface;}">
<img unselectable="on" src="ciBold.gif" onclick="document.execCommand('bold');" />
<img unselectable="on" src="ciItalic.gif" onclick="document.execCommand('italic');" />
<img unselectable="on" src="ciUnderline.gif" onclick="document.execCommand('underline');" />
</div>
<span id="memoTool1" contentEditable="true" style="{text-align:left; width:400px; height:75px; border:buttonface 1px solid;}"></span>

C'est un peu bizarre, mais ça a l'air d'aller avec «document.execCommand()». Vu que je ne passe pas par une <iframe>, j'avais d'abord essayé «document.getElementById('memoTool1').execCommand()», mais ça ne marchait pas.

Quelques fonctions supplémentaires

Comme j'ai la chance d'utiliser Visual Studio .Net, je tape «execCommand» dans la zone «Rechercher», je double-clique sur la première réponse qu'il me propose et je tombe pile sur l'information dont j'ai besoin. En suivant le lien sur «command identifiers», j'obtiens la liste complète des paramètres possibles pour la fonction «execCommand()».

Là, je retrouve les trois commandes 'bold', 'italic' et 'underline' parmi près de 75 autres valeurs - dont quand même une vingtaine qui ne sont pas encore gérées :). Il y a de quoi définir la police utilisée ('fontname' et 'fontsize'), les couleurs ('backcolor', 'forecolor') et tout plein d'autres trucs sans intérêt dans mon cas.

Je repère quand même quatre paramètres intéressants:

Aussitôt trouvé, aussitôt codé :

<div style="{text-align:left; width:400px; background-color: buttonface;}">
<img unselectable="on" src="ciCut.gif" onclick="document.execCommand('cut');" />
<img unselectable="on" src="ciCopy.gif" onclick="document.execCommand('copy');" />
<img unselectable="on" src="ciPaste.gif" onclick="document.execCommand('paste');" />
&nbsp;
<img unselectable="on" src="ciBold.gif" onclick="document.execCommand('bold');" />
<img unselectable="on" src="ciItalic.gif" onclick="document.execCommand('italic');" />
<img unselectable="on" src="ciUnderline.gif" onclick="document.execCommand('underline');" />
&nbsp;
<img unselectable="on" src="ciInsertImage.gif" onclick="document.execCommand('insertImage', true);" />
</div>
<span id="memoTool2" contentEditable="true" style="{text-align:left; width:400px; height:75px; border:buttonface 1px solid;}"></span>
       

Un peu de cosmétique

Comme il faut bien savoir s'arrêter à un moment et être capable de livrer quelque chose de fini, juste quatre dernières retouches pour fignoler la barre d'outils.

C'est vrai que le code commence à devenir un peu conséquent, mais ça n'a encore rien à voir avec celui des éditeurs super sophistiqués que j'ai pu trouver par ailleurs. Et surtout, presque tout est générique et sera donc réutilisable tel quel sans prise de tête.

<div class="memoBar" style="{width:400px;}">
<img unselectable="on" class="memoOut" src="ciCut.gif" onclick="document.execCommand('cut');" onmouseover="this.className='memoOver';" onmouseout="this.className='memoOut';" title="Couper (Ctrl X)" />
<img unselectable="on" class="memoOut" src="ciCopy.gif" onclick="document.execCommand('copy');" onmouseover="this.className='memoOver';" onmouseout="this.className='memoOut';" title="Copier (Ctrl C)" />
<img unselectable="on" class="memoOut" src="ciPaste.gif" onclick="document.execCommand('paste');" onmouseover="this.className='memoOver';" onmouseout="this.className='memoOut';" title="Coller (Ctrl V)" />
<img unselectable="on" src="ciSpacer.gif" title="" />
<img unselectable="on" class="memoOut" src="ciBold.gif" onclick="document.execCommand('bold');" onmouseover="this.className='memoOver';" onmouseout="this.className='memoOut';" title="Gras (Ctrl B)" />
<img unselectable="on" class="memoOut" src="ciItalic.gif" onclick="document.execCommand('italic');" onmouseover="this.className='memoOver';" onmouseout="this.className='memoOut';" title="Italique (Ctrl I)" />
<img unselectable="on" class="memoOut" src="ciUnderline.gif" onclick="document.execCommand('underline');" onmouseover="this.className='memoOver';" onmouseout="this.className='memoOut';" title="Souligné (Ctrl U)" />
<img unselectable="on" src="ciSpacer.gif" title="" />
<img unselectable="on" class="memoOut" src="ciCreateLink.gif" onclick="document.execCommand('createLink', true);" onmouseover="this.className='memoOver';" onmouseout="this.className='memoOut';" title="Insérer un lien hypertexte (Ctrl K)" />
<img unselectable="on" class="memoOut" src="ciInsertImage.gif" onclick="document.execCommand('insertImage', true);" onmouseover="this.className='memoOver';" onmouseout="this.className='memoOut';" title="Insérer une image" />
</div>
<span id="memoTool3" contentEditable="true" class="memoText" style="{width:400px; height:75px;}"></span>

Conclusion

Et voilà! J'ai maintenant une zone de saisie wywiwyg, avec une barre d'outils qui répond presque quasiment à mon besoin initial. Maintenant c'est certain, je vais encore bosser un peu dessus parce que je vais vouloir transformer le vieux code html qu'elle génère en xhtml moderne.

Publicités