We’re working on typesetting scenarios. The first iteration of this aims at the following:
- Subplot reads the markdown input, and a YAML file with bindings. The YAML file is named in the markdown’s metadata block (a Pandoc extension to markdown).
- The bindings may capture parts of a step using regular expressions.
- Each scenario snippet is typeset separately.
- Each step in a snippet is typeset separately.
- There is no support for “and” or “but”. The keyword must be one of “given”, “when”, or “then”.
- The keyword of a step is typeset in italics.
- Captured parts of a step are typeset in bold face.
- The rest of the step is typeset in a normal font.
- Steps that do not match a binding, or have an unknown keyword, or otherwise are problematic, are typeset in monospace and have a question mark prepended to them. A descriptive error message is added to the document as well.
To implement this, I’m going to want a couple of abstractions:
- A snippet parser, as an iterator over unparsed steps (string slices).
- A step parser, which takes an unparsed step (a string slice), and returns a parsed step.
A parsed step is matched against all known bindings. It can either be a successful match, or an unsuccessful one.
A successful match consists of a step kind (keyword), and a list of partial steps. A partial step is either captured or uncaptured parts of the step.
Given a binding file like this:
- given: I am (?P<name>\S+)
- when: I declare myself (king|queen)
- then: everyone agrees
And a scenario snippet like this:
given I am Tomjon
when I declare myself king
then there is applause
This would result in the following parse results:
- A matched step, with keyword given, an uncaptured part “I am” and a captured part “Tomjon”
- A matched step, with keyword when, and an uncaptured part “I declare myself king”
- An unmatched step, with text “then there is applause”