turns out twee, the plain text twine format, is dead simple. a little sed and a recfmt template, and now we have twine support! installed tweego[1] and now i have a little html pipeline! and with the twison format library[2] i also get a json object of the whole game in case i want to embedd it in some other framework or something. the only kind of annoying part is that instead of generating json, it generates a preformatted html tag full of the json object that is created on the fly with javascript. so you can't just dump the contents. you have to open a browser and copy the contents of the div to a file. unless you use like, a headless browser or something. [1]: https://www.motoslave.net/tweego/docs/ [2]: https://github.com/lazerwalker/twison
		
			
				
	
	
		
			118 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
| db := 'db/game.rec'
 | |
| 
 | |
| # show all commands
 | |
| default:
 | |
|   just --list --unsorted
 | |
| 
 | |
| # super plain boring output
 | |
| _map:
 | |
|   recsel -t game {{db}} | recfmt '"{{{{name}}": "{{{{id}}", '
 | |
| 
 | |
| # build dot file (tmp file)
 | |
| _dot:
 | |
|   make dot
 | |
| 
 | |
| # build data object (tmp file)
 | |
| _data:
 | |
|   make data
 | |
| 
 | |
| # build a graph of all the nodes
 | |
| graph:
 | |
|   make graph
 | |
| 
 | |
| # plain output
 | |
| build: _data
 | |
|   mustache tmp/data {{db}} \
 | |
|   | recfmt '{{{{id}}: {{{{text}}|' \
 | |
|   | sed -e 's/|/\n\n/g' \
 | |
| 
 | |
| # read the story
 | |
| browse:
 | |
|   just build | fmt | less
 | |
| 
 | |
| # remove generated files
 | |
| clean:
 | |
|   rm -f tmp/* out/*
 | |
| 
 | |
| # word count and number of nodes
 | |
| info:
 | |
|   echo "$(recinf -t game {{db}}) nodes" \
 | |
|   && echo "$(recsel -t game -P text {{db}} | wc -w | awk '{ print $1}') words"
 | |
| 
 | |
| # rebulid graph on change
 | |
| watch-graph:
 | |
|   ls {{db}} | entr -c just graph
 | |
| 
 | |
| # rebulid pdf on change
 | |
| watch-pdf:
 | |
|   ls {{db}} | entr -c just pdf
 | |
| 
 | |
| # shuffle ids
 | |
| _shuffle:
 | |
|   recsel -t game -P id -C db/game.rec \
 | |
|   | shuf --random-source=/dev/urandom \
 | |
|   | gsed -e '/^0$/d' -e '1 i 0'
 | |
| 
 | |
| # story in random order, starting with 0
 | |
| randomize:
 | |
|   for n in $(just _shuffle); do recsel -t game -e "id='$n'" db/game.rec; echo; done
 | |
| 
 | |
| # renumber the randomized list
 | |
| renumber:
 | |
|   #!/usr/bin/env zsh
 | |
|   tmpfile=$(mktemp)
 | |
|   echo "$tmpfile"
 | |
|   cp {{db}} {{db}}.bak
 | |
|   just randomize > "$tmpfile"
 | |
|   j=$(recinf -t game "$tmpfile")
 | |
|   recdel -t game -n 0-$((j - 1)) {{db}}
 | |
|   for i in {0..$((j - 1))}
 | |
|   do
 | |
|     name=$(recsel -n "$i" -P name "$tmpfile")
 | |
|     text=$(recsel -n "$i" -P text "$tmpfile")
 | |
|     #echo "$i $name $text"
 | |
|     recins -t game -f name -v "$name" -f text -v "$text" {{db}}
 | |
|   done
 | |
|   rm "$tmpfile"
 | |
| 
 | |
| # make ms
 | |
| _ms: 
 | |
|   make ms
 | |
| 
 | |
| # make pdf
 | |
| pdf:
 | |
|   make pdf
 | |
| 
 | |
| # make ascii doc
 | |
| ascii:
 | |
|   make ascii
 | |
| 
 | |
| # make twee
 | |
| twee:
 | |
|   #!/usr/bin/env zsh
 | |
|   exec > out/story.twee
 | |
|   cat<<EOF
 | |
|   :: StoryTitle
 | |
|   CORNQUEST
 | |
|   
 | |
|   :: StoryData
 | |
|   {
 | |
|     "start": "beginning",
 | |
|     "ifid": "BDB6BEED-D6E0-4F71-9227-A8AD27067935"
 | |
|   }
 | |
| 
 | |
|   EOF
 | |
|   mustache tmp/data <(sed 's/{{{{\([^}]*\)}}/[[{{{{\1}}|\1]]/g' {{db}}) | recsel -t game | recfmt -f templates/twee.template
 | |
| 
 | |
| # make twine html
 | |
| html: twee
 | |
|   tweego --format=harlowe-3 --output=out/story.html out/story.twee
 | |
| 
 | |
| # make twine json
 | |
| json: twee
 | |
|   tweego --format=twison --output=out/json.html out/story.twee
 | |
| 
 | |
| # generate tags
 | |
| tags:
 | |
|   make tags
 |