From e4650f6cf3d644d7e168c4f6739fb02c9a8699e7 Mon Sep 17 00:00:00 2001 From: Nycto Date: Wed, 15 Jul 2026 18:55:00 -0700 Subject: [PATCH 1/3] Render scripts without a title page in the script frame --- screenplain/export/pdf.py | 10 ++++++---- tests/files/dual-dialogue.pdf | Bin 25240 -> 25240 bytes 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/screenplain/export/pdf.py b/screenplain/export/pdf.py index 6331178..1bba128 100644 --- a/screenplain/export/pdf.py +++ b/screenplain/export/pdf.py @@ -298,12 +298,14 @@ def __init__(self, *args, **kwargs): id='title', leftPadding=0, topPadding=0, rightPadding=0, bottomPadding=0 ) - pageTemplates = [ - PageTemplate(id='title', frames=[title_frame]), - PageTemplate(id='standard', frames=[frame]) + title_template = PageTemplate(id='title', frames=[title_frame]) + standard_template = PageTemplate(id='standard', frames=[frame]) + page_templates = [ + *([title_template] if self.has_title_page else []), + standard_template, ] BaseDocTemplate.__init__( - self, pageTemplates=pageTemplates, *args, **kwargs + self, pageTemplates=page_templates, *args, **kwargs ) def handle_pageBegin(self): diff --git a/tests/files/dual-dialogue.pdf b/tests/files/dual-dialogue.pdf index 49c5b18565c53f5107abf5e5e5d8c33f78de80d2..cc13e91d8f14f703a700ff26f1bb39fcb6038a8e 100644 GIT binary patch delta 332 zcmajVO;UnT007`&-@aw}8>meDz4xF33=C}4L{XHO2vEqv2q9Wz7vCW`TD%RR(502(cU=^IFwcH!G zC33nlGj59WDw$y_qGAIWqbr>?(vqn0Wo3trjx*u;b=>0dfGUqgc%L-`)wP j_>lG?%P|21IG?3_3JNUbU=UFdg>wX@tN+IKH2C-hmP220 delta 332 zcmajV%Tj_+007Wo-@av!X)qM=f;^Mtib(lDlZ3$ZcJYEal9r9kwDSX6y74ob@dH}< z3w=-PR&CFm-GSO2sILt=;(5TUWm(b+fZu*1;}7hA&@r{C(G{(;c7o}1HBs5SWE{bF z&d`VTyiL~v*6}eej?Q~lQAcnvF6rc<-tP}?US^AYvweBpb4NMUw~MUev0Z3oQoWqD z)+;TgVZ{KRaIX3dQj)pOOvZ0Ufe$U4tHzKKmuzX2&Y63OAd7jG+~K@{GtRJM1B>*d zoDT%ECOYKy45UnmoYfNt=Aqe!%p$((66|`*0Q=3HX*KMz8>Z09TAEKs9X`6)f8!I% koG5}gRTDu=fS@FbB7(RqNty~KLZlEft?K`c?djy>7k*q{mjD0& From 1e536db239fef73b4098ef44d9f59436f5f47311 Mon Sep 17 00:00:00 2001 From: Nycto Date: Wed, 15 Jul 2026 18:57:04 -0700 Subject: [PATCH 2/3] Wrap parentheticals at the standard 2.5" width --- examples/Big-Fish.pdf | Bin 247788 -> 247792 bytes examples/Brick-and-Steel.pdf | Bin 77278 -> 77302 bytes examples/The-Last-Birthday-Card.pdf | Bin 77728 -> 77756 bytes screenplain/export/pdf.py | 36 ++++++++++-------- .../dual-dialogue-parenthetical.fountain | 7 ++++ tests/files/dual-dialogue-parenthetical.pdf | Bin 0 -> 25326 bytes 6 files changed, 28 insertions(+), 15 deletions(-) create mode 100644 tests/files/dual-dialogue-parenthetical.fountain create mode 100644 tests/files/dual-dialogue-parenthetical.pdf diff --git a/examples/Big-Fish.pdf b/examples/Big-Fish.pdf index c326c88924f4ed8c589a2fabae2f30c6d04e1a8e..e1bac05d0148e43fb99d4716822376654689a365 100644 GIT binary patch delta 7175 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 diff --git a/examples/Brick-and-Steel.pdf b/examples/Brick-and-Steel.pdf index 656da9576ab39ddcd1f90552caa62389b75a31a1..a4aee388e86fef2ea337bd4213c77b669eab4711 100644 GIT binary patch delta 4105 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 NElvM~psu6-{2w`EqQd|H delta 4051 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 V|0;g{TjeYJy9V(Cf@D+q@jqj`qUZns diff --git a/examples/The-Last-Birthday-Card.pdf b/examples/The-Last-Birthday-Card.pdf index 704cf183fc314d597174807e877b6158c990eb25..fe70dcb3a9fe159b4cdd80972974c40fd999f645 100644 GIT binary patch delta 1595 zcmaiwxvt_?9L9B}k)m9sjAoh?fDOhh-j5f!U~Ir(F!+LfS<|Xm~nMpO_M#`ysBp`Xf0y;}@KmGAu{N`Wa&4<}*vtEs8l3_+Tnd)*+fh3XQ6V~`@Mj5|86C)65ZjYGY0Uld zb7LaSxm{h!pLI^~u1~{>wi)F_fcb(YO%deGqsg%wg^q*MGBtoR&jzgaEM)^|Pkg9| z+Mu1;C$~26hBc;`kZM}4>*hokOA}-~OpD|Av!U7BEhD%5dA$We{?SsYyy{fbrDA^6 z-jgVYl*^8`K8~Zbb#>>{gGpxPX)l1Wn4hu zmel}BH=y@t1QB<5=?WG>k_@Eb&=PB{Sw}@V(6#6`R=vpE^)g&#%zSyt?!ypapukEi zv%(<3WRn*X#Ly^N3gSq|L(fq&SBMTmxNbC2mRKm-lTq+vSb1$=rBQET6eZO!Zy*Gl zx?38lc(tr7X7KYCzT%S#@)-$8z02wny_%ktx;7Et`wb7eZ1jD`Z^nC4U?o6Nr!%da=W0k zoI-_VCfkASLH${90`4M_unx5AF}k0dvW+8wvZ(TqYH->1V^{7UyJs_>D2$O+ zjyTno(@_tqfPWIuec0<>$>U~W#ix>j9nUB}&FWe~u4P)wRe(SEH+ERtpwIBk76~GaGU*;Sy)G7xpil_M@B6$be0kq z?R2BllIS|6^@?95L8`vdlJqk-`>5s`}Q67*H^-oC5Q;| z`9*e-`+q)w-~{rPkrXT3GD;BGTgDLl3oiiV3ol3T|9G!o7V`kS5DEfu8_1FjPu&!= z6rlNAMhgsg%K*cC+3~5LAXt_s>02Sk3Cu0y|Kk{ef3XZlGTdz*NAbj$#h-gQhImcg zPRIe86W;!g-F+w1JjYU>1_czw_^jtFT);BqVgWqcW|7W-&!7ULf5RDbnN- zB2Aleri=0dDdrg>CNxIejts6b?^^AdH(fc zAV?T5ogFLK_=mC;IN?NDqzH;5NRl7{EiinFAm9D@A@}`P!jB(kKYWFG|MSPclQ)J7 z$#UotJOjOuVqJ-%gvzG~EIv8q^&xVqwO1T7oAlZ_cimgr(-`eEBva>}aOQDlkjZ8( zY1^P)kFH{^5&=|smQ_#Pk#lUJ9o0gYa&)=Du&Acmh~MIa>YT4+n5gXRO()`ZsoTi$ zrB+LFBR!~4MaJfq@3ph;EF zxI5UIMOT&g(hgE_?I6Oq=>b#`u6S;riCu%J%~tK)<{BOKyIT@T!fEj_=V?u;+@53Y z+euoSYPIM%0kb3BR42PL8>ALq0HL6}Fx74uGCNeOhQS@!Y7j-NTI(IKQRR$v5+ao+ zbTtr@Igm!UPG%h63;wJZT|gucSkz%hyNlnl4cgt3SU+O5(-*1H*E0AI0^9diqp)VJf06cZCk#T7EaqAEl~Le@dmu+LfW9l{sMjSNEs(;!k7cNr13&jauL2J6?7a~Hj=R@*{&lgy zGcSRkd4Ob?dmf;kKkSb8yn1f}e=o8$`@$HUt ParagraphStyle: + """Rebuild a style with both indents scaled to a narrower column. + + Scaling every indent generically keeps a style's column intact: an + indent left unscaled would be measured against the full frame width + and swallow the narrower column. + """ + return ParagraphStyle( + name, style, + leftIndent=style.leftIndent * proportion, + rightIndent=style.rightIndent * proportion, + ) + + def _dialog_to_flowables( dialog, settings: Settings, column_width=None ) -> list[Flowable]: # If column_width is set, adjust indents proportionally if column_width is not None: proportion = column_width / settings.frame_width - character_left = settings.character_style.leftIndent * proportion - dialog_left = settings.dialog_style.leftIndent * proportion - parenthentical_left = (settings.parenthentical_style.leftIndent * - proportion) - dialog_right = settings.dialog_style.rightIndent * proportion - character_style = ParagraphStyle( - 'character-dual', settings.character_style, - leftIndent=character_left + character_style = _scaled_style( + settings.character_style, 'character-dual', proportion ) - dialog_style = ParagraphStyle( - 'dialog-dual', settings.dialog_style, - leftIndent=dialog_left, - rightIndent=dialog_right + dialog_style = _scaled_style( + settings.dialog_style, 'dialog-dual', proportion ) - parenthentical_style = ParagraphStyle( - 'parenth-dual', settings.parenthentical_style, - leftIndent=parenthentical_left + parenthentical_style = _scaled_style( + settings.parenthentical_style, 'parenth-dual', proportion ) else: character_style = settings.character_style diff --git a/tests/files/dual-dialogue-parenthetical.fountain b/tests/files/dual-dialogue-parenthetical.fountain new file mode 100644 index 0000000..d01e936 --- /dev/null +++ b/tests/files/dual-dialogue-parenthetical.fountain @@ -0,0 +1,7 @@ +GIRL +(quietly) +Hello there friend. + +GUY^ +(loudly) +Hi back at you. diff --git a/tests/files/dual-dialogue-parenthetical.pdf b/tests/files/dual-dialogue-parenthetical.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f32af8322109d7cddc0635b1e2a38f1471fd99bd GIT binary patch literal 25326 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μ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 literal 0 HcmV?d00001 From 275982501f803d05d474420d8700fd2475ca7fee Mon Sep 17 00:00:00 2001 From: Nycto Date: Wed, 15 Jul 2026 19:12:21 -0700 Subject: [PATCH 3/3] Place the right-hand scene number in the margin --- screenplain/export/pdf.py | 13 ++++++------- tests/files/scene-numbers.pdf | Bin 25413 -> 25413 bytes 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/screenplain/export/pdf.py b/screenplain/export/pdf.py index eab9c14..57d5468 100644 --- a/screenplain/export/pdf.py +++ b/screenplain/export/pdf.py @@ -266,13 +266,12 @@ def draw(self): self.settings.font_size ) - # Left margin: Position to the left of frame - left_x = -0.75 * inch - canvas.drawString(left_x, 0, self.scene_number) - - # Right margin: Right-aligned inside right margin area - right_x = self.settings.frame_width - canvas.drawRightString(right_x, 0, self.scene_number) + margin_offset = 0.75 * inch + right_edge = ( + self.settings.page_width - margin_offset - self.settings.left_margin + ) + canvas.drawString(-margin_offset, 0, self.scene_number) + canvas.drawRightString(right_edge, 0, self.scene_number) canvas.restoreState() diff --git a/tests/files/scene-numbers.pdf b/tests/files/scene-numbers.pdf index 649ee19c676ae94db337de473f3adfb88a1c5727..a1aec75c70033379247161ac9277a7b8ca6b7473 100644 GIT binary patch delta 511 zcmajVJCd4U007{z*(%*0V8`_t1Q8JU5d}qmHR5|QC@8GRQxp`&nRFf?3W?|+QP%$>ebm0OXQl<5Rk3~IJ} z9aD&9sW&N+N0Z=dMb?(xcDlA`MHuCT?#TmUP*=;(5Lz4B+8 z3);}8c(r^=v$EvYwK*2=5H`8^-a$^{xwGOf>Od_G{aLWU#GY)tf*i_Zq=o5b$@w13J-tV_5xig0Ys csS{M)sX2gkZTdjC0JtQm3C;hFx8K%}zwi8)tN;K2 delta 511 zcmajV%W|4f007W&(^Yr*fDY9F!$Y||E)mg-Bo-8`hTy~pf`Eb#6pT94ogdI;exx(` zhGf@mzo+Z2x;=B=KT7W(rC(S7GXOHjNs#Ag4!r*K(LeC^$G<6EmELqz#dVR2`yG02 zdML4w5k>aP=wNp$7HDgQGmf{)fm-@x`&_U=O5Y(6*aW|BoBM#Zamij|4!IsOa7OGW z_k$iTInJ(?7~kb}zitx5+KP@1D!=UY{XIY&9ZxV-B}ay_7+$M+Ge(BdZL`F9508VC z_h2vjic5mdE>7Msbf^B9GQ$flyW&acQDQOQx#mnKwMDAvmenDjt9V`s-HN-!I)_VZ zmMUYENpUcF3JNi5R6U&2Hsy+fr7wsTY5^)+g{@(mQ{@b=jS+l2P8dHUvq4cCo}ZnS zrYcU_?=mXWsFNB2dGCqct-8Y`WinF_HZ2Tw`2p!N9Mu)cpg$2GYK|o(m-z0{C4}Dc zbQ=n82NTP;7Hl3tHXY~SWIQ-ce;cNkojg|pgF0^Y+6aA`GT*9n{+5MbO8QEc0Vl)) efc0ep1yPOxTt#8TuM)s>(XyrfZ@m7Fe*6VpsFdXZ