# Madlang DSL for generating random text [![Build Status](https://travis-ci.org/vmchale/madlibs.svg?branch=master)](https://travis-ci.org/vmchale/madlibs) This is the Madlang DSL for generating text. You specify a template, and Madlang will create randomized text from the template. Madlang is an interpreted language, written in Haskell. It runs from the command line, but also provides a Haskell library that can be integrated into [other projects](https://github.com/vmchale/toboggan), compiled to a [web app](https://github.com/vmchale/madlang-reflex), or used as an EDSL. There is also a vim plugin for syntax highlighting, available [here](https://github.com/vmchale/madlang-vim). It can be used for twitter bots (among other things) and provides human-readable syntax for generating text. ## Examples ```madlang # Madlang is a declarative language. The most basic component is a function, viz. :define coinFlip 1.0 "heads" 1.0 "tails" :define die 1.0 "1" 1.0 "2" 1.0 "3" 1.0 "4" 1.0 "5" 1.0 "6" # Madlang also has categories, that is, a collection of functions that can be # bundled together :category gambling coinFlip die # :return declarations handle the actual output :return 0.7 gambling 0.3 gambling.to_upper # .to_upper is a modifier which make the whole string uppercase ``` ### Syntax There are two keywords in madlang you'll use most: `:define` and `:return`. `:return` is the main string we'll be spitting back; there can be only one per file. `:define` on the other hand can be used to make functions. These functions are combinations of templates, organizing pairs of weights and strings. There is a Shakespearean insult generator demo available in `demo/shakespeare.mad` ## Installation ### Releases ### Nix If you're on linux or mac, you can get up-to-date binaries via nix. Download nix with ``` curl https://nixos.org/nix/install | sh ``` From there, `nix-env -i madlang` will install the proper executables. ### Stack Download `stack` with ``` curl -sSL http://haskellstack.org | sh ``` Then run `stack install madlang --resolver nightly` and you'll get the `madlang` executable installed on your path. This may take a bit of time, as it will build *all* dependencies of `madlang` first. ### Use To use it, try ``` $ madlang run demo/shakespeare.mad ``` You can do `madlang --help` if you want a couple other options for debugging. ## Using the Haskell library One function you might want to use is `runFile`; it reads a file and generates randomized text: ``` λ:> runFile [] "demo/shakespeare.mad" "Thou hasty-witted gleeking puttock!" ``` To use the library as an EDSL, there are two options: splicing in a file or using a quasi-quoter, viz. ```haskell demo :: IO T.Text demo = run $(madFile "demo/shakespeare.mad") demo :: IO T.Text demo = run [|madlang :define f 1.0 "heads" 1.0 "tails" :return 1.0 f|] ``` Haddock documentation of all library functionality is located [here](https://hackage.haskell.org/package/madlang#readme). ## Syntax Highlighting Syntax highlighting for the DSL is provided in the vim plugin [here](http://github.com/vmchale/madlang-vim). It includes integration with [syntastic](https://github.com/vim-syntastic/syntastic).