]> git.scottworley.com Git - paperdoorknob/blob - args.py
384e4487b76bfb918f7316dee8604276f92e1cc5
[paperdoorknob] / args.py
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
8 from argparse import ArgumentParser
9 from contextlib import contextmanager
10 import os.path
11
12 from typing import Iterator
13
14 from xdg_base_dirs import xdg_cache_home
15
16 from domfilter import ApplyDOMFilters, DOMFilters
17 from fetch import CachingFetcher
18 from glowfic import BesideIconLayout, BelowIconLayout, Layout
19 from htmlfilter import ApplyHTMLFilters, HTMLFilters
20 from texfilter import ApplyTexFilters, TexFilters
21 from images import DiskImageStore
22 from spec import Spec
23 from texify import PandocTexifier
24
25
26 def _command_line_parser() -> ArgumentParser:
27 parser = ArgumentParser(prog='paperdoorknob', description='Print glowfic')
28 parser.add_argument(
29 '--cache_path',
30 metavar='PATH',
31 help='Where to keep the http cache (instead of %(default)s)',
32 default=os.path.join(xdg_cache_home(), "paperdoorknob"))
33 parser.add_argument(
34 '--domfilters',
35 help='Which DOM filters to use (default: %(default)s)',
36 default=','.join(f[0] for f in DOMFilters))
37 parser.add_argument(
38 '--geometry',
39 help='''Page size and margin control
40 See https://faculty.bard.edu/bloch/geometry.pdf for details
41 (default: %(default)s)''',
42 default='paperwidth=5.5in,paperheight=8.5in,nohead,' +
43 'tmargin=15mm,hmargin=15mm,bmargin=17mm,foot=4mm')
44 parser.add_argument(
45 '--htmlfilters',
46 help='Which HTML filters to use (default: %(default)s)',
47 default=','.join(f[0] for f in HTMLFilters))
48 parser.add_argument(
49 '--image_size',
50 help='How large the icon images are, in mm',
51 default=20)
52 parser.add_argument(
53 '--layout',
54 default='below',
55 help='Whether to put character and author information `beside` or `below` the icon ' +
56 '(default: below)')
57 parser.add_argument(
58 '--out',
59 help='The filename stem at which to write output ' +
60 '(eg: "%(default)s" produces %(default)s.tex, %(default)s.pdf, etc.)',
61 default='book')
62 parser.add_argument('--pandoc', help='Location of the pandoc executable')
63 parser.add_argument(
64 '--texfilters',
65 help='Which TeX filters to use (default: %(default)s)',
66 default=','.join(f[0] for f in TexFilters))
67 parser.add_argument(
68 '--timeout',
69 help='How long to wait for HTTP requests, in seconds',
70 default=30)
71 parser.add_argument(
72 'url',
73 help='URL to retrieve (example: https://www.projectlawful.com/posts/4582 )')
74 return parser
75
76
77 @contextmanager
78 def spec_from_commandline_args() -> Iterator[Spec]:
79 args = _command_line_parser().parse_args()
80 texifier = PandocTexifier(args.pandoc or 'pandoc')
81 layout: Layout
82 if args.layout == 'below':
83 layout = BelowIconLayout(texifier, args.image_size)
84 elif args.layout == 'beside':
85 layout = BesideIconLayout(texifier, args.image_size)
86 else:
87 raise ValueError(f'Unknown layout: {args.layout}')
88 with CachingFetcher(args.cache_path, args.timeout) as fetcher:
89 with open(args.out + '.tex', 'wb') as texout:
90 yield Spec(
91 args.url,
92 fetcher,
93 DiskImageStore(args.out + '_images', fetcher),
94 lambda x: ApplyHTMLFilters(args.htmlfilters, x),
95 lambda x: ApplyDOMFilters(args.domfilters, x),
96 lambda x: ApplyTexFilters(args.texfilters, x),
97 layout,
98 args.geometry,
99 texout)