jouvence v1.0.1
Jouvence (version 1.0.1)
Jouvence is a javascript library to parse a screenplay written in Fountain.
Fountain is a text format, similar to Markdown, but designed specifically to write screenplays.
To quote from the Fountain web site:
Fountain allows you to write screenplays in any text editor on any device. Because it’s just text, it’s portable and future-proof.
Jouvence is an event driven parser
Jouvence is an event-driven parser: it operates on each piece of the Fountain input sequentially and reports each parsing event as it happens.
Jouvence sends notification while it is parsing the content instead of providing a model of the content of the Fountain document at the end of the parsing.
Installation
To install the jouvence package, just type:
npm install jouvenceif you want to update your package.json file:
npm install --save jouvenceUsage
If you have a Fountain file, like the sample file BrickAndSteel.fountain that you can find on the Fountain website, you can parse it with this simple code:
var jouvence = require('jouvence');
var input = jouvence.input().fromFile('BrickAndSteel.fountain');
var parser = jouvence.parser();
parser.parse(input, jouvence.dummyNotification())
.then(function(){
console.log("Done");
})
.catch(function(err){
console.log("Error:", err);
});API details
Once you have imported the jouvence API with `require('jouvence'), you then have access to 3 classes:
Input : jouvence.input()
This class allows you to define the way you want to inject your fountain screenplay into the parser.
You have 3 options:
- you can provide a file (like the example above):
jouvence.input().fromFile(<path of the file>) - you can provide a string:
jouvence.input().fromString('<your fountain data>') - you can provide a regular (node/Stream) Readable:
jouvence.input().fromReadStream(<readable instance>)
All those methods return an object which can be parsed by the Fountain parser:
Fountain parser: jouvence.parser()
This parser has a single method parse() which takes 2 parameters:
- the
inputas returned from thejouvence.input()class - a class which will provide all the callbacks require to process the parsing events (see next section).
As the parsing is asynchronous, the parse() method returns a Promise : when the processing is over, the then() method is called.
parsing notification callbacks
As mentioned above, the parser expects a class which will provide all the callbacks methods to receive the parsing events.
There is a helper class, returned by jouvence.dummyNotification() which will provide a starting point for your own implementation.
With the example above, this class outputs the events it receives from the parser:
tartOfDocument
titlePage: { Title: [ '_**BRICK & STEEL**_', '_**FULL RETIRED**_' ],
Credit: [ 'Written by' ],
Author: [ 'Stu Maschwitz' ],
Source: [ 'Story by KTM' ],
'Draft date': [ '1/27/2012' ],
Contact:
[ 'Next Level Productions',
'1588 Mission Dr.',
'Solvang, CA 93463' ] }
sceneHeading:<EXT. BRICK'S PATIO - DAY> { lineno: 13 }
action:<A gorgeous day. The sun is shining. But BRICK BRADDOCK, retired police detective, is sitting quietly, contemplating -- something.> options: undefinedThe easiest way to create your own callback class is to copy and paste the code from this sample notification class and provide your own implementation.
Callbacks description
| Callback name | Description |
|---|---|
startOfDocument | called when the parsing starts |
titlePage (metainformation) | called when the title page information is parsed. metainformation contains is a map with all the key/values from the title page |
sceneHeading(sceneHeading, extra) | called when a scene heading is parsed. extra.lineno contains the line number of the input. |
action(action, blocks, options) | called when an action is parsed. blocks contains the comments or notes which may have been inserted in the action |
pageBreak | called when a page break is parsed |
dualDialogueStart | called when a dual dialogue is about to start |
dualDialogueEnd | called when a dual dialogue ends |
dialogueStart | called when a dialogue is about to start |
dialogueEnd | called when a dialogue ends |
character(character, option) | called when a character is parsed. option.extension contains the optional extension |
parenthetical(parenthetical) | called when a parenthetical is parsed |
dialogue(dialogue) | called when a dialogue is parsed |
transition(transition) | called when a transition is parsed |
section(section, level, extra) | (optional) Called when a section is parsed. |
synopsis(synopsis) | (optional) called when a synopsis is parsed. |
block(blocks) | (optional) Called when a comments or notes have been parsed |
endOfDocument | Called when the end of the input is reached |
emphasis parser: jouvence.parseEmphasis()
This last class allows you to parse the emphasis in the strings returned in the API parsing events.
This is a synchronous parser which returns a data structure describing the different parts of the string:
var parts = emParser.parse("This is *italics* and that is **bold**");
console.log("Parts :" + require('util').inspect(parts, { showHidden: false, depth: null }));The result is:
Parts :{ type: '.',
parts:
[ { type: '.', text: 'This is ' },
{ type: '*', parts: [ { type: '.', text: 'italics' } ] },
{ type: '.', text: ' and that is ' },
{ type: '**', parts: [ { type: '.', text: 'bold' } ] } ] }