1
Fork 0

Use a lua filter rather than a massive python script

This commit is contained in:
Jake Howard 2018-04-01 12:38:09 +01:00
parent 631e948548
commit 55603857da
5 changed files with 39 additions and 79 deletions

View file

@ -6,12 +6,6 @@ jobs:
working_directory: ~/tex-template working_directory: ~/tex-template
steps: steps:
- checkout - checkout
- run:
name: Install Dependencies
command: apt-get install -y python-flake8
- run:
name: Lint
command: flake8 build.py --ignore=E128,E501
- run: - run:
name: Test build name: Test build
command: python3 build.py test/main.md command: bash build.sh test/main.md

View file

@ -1,68 +0,0 @@
#!/usr/bin/env python3
import argparse
import pathlib
import os
import subprocess
import re
import tempfile
CWD = pathlib.Path(os.getcwd())
BASE_DIR = pathlib.Path(os.path.dirname(os.path.abspath(__file__)))
TEMPLATE_FILE = BASE_DIR / 'main.tex'
OUTPUT_FILE = CWD / 'output.pdf'
WORDCOUNT_TEMPLATE = BASE_DIR / 'wordcount.yaml'
def build(input_file, additional_args=None):
build_args = ['pandoc', str(input_file)]
if additional_args is not None:
build_args.extend(additional_args)
build_args.extend([
'--template',
str(TEMPLATE_FILE),
'-o',
str(OUTPUT_FILE)
])
subprocess.check_output(build_args, cwd=str(BASE_DIR))
def get_word_count():
words = subprocess.check_output([
'pdftotext', str(OUTPUT_FILE), '-'
], cwd=str(BASE_DIR))
return len(re.findall(r'\w+', words.decode()))
def write_wordcount():
_, out_file_path = tempfile.mkstemp(suffix='.yaml')
wordcount = get_word_count()
with open(out_file_path, 'w') as out_file:
with WORDCOUNT_TEMPLATE.open() as template:
out_file.write(template.read().format(wordcount=wordcount))
return pathlib.Path(out_file_path)
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="Set verbosity level (repeat argument)", action="count", default=0)
parser.add_argument("input", help="Input File", action='store', type=pathlib.Path,)
parser.add_help = True
return parser.parse_args()
if __name__ == '__main__':
args = parse_args()
input_file = args.input.resolve()
operating_dir = input_file.parents[0]
context_file = operating_dir.joinpath('context.yaml')
if not input_file.is_file():
raise ValueError("Failed to find {}".format(input_file))
additional_args = []
if context_file.exists():
additional_args.append(str(context_file))
build(input_file, additional_args)
additional_args.append(write_wordcount())
build(input_file, additional_args)

15
build.sh Executable file
View file

@ -0,0 +1,15 @@
#!/usr/bin/env bash
SCRIPT=`realpath $0`
SCRIPTPATH=`dirname $SCRIPT`
INPUT_FILE=`realpath $1`
OUTPUT_FILE=output.pdf
PANDOC_ARGS="$INPUT_FILE --template $SCRIPTPATH/main.tex -o $OUTPUT_FILE"
echo "Building document..."
pandoc $PANDOC_ARGS
echo "Running second pass..."
pandoc $PANDOC_ARGS --lua-filter=second-pass.lua

23
second-pass.lua Normal file
View file

@ -0,0 +1,23 @@
function file_exists(name)
local f=io.open(name,"r")
if f~=nil then io.close(f) return true else return false end
end
local function countWords()
local rawText = pandoc.pipe("pdftotext", {"output.pdf", "-"}, "")
return pandoc.pipe("wc", {"-w"}, rawText)
end
return {
{
Meta = function(meta)
if file_exists("output.pdf") then
meta["wordcount"] = countWords()
meta["secondpass"] = true
end
return meta
end,
}
}

View file

@ -1,4 +0,0 @@
---
wordcount: {wordcount}
secondpass: true
...