More is less

mercredi 6 septembre 2017

Tohtml

Vim dispose d'une commande TOhtml pour convertir le fichier courant en html. Cette fonction produit une page html complète avec son head et son body. Les styles qui y sont définis altèrent le style de la page dans laquelle on l'inclut. Ici on va hacker TOhtml pour produire un bout de code html isolé.

TOhtml

La commande TOhtml crée un nouveau buffer dans une nouvelle fenêtre et y insère le code d'un page html autonome :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>~/src/python/papy/nsa.py.html</title>
<meta name="Generator" content="Vim/8.0">
...
<style type="text/css">
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #ffffff; 
background-color: #3a3a3a; }
body { font-family: monospace; color: #ffffff; background-color: #3a3a3a; }
* { font-size: 1em; }
.String { color: #87ffaf; }
.Operator { color: #00ffff; }
.LineNr { color: #a8a8a8; background-color: #626262; padding-bottom: 1px; }
...
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="Comment">#!/usr/bin/env python3</span>
<span id="L2" class="LineNr"> 2 </span><span class="Comment"># nsa.py Non standard analysis</span>

Le but recherché est de ne laisser que le strict nécessaire pour afficher le code avec la coloration syntaxique.

On voudrait quelque chose comme ceci :

<style type="text/css">
<!--
.monokai { white-space: pre-wrap; font-family: monospace; color: #ffffff; 
background-color: #444; }
.String { color: #d7d787; }
.Number { color: #af87ff; }
.Define { color: #ff005f; }
.Conditional { color: #ff005f; }
.Comment { color: #999; }
.Operator { color: #ff005f; }
.Function { color: #afd700; }
.Statement { color: #ff005f; }
.PreProc { color: #ff005f; }
.Special { color: #ffffff; }
-->
</style>
<pre class="monokai">
<span id="L1" class="LineNr"> 1 </span><span class="Comment">
#!/usr/bin/env python3</span>
...
</pre>

Le script vim / python

L'affichage qui suit est produit par le script lui même tohtml.vim


 1 " (c) 2017 Released under the GPL by marnout à free pt fr
 2 
 3 :TOhtml
 4 
 5 " delete lines that does not begin by <span
 6 :v/^<span/d
 7 
 8 python << endpy
 9 
10 header = """<style type="text/css">
11 <!--
12 .monokai { white-space: pre-wrap; font-family: monospace; color: #ffffff; background-color: #444; }
13 .String { color: #d7d787; }
14 .Number { color: #af87ff; }
15 .Define { color: #ff005f; }
16 .Conditional { color: #ff005f; }
17 .Comment { color: #999; }
18 .Operator { color: #ff005f; }
19 .Function { color: #afd700; }
20 .Statement { color: #ff005f; }
21 .PreProc { color: #ff005f; }
22 .Special { color: #ffffff; }
23 -->
24 </style>
25 <pre class="monokai">
26 """
27 
28 import vim
29 
30 cb = vim.current.buffer
31 
32 cb[0:0] = header.split('\n')
33 cb.append('</pre>')
34 
35 endpy
36 

Commentaire

Ligne 3
exécute la commande TOhtml de vim. On se retrouve donc avec une nouvelle fenetre qui affiche le contenu du buffer créé par la commande.
Ligne 6
Supprime toutes les lignes qui ne commencent pas par <span. Voir la commande :v avec :help :v. Après cette execution, un grand nettoyage est fait. Il ne reste que les lignes <span ..> .. </span>.
Lignes 8 à 35
Script python qui sera excécuté dans vim.
Lignes 10 à 26
On définit la balise style css qui s'inspire du style monokai, sous forme de chaine de caractères.
Ligne 28
Importation du module vim, pour scripter vim en python. Je passe par ce subterfuge, parce que je n'ai pas réussi à le faire avec le langage de vim, qui m'agace.
Ligne 30
La variable cb est une list python constituée par le buffer courant, c'est à dire celui qui contient le html.
Ligne 32
Les lignes de header sont insérées au buffer courant au début.
Ligne 33
Terminaison de la balise <pre>

Utilisation

J'ai placé le fichier tohtml.vim dans mon dossier $HOME/.vim

J'ai ajouté à mon .vimrc :

:command Tohtml :source ~/.vim/tohtml.vim

La majuscule T à Tohtml est une contrainte de vim.

Pour exporter un buffer de vim en html, il suffit maintenant de taper la commande :Tohtml et enregistrer le buffer produit. Par défaut si le nom du fichier est machin.c le fichier html en sortie sera machin.c.html

Il ne reste plus qu'à l'inclure dans une page html.


Réalisé avec Qlam - LGPL