From 518c7631317346bfbfeaa212b63e3d566b15439a Mon Sep 17 00:00:00 2001 From: Andy Meneely Date: Thu, 17 Oct 2019 12:04:46 -0400 Subject: [PATCH] Rewritten autoscale sample --- CHANGELOG.md | 3 + samples/autoscale_font/_autoscale_font.rb | 89 +++++++++++++++--- .../autoscale_w_data_00_expected.png | Bin 0 -> 5656 bytes .../autoscale_w_ellipsize_00_expected.png | Bin 0 -> 6909 bytes .../autoscale_w_range_00_expected.png | Bin 0 -> 5461 bytes samples/autoscale_font/card_00_expected.png | Bin 5885 -> 0 bytes 6 files changed, 79 insertions(+), 13 deletions(-) create mode 100644 samples/autoscale_font/autoscale_w_data_00_expected.png create mode 100644 samples/autoscale_font/autoscale_w_ellipsize_00_expected.png create mode 100644 samples/autoscale_font/autoscale_w_range_00_expected.png delete mode 100644 samples/autoscale_font/card_00_expected.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 2dffdfb..adcbc00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,9 @@ Squib follows [semantic versioning](http://semver.org). ## v0.16.0 / Unreleased +Features: +* Autscaling text! `ellipsize: :autoscale` will now downscale your `font_size` if the text ellipsized. Thanks @Qgel! (#288, #111). + ## v0.15.3 / 2019-10-17 Chores: diff --git a/samples/autoscale_font/_autoscale_font.rb b/samples/autoscale_font/_autoscale_font.rb index 1979b9a..09f7bd7 100644 --- a/samples/autoscale_font/_autoscale_font.rb +++ b/samples/autoscale_font/_autoscale_font.rb @@ -1,13 +1,79 @@ require 'squib' -# Here's an example of being able to scale a font -# based on the length of individual string. -# Handy for making minor font scales to fill text boxes. +# Autoscaling font is handy for a bunch of things: +# * Picture-perfect text fitting for one-off +# * Rapid prototyping where you don't have to think about sizes +# +# We've got three options... +# Option 1. Use your data <--- good for picture-perfect +# Option 2. Use ellipsize: :autoscale <--- good for rapid prototyping +# Option 3. Use map ranges in your code <--- good for picture-perfect +# or other weird cases + +########################### +# Option 1: Use your data # +########################### +# If you want to tweak the font size per-card, you can always make font_size +# a column and map it from there. This is tedious but leads to perfectly +# customized results +my_data = Squib.csv data: <<~CSV + "Title","Font Size" + "Short & Big",10 + "Medium Length & Size", 5 + "Super duper long string here, therefore a smaller font.", 4 +CSV + +Squib::Deck.new(width: 300, height: 75, cards: 3) do + background color: :white + rect stroke_color: :black + + text str: my_data.title, font: 'Arial', + font_size: my_data.font_size, # <-- key part + x: 10, y:10, align: :center, + width: 280, # <-- note how height does NOT need to be set + ellipsize: false, + hint: :red + save_sheet columns: 3, prefix: 'autoscale_w_data_' +end + +####################################### +# Option 2: Use ellipsize: :autoscale # +####################################### +# If set the height, you can set "autoscale" and it will incrementally +# downgrade the font size until the text does not ellipsize +# +# Great for rapid prototyping, set-it-and-forget-it +# +# NOTE: You MUST set the height for this to work. Otherwise, the text will +# never ellipsize and Squib doesn't know when to start autoscaling +Squib::Deck.new(width: 300, height: 75, cards: 3) do + background color: :white + rect stroke_color: :black + title = ['Short & Big', + 'Medium Length & Size', + 'Super duper long string here, therefore a smaller font.'] + + # Automatically scale the text down from the specified font_size to the largest size that fits + text str: title, font: 'Arial', + font_size: 15, # <-- this is the MAX font size. Scale down from here + ellipsize: :autoscale, # <-- key part + height: 50, # <-- need this to be set to something + width: 280, x: 10, y: 10, align: :center, valign: :middle, hint: :red + + save_sheet columns: 3, prefix: 'autoscale_w_ellipsize_' +end + +############################################ +# Option 3: Mapping to ranges in your code # +############################################ +# Here's an in-between option that allows you to programmatically apply font +# sizes. This allows you a ton of flexibility.Probably more flexibility than +# you need, frankly. But one advantage is that you don't have to set the height def autoscale(str_array) str_array.map do | str | case str.length when 0..15 - 10.66 + 9 when 16..20 6 else @@ -16,20 +82,17 @@ def autoscale(str_array) end end -Squib::Deck.new(width: 300, height: 200, cards: 3) do +Squib::Deck.new(width: 300, height: 75, cards: 3) do background color: :white - rect + rect stroke_color: :black title = ['Short & Big', 'Medium Length & Size', 'Super duper long string here, therefore a smaller font.'] - + # Scale text based on the string length - text str: title, font: 'Arial', font_size: autoscale(title), + text str: title, font: 'Arial', + font_size: autoscale(title), # <-- key part x: 10, y:10, align: :center, width: 280, ellipsize: false, hint: :red - - # Automatically scale the text down from the specified font_size to the largest size that fits - text str: title, font: 'Arial', font_size: 10, - x: 10, y:100, align: :center, width: 280, height: 50, ellipsize: :autoscale, hint: :red - save_sheet columns: 3 + save_sheet columns: 3, prefix: 'autoscale_w_range_' end diff --git a/samples/autoscale_font/autoscale_w_data_00_expected.png b/samples/autoscale_font/autoscale_w_data_00_expected.png new file mode 100644 index 0000000000000000000000000000000000000000..342aca2b2c92d712e7d8319f79d171e6247ae9ff GIT binary patch literal 5656 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 J3fXsG{{zamy(a(w literal 0 HcmV?d00001 diff --git a/samples/autoscale_font/autoscale_w_ellipsize_00_expected.png b/samples/autoscale_font/autoscale_w_ellipsize_00_expected.png new file mode 100644 index 0000000000000000000000000000000000000000..b13410cdbba24ec64ebe90b7a51fbed9ab8e23cd GIT binary patch literal 6909 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 z'GjWfH)2r9MNbfcVGZ(I6>+|?Kp#c!tM6Q7jM#HN1 zN30tGO)6bN^*|$7&Sw%5|JF?h%RJABt8Jt|-&~ix6ZCEN!G&jox<0EcM5X6MLN3r> zA>ciSG%2R_gvG7xclW8frfOPBsK*0o>Cb(FIfjvi*vCAU!EDk$yGGA?5nwGNche>CQ3@dm@fyy`p zOKp`)+n6U#P@o8ao|nD%WkpP<`zZAK&kgGeE3OIBPAHK_Q?AL42&KGn;!oT~f9V_Y zCqkdL@7V%tm3u!FVQ;@Nod`-0-eRK|MhsW3Ad0J|S(Fc9PRWq#I({PAA$9Mx=E@fi z9dOIBTI33-YWQp&8_1uu#o`FRtQb|*sH zl``;+_(>eZDs_;9u@ToL0oPUs6d3!;W$UNkg1bP3V96ET?k}BBcXto`G`y#Xc*9)( z6AOlG!w_qEoO;(7Aty)jwdbPfA;oZjU}U%gaWpz79GU($_)gomCzKV>nZt}0u7{jq zA=YweofhonY68}2oDyHdt8}tfL;~Kd!=?EC$F44L<)NnpUcL=3u70U`X?~&zmxjo; z1uAjDpZxKx6UYMq#%v~VXaHtnJ}3xFMC7xt{*xQVDLMH3*?*Pz^H z81Lx#g1gVMC;10`)4UJwAa3>t9x18zOe@E3b=0PP6y@Go|R3=jBXwPgRN(|_%N0Fi$v XMDnk`cO6Xr*Ptk?CQ~hC7V`f9wBmw) literal 0 HcmV?d00001 diff --git a/samples/autoscale_font/autoscale_w_range_00_expected.png b/samples/autoscale_font/autoscale_w_range_00_expected.png new file mode 100644 index 0000000000000000000000000000000000000000..9da2cb35bbaab15741b47d5d5fc5c2b562d8c926 GIT binary patch literal 5461 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 literal 0 HcmV?d00001 diff --git a/samples/autoscale_font/card_00_expected.png b/samples/autoscale_font/card_00_expected.png deleted file mode 100644 index 4ecd0f0c9b3f6a24505d327d4a36dfc6e66154fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5885 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

7pwFVSvF*Ij{9z_!4JoUnMy22(O3nfa6a2`*vW zY)4&U&F)aaPl&bgtZng2)wuC?YQP`tPPyU5lSwzie;yj-0)7uz(f&3s9oKqWZ6t+@ z?Anlp{6VM|%h(?+9pCfv(56CB?XI4OGBtx8A?mGg&sr?!G0!{&%#$y!xQ#QZYJCCz zht)h@$HW3YNxxI`*oT`se97u_^^fUvFL$PyQ+Ij%N}qE&vc>qEICUV=D)QL^D$#Dh zF-P~VMfgc_Vu*xrkyrX8*=Cu4x39XNAVXP^owsKz@-e-iq~{wOM*6}1T>P@9r_jzT zJ74vOY(h6TLGkgbn2g|>*G5s)fTITDUU5TMgWt1hP1dautE#(+qpKoqVCiPmaLHe7 zLuoFK>>5~RwC$wK#XC>d*rBZnT{mdRnq%$FWWFzdAX&?MTF&Ji?oY)o!6{efD*yNmOTXr=)iL&5@ipfkb7>^6-pA4Cn$w;|;4jtN=eOAGo ztQ={5>7qY+g5Kidix`@E?z&`&TnA3XJ$EZ-?EXD`a51S`x&2bFf{#e5D8B(oSgNkpz$2eJhXwcJz#cb6z$?o_8`7dF-$*5W{ zw%C$k51n*~MU&<3WKNk14C!2%D{AR*je6d5N zbiKG{m4D3VEo-6Q@T>h3gxx5D!*oNHB`_o%Icz}eT}%GD@dF#{0J<~4NSJgm)@O0u ziuu!=x!Xh{U4s9vriMiW`Qplb%Sz%fG2C=VOO#Lc`RM_4(8wQ3H61T{E_RW1bHWS> z$u)^37xPTh6T8_8;y$`B4(r^Rwh|NgNN4RQ>u08`PSleq2K|z40Xecy5D|eTOoQYt z7178+M7GXgaQ6AC&ZSmD1oydZ>W2F4i1jvW^c3F<*SHk2R_>gE7{*FsyoA^(lbL```q70j-kR*%Rj#>7C zRSSXc`iYzwB7ZDLWo{B?6+@IEfjBBtT@eA5wh_!`@Dmbud9a8iH(31V_=j-8^6XX| zcO!>PWKwNYRGjLA7b|PMrJt}=xmfBD#?~xGb;}g+`n!Zq2+8FR@!&XbN1YI&v}+1< zz#*+C%a&gVAv#%PZ)q@8>ia7Mps<+kbq@&_J!BaTgu@?-o1w}y`M%5HM!TS%Bk50j zrBUp^N#nGU*v*lY0g_cI1I}8R1x3gJRd=q!{5eRd>}c6nMw+~;RjKPH0|_=Rv2!!^ zLBHDHXEK*Bk-q9e)kcR%2_RYR<$v;#*COL{y2^S!{Jq(&x7`M_>_ugr2fv91WB^5l4|=jt-@xgFQEV|GN`(yI9&Z;Y zTOgotcD8?VQu?TZT_t3ZF}M8;e}qAAofd6SyNR