Les travaux de Marijn Haverbeke

Posté par  (site web personnel) . Édité par Xavier Teyssier et Davy Defaud. Modéré par claudex. Licence CC By‑SA.
Étiquettes :
54
4
mai
2020
JavaScript

Marijn Haverbeke est un développeur que j’apprécie beaucoup. Ses projets sont pour la plupart écrits en JavaScript, langage que j’apprécie habituellement que moyennement, mais la qualité de son code le rend plaisant à lire. Et c’est toujours très bien documenté ! Comme ses travaux n’ont pas encore eu beaucoup d’échos sur LinuxFr.org, je me propose de vous les présenter.

Commençons par Eloquent JavaScript. C’est un ouvrage, dont la version en ligne est gratuite, qui enseigne le JavaScript. Il est régulièrement cité comme étant ce qui se fait de mieux pour les débutants qui veulent apprendre le JS.

Logo de ProseMirror

ProseMirror est une boîte à outils pour construire des éditeurs Web de texte riche. En particulier, il inclut les fondations permettant de faire de l’édition collaborative. J’ai découvert ce projet lors du développement de cozy-notes (cf. la dépêche des nouvelles de Cozy) et j’ai été impressionné par la qualité : les concepts de base sont bien expliqués, le code est modulaire et bien organisé, on sent une grande maîtrise du sujet, aussi bien sur les manipulations du DOM dans le navigateur que sur les aspects algorithmiques pour l’intégration automatique des changements lors de l’édition collaborative.

Logo de CodeMirror

CodeMirror est le pendant de ProseMirror pour le code : c’est un éditeur de code en ligne, avec coloration syntaxique, thèmes, auto‐complétion, recherche, intégration d’outils de « lint », etc. Il est utilisé par les outils de développement de votre navigateur et par beaucoup d’autres projets.

Logo de Lezer

En parlant de CodeMirror, la version actuelle est la 5 et la version 6, en cours de développement, sera une réécriture complète. Parmi les nouveautés, il y aura une meilleure accessibilité, une prise en charge améliorée des écrans tactiles et une meilleure analyse du contenu. Pour cela, le projet Lezer a été développé. C’est un outil pour écrire des analyseurs (parsers).

Vous vous souvenez peut‑être de Lex et Yacc. Là, c’est la même chose mais avec des objectifs liés à CodeMirror : déjà, le parser va être en JavaScript. Ensuite, on charge à minimiser le poids à télécharger pour le parser. Le parser doit également être rapide et pouvoir travailler de manière incrémentale. Enfin, il doit être tolérant aux erreurs : si une personne est en train de taper du code dans CodeMirror, ce serait dommage qu’elle ne puisse pas profiter de la coloration syntaxique tant qu’elle n’a pas fini l’instruction ou le bloc en cours.

Lezer permet d’écrire un fichier .grammar qui représente la grammaire à analyser, avec des points d’entrée pour brancher du code JavaScript. Tout cela est ensuite transformé en analyseur JS qui pourra être utilisé dans CodeMirror ou ailleurs. À titre d’exemple, voici à quoi ressemble le fichier .grammar pour décrire la syntaxe JSON :

@top JsonText { value }

value { True | False | Null | Number | String | Object | Array }

String { string }
Object { "{" list<Property>? "}" }
Array  { "[" list<value>? "]" }

Property { PropertyName ":" value }
PropertyName { string }


@tokens {
  True  { "true" }
  False { "false" }
  Null  { "null" }

  Number { '-'? int frac? exp?  }
  int  { '0' | $[1-9] std.digit* }
  frac { '.' std.digit+ }
  exp  { $[eE] $[+\-]? std.digit+ }

  string { '"' char* '"' }
  char { $[\u{20}\u{21}\u{23}-\u{5b}\u{5d}-\u{10ffff}] | "\" esc }
  esc  { $["\/bfnrt] | "u" hex hex hex hex }
  hex  { $[0-9a-fA-F] }

  whitespace { $[ \n\r\t] }
}

@skip { whitespace }
list<item> { item ("," item)* }

@detectDelim

Pour finir, si vous appréciez comme moi les travaux de Marijn Haverbeke, vous pouvez financer leur maintenance via un don sur https://marijnhaverbeke.nl/fund/.

Aller plus loin

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.