#!/usr/bin/awk -f function printusage() { print "Usage: lipsum [# of] [w/words|s/sentences|p/paragraphs] [1/t/true|0/f/false output 'lorem ipsum' in first entry] [min words] [max words]\n" exit 1 } function capitalize(word) { sub(/./, toupper(substr(word, 0, 1)), word) print word } function isint(arg) { return arg ~ /^[0-9]+$/ } function randrange(min, max) { return int((rand() * (max - min)) + min) } function genword() { wc++ # There's gotta be a more efficient way of doing this return (wc > 5 || !litextout) ? word[randrange(0, dictlen)] : litext[wc - 1] } function genwords(words) { if (words > 0) { capitalize(genword()) for (i = 1; i < words; i++) print " " genword() print "\n" } } function gensentences(sentences, delim, min, max) { for (; sentences > 0; sentences--) { capitalize(genword()) words = randrange(min, max) # Isn't possible to initialize or increment multiple variables in awk for loops for (i = 1; i < words; i++) print (rand() < 0.10 ? ", " : " ") genword() print delim } } function genparagraphs(paragraphs, min, max) { for (; paragraphs > 0; paragraphs--) { print "\t" gensentences(randrange(6, 10), ". ", min, max) print "\n" } } BEGIN { dictionary = "/home/timmy/.local/share/lorem-ipsum-dictionary" # List of lorem ipsum words separated by newlines litext[0] = "lorem"; litext[1] = "ipsum"; litext[2] = "dolor"; litext[3] = "sit"; litext[4] = "amet" ORS = "" srand() for (dictlen = 0; getline < dictionary; dictlen++) word[dictlen] = $0 # Parse Arguments !isint(ARGV[1]) && ARGV[1] && printusage() numof = ARGC > 1 ? ARGV[1] : 5 mode = ARGC > 2 ? ARGV[2] : "p" litextout = 1 if (ARGV[3]) switch (ARGV[3]) { case /^1$|^t$|^true$/: litextout = 1; break case /^0$|^f$|^false$/: litextout = 0; break default: printusage() } min = isint(ARGV[4]) ? ARGV[4] : 5 max = isint(ARGV[5]) ? ARGV[5] : 12 switch (mode) { case /^w$|^words$/: genwords(numof) break case /^s$|^sentences$/: gensentences(numof, ".\n", min, max) break case /^p$|^paragraphs$/: genparagraphs(numof, min, max) break default: printusage() } }