Hamill
Ce document en français décrit le langage Hamill. English documentation is available here.
Hamill est un langage de balisage léger comme Markdown, Textile, AsciiDoc ou reStructuredText, pour écrire de la documentation dans un fichier texte avec des informations de structure (titres, divisions, paragraphes) et de formatages (gras, italique…).
Sa syntaxe légère rend plus facilement la lecture directe du fichier texte par rapport à un fichier HTML. Hamill fournit toutefois un outil pour transformer un fichier Hamill (extension .hml
) en fichier HTML (extension .html
)
Sa syntaxe est à la fois plus facile et plus complète que celle du Markdown originel de 2004.
Hamill existe depuis 2020, il est actuellement à sa version 2 depuis 2022 et dispose de deux implémentations qui produisent le même résultat :
- celle en JavaScript avec NodeJS est hébergée sur NPM : Hamill JS,
- celle en en Python 3 est hébergée sur PYPI : Hamill PY.
Le code source du projet est disponible sur GitHub.
Vous pouvez l'essayer directement en ligne
La version actuelle est la version 2.0.6. Hamill est publié sous licence MIT.
Damien Gouteux 2020-2024
Sommaire
- Utilisation
- Commentaires, HR et BR
- Titres
- Modification de texte
- Div, p et span
- Détails
- Code
- Listes
- Listes de définition
- Tables
- Liens
- Images
- Constantes
- Variables
- Inclusion de fichier HTML
- Liens vers un fichier CSS ou JavaScript
- Spécial
Utilisation
Hamill vient la sous la forme de deux scripts : hamill et weyland (extension .mjs pour la version JavaScript et .py pour la version Python). Weyland s'occupe de l'analyse lexicale et syntaxique des différents langages, et Hamill de la transformation du fichier Hamill (extension .hml) en un document composé de plusieurs nœuds. Ce document est ensuite traduit en HTML. Pour cela, il faut utiliser Hamill en ligne de commande :
node.exe hamill.mjs python.exe hamill.py
Par défaut, il affichera le menu d'aide qui détaille les différentes commandes disponibles.
Running Hamill v2.0.6 --- > Use hamill.mjs --process (or -p) <input config filepath> to convert the HML file to HTML The file must be an object {} with a key named targets with an array value of pairs : ["inputFile", "outputDir"] > Use hamill.mjs --tests (or -t) to launch all the tests (99). > Use hamill.mjs --eval (or -e) to run a read-eval-print-loop from hml to html > Use hamill.mjs --help (or -h) to display this message
--process ou -p
: permet de lancer la traduction d'un ou plusieurs fichiers hamill en HTML. Il faut préciser le chemin d'un fichier de config.--tests ou -t
: lance la suite de tests--eval ou -e
: pour lancer une invite de commande pour entrer du hamill et voir directement le résultat traduit en HTML. Utile pour faire des tests.--help ou -h
: pour afficher ce message (comportement par défaut)
Le fichier de configuration est un fichier JSON qui a un objet pour racine. Cet objet doit avoir une clé targets qui est une liste d'objets. Chaque objet doit avoir :
- une propriété
do
pour indiquer si la cible doit être traitée ou non, - une propriété
source
indiquant le fichier hamill cible, - une propriété
destination
indiquant le répertoire où mettre le résultat de la transformation en HTML.
ou
- une seule propriété
comment
pour indiquer un commentaire.
Le résultat portera le même nom de fichier que le fichier hamill cible, sauf que son extension sera .html au lien de .hml.
{ "targets": [ { "comment": "Pages racines" }, [ "do": true, "source": "./input/index.hml", "destination": "../" ] ] }
Commentaires, HR et BR
On peut faire des commentaires en mettant !rem
ou §§
en début de ligne, toute la ligne est alors en commentaire.
!rem Ceci est un commentaire
§§ Ceci est un autre commentaire
Une ligne entièrement en commentaire sera exportée en l'HTML si la variable EXPORT_COMMENT
est à true
.
On peut faire une ligne horizontale avec une ligne constituée uniquement de -
d'une longueur supérieure ou égale à 3.
---
On peut forcer un retour à la ligne avec ##
entouré d'un espace avant et après et pas en début de ligne (sinon c'est un titre) :
ceci est un retour ## à la ligne.
ceci est un retour
à la ligne.
Titres
On met en début de ligne un nombre de #
correspondant au niveau du titre que l'on veut.
### Titre de niveau 3
Modification de texte
- **gras** : pour mettre en gras (balise b)
- !!gras!! : pour mettre en gras (balise strong)
- ''italique'' : pour mettre en italique (balise i)
- //italique// : pour mettre en italique (balise em)
- --
barré-- : pour barrer - __souligné__ : pour souligner
- ^^exposant^^ : pour mettre en exposant
- %%indice%% : pour mettre en indice
- Pour échapper un caractère spécial, utilisez
\
Div, p et span
{{#id .class}}
: sur une ligne, seule, permet de définir une div avec un id et/ou une classe.{{begin}}
: sur une ligne, pour ouvrir une div sans id ni classe.{{end}}
: sur une ligne, seule, permet de fermer une div ouverte.{{#id .class}} content
: dans un paragraphe, permet de spécifier l'id et/ou la classe du paragraphe.{{#id .class content}}
: dans un paragraphe, permet de spécifier un span avec un id et/ou une classe.
!css span.spoiler {background: black; user-select: none;}
!css span.spoiler:active {background: lightgrey; user-select: none;}
Ceci est un texte avec une partie cachée : {{.spoiler Dark Vador est le père de Luke}}. Pour ne pas spoiler.
Ceci est un texte avec une partie cachée : Dark Vador est le père de Luke. Pour ne pas spoiler.
Détails
- Ecrire
<<xxx -> yyy>>
pour ouvrir une courte note. On peut mettre un id et une classe avant xxx avec#id
et.class
. - Ecrire
<<xxx>>
pour ouvrir une longue note. mettre un id et une classe avant xxx avec#id
et.class
. - Ecrire
<<end>>
pour fermer une longue note, on peut rappeler l'id et la classe mais cela n'a pas de signification pour Hamill.
<<Courte note -> Ceci est une courte note.>>
Courte note
Ceci est une courte note.<<Longue>>
* Ceci est une note longue
* Avec du Hamill dedans ##
<<end>>
Longue note
- Ceci est une note longue
- Avec du Hamill dedans
Code
On utilise @@pour du code inline@@
. Hamill dispose d'un colorisateur syntaxique pour Python et JSON, on précise ainsi : @@python def function(par1, par2)@@
.
Pour un bloc de code, il y a deux solutions :
On peut faire une ligne avec seulement @@
suivi éventuellement du langage qu'on souhaite puis des lignes avec @@
au début jusqu'à une ligne ne comportant que @@
. Ainsi :
@@python
@@# Ceci est un commentaire
@@def function(par1, par2):
@@ return "Ceci est une fonction"
@@
Donnera :
# Ceci est un commentaire def function(par1, par2): return "Ceci est une fonction"
On peut également faire une ligne avec seulement @@@
suivi éventuellement du langage qu'on souhaite puis des lignes sans rien jusqu'à une ligne ne comportant que @@@
. Ainsi :
@@@python
# Ceci est un commentaire
def function(par1, par2):
return "Ceci est une fonction"
@@@
Donnera :
# Ceci est un commentaire def function(par1, par2): return "Ceci est une fonction"
Listes
*
pour une liste non numérotée
+
pour une liste numérotée, item 1/2+
item 2/2
-
pour une liste numérotée inversée, item 1/2-
item 2/2
Listes de définition
- $ indique une liste de définition. On fait suivre directement la définition en la précédant d'espaces.
$ Cuirassier soldat à cheval lourdement équipé
- Cuirassier
- soldat à cheval lourdement équipé
Tables
- Un tableau s'écrit ainsi :
|col1|col2|col3|
- La ligne de titre doit être la première et séparée des autres par une ligne de tirets :
|----|
Ceci | est | un | tableau |
---|---|---|---|
Il | est | beau | mon tableau |
On peut mettre bien sûr des modificateurs de textes, des liens ou une image dans un tableau.
Ceci | est | un | tableau |
---|---|---|---|
Il | est | ce tableau. |
On peut également centré une case en faisant suivre la colonne ouvrante par =
et d'aligner à droite avec >
:
A gauche et aussi très long | Centré | A droite |
---|---|---|
A droite | Centré | A gauche et aussi très long |
On peut également préciser un colspan avec #cVALEUR# par exemple : #c3#
et combiner avec centrer =#c3#
:
Colonne 1 | Colonne 2 | Colonne 3 |
---|---|---|
Centré et colspan=3 |
LIMITATION : pas de listes dans un tableau
Liens
- On utilise les crochets
- La première forme dite directe est
[[URL]]
,[[REF]]
,[#ID]
. L'URL, la REF ou l'identifiant sera affichée - La seconde forme dite nommée s'écrit
[[ nom affiché -> URL | REF | #ID ]]
ou[ nom affiché -> REF ]
- Une URL commence par
http://
ouhttps://
- Une REF est définie par une ligne de la forme
::code:: http://...
- Une forme spéciale de la nommée est si REF est seulement
#
comme[[ nom affiché -> # ]]
: Hamill essaye alors de faire sur le nom affiché transformé ou, si l'ancre n'existe pas, le nom affiché directement - Les titres sont automatiquement transformés en ancre en remplaçant les espaces par - et en les mettant en minuscules : ainsi Les jeux devient les-jeux
Images
- On utilise des parenthèses
((url))
comme :((mon_image.png))
- On peut définir un répertoire par défaut où les images seront prises avec la variable
DEFAULT_FIND_IMAGE
Constantes
On peut définir des constantes en mettant !const
en début de ligne. Les constantes peuvent être définies n'importe où dans le document mais une seule fois.
Certaines constantes sont prédéclarées mais sans valeur, on peut donc les définir une fois encore :
!const TITLE=titre
pour définir le titre de la page!const ICON=icon
pour définir une icône pour la page!const LANG=lang
pour définir la langue utilisée dans la page!const ENCODING=encoding
pour définir la langue utilisée dans la page, par défaut utf-8!const BODY_CLASS=classe
pour définir la classe du body!const BODY_ID=id
pour définir l'id du body
Certaines constantes sont prédéclarées avec une valeur, on ne peut donc pas les redéfinir :
!const VERSION
la version de Hamill utilisée!const NOW
affiche dans une chaîne le jour, le mois et l'année au format : mercredi 24 avril 2024.
Pour l'affichage du jour dans la semaine, seuls l'anglais et le français sont gérés en fonction de la constante LANG
.
Variables
On peut définir des variables en mettant !var
en début de ligne. On peut changer la valeur d'une variable en la redéfinissant dans le document autant de fois que l'on veut.
!var EXPORT_COMMENT=true/false
spécifie si les commentaires seront exportés en HTML ou pas!var PARAGRAPH_DEFINITION=true/false
spécifie si les dd des listes de définitions doivent être mis dans des balises p!var DEFAULT_CODE=python/json
définit la coloration syntaxique par défaut du code (aucune par défaut)!var NEXT_TAB_ID=ids
spécifie l'id du prochain tableau!var NEXT_TAB_CLASS=cls
spécifie la classe du prochain tableau!var DEFAULT_PAR_CLASS=cls
spécifie la classe par défaut de tous les paragraphes qui suivent!var DEFAULT_TAB_CLASS=cls
spécifie la classe par défaut de tous les tableaux qui suivent!var DEFAULT_FIND_IMAGE=path
spécifie un répertoire où aller chercher les images par défaut!var NEXT_CODE_ID=ids
spécifie l'id du prochain bloc de code!var NEXT_CODE_CLASS=cls
spécifie la classe du prochain bloc de code
Si NEXT_TAB_CLASS
et DEFAULT_TAB_CLASS
sont définies, c'est la valeur de NEXT_TAB_CLASS
qui sera prise en compte.
Inclusion de fichier HTML
On peut inclure un fichier HTML avec !include
en début de ligne. Le contenu du fichier sera copié directement le document produit.
Liens vers un fichier CSS ou JavaScript
On peut lier notre document à fichier CSS ou JavaScript avec la commande !require
en début de ligne.
Le lien vers un fichier CSS (.css) requis est automatiquement placé dans la tête du document HTML.
Le lien vers un fichier JavaScript (.js ou .mjs) requis est automatiquement placé dans la tête du document HTML.
Spécial
!css css-code
permet de rajouter du code css!html html-code
permet de rajouter du code html