From 8aebf438a93c2f8e4981a8f16b2a8f2db019c8c2 Mon Sep 17 00:00:00 2001 From: Vadim Namniak Date: Sun, 25 Jan 2015 14:42:25 -0500 Subject: [PATCH] v 0.3.0 --- .gitignore | 1 + css/styles.css | 30 ++- img/bg.jpg | Bin 49525 -> 59014 bytes index.html | 112 ++++++----- js/CanvasTextWrapper.js | 415 ++++++++++++++++++++++++---------------- js/examples.js | 116 ++++------- js/options.js | 83 ++++---- 7 files changed, 416 insertions(+), 341 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..62c8935 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea/ \ No newline at end of file diff --git a/css/styles.css b/css/styles.css index 8b7719b..7be9043 100644 --- a/css/styles.css +++ b/css/styles.css @@ -13,7 +13,7 @@ div, header, footer, article { header, footer, article { width: 930px; margin: auto; - background-color: #0D9F69; + background-color: #3299af; padding: 20px; } @@ -55,10 +55,15 @@ article { vertical-align: middle; background-color: #fff; font-weight: 100; - color: #0D9F69; + color: #2E6571; line-height: 120%; } +pre.white-block { + padding-left: 0; + padding-bottom: 0; +} + p { margin: 10px 0; line-height: 120%; @@ -66,6 +71,11 @@ p { h2 { font-size: 30px; + padding-top: 40px; +} + +h2:first-of-type { + padding-top: 10px; } h6 { @@ -83,6 +93,10 @@ h6 { margin-bottom: 15px; } +.syntax p { + margin-bottom: 0; +} + .values li { text-indent: 20px; list-style: inside circle; @@ -98,20 +112,20 @@ section > div { position: relative; width: 450px; margin: 15px; - border: 1px solid #0D9F69; + border: 1px solid #3299af; overflow: hidden; } section h2 { - color: #0D9F69; + color: #3299af; text-indent: 30px; margin-bottom: 20px; } section > div div { width: 100%; - height: 200px; - background-color: #0D9F69; + height: 240px; + background-color: #3299af; margin-top: 250px; padding: 20px; } @@ -139,7 +153,7 @@ span, .emph { strong { background: #fff; - color: #0D9F69; + color: #3299af; font-weight: bold; padding: 0 5px; -} +} \ No newline at end of file diff --git a/img/bg.jpg b/img/bg.jpg index 697e9c38c5caf395ad11daa49bf15ea3e2f2c8d3..9bd75c366104de0e5195a040457003baab55c88e 100644 GIT binary patch literal 59014 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%0Dn1)JRAd(jh@Xs<&GCRYT&Q~^TnN%B(|yTz1S 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 XcH!VDzm@R$zR9NBbL85%ZD0S{MCHIF literal 49525 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 z zgw8Tb&Pn(@06Ls;gupLEdWItlT>k)0GSGnym(;|$Eiay!+I%8l=r5q;Iq?jz>((#( zFf>q1{3lZtK^g&0mU#mw!;1*o0-C#g;iE`jfQBdBWn+j%>Htrv%W?!dT=FzCzTU?v2?m99roAS-?AR0100fga6YL3zoytou`1BneffHuG|tZ&Y; zT?A=F_=IN;{){G9K_Y$}d#7-mV?aG$jCBknEiZ;lhg$_eb!n%xo6GPTL;s_8y zoAxbZr0Q71P@0*CddM|h@k>(|(~fdJ#sq|RnZ2`wWcC2C%7Qg<#^LH04-&LAKdfB) zLd2ay!gF_l`BRuSNq;W#aN(o?=r8ev7bHb>B4GH!_na9H?jj;0qj-vzM(f;Z5z=OZ zX_DtB%pxG~4iF?w>N)|bsbIoXP%V()UVCD14TAZg%Zm?zJBf!8Uwf=)0zw%J(sFHt zFn~^?zV9RCN~}4ZxU!Fud|=V#G8}UaVBt`8g>Z`ia_+wv36#{K)2voW1QX6u1u}z1 z+;@Vs%s?N{#tFzOdXI#&wstgJZo!VPFiJ-g)yJ zag4W^X5Xwp-9V7Lg*x9-Co785Aw#k_9>WVKG|a+|V@<v9od;*E92t*s$`Jqyir1aA6X{Mz3`X>((%$ z!Tb^=IpcILGBYt$h_G!oZVkNRp$szzoxNmGNJ8yeQab7dawc0dAKiuoq@rrTOW#D; za=q~khFBq)aPaC6%sJeTF+QURBqrIlf1F^%TL$!~`XBg}dC(z^Z?BJBWW!NC04^(u1Vd(dW29k$1c6J6I*#{vDWK8v1uuQ) zPiZbQ(g?@SdnHG0f!0Qy6^>T`37!7{IPT}64v3Swn%7JiktfdtA90oKv;{B_QhxcI zMYM3hqNdHmu83t;u}Fc$^*Ow^=GGYZfEh0hK98&`Ucm`6&%k=lw6ztH1{9!;#^Pi7 z!9_xVTT-RRczZfPk4Fs=)7n&pje1yLQXJE5r@)Bb>tJxyEesK+s2(*}EW#u%Qk?lk2 zhtAj$HsPlz*^G@66a6{YspPojn~0?V+m98YGFgTL^pqC@x?j_Xu)szRqyyf;A;|!RRegYkKFuGnY=uB2$!@3uP9lr?DqY z%tc~SMw(vCQ)V9f#d@Fb^O1spXmXh099|gl=L>Ftg7J%8OTW|YgJ)o~LEtRew8>?)P-?s-zMx!^QhctiL;z^Z&>;(MJJv8wb!A&j{ zO_Ien^A1d`;PfugnQym@+^$NMEG`oab`oj&ycrtRt@43f=Q&hxP!M7kQxjZvcf0N&M6{ny!e1UxEUSS zW_b?Yuva7@_cemH2~YT$pDsctcHtkqG4N3K@6!^pCQuljyN|3#L-7Im94u6$9iZPU z&Spo4HXTY->Q}S%L#Sg?(IE|~xPtGT({2U!koi&5StMo@Y;50L6Ct8lk1|i=1PLw( zGc-?Jkn{mM+=#Eddkk6$hB+R(WL=M}7>+!)`O0!DIs@Tx=xCr(FLw`INTx4J)b@;* z0qyh)56)8=sl(?_taNvfq6CgWZ=v5fl!g}Bpni4hBwW%IjUT+OQp`jNvr9wwbc$WQ zR^0?0W_)v%3xqE|j33+U28=Oe#e2pD>QP-8dJ4g#>x4(_j*k6X@FoP0j7?M|7%aLD z{W1ATv_`t;6*^M)n)EoHP8g=a7J$kbhHrUg0*UTMRjP#*)1^`o)owkQ)fE%e*sRM^_0SMihqaP&ri7%6TxZ ziahbe|B3*?em1m5TC;-HF!m#<`7@~*9FHA9!d@%<|m&YO95iQ|p z^@t-2vIx_CkEprG)E+SZ01LpbfWy?lmBa+QXCH&F4dib4Oa*)czbUML)0|T&MuHne zMC&EOUzt7AUixBkATwpA7kZWq-Fc?Iy1|-_(+m+8aq~Fp;+;{o9bm&Ck{sh}LbLEw=OSZd z--l$sjE=+bNeGGB`O0tWIsKy7n#fNQWw%t{Y=*8PJVCuL8k;gHA<}uo z00eP>(mm0E(D=pTp73QLs_rQxv-gL}bAm{iKL@XA%hvEDNFj(=9$4oJ=CDnjOi%TK z@brpTQ*Nc#VA!+(4uOLl@epra zeEeZtSHL|mM4hD?K5<3hrC-sH<^=+8=inXk)fgy8F&Fo7mx$F(%aTajKyyGUx)I+Q zGXcZdXM=Amky4V)>1R5@3V=Y3EOM3T5NyQQ+frTehb$erYaOa8 zg5Hr3J&>Bo(TYXS91-a;^O1gnfV)Zh40=&wh?pi%5&Olgd=hSI1Gy^3-z1*H084SW zQ}msRFh#lsM)gcEks6-A&PdH&&YpP4p;SUZdUNmV4+$os3Z%p}iXk0AGZOZ%227X4 zZ*pyZxuEV-Ygk+0fP2XxyBT z09MwPR?YU^CP6O&;r=kCLu@8E>5xnY`8>Fk4G097^M>E1@LFaLow67r+Z5u+jg=$+ z01&bi6`rOuHjQi0dSs}bOKuv|vfF$?yNnhD2mv)jg5z5pf*@(A>kB_vic+L49cDgp zEI|!{xh_41FWW)b-q!Cp^a7IB2ndlEQ^i>`(^&%-OwJ9nRQ#&P`NwFR1qQg);*l^( zDxO0PE|mcWpj=#$HiDlq7+RVZlK%kQj40-9@Snx^!5|ed-$yTb8s{}JMB&(-Sp#jSwjaB$H?p(r27cN22`ckq}t0GdhA*x}D+DVkVMs8z)00 z{{TcvUL+g%_{jn%B2xRrIYXcOiVDDmV@F&o!s||wcK$KfvZE)%8N>jEjy+)I8D)83 zNF&qnS!lL6Pp8$7v@OR>*|*jn&4zG@0?g-H{r>>qsg)oKUnwW7H)LWMHZOjDutmlO z9~zImJYx(>0_$wz3an-`Y}7H=uCQ*t5TBQSTA0B=0OY50rbI;K^yJ4@~eA{=88$vls$PO+^K~&_+>ErRg1UX^1Rj3+CH+yp(@@gmC5% zK|^h(N&&%xIT#qZjy+^oGXV?tn&P%hzRhHi8(}X97xRQ#49E=n{{H~+P=i!PFKgQZ zY^nB3Fd6|-Pxruvj8L+s3G>b$8kz6N5PzdJ5hcdfXM9OReezHxB!=|X&oG=$7f4cr zevXPX9WspwA)pi_wiZnG5IM9XMuuAE6^V<*o3Z5?nb za2bSV-Uc{1<(xfKssb#TA{n7agf>uvN&@nsEc?hnKnLu3zvIM&f4wSD|!-p5DIxfbw~=EpnPR1U%eIOWI`l!#=9ynJI(b${diF%bZP2ZjOfII6>l1V7FTf)gpP zGUlKi6u(QB8WNB~Cw{m2;0!Q7-@!2QABBSMIrCV5I<=LH4KjSnijRo#2ZP#L*d;y=7yQc?sgpqXFBAp<&A zM<+k5)GG3SY98^5?*b`T=PZdEi+(XFltVQ-$`SXD6l|OiFW)1Mm=er(ca3jyFnpj7 zsoreUN}TPG#H5=0`M@_=Z9B#;1OycaY!>ar=!$cgfY-XKWLo|F1zOK>q=p^UHO#w3_5cUesG zt&f-E4W#WN3)OvL!7DhH4`9iU zGOGJG$R@_86FytK}(ii3w|yw)@dqF7$KSARXsI) zWr;n5+(a)`{zHt$`1U?izzV1w=Jg^>x7 zpkKTKABa%N8slts*d?I`C3w9}K)ap7IMo{{Wq1N zO^F|P3<(HzlOkV6I#209?84w!EX`PaGJRtgD~0F;2VyXhP=PQGD|m_wFI>3j#RR$n z@AZNsxo!+GO;931@rO=Sd1>2a71DLGNtS?*48cVxax1MC>%lwP8dXhDs_W#NEO$70)Wy?WWy^L zdaHlNH?Yb+U#9;_c zOHM3}8ITgw!=UJNz~>^dr|S@eh8Zy6utP{^9}*C&J^f~1!2>d0RV!y$$CPI6Z*jh!a9=a-wz-OpucZ9E4Kt~aS(t9 zNHcwI9M>a6QG_rkbXZYHt*gm<1_%{lI~ty~(-I@Dg00r)B|#Q}e*XZxeELd&IRRAl zh-4{5gu-~H2*N{|;}>ymR(X^7GI|7&AfK4PgpNpu&&!Eazzd8~6?0-t+`$kQB193J#dTC~i|O2_;}q{jT3bg=z{5_s~1!0EG-;DP`o-W;jm$1(nSi9d^eoPNHJE&F=fCYG@pYIAsj%S^sl(Aom^0-eCmAQD`Ef*_mPUm zLPVNg{{Vs`1_+Rm5b9Q55Sa-@#Pn_y_mS8J;5On4`o$g6h*zCtnplL;MNj}W} zd~omN$+8Q3T;mAV313p=27=99gp=u=6)JI@5Kp)ol$j@{ES21;;}$C0w_oEr3L;-l z4HVJ6WhzO4j?l2=T@DyeSdE9)S6sQ?gFUoDg>L>#g&9aB#3bpXwmODD0jCUW?~^6q zsv%5FeAXf&l`IFKa6yeKjftQGe9wk5{3g;nFCO9TlBAT1z4iWai2{nBoF#l>bMYX4 zu!IsL8Xnx>%c6w2>O15+AVL+~==JS_Gz1A(uwv>6BocVz-W?KtGv#_5yiP?3rI>A8 z6uTw_rZ8lZ0#87B{{T6nBN`LPUyPc7w$UChol%N~0vX9LSPb#3PO=ga6{Il2>r=9_ zPH2WxD=89p!FX0uMv28VH8wO?0+f$tMp?0Gpfc5cXakj<7^nue z$R1$l-Y~GJ93;~Yy=xkHNr+$~7C`tDzC{0U8=I9LdAqgbG3MExvu2{@lv@NW_a zbSDN5)t0wZrC~JX0W9)0Q=sphh9xs3CghG~p1Bzugg(aq0Mmq>n!PHqd*oma3Zxe9 zF7jy+>M%NK8XRf+CwVOK=_=)sRriHA^+EhHH0V(>{e0p$?$cojw8_J*^uTL}IwGYt zNcqAm9;Bv2&YuhEIG2K=J`80PpLpw$g21Ds;7FsS< zB*gOx8;g%!u~I?UVDce?Q|(;#NS_#$gn{gFJbR1?XI1Tz$8-#CS=RE1Cukq;GJ-s5 zQh1NuVa*njU*Hd4(NQhw-7@JjRd&uh8%%9;nR%yKX{8ZL{Y8>_7a~K+0F`fVi~>Y# z49~w9B0(wyyO`0=0pLzw;~As?GDc%qfK;erW#dKuGG`3KYv_Nt$i`wQj3;3wLZpML zpPV#gTT-4bzZhx81DWS8^ol!L9Fr#XTn9(!KX|E9GAtw1e(?jQO%IH@m{fvOHK4@Po$r&RJ8o(i=)22NJ9l@aI2NG)l_^Zfbbg8SJ z*b$={fjX{w^MhoNV(9gcj9r#%-N2i}N(+F;lq^r)KF;$hzZgNri2{G!Fkqe+WBC5D z$PLW`WWLq$l-59@s>O@I=U9P2iZvdwBm#m@JsgsoK&*qOSn!yHkOeJYz29CdX<1F_=p$q5$Ca7a16IpqtA8_&sE24^|-%2a@n` znV^rxATLNCE|>_Cc0bN3C>Tfjvxp~kGB}A&Pu48yF0geSD;#JobAieP?r=@%I3tuM zjIVB7-e3&)=5vJs^N5-H#2QOs-Mc^VnhUieqH%=?l@)Yj|g8bo=OhODh7kJA?g(G|rdvS}30bIMZfi)kTLgfae z)PP9uKZXN3lhWACg(XnDayShEp*%z+1#+u*tfNL!1_eNbw^m-~3(-0PMx^lCP~bX5 z7KLH~w&j|d?qhruf{;K;MwhZ&Vi3%U%VI=RP>r1Aif*}$EekuZLS*L|yfPo)ej_y;%d`LQiX% z{&7Q4kpQ~3V=M+o<`8{hVET{~4;t~c-Uw?z``CzEWJU-pM|LlD4qRTH$UUmgcD^jx zj3Y3ASgShfZriEt51ihSy1(BLYPZ`r`9QO@B=YwO;vzAN%n-)l8kdCpu zJ*3xqe^?*YgSaG6O5RcCSul^rB)JGg#7ya9;xXV7-~G9NIXrwVqM@=U`pU2YGzUxl zVl#wxrLTNo7oCa*`13f3NP}W}slj+K3bdV#kO)_e=_D&}J;;*)GJ?W@z z!v>5`G1f3iL&`Hf9-gpk36{g~elX;f#+S>+wr!Vx!Z|$*2BeLQAoD)8k@a{i@Z%X4 zLR-9F^N7Nci6irjMp^>fr0Q^aObkAs`-FvhSm~kllMrM@ry^+>?L zXMcbKXT+ETfMi-sOrdrM?<{>{E{ksw^-v-vZqC`$)oD;$)M1UEC+ zC!y#{ow{R{!V4t3^~Mzl>TExCoCd+65}?e{JFGz*16n)c+O!hi_q>M7njjoWsn)(Q z1VZdeXRKg=*2_zY+UY8Oa&?7hMEdoC1yHC@J+biL34TcW$o^#tgQTnB`Nb0YRwvnq z#1WGksH6MEB9TN(#{{Tl4{(+NZ4z@GFeLu~Mj3Ndx5DN-ZxBXE-)UJXRQ87)c5xgJe4V;)H!@9*E_MPvaGZ zfFaVY^S+n@p#cpK8$Fm%@E|9GLRWr{*bw?f6|#c&Yk6T)s+W;K$l1eSi{wf5fCq#l40H6+$tO5}?WfqxZjymLw zjtDp21QoCZwIj#5$1oZSOF__lWDDCteGlG3KiC3hAeX0om^_LBLP#d{a&Gc`8bdVp zagtgM2uaf&OTZS%@6Jba)L9(KawKxWZjP2)O`@|H}QS??D zWswtUbGw;vjCHtvg9RuqTXn2_0>mxjfaxKjXU9xU%)u=KkNu6%l(d~l} z43a7Xs5GCvkSIU`K92X>SU?BKd7Y(XBh-O`dJ~80k!jhSmL4KNdl?3Gw>e)T`~jFASBOtStfELwR1;GEm)P6Nvs zEEVFA#ZOv7-t~^0`kGz2&DQol?DIOGtk6f{(Q*9(y z0o!B5CX+?4X0BC zYZHKtW)FdXIFgzq$X^k74FyFK82}NX;TYBciA{RK2`>e9vpCvDsfzNLEmW=Ca{zr~ zb)g_FWv#93)NG^gStY7OaFn9r<^;ij;Bu~k1Moxl~CvLcpuHawJKnnog$6PA| zT5pIGH`zdD!PJ<^tI=@^!wRf&^WPM~1(rddKUh^ID8sTkE_E9?08)^k1i|0NGa@Rf z1Ei8+A(|RJh;At9kYvodoy%<9e-nzC5Je8|`1-=ojP3~ja>v9PK)xq;iESBxDq{CB z!;J)s4JW7blUvpg)?0w}jF6np7pv=zwo!?6#aUq1IE@=nyWKnk7l*WW-znaCsLcq_= z;2XRyh4oqu<8UPj-Oj%_d_ju{`ew3J45*{x2NJ5>0>5#Am|mr)=M)FPp^R58(l@+G zWQQ#8vAUI-mnha7Q;!(|k`gxEiQ^=xr_-?OkE#~>e;9dWnhcPsx>mpG#2x_{J~B$^ zREZZ(v6h%&mI3Zn-aA4}8F#>zzYSwcHmAdkJj^BlwDZx(aG@s7Qth(3;VlVOcB<8L zmLpJ<{eKay0<=%tERGVDC#(4} zq9~|_?<4S-x<%2eeBkyNgZs@VdhwG(4W;)cIzpL%8S6M0A)x)oOo-ECW#PyKWzL*$ zG0G_%3fxa@X6@u2a5P5gQT^kdo=GT<_;r)1OWsSM(1+nTY>cuH^q#l|eE}=c>-xl` z#)AV}8X&{3S3m22jOIXFVD}{d0954YWi~-FOhkb##{#%WPXvQRh{l~AIWGk!wN>QM zmBJqO`)vr=~K}?>L(|{{X#ls9`!i za76Y93V%4;NK~d{{k|}|Qb8*D`oL8M#OqU8KMG35g=CJ$&Jt5<1y!^-*6{L-5g;eA zJK*x-!m%?oNit!p=;8u? zCB%1G40zK>6m;DfbV(tg?Uwx9w&X!VVZoGpm4`?zN_)rmmyunN&db`T$B~5$9!)S& z#J0-z!eEg1AI?O%We#U}=`xopj;H%ric+1Oc0IW%72K=W>lc7nNU~@?3&F4=b)+++ za=jctX+vfuL1!@Ii4Efe0-8w;%lpTskU|EQo~Ml&<2Xwl$zuS7&u4Y}VaD8M;`HFY z`yfE|df=c2Vs-st>kJ2^;Fq&R)5C&NQ!ot7{{Rd=zL9u%=f0lk;&`?8ggYy;-mFQr&$|l7< z>N^=ICvmjBQ?6U0?vL| zGBlYcQ3iVP^@Z7Cf>YT40H+uPL<#-4!qW_y1hI^=&v4_MY>YtxKz=SKtl-*R&P%y} z*BCH59Sr{f+-H2?<>YshfxMFZD+-b-L{Fmwz?(xW+Y3+{F1$E!QKAyA93Y{tS^Q!X zC@f6e}9lm@zuodBTIq5op|=zc~~n zEl*CDkku0NZ{8#bSb@RkH?a7{BZd~-=iVUp0M?>@K5**&A%lXj+siT>IvW1~cf%z> zejQ?hbWFN%MA-nAJ1u==K@yMypbj)tUH<@-xZ z0f>o`JiAUd+!+YdeHL;7DBUUnn1otH&W8oU3ZGDG#z=|j{;8CN#i7bd;GFO*D7RAz8{=e5=P!1jF!%z zN4vmB3&;%IVL~QSu^0LK#wEMnMtCj6%sOC#lYqvbiBMJ>h6J$_1o1g8R47gV0J~)Y zKwa~NZFw}rM^;}1XxSjE&L-kn3#zlrj+C{~_kcACxgBE!$bd`rhE83sowsgHw?w5! zPk5PC3Z*3P=5Wx6*(N6?lut?1zL)_}5W9>PWKtS?&W$2z@)$8|gxGFHs9Gb;;sF()DwwxzG3p z8#_5?dVe_~GBxN7Y@_2Er0KqOiDd2P=M!nPzn|pcVs2D>(^b diff --git a/index.html b/index.html index 82fad33..b0a31ae 100644 --- a/index.html +++ b/index.html @@ -8,35 +8,44 @@ - CanvasTextWrapper.js + CanvasTextWrapper
-

CanvasTextWrapper.js

+

CanvasTextWrapper

- JavaScript canvas text wrapper that automatically splits a string into lines on specified rule with - optional alignments and padding. + Pure JavaScript canvas text wrapper that automatically splits a string into lines on specified rule with + alignment and padding.

Syntax


-

new CanvasTextWrapper(HTMLCanvasElement, String [, Options]);


+

CanvasTextWrapper(HTMLCanvasElement, String [, Options]);


-
OPTIONS
- - is a JavaScript object with the following available properties and values: +
Options
+ - is an object with the following available properties and values:
  • font
    - (String) - text style that includes font size in px (REQUIRED), weight & family, etc. specified similarly to CSS - font shorthand property + (String) - text style that includes font size in px, weight, font family, etc. Similar to CSS font shorthand + property +
  • +
  • +
    lineHeight
    + (Number or String) +
      +
    • number - n times font size where 1 is equivalent to '100%'
    • +
    • "%"
    • +
    • "px"
    • +
  • textAlign
    - (String) - horizontal alignment that applies for each line + (String) - horizontal alignment of each line
    • "left"
    • "center"
    • @@ -45,7 +54,7 @@
    • verticalAlign
      - (String) - vertical alignment that applies on a whole block of text + (String) - vertical alignment of the whole block of text
      • "top"
      • "middle"
      • @@ -54,12 +63,11 @@
      • paddingX
        - (Number) - horizontal padding in pixels set equally on both, left and right sides of - the element + (Number) - horizontal padding (in px) set equally on both, left and right sides of the container
      • paddingY
        - (Number) - vertical padding in pixels set equally on both, top and bottom sides of the element + (Number) - vertical padding (in px) set equally on both, top and bottom sides of the container
      • fitParent
        @@ -73,7 +81,7 @@
        lineBreak
        (String) - text split rule
          -
        • "auto" - text fills the element's width going to a new line on a whole word when no more space
        • +
        • "auto" - text fills padded container going to a next line on a whole word
        • "word" - each next word will be placed on a new line
      • @@ -81,61 +89,59 @@
        sizeToFill
        (Boolean) - auto font size to fill text container
          -
        • "true" - ignore given font size and resize text to fill its padded container
        • -
        • "false" - use specified or default font size
        • +
        • true - ignore given font size/line height and resize text to fill its padded container
        • +
        • false - use specified or default font size
      • strokeText
        - (Boolean) - text outline based on context configuration (make sure it doesn't contradict with other context settings such as globalCompositeOperation, etc) -
          -
        • "true" - enable text outline
        • -
        • "false" - enable text outline
        • -
        + (Boolean) - outline text based on context configuration +
      • +
      • +
        justifyLines
        + (Boolean) - flex spaces between words so all lines match the same width (one-word lines are skipped).
      • - NOTE: if a single word is too long to fit the width with specified font size, it will be broken into as - many lines as required on any letter of the word unless sizeToFill option is used. + NOTE: if a single word is too long to fit the width with specified font size, it will break on any letter + unless "sizeToFill" option is enabled.

        -

      - -

      Defaults


      - -

      The default options object which values will be used if a property is not specified or no object is passed:

      +
    +

    Default Options


         { 
    -        font: "18px Arial, sans-serif",     
    -        textAlign: "left",  
    -        verticalAlign: "top",   
    -        paddingX: 0,
    -        paddingY: 0,
    -        fitParent: false,
    -        lineBreak: "auto",
    -        sizeToFill: false
    +        font: "18px Arial, sans-serif",
    +        lineHeight: 1,
    +        textAlign: "left",
    +        verticalAlign: "top",
    +        paddingX: 0,
    +        paddingY: 0,
    +        fitParent: false,
    +        lineBreak: "auto",
    +        sizeToFill: false,
    +        allowNewLine: true,
    +        justifyLines: false
         }
         
    -

    Usage


    +

    - Use standard canvas text drawing methods such as "fillStyle" and "globalCompositeOperation" when needed before - using CanvasTextWrapper like so: + Use context settings such as "fillStyle", "lineWidth" or "strokeStyle" before using CanvasTextWrapper like so:

    -

    - var canvas = document.createElement('canvas');
    - canvas.width = 300;
    - canvas.height = 250;
    - context = canvas.getContext("2d");
    - context.fillStyle = "rgb(255, 255, 255)";
    - context.fillRect(0, 0, canvas.width, canvas.height);

    - context.globalCompositeOperation = "destination-out";
    - var wrapper = new CanvasTextWrapper(canvas, 'Hello'); // default options will apply
    -

    -
    - +
    +        var canvas = document.getElementById("#canvasText");
    +        canvas.width = 200;
    +        canvas.height = 200;
    +        context = canvas.getContext("2d");
    +        context.lineWidth = 2;
    +        context.strokeStyle = "#ff0000";
    +        CanvasTextWrapper(canvas,"Hello");    //default options will apply
    +    
    +

    Installation


    +

    bower install canvas-text-wrapper
    npm install canvas-text-wrapper @@ -148,4 +154,4 @@ ← 
    View on GitHub - + \ No newline at end of file diff --git a/js/CanvasTextWrapper.js b/js/CanvasTextWrapper.js index 60a7fdf..fe07340 100644 --- a/js/CanvasTextWrapper.js +++ b/js/CanvasTextWrapper.js @@ -1,206 +1,283 @@ -/*! CanvasTextWrapper (https://github.com/namniak/CanvasTextWrapper) - * Version: 0.2.0 - * +/*! CanvasTextWrapper + * https://github.com/namniak/CanvasTextWrapper + * Version: 0.3.0 * MIT License (http://www.opensource.org/licenses/mit-license.html) * Copyright (c) 2014 Vadim Namniak */ (function() { - 'use strict'; + 'use strict'; - var defaultOptions = { - font: '18px Arial, sans-serif', - textAlign: 'left', // each line of text is aligned left - verticalAlign: 'top', // text lines block is aligned top - paddingX: 0, // zero px left & right text padding relative to canvas or parent - paddingY: 0, // zero px top & bottom text padding relative to canvas or parent - fitParent: false, // text is tested to fit canvas width - lineBreak: 'auto', // text fills the element's (canvas or parent) width going to a new line on a whole word - sizeToFill: false, // text is resized to fill the container (given font size is ignored) - strokeText: false // text is stroked according to context configuration. - }; + var EL_WIDTH,EL_HEIGHT,MAX_TXT_WIDTH,MAX_TXT_HEIGHT; - window.CanvasTextWrapper = function(canvas, text, opts) { + var defaults = { + font: '18px Arial, sans-serif', + sizeToFill: false, // text is resized to fill the container (given font size is ignored) + lineHeight: 1, // default line height equivalent of '100%' + allowNewLine: true, // breaks text on every new line character '\n' + lineBreak: 'auto', // text fills the element's (canvas or parent) width going to a new line on a whole word + textAlign: 'left', // each line of text is aligned left + verticalAlign: 'top', // text lines block is aligned top + justifyLines: false, // lines are not justified + paddingX: 0, // 0px left & right text padding relatively to canvas or its container + paddingY: 0, // 0px top & bottom text padding relatively to canvas or its container + fitParent: false, // text is set to fit canvas width + strokeText: false // text is stroked according to context configuration + }; - if (!(this instanceof CanvasTextWrapper)) { - throw new TypeError('CanvasTextWrapper constructor failed. Use "new" keyword when instantiating.'); - } + var CanvasTextWrapper = function(canvas,text,options) { + if (!(this instanceof CanvasTextWrapper)) { + return new CanvasTextWrapper(canvas,text,options); + } - this.canvas = canvas; - this.text = text; + this.canvas = canvas; + this.text = text; + this.context = this.canvas.getContext('2d'); + this.context.font = this.font; + this.context.textBaseline = 'bottom'; - // set options to specified or default values - for (var property in defaultOptions) { - this[property] = (opts && opts[property]) ? opts[property] : defaultOptions[property]; - } + for (var property in defaults) { + if (defaults.hasOwnProperty(property)) { + this[property] = (options && options[property]) ? options[property] : defaults[property]; + } + } - // extract font size - this.lineHeight = parseInt(this.font.replace(/^\D+/g, ''), 10) || 18; + EL_WIDTH = (this.fitParent === false) ? this.canvas.width : this.canvas.parentNode.clientWidth; + EL_HEIGHT = (this.fitParent === false) ? this.canvas.height : this.canvas.parentNode.clientHeight; + MAX_TXT_WIDTH = EL_WIDTH - (this.paddingX * 2); + MAX_TXT_HEIGHT = EL_HEIGHT - (this.paddingY * 2); - // validate all set properties - this.validate(); + this._init(); + }; - // basic context settings - this.context = this.canvas.getContext('2d'); - this.context.font = this.font; - this.context.textBaseline = 'bottom'; + CanvasTextWrapper.prototype = { + _init: function() { + this.fontSize = parseInt(this.font.replace(/^\D+/g,''),10) || 18; + this.textBlockHeight = 0; + this.lines = []; + this.newLineIndexes = []; + this.textPos = {x: 0,y: 0}; - this.drawText(); - }; + this._setFont(this.fontSize); + this._setLineHeight(); + this._validate(); + this._render(); + }, - CanvasTextWrapper.prototype = { + _render: function() { + if (this.sizeToFill) { + var numWords = this.text.trim().split(/\s+/).length; + var fontSize = 0; - drawText: function() { - var elementWidth = (this.fitParent === false) ? this.canvas.width : this.canvas.parentNode.clientWidth; - var textPos = { - x: 0, - y: 0 - }; + do { + this._setFont(++fontSize); + this.lineHeight = this.fontSize; + this._wrap(); + } while (this.textBlockHeight < MAX_TXT_HEIGHT && (this.lines.join(' ').split(/\s+/).length == numWords)); - if (this.sizeToFill) { - // starting at 1px increase font size by 1px until text block exceeds the height of its padded container or until words break - var elementHeight = ((this.fitParent === false) ? this.canvas.height : this.canvas.parentNode.clientHeight) - (this.paddingX * 2); - var numWords = this.text.trim().split(/\s+/).length; - var fontSize = 0; - do { - this.setFontSize(++fontSize); - var lines = this.getWrappedText(elementWidth); - var textBlockHeight = lines.length * this.lineHeight; - } while (textBlockHeight < elementHeight && lines.join(' ').split(/\s+/).length == numWords); + this._setFont(--fontSize); + this.lineHeight = this.fontSize; + } else { + this._wrap(); + } - // use previous font size, not the one that broke the while condition - this.setFontSize(--fontSize); - } + if (this.justifyLines && this.lineBreak === 'auto') { + this._justify(); + } - var lines = this.getWrappedText(elementWidth); - var textBlockHeight = lines.length * this.lineHeight; + this._setAlignY(); + this._drawText(); + }, - // set vertical align for the whole text block - this.setTextVerticalAlign(textPos, textBlockHeight); + _setFont: function(fontSize) { + var fontParts = (!this.sizeToFill) ? this.font.split(/\b\d+px\b/i) : this.context.font.split(/\b\d+px\b/i); + this.context.font = fontParts[0] + fontSize + 'px' + fontParts[1]; + this.fontSize = fontSize; + }, - for (var i = 0; i < lines.length; i++) { - this.setTextHorizontalAlign(this.context, textPos, elementWidth, lines[i]); + _setLineHeight: function() { + if (!isNaN(this.lineHeight)) { + this.lineHeight = this.fontSize * this.lineHeight; + } else if (this.lineHeight.toString().indexOf('px') !== -1) { + this.lineHeight = parseInt(this.lineHeight); + } else if (this.lineHeight.toString().indexOf('%') !== -1) { + this.lineHeight = (parseInt(this.lineHeight) / 100) * this.fontSize; + } + }, - textPos.y = parseInt(textPos.y) + parseInt(this.lineHeight); - this.context.fillText(lines[i], textPos.x, textPos.y); - if (this.strokeText) { - this.context.strokeText(lines[i], textPos.x, textPos.y); - } - } - }, + _wrap: function() { + if (this.allowNewLine) { + var newLines = this.text.trim().split('\n'); + for (var i = 0,idx = 0; i < newLines.length - 1; i++) { + idx += newLines[i].trim().split(/\s+/).length; + this.newLineIndexes.push(idx) + } + } - setFontSize: function(size) { - var fontParts = this.context.font.split(/\b\d+px\b/i); - this.context.font = fontParts[0] + size + 'px' + fontParts[1]; - this.lineHeight = size; - }, + var words = this.text.trim().split(/\s+/); + this._checkLength(words); + this._breakText(words); - getWrappedText: function(elementWidth) { - var maxTextLength = elementWidth - (this.paddingX * 2); + this.textBlockHeight = this.lines.length * this.lineHeight; + }, - var words = this.text.trim().split(/\s+/); - var lines = []; + _checkLength: function(words) { + var testString,tokenLen,sliced,leftover; - this.checkWordsLength(this.context, words, maxTextLength); - this.breakTextIntoLines(this.context, lines, words, maxTextLength); + for (var i = 0; i < words.length; i++) { + testString = ''; + tokenLen = this.context.measureText(words[i]).width; - return lines; - }, + if (tokenLen > MAX_TXT_WIDTH) { + for (var k = 0; (this.context.measureText(testString + words[i][k]).width <= MAX_TXT_WIDTH) && (k < words[i].length); k++) { + testString += words[i][k]; + } - checkWordsLength: function(context, words, maxTextLength) { - for (var i = 0; i < words.length; i++) { - var testString = ''; - var tokenLen = context.measureText(words[i]).width; + sliced = words[i].slice(0,k); + leftover = words[i].slice(k); + words.splice(i,1,sliced,leftover); + } + } + }, - // check if a word exceeds the element's width - if (tokenLen > maxTextLength) { - for (var k = 0; (context.measureText(testString + words[i][k]).width <= maxTextLength) && (k < words[i].length); k++) { - testString += words[i][k]; - } + _breakText: function(words) { + for (var i = 0,j = 0; i < words.length; j++) { + this.lines[j] = ''; - // break the word because it's too long - var sliced = words[i].slice(0, k); - var leftover = words[i].slice(k); - words.splice(i, 1, sliced, leftover); - } - } - }, + if (this.lineBreak === 'auto') { + while ((this.context.measureText(this.lines[j] + words[i]).width <= MAX_TXT_WIDTH) && (i < words.length)) { - breakTextIntoLines: function(context, lines, words, maxTextLength) { - for (var i = 0, j = 0; i < words.length; j++) { - lines[j] = ''; + this.lines[j] += words[i] + ' '; + i++; - if (this.lineBreak === 'auto') { - // put as many full words in a line as can fit element - while ((context.measureText(lines[j] + words[i]).width <= maxTextLength) && (i < words.length)) { - lines[j] += words[i] + ' '; - i++; - } - lines[j] = lines[j].trim(); - } else if (this.lineBreak === 'word') { - // put each next word in a new line - lines[j] = words[i]; - i++; - } - } - }, + if (this.allowNewLine) { + for (var k = 0; k < this.newLineIndexes.length; k++) { + if (this.newLineIndexes[k] === i) { + j++; + this.lines[j] = ''; + break; + } + } + } + } + this.lines[j] = this.lines[j].trim(); + } else { + this.lines[j] = words[i]; + i++; + } + } + }, - setTextHorizontalAlign: function(context, textPos, elementWidth, line) { - if (this.textAlign === 'center') { - textPos.x = (elementWidth - context.measureText(line).width) / 2; - } else if (this.textAlign === 'right') { - textPos.x = elementWidth - context.measureText(line).width - this.paddingX; - } else { - textPos.x = this.paddingX; - } - }, + _justify: function() { + var maxLen,longestLineIndex,tokenLen; + for (var i = 0; i < this.lines.length; i++) { + tokenLen = this.context.measureText(this.lines[i]).width; - setTextVerticalAlign: function(textPos, textBlockHeight) { - var elementHeight = (this.fitParent === false) ? this.canvas.height : this.canvas.parentNode.clientHeight; + if (!maxLen || tokenLen > maxLen) { + maxLen = tokenLen; + longestLineIndex = i; + } + } - if (this.verticalAlign === 'middle') { - textPos.y = (elementHeight - textBlockHeight) / 2; - } else if (this.verticalAlign === 'bottom') { - textPos.y = elementHeight - textBlockHeight - this.paddingY; - } else { - textPos.y = this.paddingY; - } - }, + // fill lines with extra spaces + var numWords,spaceLength,numOfSpaces,num,filler; + var delimiter = '\u200A'; + for (i = 0; i < this.lines.length; i++) { + if (i === longestLineIndex) continue; - validate: function() { - if (!(this.canvas instanceof HTMLCanvasElement)) { - throw new TypeError('From CanvasTextWrapper(): Element passed as the first parameter is not an instance of HTMLCanvasElement.'); - } - if (typeof this.text !== 'string') { - throw new TypeError('From CanvasTextWrapper(): The second, dedicated for the text, parameter must be a string.'); - } - if (isNaN(this.lineHeight)) { - throw new TypeError('From CanvasTextWrapper(): Cannot parse font size as an Integer. Check "font" property\'s value.'); - } - if (this.textAlign !== 'left' && this.textAlign !== 'center' && this.textAlign !== 'right') { - throw new TypeError('From CanvasTextWrapper(): Unsupported horizontal align value is used. Property "textAlign" can only be set to "left", "center", or "right".'); - } - if (this.verticalAlign !== 'top' && this.verticalAlign !== 'middle' && this.verticalAlign !== 'bottom') { - throw new TypeError('From CanvasTextWrapper(): Unsupported vertical align value is used. Property "verticalAlign" can only be set to "top", "middle", or "bottom".'); - } - if (isNaN(this.paddingX)) { - throw new TypeError('From CanvasTextWrapper(): Unsupported horizontal padding value is used. Property "paddingX" must be set to a number'); - } - if (isNaN(this.paddingY)) { - throw new TypeError('From CanvasTextWrapper(): Unsupported vertical padding value is used. Property "paddingY" must be set to a number.'); - } - if (typeof this.fitParent !== 'boolean') { - throw new TypeError('From CanvasTextWrapper(): Property "fitParent" must be set to a Boolean.'); - } - if (this.lineBreak !== 'auto' && this.lineBreak !== 'word') { - throw new TypeError('From CanvasTextWrapper(): Unsupported line break value is used. Property "lineBreak" can only be set to "auto", or "word".'); - } - if (typeof this.sizeToFill !== 'boolean') { - throw new TypeError('From CanvasTextWrapper(): Property "sizeToFill" must be set to a Boolean.'); - } - if (typeof this.strokeText !== 'boolean') { - throw new TypeError('From CanvasTextWrapper(): Property "strokeText" must be set to a Boolean.'); - } - } - }; + numWords = this.lines[i].trim().split(/\s+/).length; + if (numWords <= 1) continue; + + this.lines[i] = this.lines[i].trim().split(/\s+/).join(delimiter); + + spaceLength = this.context.measureText(delimiter).width; + numOfSpaces = (maxLen - this.context.measureText(this.lines[i]).width) / spaceLength; + num = numOfSpaces / (numWords - 1); + + filler = ''; + for (var j = 0; j < num; j++) { + filler += delimiter; + } + + this.lines[i] = this.lines[i].trim().split(delimiter).join(filler); + //console.log('numWords:', numWords, 'numOfSpaces:', numOfSpaces, 'num:', num); + } + }, + + _drawText: function() { + for (var i = 0; i < this.lines.length; i++) { + this._setAlignX(this.lines[i]); + + this.textPos.y = parseInt(this.textPos.y) + this.lineHeight; + this.context.fillText(this.lines[i],this.textPos.x,this.textPos.y); + + if (this.strokeText) { + this.context.strokeText(this.lines[i],this.textPos.x,this.textPos.y); + } + } + }, + + _setAlignX: function(line) { + if (this.textAlign == 'center') { + this.textPos.x = (EL_WIDTH - this.context.measureText(line).width) / 2; + } else if (this.textAlign == 'right') { + this.textPos.x = EL_WIDTH - this.context.measureText(line).width - this.paddingX; + } else { + this.textPos.x = this.paddingX; + } + }, + + _setAlignY: function() { + if (this.verticalAlign == 'middle') { + this.textPos.y = (EL_HEIGHT - this.textBlockHeight) / 2; + } else if (this.verticalAlign == 'bottom') { + this.textPos.y = EL_HEIGHT - this.textBlockHeight - this.paddingY; + } else { + this.textPos.y = this.paddingY; + } + }, + + _validate: function() { + if (!(this.canvas instanceof HTMLCanvasElement)) + throw new TypeError('The first parameter must be an instance of HTMLCanvasElement.'); + + if (typeof this.text !== 'string') + throw new TypeError('The second parameter must be a string.'); + + if (isNaN(this.fontSize)) + throw new TypeError('Cannot parse "font".'); + + if (isNaN(this.lineHeight)) + throw new TypeError('Cannot parse "lineHeight".'); + + if (this.textAlign.toLocaleLowerCase() !== 'left' && this.textAlign.toLocaleLowerCase() !== 'center' && this.textAlign.toLocaleLowerCase() !== 'right') + throw new TypeError('Property "textAlign" must be set to either "left", "center", or "right".'); + + if (this.verticalAlign.toLocaleLowerCase() !== 'top' && this.verticalAlign.toLocaleLowerCase() !== 'middle' && this.verticalAlign.toLocaleLowerCase() !== 'bottom') + throw new TypeError('Property "verticalAlign" must be set to either "top", "middle", or "bottom".'); + + if (typeof this.justifyLines !== 'boolean') + throw new TypeError('Property "justifyLines" must be set to a Boolean.'); + + if (isNaN(this.paddingX)) + throw new TypeError('Property "paddingX" must be set to a Number.'); + + if (isNaN(this.paddingY)) + throw new TypeError('Property "paddingY" must be set to a Number.'); + + if (typeof this.fitParent !== 'boolean') + throw new TypeError('Property "fitParent" must be set to a Boolean.'); + + if (this.lineBreak.toLocaleLowerCase() !== 'auto' && this.lineBreak.toLocaleLowerCase() !== 'word') + throw new TypeError('Property "lineBreak" must be set to either "auto" or "word".'); + + if (typeof this.sizeToFill !== 'boolean') + throw new TypeError('Property "sizeToFill" must be set to a Boolean.'); + + if (typeof this.strokeText !== 'boolean') + throw new TypeError('Property "strokeText" must be set to a Boolean.'); + } + }; + + window.CanvasTextWrapper = CanvasTextWrapper; })(); \ No newline at end of file diff --git a/js/examples.js b/js/examples.js index 36f91c5..aecbeb7 100644 --- a/js/examples.js +++ b/js/examples.js @@ -1,85 +1,51 @@ document.onreadystatechange = function() { - if (document.readyState === 'complete') { + 'use strict'; + if (document.readyState === 'complete') { + (function() { + var container = document.getElementsByTagName('section')[0]; + var w = 448; + var h = 250; + var options = optionsArr; - (function() { - var container = document.getElementsByTagName('section')[0]; - var w = 448; - var h = 250; - var aspectRatio = 0; - var text = 'Canvas text wrapping example'; + createExamples(); - var img = new Image(); - img.src = 'img/bg.jpg'; - img.onload = function() { - aspectRatio = img.naturalWidth / img.naturalHeight; - createExamples(); - }; + function createExamples() { + var fragment = new DocumentFragment(); + var context; - // use options.js file - var options = optionsArr; + for (var i = 0; i < options.length; i++) { + var exampleItem = document.createElement('div'); + fragment.appendChild(exampleItem); - function createExamples() { - var fragment = new DocumentFragment(); - var context; + var canvas = document.createElement('canvas'); + exampleItem.appendChild(canvas); + canvas.width = w; + canvas.height = h; + context = canvas.getContext('2d'); + context.lineWidth = 2; + context.strokeStyle = 'red'; + CanvasTextWrapper(canvas,(options[i].txt),options[i]); - for (var i = 0; i < options.length; i++) { - var exampleItem = document.createElement('div'); - fragment.appendChild(exampleItem); + var hint = document.createElement('div'); + exampleItem.appendChild(hint); + var optionsData = ''; - // draw canvas image - var canvasImg = document.createElement('canvas'); - canvasImg.width = w; - canvasImg.height = h; - context = canvasImg.getContext('2d'); - context.drawImage(img, 0, 0, w, w * aspectRatio); - exampleItem.appendChild(canvasImg); + for (var property in options[i]) { + if (options[i].hasOwnProperty(property)) { + if (property == 'txt') continue; + var stringWrapper = (property == 'paddingX' || property == 'paddingY' || property == 'sizeToFill' || property === 'justifyLines' || property === 'allowNewLine' || property === 'strokeText') ? '' : '"'; + optionsData += ' ' + property + ': ' + + stringWrapper + options[i][property] + stringWrapper + ',
    '; + } + } - // create canvas mask layer - var canvasMask = document.createElement('canvas'); - canvasMask.width = w; - canvasMask.height = h; - context = canvasMask.getContext('2d'); - context.fillStyle = 'rgba(255,255,255, 1)'; - context.fillRect(0, 0, w, h); - exampleItem.appendChild(canvasMask); + hint.innerHTML = '

    CODE:

    ' + + 'CanvasTextWrapper(canvas, str, {
    ' + optionsData + '});' + + '

    '; + } - if (i < options.length -1) { - // create text to be cut out mask layer - context.fillStyle = '#212121'; - context.globalCompositeOperation = 'destination-out'; - } else { - // make stroke gradient - var gradient=context.createLinearGradient(0,0,canvasImg.width,0); - gradient.addColorStop("0","#ffff00"); - gradient.addColorStop("1.0","red"); - context.strokeStyle=gradient; - context.lineWidth = 3; - } - - // create wrapper - new CanvasTextWrapper(canvasMask, ('#' + (i + 1) + ' ' + text), options[i]); - - // create hint code block - var hint = document.createElement('div'); - exampleItem.appendChild(hint); - var optionsData = ''; - - // read used properties - for (var property in options[i]) { - var stringWrapper = (property == 'paddingX' || property == 'paddingY' || property == 'sizeToFill') ? '' : '"'; - optionsData += ' ' + property + ': ' + - stringWrapper + options[i][property] + stringWrapper + ',
    '; - } - - // print example code - hint.innerHTML = '
    CODE:

    ' + - 'new CanvasTextWrapper(canvasEl, textStr, {
    ' + optionsData + '});' + - '

    '; - } - - // inject document fragment into actual DOM - container.appendChild(fragment); - } - })(); - } + container.appendChild(fragment); + } + })(); + } }; \ No newline at end of file diff --git a/js/options.js b/js/options.js index 3599f4e..8cb50ba 100644 --- a/js/options.js +++ b/js/options.js @@ -1,36 +1,47 @@ -(function() { - window.optionsArr = [ - { - font: 'bold 55px Open Sans, sans-serif' - }, - { - font: 'normal 40px Impact, Charcoal, sans-serif', - textAlign: 'center', - paddingY: 10, - lineBreak: 'word' - }, - { - font: 'bold 55px Open Sans, sans-serif', - textAlign: 'right', - verticalAlign: 'bottom', - paddingX: 30 - }, - { - font: 'bold 35px Verdana, Geneva, sans-serif', - textAlign: 'center', - verticalAlign: 'middle' - }, - { - textAlign: 'center', - verticalAlign: 'middle', - sizeToFill: true - }, - { - font: 'bold 50px Tahoma, Geneva, sans-serif', - textAlign: 'right', - paddingX: 25, - paddingY: 25, - strokeText: true - }, - ]; -})(); \ No newline at end of file +var optionsArr = [ + { + txt: 'Break text on every next word', + font: 'bold 25px Arial, sans-serif', + textAlign: 'center', + lineBreak: 'word', + lineHeight: 1.6 + }, + { + txt: 'Center text block horizontally and vertically', + font: 'bold 35px Verdana, Geneva, sans-serif', + textAlign: 'center', + verticalAlign: 'middle' + }, + { + txt: 'Resize text automatically to fill its padded container. Given "font" and "lineHeight" properties are ignored', + textAlign: 'center', + verticalAlign: 'middle', + sizeToFill: true, + paddingX: 10, + paddingY: 30 + }, + { + txt: 'Justify text lines takes effect only with "auto" break line. One-word lines are skipped', + font: 'bold 40px Arial, Geneva, sans-serif', + paddingX: 20, + paddingY: 20, + verticalAlign: 'middle', + textAlign: 'center', + justifyLines: true + }, + { + txt: 'Apply text stroke is based on context settings', + font: 'bold 40px Tahoma, Geneva, sans-serif', + textAlign: 'right', + paddingX: 25, + strokeText: true, + lineHeight: '60px' + }, + { + txt: 'Use\n new line character "\\n"\n to break lines\nwhere needed', + font: 'bold 30px Tahoma, Geneva, sans-serif', + verticalAlign: 'bottom', + allowNewLine: true, + lineHeight: '200%' + } +]; \ No newline at end of file