Ogma

Visualiser une histoire dans le temps et dans l’esipace

a marqué ce sujet comme résolu.

Bonjour à tous. Depuis maintenant plusieurs années, j’ai un projet qui me trotte dans la tête et que je repousse par manque de temps et motivation ; il se trouve si je manque toujours de temps, j’ai depuis quelques mois un peu plus de motivation et j’ai commencé à me mettre plus ou moins sérieusement (ça dépend des jours) à travailler sur Ogma.

L’idée de base

Ogma, c’est quoi ? Dans l’idée, c’est un outil qui permet de visualiser une histoire dans le temps et dans l’espace. L’idée est d’encourager un (des) écrivain(s) à ajouter des métadonnées à leurs textes (et en particulier, la date et l’endroit de l’action) pour pouvoir ensuite réafficher ses informations par le biais de deux widgets sélecteurs : une carte et une frise chronologique.

En plus de ces deux informations de base, j’imagine de rajouter d’autres informations comme les personnages présents (j’ai déjà des moyens d’extraire ceux qui parlent automatiquement, j’y reviendrai), etc. Toujours dans cette idée de restituer ces informations pour qu’un écrivain puisse se « promener » dans son histoire, retrouver les sections qui l’intéressent, se souvenir de ce qu’il s’est passé, etc.

C’est vaste et c’est surtout très éloigné de ce que je fais d’ordinaire (en gros, du Coq et de l’ASM).

Ogmarkup

Il fallait donc faire les choses par étapes et la première, qui est bien avancée maintenant, c’est l’ogmarkup. L’ogmarkup, c’est un langage de markup vaguement inspiré de markdown, mais avec l’objectif d’écriture littéraire en tête.

Syntaxe

Le +gras+, l’*italique* mais aussi les"quotes"` sont gérées. Pourquoi je parle des citations ? Parce qu’un des autres objectifs de l’ogmarkup est de s’occuper de la typographie. J’ai un clavier bépo et j’essaie de faire attention dans la mesure du possible aux espaces insécables, aux guillemets français, etc. mais parfois, c’est un peu chiant. Du coup, c’est gérer par le langage et c’est tant mieux.

Au delà d’un formatage très basique, « l’innovation » (je n’ai pas été voir la concurrence, c’est donc dit en toute humilité) c’est des balises pour les pensées et des dialogues.

La balise dialogue ressemble à ça :

1
[Bonjour! |cria-t-elle en sa direction.| Comment vas-tu ?](Sarah)

La réplique est entre crochets, l’incise (optionnelle) entre pipes et le code/nom du personnage (optionnel aussi) est entre parenthèses. On peut donc imaginer :

1
2
3
[Blablba.]
[Bla|, blublu.|]
etc.

Au passage, les pensées ont une syntaxe similaire, il suffit simplement de remplacer [] par <>.

Les paragraphes sont séparées par une ligne vide (le retour à la ligne simple n’est pas pris en compte) et il est possible de séparer des paragraphes d’autres pour, par exemple, isoler un flashback.

1
2
3
4
5
6
7
Du texte, du texte, du texte.

________
Un flashback.
________

Du texte, du texte, du texte.

Une section de ce type peut avoir une classe mise en évidence ;

1
2
3
_____flashback______
Un flashback.
_____________________

Implémentation et résultat

L’ogmarkup a été implémenté en Haskell et une première version a été publiée sur Hackage. Un deuxième (petit) package a aussi été publié pour utilisé ogmarkup avec Hakyll. Le code est sur Github si vous voulez y jeter un œil.

Il n’y a pas vraiment d’output standardisé, c’est assez facile d’écrire une configuration spécifique en Haskell pour définir les templates à appliquer à chaque élément.

À noter que le gros avantages des balises dialogues restent de gérer la succession des dialogues et les incises. En quelques examples, parce que ça sera plus parlant :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[Bonjour.]
« Bonjour. »

[Bonjour|, dit-il.|]
« Bonjour », dit-il.

[Bonjour|, dit-il.| Comment allez-vous ?]
« Bonjour, dit-il. Comment allez-vous ? »

[Bonjour !]
[Salut…]
« Bonjour !
— Salut… »

J’avais un démonstrateur en ligne, mais ça fait un moment qu’il n’a pas été mis à jour.

En projet

Outre la possibilité de changer de lib pour le parseur (en vrai, je ne suis vraiment pas chaud), j’étudie actuellement la possibilité de rajouter une espèce de méta-balise @<ident>(<texte>) pour gérer des cas spécifiques à un projet en particulier ; par exemple, si on veut gérer les noms de marque d’une manière particulière, on pourrait avoir @brand(Intel).

La suite du projet

Ce week-end, j’ai découvert Hakyll, du coup je « perds » un peu de temps pour générer facilement des sites de présentations d’histoire écrites en ogmarkup. Ça ne me détourne pas, cependant, de mon projet principal. Le serveur d’Ogma sera écrit en Haskell et utilisera servant. J’ai déjà bossé un peu sur l’authentification (qui n’est pas encore très mature dans le projet) et c’est quelque chose qu’il faudra que je pousse chez eux pour voir ce qu’ils en pensent.

Pour ce qui est du front, je n’en sais trop rien encore, mais j’ai dans l’idée :

  • d’utiliser ghcjs (haskell -> js)
  • ou d’utiliser purescript (langage inspiré d’Haskell et prévu pour être compilé vers le js)

Voilà voilà, c’est peut-être un peu tôt encore, mais je me suis dit que ça intéresserait peut-être des gens. Merci si vous avez lu jusqu’au bout (:

+9 -0

Salut !

Bravo pour ton projet, mais pourquoi pas tout simplement étendre markdown au lieu de le réinventer ? Et où et sous quel forme je met les métadonnées ? Pour le lieu, des coordonnées GPS ? Pour la date, en format iso ? Que des questions sans réponses :p

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte