Home

Awesome

sententia

Generate random adjective-noun combinations, madlibs-style, in Golang. Inspired by kylestetz's Sentencer (node.js module).

"Oh look, {{ an adjective }} {{ noun }}!"

becomes something like (it's random!):

"Oh look, a tameless recorder!"

sententia uses Go's text/template to identify the places where a new noun or adjective should be generated.

Use cases

Usage

Download the lib.

go get github.com/castillobgr/sententia
package main

import (
	"fmt"

	"github.com/castillobgr/sententia"
)

func main() {
	sentence, err := sententia.Make("Aw yis, {{ adjective }} {{ nouns }}.")
	if err != nil {
		panic(err)
	}
	fmt.Println(sentence)
}

Actions

Built in actions are:

noun

Picks a random noun and replaces it in the input.

sententia.Make("{{ noun }}")
// => "avenue", "knot", "show", "narcissus"

nouns

Picks a random noun and pluralizes it.

sententia.Make("{{ noun }}")
// => "harbors", "pumps", "overcoats", "gongs"

adjective

Is replaced in the template by a random adjective.

sententia.Make("{{ adjective }}")
// => "sprightful", "naif", "glowing", "surfy"

a and an

Can be used with adjective and noun to prefix them with an article (either "a" or "an")

sententia.Make("{{ a noun }}")
// => "a romanian", "an archer", "a tyvek"
sententia.Make("{{ an adjective }}")
// => "a sphygmic", "a clubby", "an uncocked", "a bumbling"

These all can be mixed to provide beautiful nonsensic sentences:

sententia.Make(
  "Once I had {{ an adjective }} {{ noun }} full of {{ nouns }} but they flew into {{ a noun }}.",
)
// => "Once I had a spleeny wallet full of toilets but they flew into an orchestra."

Extending sententia

Adjectives and nouns

sententia can be extended by adding custom nouns or adjectives, or overwriting the built-in ones.

customNouns := []string{"potato", "carrot", "letuce"}
sententia.AddNouns(nouns) // Apepnds the new nouns to the existent ones.
sententia.SetNouns(nouns) // Overwrites the existent nouns.

customAdjectives := []string{"delicious", "earthy", "healthy"}
sententia.AddAdjectives(customAdjectives) // Apepnds the new adjectives to the existent ones.
sententia.SetAdjectives(customAdjectives) // Overwrites existent adjectives.

Actions

Because sententia is based on Go's text/template package, we can also compose actions by feeding their output into other ones. For example, we could write an action to turn a noun into title case, where the first letter is upper case:

package main

import (
	"fmt"
	"strings"

	"github.com/castillobgr/sententia"
)

func main() {
	customActions := map[string]interface{}{
		"capitalize": strings.Title,
	}
	sententia.AddActions(customActions)
	sentence, err := sententia.Make(
		"She wrote a book called '{{ capitalize (an adjective) }} {{ capitalize noun }}'",
	)
	if err != nil {
		panic(err)
	}
	fmt.Println(sentence)
}

Then, we could get something like "She wrote a book called 'A Subdued Duckling'". Notice we have to group the actions with () for Go to interpret their output as input to capitalize. If you want a refresher on how Go templates handle arguments, check this out!