]> git.scottworley.com Git - paperdoorknob/commitdiff
`beside` layout
authorScott Worley <scottworley@scottworley.com>
Sun, 24 Dec 2023 06:02:35 +0000 (22:02 -0800)
committerScott Worley <scottworley@scottworley.com>
Sun, 24 Dec 2023 06:02:35 +0000 (22:02 -0800)
args.py
glowfic.py

diff --git a/args.py b/args.py
index e952c45040c77f503e7ec8cd2990540b87f3dbd0..8f77a887547b403d311ee0939a5a423b168aa88a 100644 (file)
--- 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)
index eadc40ab9cb8ccdba5c94db453e809ffa24964a6..d1966cae628267177b08789aaf8714c81c01f6d3 100644 (file)
@@ -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))