Tdl est une petite bibliothèque pour représenter, écrire et lire des listes de choses à faire ("TODO lists") dans des fichiers XML. Une bibliothèque additionnelle, Tdl_gui, peut être utilisée pour afficher et éditer ces fichers dans des applications utilisant LablGtk2.
Une TODO list est une arboresence de groupes, chacun pouvant contenir des items (correspondants aux tâches) et d'autres groupes.
Le programme tdl.{x,byte} inclus dans Cameleon utilise cette bibliothèque pour permettre l'édition de tels fichiers par une interface graphique. tdl_export.{x,byte} est un programme en ligne de commande permettant de fusionner, filtrer des TODO lists ou encore d'en exporter au format RSS. tdl2html.{x,byte} permet quant à lui de générer du code HTML ou une page HTML d'après une TODO list. L'utilisation de ces outils est expliquée plus loin.
Enfin, une vue "tdl" utilisant cette bibliothèque est disponible dans Chamo.
La documentation générée par OCamldoc est accessible ici: Tdl
,
Tdl_gui
.
Le programme tdl.{x,byte} permet d'éditer graphiquement des TODO lists. Le fichier à éditer est donné en argument sur la ligne de commande:
tdl.x file.tdl
L'outil tdl_export.{x,byte} permet de fusionner et/ou filtrer des TODO lists. Le résultat peut être une nouvelle TODO list ou bien un document XML au format RSS, construit en utilisant les dates des tâches de la TODO list finale.
tdl.x f1.tdl f2.tdl f3.tdl
cat f2.tdl | tdl.x f1.tdl - f3.tdl
tdl.x f1.tdl f2.tdl f3.tdl --filter 'not empty and state: done'
tdl.x f1.tdl f2.tdl f3.tdl --filter "state: done" --rss > output.rss
tdl.x f1.tdl f2.tdl f3.tdl --filter "state: done" --split-by-day /tmp/things-done
Un petit langage permet de définir des filtres sur les TODO lists, c'est-à-dire des conditions sur les groupes et les items pour les sélectionner. Voici une description de ce langage dans le style BNF:
FILTER ::=
| group: REGEXP
| item: REGEXP
| empty
| state: STATE
| desc: REGEXP
| before DATETIME
| FILTER and FILTER
| FILTER or FILTER
| not FILTER
| ( FILTER )
STATE ::=
| done
| suspended
| high
| normal
| low
REGEXP ::=
| quoted_string
| [^'\n' '"' '(' ')' ' ' '\009' '\012' ':' '/' '<' '>']+
DATETIME ::=
| [0-9]+-[0-9]+-[0-9]+
| [0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+:[0-9]+
REGEXP est une expression régulière comme celles du module Str d'Objective-Caml.
DATETIME peut être par exemple "2007-08-08" ou "2007-08-08 23:12:07". Si aucune heure n'est indiquée, l'heure, la minute et la seconde sont considérées comme étant à 0.
Comme on peut le voir, les filtres sur les groupes et les items sont indiqués ensemble dans la même expression. C'est pour simplifier l'expression des filtres. En réalité, quand un filtre est appliqué à une TODO list, il est séparé en deux filtres: l'un pour les groupes, l'autre pour les items. En effet, certains filtres sont invalides pour les groupes (comme "state: done") tandis que d'autres sont invalides pour les items (comme "empty"). Par exemple le filtre "state: done and not empty" donnera deux filtres: "state: done" pour les items et "not empty" pour les groupes.
