Files
kdp_generator/__pycache__/renderer.cpython-313.pyc
T

109 lines
9.9 KiB
Plaintext
Raw Normal View History

2026-03-24 19:36:04 +02:00
ó
@ÅÂi'ãó´•SrSSKJr SSKJr SSKJr SSKJ r SSK
J r SSK J
r
Jr SSKJr S rS
rS rS rS rS
rSrSrSrSrSrSrSrS\S\S\S\S\S\S\4Sjr S\ S\S\S \S!\S"\!S\4S#jr"S\ S\S$\S%\S&\S'\SS(4S)jr#S<S\ S\S*\S+\S,\S-\S.\S/\\$SS(4S0jjr%S\ S\S*\S+\S,\S-\S.\SS(4S1jr&S2\ -S3\ -S\ -S44S5\'\S6\$S7\S8\S9\S:\!SS(4S;jjr(g()=aGPDF rendering for crossword puzzle grids and clues.
Draws crossword grids (empty for puzzle pages, filled for solution pages)
and lays out numbered clues in a two-column format. All drawing happens
within caller-supplied content rectangles so the KDP formatter can
control margins, page size, and front matter independently.
é)ÚOptional)Úescape)ÚParagraphStyle)Úinch)ÚCanvas)ÚFrameÚ Paragraph)Ú CrosswordúHelvetica-BoldééÚ Helveticag<@g4@gš™™™™™á?gè?)縅ëQ¸¾?rr)çÍÌÌÌÌÌÜ?rr)rrr)çffffffÖ?rrÚcolsÚrowsÚavail_wÚavail_hÚmax_cellÚh_ratioÚreturncó0•X - nX5-U- n[XgU5$)uELargest cell size that fits *cols*×*rows* inside the available area.)Úmin)rrrrrrÚby_wÚby_hs ÚM/Users/mihai.stefanescu/Projects/personal/crossword-kdp-generator/renderer.pyÚ_calc_cell_sizer2s%€ð ‰>€DØ Ñ  Ñ %€DÜ ˆt˜8Ó $Ð$óÚcvÚ crosswordÚgrid_xÚ
grid_top_yÚ cell_sizeÚ show_lettersc ó
•[UR5GHüupg[U5GHæup‰X(U--n
X6S-U--
n U R(aKUR"[6 UR
"[6 UR
S5 URX«XDSSS9 MsURSSS5 UR
"[6 UR
S5 URX«XDSSS9 U R(ai[SUS-5n UR[U 5 URSSS5 URU
S-X´-U -
S-
[U R55 U(dGM@U R (dGMTUS-n
UR["U
5 URSSS5 UR%U R ["U
5nU R(aX´S--OX´S --nURX¤U-
S
- -XùR 5 GMé GMÿ UR&U-nUR(U-nUR
"[*6 UR
S5 URX#U-
UUSSS9 UR
S5 UU-
$) zCRender the crossword grid. Returns the y-coordinate of the bottom.égà?)ÚfillÚstrokeg@gÐ?rgø?g{®Gáz´?g
×£p=
Ç?é)Ú enumerateÚgridÚis_emptyÚsetFillColorRGBÚ _BLACK_FILLÚsetStrokeColorRGBÚ setLineWidthÚrectÚ
_GRID_LINEÚ is_numberedÚmaxÚsetFontÚ _NUMBER_FONTÚ
drawStringÚstrÚnumberÚletterÚ _LETTER_FONTÚ stringWidthÚwidthÚheightÚ
_OUTER_BORDER)r r!r"r#r$r%ÚriÚrowÚciÚcellÚxÚyÚn_sizeÚl_sizeÚlwÚlyÚgrid_wÚgrid_hs rÚ
_draw_gridrM;s1€ô
˜YŸ^™^×,‰ˆÜ! #Ÿ‰HˆBؘi™Ñ'ˆAØ 1™f¨ Ñ1Ñ1ˆAà�}�}Ø×"Ò"¤KÑ0Ø×$Ò$¤kÑ2Ø—‘ Ô$Ø—‘˜˜i¸À1�ÑEÙð
× Ñ ˜q ! QÔ 'Ø × Ò ¤*Ñ -Ø �O‰O˜CÔ Ø �G‰G�A˜)°Q¸qˆGÑ Að××ܘS )¨dÑ"2Ó3�Ø—
‘
œ<¨Ô0Ø×"Ñ" 1 a¨Ô+Ø—
‘
˜a #™g q¡}°vÑ'=ÀÑ'CÜ! $§+¡+Ó.ô0÷‰| § § ¢ Ø" TÑ)�Ø—
‘
œ<¨Ô0Ø×"Ñ" 1 a¨Ô+Ø—^‘^ D§K¡K´¸vÓF�à-1×-=×-=�Q TÑ)Ò)À1ÐSWÑGWÑCW�Ø—
‘
˜a¨r¡>°QÑ"6Ñ6¸¿K¹K×HôC'ñ-ðJ�_‰_˜yÑ
(€FØ
×
Ñ
  Ñ
)€FØ×Òœ-Ñ(؇O�O�CÔØ‡G�GˆF Ñ'¨°¸aÈ€GÑJ؇O�O�CÔà ˜Ñ ÐrrEÚy_bottomr>r?Nc óF•[SSSSSSS9n[SSSS S
S S9nS nXH-
S
- n [SU5/n
URHAn U
R[SU RS[ U R 53U55 MC [X#X•S
S S
S
S9RX 5 [SU5/n URHAn U R[SU RS[ U R 53U55 MC [X)-U-X9US
S S
S
S9RXÀ5 g)zADraw ACROSS / DOWN clues in two columns with automatic text wrap.ÚClueré
é r')ÚfontNameÚfontSizeÚleadingÚ spaceBeforeÚ
spaceAfterÚ
ClueHeaderr érér r*ÚACROSSz<b>z.</b> )Ú leftPaddingÚ rightPaddingÚ
topPaddingÚ
bottomPaddingÚDOWNN)
rr Ú across_cluesÚappendr:Ú
xml_escapeÚcluerÚ addFromListÚ
down_clues)
r r!rErNr>r?Ú
clue_styleÚ header_styleÚgapÚcol_wÚ across_itemsÚclÚ
down_itemss
rÚ _draw_cluesrnosD€ô
 ؘ¨r¸2Ø !ñ€Jô"ØÐ/¸"Ø ¨añ€Lð
€CØ
‰[˜AÑ €Eô&/¨x¸Ó%FÐ$G€LØ×$Ô$ˆØ×ÑÜ ˜˜BŸI™I˜; f¬Z¸¿¹Ó-@Ð,AÐBØ ó
"ö #ñ%ô
ˆ!�uØ aØ añ)ç)4©°\Ô)Fô$-¨V°\Ó#BÐ"C€JØ×"Ô"ˆØ×ÑÜ ˜˜BŸI™I˜; f¬Z¸¿¹Ó-@Ð,AÐBØ ó
"ö #ñ#ô
ˆ!‰)�c‰/˜8¨FØ aØ añ)ç)4©°ZÕ)DrÚ
puzzle_numÚ content_xÚ
content_top_yÚ content_wÚ content_hÚtitlec ó•U=(d SU3nUR[[5 URSSS5 UR U[[5n UR X5U -
S- -U[-
U5 [S-n
[
URURXVU
-
[[5n URU -n X5U -
S- -n
XJ-
n[XXÞU SS9nSnUU-
nXF-
nUU-
nUS:”a[XUUUU5 g g )
zŸDraw a puzzle page (empty grid + clues) inside the content rectangle.
*content_top_y* is the top edge of the content area (ReportLab's
y-axis points upward).
zPuzzle rr*rRF©r%r
éN)
r6Ú _TITLE_FONTÚ _TITLE_SIZEr.r=r8rr>r?Ú_MAX_PUZZLE_CELLÚ_PUZZLE_GRID_RATIOrMrn)r r!rorprqrrrsrtÚlabelÚtwÚ title_blockÚcsrKr"Úgrid_topÚ grid_bottomÚclue_gapÚ
clue_area_topÚclue_area_bottomÚclue_hs rÚrender_puzzle_pager†™s!€ð
× +�w˜z˜lÐ+€E؇J�JŒ{œKÔ(Ø×Ñ�q˜!˜QÔØ �‰˜œ{¬KÓ 8€B؇M�M�)¨2™~°Ñ2Ñ2ؤ+Ñ-¨uô6ô Ñ"€Kô