Voxpop
Voxpop generates text from declarative grammars.
It is roughly a version of Calyx ported to Elixir.
Installation
If available in Hex, the package can be installed as:
Add voxpop to your list of dependencies in
mix.exs:def deps do
[{:voxpop, "~> 0.0.2"}]end
Usage
The API is still currently in flux while I work some things out, but in the general case, you do things like this:
iex> Voxpop.generate %Voxpop.Grammar.Definition{start: "Hello {greeting}!", rules: %{greeting: "world"}}
"Hello World"Your rules can have multiple options which will be randomly chosen:
%Voxpop.Grammar.Definition{start: "Hello {group}!", rules: %{group: ["comrades", "folks", "friends"]}}There is also a DSL, if you’d prefer to define your grammar as part of a module:
defmodule MyGrammar do
use Voxpop.Grammar
start "{greeting} {group}!"
rule :greeting, "Hello"
rule :group, "World"
end
MyGrammar.evaluateYou can also evaluate using a run-time defined start rule:
MyGrammar.evaluate("{group}, {greeting}!")Plans
The plan is to make Voxpop powerful enough that it can generate text for sophisticated applications like chat user interfaces. That is going to take a few steps:
- [ ] Weighted Choices
- [ ] Dynamic generation with generation-time context
- [ ] Per-generation repetition avoidance in choices
- [ ] Loading grammars from JSON or other format
- [ ] Visualising evaluated AST
- [ ] OTP application to reduce the requirement to rebuild grammars loaded at runtime