]> git.scottworley.com Git - paperdoorknob/blame - args.py
Specify page geometry
[paperdoorknob] / args.py
CommitLineData
23f31879
SW
1# paperdoorknob: Print glowfic
2#
3# This program is free software: you can redistribute it and/or modify it
4# under the terms of the GNU General Public License as published by the
5# Free Software Foundation, version 3.
6
7
8from argparse import ArgumentParser
9from contextlib import contextmanager
10import os.path
11
12from typing import Iterator
13
14from xdg_base_dirs import xdg_cache_home
15
8be20b9d 16from domfilter import ApplyDOMFilters, DOMFilters
23f31879 17from fetch import CachingFetcher
929db576 18from htmlfilter import ApplyHTMLFilters, HTMLFilters
23f31879
SW
19from spec import Spec
20from texify import PandocTexifier
21
22
23def _command_line_parser() -> ArgumentParser:
24 parser = ArgumentParser(prog='paperdoorknob', description='Print glowfic')
25 parser.add_argument(
26 '--cache_path',
27 metavar='PATH',
28 help='Where to keep the http cache (instead of %(default)s)',
29 default=os.path.join(xdg_cache_home(), "paperdoorknob"))
8be20b9d
SW
30 parser.add_argument(
31 '--domfilters',
32 help='Which DOM filters to use (default: %(default)s)',
33 default=','.join(f[0] for f in DOMFilters))
e10b5b6f
SW
34 parser.add_argument(
35 '--geometry',
36 help='''Page size and margin control
37See https://faculty.bard.edu/bloch/geometry.pdf for details
38(default: %(default)s)''',
39 default='paperwidth=5.5in,paperheight=8.5in,nohead,' +
40 'tmargin=15mm,hmargin=15mm,bmargin=17mm,foot=4mm')
929db576
SW
41 parser.add_argument(
42 '--htmlfilters',
43 help='Which HTML filters to use (default: %(default)s)',
44 default=','.join(f[0] for f in HTMLFilters))
23f31879
SW
45 parser.add_argument(
46 '--out',
47 help='The filename stem at which to write output ' +
48 '(eg: "%(default)s" produces %(default)s.tex, %(default)s.pdf, etc.)',
49 default='book')
50 parser.add_argument('--pandoc', help='Location of the pandoc executable')
51 parser.add_argument(
52 '--timeout',
53 help='How long to wait for HTTP requests, in seconds',
54 default=30)
c04b2e78
SW
55 parser.add_argument(
56 'url',
57 help='URL to retrieve (example: https://www.projectlawful.com/posts/4582 )')
23f31879
SW
58 return parser
59
60
61@contextmanager
62def spec_from_commandline_args() -> Iterator[Spec]:
63 args = _command_line_parser().parse_args()
64 with CachingFetcher(args.cache_path, args.timeout) as fetcher:
65 with open(args.out + '.tex', 'wb') as texout:
929db576
SW
66 yield Spec(
67 args.url,
68 fetcher,
69 lambda x: ApplyHTMLFilters(args.htmlfilters, x),
8be20b9d 70 lambda x: ApplyDOMFilters(args.domfilters, x),
929db576 71 PandocTexifier(args.pandoc or 'pandoc'),
e10b5b6f 72 args.geometry,
929db576 73 texout)