From f75c16294c01dc2bdbe867e4477c2073c10680a8 Mon Sep 17 00:00:00 2001 From: Scott Worley Date: Sat, 23 Dec 2023 22:02:35 -0800 Subject: [PATCH] `beside` layout --- args.py | 16 ++++++++++++++-- glowfic.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/args.py b/args.py index e952c45..8f77a88 100644 --- a/args.py +++ b/args.py @@ -15,7 +15,7 @@ from xdg_base_dirs import xdg_cache_home from domfilter import ApplyDOMFilters, DOMFilters from fetch import CachingFetcher -from glowfic import BelowIconLayout +from glowfic import BesideIconLayout, BelowIconLayout, Layout from htmlfilter import ApplyHTMLFilters, HTMLFilters from images import DiskImageStore from spec import Spec @@ -48,6 +48,11 @@ See https://faculty.bard.edu/bloch/geometry.pdf for details '--image_size', help='How large the icon images are, in mm', default=20) + parser.add_argument( + '--layout', + default='below', + help='Whether to put character and author information `beside` or `below` the icon ' + + '(default: below)') parser.add_argument( '--out', help='The filename stem at which to write output ' + @@ -68,6 +73,13 @@ See https://faculty.bard.edu/bloch/geometry.pdf for details def spec_from_commandline_args() -> Iterator[Spec]: args = _command_line_parser().parse_args() texifier = PandocTexifier(args.pandoc or 'pandoc') + layout: Layout + if args.layout == 'below': + layout = BelowIconLayout(texifier, args.image_size) + elif args.layout == 'beside': + layout = BesideIconLayout(texifier, args.image_size) + else: + raise ValueError(f'Unknown layout: {args.layout}') with CachingFetcher(args.cache_path, args.timeout) as fetcher: with open(args.out + '.tex', 'wb') as texout: yield Spec( @@ -76,6 +88,6 @@ def spec_from_commandline_args() -> Iterator[Spec]: DiskImageStore(args.out + '_images', fetcher), lambda x: ApplyHTMLFilters(args.htmlfilters, x), lambda x: ApplyDOMFilters(args.domfilters, x), - BelowIconLayout(texifier, args.image_size), + layout, args.geometry, texout) diff --git a/glowfic.py b/glowfic.py index eadc40a..d1966ca 100644 --- a/glowfic.py +++ b/glowfic.py @@ -140,3 +140,38 @@ class BelowIconLayout(Layout): ''' % ( b'\\\\*'.join(x.encode('UTF-8') for x in meta if x is not None), self._texifier.texify(chunk.content)) + + +class BesideIconLayout(Layout): + + def __init__(self, texifier: Texifier, image_size: float) -> None: + self._texifier = texifier + self._image_size = image_size + + def renderChunk(self, chunk: Chunk) -> bytes: + icon = renderIcon(chunk.icon, self._image_size) + meta = [ + chunk.character, + chunk.screen_name, + chunk.author, + ] + + # Why is \textwidth not the width of the text? + # Why is the width of the text .765\textwidth? + return b'''\\noindent\\fbox{ +%s +\\parbox[b]{.765\\textwidth}{ +\\begin{center} +%s +\\end{center} +} +}\\\\* +\\vspace{-0.75em}\\\\* +\\noindent %s + +\\strut + +''' % ( + icon.encode('UTF-8') if icon else b'', + b'\\\\*'.join(x.encode('UTF-8') for x in meta if x is not None), + self._texifier.texify(chunk.content)) -- 2.44.1