v2 / examples / lorem.v
60 lines · 49 sloc · 1.67 KB · e2e5cf8db56f3562c7baa735061690be936bdf3e
Raw
1/*
2Random Markov Text Generator
3
4This program generates pseudo-random text using a Markov chain built from
5one of several embedded corpora in the strings module. It produces structured output in the
6form of paragraphs and sentences, with configurable parameters.
7
8Usage:
9
10 v run lorem.v [--options]
11 ./lorem [--options]
12
13Example:
14
15 ./lorem -order 2 -words 12 -sentences 4 -paragraphs 3 -corpus poe
16*/
17import strings.lorem
18import flag
19import os
20import rand
21import time
22
23fn main() {
24 mut fp := flag.new_flag_parser(os.args[1..])
25 fp.application('lorem')
26 fp.version('1.0')
27 fp.description('Random text generator using a Markov chain')
28
29 order := fp.int('order', `o`, 2, 'Markov order [default: 2]')
30 words_per_sentence := fp.int('words', `w`, 10, 'Words per sentence [default: 10]')
31 sentences_per_paragraph := fp.int('sentences', `s`, 5, 'Sentences per paragraph [default: 5]')
32 paragraphs := fp.int('paragraphs', `p`, 3, 'Paragraph count [default: 3]')
33 corpus_name := fp.string('corpus', `c`, 'lorem',
34 'Corpus name (lorem, poe, darwin, bard) [default: lorem]')
35 seed_text := fp.string('seed', `S`, '', 'Seed phrase (random if omitted)')
36 mut rng_seed := fp.int('rngseed', `r`, 0, 'RNG seed (0 = random)')
37
38 fp.finalize() or {
39 eprintln(err)
40 return
41 }
42
43 if rng_seed == 0 {
44 t := time.now().unix_milli()
45 rand.seed([u32(t), u32(t >> 32)])
46 rng_seed = rand.int()
47 }
48
49 text := lorem.generate(
50 markov_order: order
51 words_per_sentence: words_per_sentence
52 sentences_per_paragraph: sentences_per_paragraph
53 paragraphs: paragraphs
54 corpus_name: corpus_name
55 seed_text: seed_text
56 rng_seed: rng_seed
57 )
58
59 println(text)
60}
61