diff options
Diffstat (limited to 'content/Informatique')
| -rw-r--r-- | content/Informatique/2013-10-12-rst_graphviz.rst | 2 | ||||
| -rwxr-xr-x | content/Informatique/2020-12-05-graphviz_en_js.rst | 187 | 
2 files changed, 188 insertions, 1 deletions
| diff --git a/content/Informatique/2013-10-12-rst_graphviz.rst b/content/Informatique/2013-10-12-rst_graphviz.rst index ebf9873..d482f08 100644 --- a/content/Informatique/2013-10-12-rst_graphviz.rst +++ b/content/Informatique/2013-10-12-rst_graphviz.rst @@ -5,7 +5,7 @@ Ajouter graphviz dans les documents restructuredText  ####################################################  :date: 2013-10-12 -:tags: Libre, reStructuredText +:tags: Libre, reStructuredText, graphviz  :logo: /images/graphviz/graphe.png  :summary: |summary| diff --git a/content/Informatique/2020-12-05-graphviz_en_js.rst b/content/Informatique/2020-12-05-graphviz_en_js.rst new file mode 100755 index 0000000..8b2e70a --- /dev/null +++ b/content/Informatique/2020-12-05-graphviz_en_js.rst @@ -0,0 +1,187 @@ +.. -*- mode: rst -*- +.. -*-  coding: utf-8 -*- + +=========================== +Prise de note avec graphviz +=========================== + +:date: 2020-12-06 +:tags: graphviz, javascript +:summary: |summary| + +.. default-role:: literal + +.. |summary| replace:: + + + J'utilise Graphviz depuis un moment — même pour des notes — car la + représentation en graphe permet de synthétiser facilement des notions + complexes. Mais c'est compliqué et long à saisir, du coup, j'ai choisi de me + faire un petit outil pour me faciliter la vie… + +J'utilise Graphviz depuis un moment — même pour des notes — car la +représentation en graphe permet de synthétiser facilement des notions complexes : + +- relation de dépendances +- séquence de processus +- … + +Mais il me manquait une manière de pouvoir les créer de manière rapide, +c'est-à-dire avec une syntaxe adaptée à la prise de note, et pouvoir éditer le +résultat en temps réel. Or créer une syntaxe est quelque chose que je sais +faire, et voir le résultat en temps réel est possible grâce à `viz.js`_ qui a +recompilé Graphviz en javascript à l'aide d'Emscripten_, et permet donc de le +faire tourner dans le navigateur. + + +.. _viz.js: http://viz-js.com/ +.. _emscripten: https://fr.wikipedia.org/wiki/Emscripten + +Il ne reste donc plus qu'à assembler tout ça, pour faire tourner un petit +éditeur de graphe. J'ai choisi de ne représenter que des tables, et d'utiliser +l'indentation pour marquer la relation au parent : (si vous souhaitez en +profiter en pleine page, c'est `ici que ça se passe`_) + +.. _ici que ça se passe: {filename}/pages/graph-editor.html + +La démo +------- + +.. raw:: html + +    <style> +    #app {width: 100%; height: 100%; overflow: hidden; position: relative;} +    #panes {display: flex; width: 100%; height: 100%; overflow: auto;} +    #output svg, #output object { top: 0; left: 0; width: 100%; height: 100%; } +    .flex-child {flex: 1;} +    .vcenter {display: table-cell; vertical-align: middle} +    #overlay { +    display: table; +    width: 100%; +    height: 100%; +    position: absolute; +    top: 0; +    left: 0; +    background: rgba(0, 0, 0, 0.5); +    z-index: 99; +    color: white; +    text-align: center; +    } +    </style> + +    <div id="app" disabled="true"> +      <button id="dot_output">Export DOT</button> +      <button id="png_output">Export PNG</button> +      <div id="panes"> +        <textarea id="editor" class="flex-child"> +    g1 +     Nom +     - +     propriété 1 <-> g2:2 +     propriété 2 + +    g2 +     Autre +     - +     propriété 1 +     encore une autre <i>entrée</i> +     autre champ -> g1:3 retour + +    g3 +     Dernier élément +     - +     ligne 2 +     ligne 3 +    </textarea> +      <div id="graph" class="flex-child"> +        <div id="output"> +          <div id="svg"><object data="{static}/resources/viz.js/example.svg" type="image/svg+xml"></object></div> +            <div id="error"></div> +          </div> +        </div> +      </div> +      <div id="overlay"> +      </div> +    </div> + + +.. admonition:: Exécution du script + :class: hint + :name: note + + Les librairies étant relativement lourdes (+2Mo), elles ne sont pas chargées + automatiquement avec la page. Je vous laisse cliquer sur le bouton pour les + charger et lancer la mise à jour. + + .. raw:: html + +  <div style="text-align:center; width:100%; position:relative;"> +  <button type="button" id="load_button">Activer</button> +  </div> + +  <script type="text/javascript"> +   async function getScript(url){ +     var script = document.createElement('script'); + +     promise = new Promise((res, rej) => { +       script.addEventListener('load', () => { +         res(script); +       }) +     }); + +     script.setAttribute('type', 'text/javascript'); +     script.setAttribute('src', url); +     if(document.body == null) { +       document.head.appendChild(script); +     } else { +       document.body.appendChild(script); +     } +     return promise; +   } +  var load_button = document.getElementById('load_button'); + +  load_button.onclick = async function() { +      var note = document.getElementById('note'); +      note.remove(); +      var s1 = getScript("/resources/viz.js/viz.js"); +      var s2 = getScript("/resources/viz.js/full.render.js"); +      var s3 = getScript("/resources/viz.js/download.js"); +      var s4 = getScript("/resources/viz.js/convert.js"); +      await Promise.all([s1, s2, s3, s4]); +      generator.load(); +      var overlay = document.getElementById("overlay"); +      overlay.remove(); +      return false; +  } +  </script> + + + +Vous pouvez édite le texte ci-dessus pour mettre à jour le graphe de la partie +droite directement. Les nœuds sont représentés à l'aide des `HTML Like label`_ +de graphviz, il est donc possible d'utiliser de la couleur, ou des balises de +mises en formes qui seront reprises dans le graphe final. Tout ce qui est saisi +est transformé dans le navigateur, et aucune donnée ne transite sur le réseau. + + +.. _HTML Like label: https://www.graphviz.org/doc/info/shapes.html#html + +Avec les boutons d'export, cela me suffit pour produire un petit schéma +rapidement, ou ensuite le retravailler le fichier dot correspondant si j'ai +besoin d'aller plus loin… + +Le code +------- + +Il est écrit en OCaml et compilé en javascript (c'est pour ça qu'il s'exécute +dans la page). Vous pouvez télécharger une version hors ligne à exécuter en +local ci-dessous : + +.. figure:: {static}/images/package-x-generic.png +    :alt: get the file +    :align: center +    :target: {static}/resources/viz.js/graphviz.zip + +    Télécharger + +la commande `make html` permet de régénérer les sources. | 
