From 2c644f91d7e87c374ec53d5f503081fa55995cfb Mon Sep 17 00:00:00 2001 From: ceee Date: Wed, 15 May 2013 22:30:57 +0200 Subject: [PATCH] add basic functionality --- Gruntfile.js | 24 ++++++++++++++++++--- package.json | 3 ++- tasks/base64.js | 43 +++++++++++++++++++++++++++++++++++-- test/base64_test.js | 13 +++++++++++ test/fixtures/test-bmp.bmp | Bin 0 -> 30056 bytes test/fixtures/test-gif.gif | Bin 0 -> 458 bytes test/fixtures/test-jpg.jpg | Bin 0 -> 18107 bytes test/fixtures/test-png.png | Bin 0 -> 4980 bytes 8 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 test/fixtures/test-bmp.bmp create mode 100644 test/fixtures/test-gif.gif create mode 100644 test/fixtures/test-jpg.jpg create mode 100644 test/fixtures/test-png.png diff --git a/Gruntfile.js b/Gruntfile.js index 19850ee..1caf9fb 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -10,6 +10,7 @@ module.exports = function (grunt) { grunt.initConfig({ + jshint: { all: [ 'Gruntfile.js', @@ -20,11 +21,29 @@ module.exports = function (grunt) { jshintrc: '.jshintrc' } }, + clean: { test: ['tmp'] }, + nodeunit: { tasks: ['test/*_test.js'] + }, + + // Configuration to be run (and then tested). + base64: { + default: { + options: { + test: true + }, + src: [ + "test/fixtures/test-png.png", + "test/fixtures/test-gif.gif", + "test/fixtures/test-jpg.jpg", + "test/fixtures/test-bmp.bmp" + ], + dest: "tmp/base64.css" + } } }); @@ -34,11 +53,10 @@ module.exports = function (grunt) { grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-nodeunit'); grunt.loadNpmTasks('grunt-contrib-internal'); - grunt.loadNpmTasks('grunt-base64'); grunt.registerTask('mkdir', grunt.file.mkdir); - + grunt.registerTask('test', [ 'clean', 'mkdir:tmp', 'nodeunit', 'clean' ]); - + grunt.registerTask('default', [ 'test', 'base64' ]); }; diff --git a/package.json b/package.json index 1ac9666..8263426 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,8 @@ "test": "grunt test" }, "dependencies": { - "filesize": "~1.7.9" + "filesize": "~1.7.9", + "datauri": "~0.2.0" }, "devDependencies": { "grunt-contrib-internal": "~0.4.3", diff --git a/tasks/base64.js b/tasks/base64.js index 014f9a8..923f91d 100644 --- a/tasks/base64.js +++ b/tasks/base64.js @@ -14,9 +14,48 @@ module.exports = function (grunt) var fs = require('fs'); var childProcess = require('child_process'); var filesize = require('filesize'); + var datauri = require('datauri'); grunt.registerMultiTask('base64', 'create base64 encoded data-uris for css from images', function () { - var options = this.options(); - }); + var options = this.options({ + + }); + + + this.files.forEach(function(f) + { + // filter valid files and map data uri generation + var data = f.src.filter( fileExists ).map( generateDataUri ).join('\n'); + + // Write the destination file. + grunt.file.write(f.dest, data); + + grunt.log.writeln('File "' + f.dest + '" created.'); + }); + + + // generates a datauri object from file + // ~~~~~~~~~~~~~~~~~~~~~ + function generateDataUri( filepath ) + { + var dataObj = new datauri( filepath ); + + return dataObj.getCss(); + } + + + // Warn on and remove invalid source files (if nonull was set). + // ~~~~~~~~~~~~~~~~~~~~~ + function fileExists( filepath ) + { + if (!grunt.file.exists(filepath)) + { + grunt.log.warn('source file "' + filepath + '" not found.'); + return false; + } + + return true; + } + }); }; diff --git a/test/base64_test.js b/test/base64_test.js index bfd0e5b..80d55e8 100644 --- a/test/base64_test.js +++ b/test/base64_test.js @@ -3,4 +3,17 @@ var grunt = require('grunt'); var fs = require('fs'); exports.imagemin = { + + setUp: function( done ) + { + done(); + }, + + base64_options: function( test ) + { + test.expect( 1 ); + test.equal( 1, 1, "random..." ); + test.done(); + } + }; diff --git a/test/fixtures/test-bmp.bmp b/test/fixtures/test-bmp.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4a24e4f7578910f37c36a0f5399352f93872b85b GIT binary patch literal 30056 zcmeI4b%+&R8^G;u?0W4kOa!}I>{e_={lh}ByG5`Su{%%1P z@aJFu$CrRF0bc^X1bhkj67VJ9OTd?aF9BZyItjdc_wMA$lk?}#A2DJ?&z?P-HEY(j zYuBMehpt((=D~vp^7P-oe_y_QdHM3?lP6E^+qZA;-o3|+8NHpC<;!3%pwVlhCI7ltKs=FAB&FJicJ=gu+a1-o_Y7TYI+v%vo^T)2R& zmMmEkcxuFqZQHiRjJNB{moMm?2(|+JMN97~JbU)+`}gld;|n#;LAh?-x-MP1U};pTQYADvUS9R) z&6}GyZ(?3LNF!=0~<{*%YLO3l~NYxQEmc$knP+u{P^*P7;z!GgwYYO_wV0NojSE4g$woMS@fh&pZ>~~D+(O@k7LJlzs&fK|kYhhCX#JYj6 zo~vK%*s%?vnRWj2&p*$fKevV)=24Wb9Mv+TTj2SZqyXgc>cAu7V6Mj+H!N^X8LP2d5HgF@8 zzGa8zD4cWX(4pkXlSiSHK#iAX_3G78Cs{Nf_u z<#9K=;YUM)M?gP-v%23+O=yJa_)^6BuPF7PH!{rw0;aH zQW3~EYt^b1E(jv~_5{_||Z0)v6VJWko1ciPQ^bN!7y( zH*)02g9i^{W?0+pTx}2nb~`y~(r^^248N#B$rQ6&UGUUHqZC(-^-ONCnKfs#|_q;g?ak)Y1uP?=fPR{X3!`H6SAU# zv%+kqclzZNJ80gtX;VnWNNX0Y?5J?n+G&?2(03Vhf>9VwkW zk_sypDh)1r`uQAuhP#`JV6mLA8nH|LT95Q_*%zc@QNxi;7-2-bG^tXh;ur6jLe%l%#X}7$Yd!MFr4_yesiG24kVj3oHp(lZSn~b)^%Dz~hCXYH z<5J8~UQup0Vu;4kqelgHPc={u6!!^I@kA-)@uq2`$V!O?%P*vWAR0>9NcZmD#SkUr zG8Ph?#1IY7Rs$Tv?olMppD{#l83N7EwTYwGG)pXdH#wOD>OJn54D0{ zF{+%W`}gk`L!N5jB$0he`r8c-8ER2+aw_FH0n5NERHz_xif<4<6;2*~7(zZHxN4m` zbxL07sWxS&;=RHGR}?s;QXGdDMWLD3Osq0&prw^k0yCR|>;(Y<@9Wj8R~1~|c|@NJ zQZe8$;{(#RYu7HZ#G+xd2tqbmxGO0qNI+u3Ibr(r=`z1KvaGRlQzmIaUSifJ@OS?F zd249AvE(TU2ztxJdU=>f$!QU!($Jfc3Oy)odA@abVMYN+m{qBo=aR1EG7*`LS~=LkjyFEam3bSX=t^n~=xrBw>?0+4T!eFqESeu3g zanb0@K-eJiWhYn(M1KB`9Xl*OO0Nwm$9Lq}w-15b0Ix|SAUz}x+h@?JndmVu`}fR* zh8K>nD|AW-cHoeA6pfls{ByAXN zv>+oI4e^5UeTJ0YSO_8D5QPSOOE3vJ(TMSoNhM!&$dDl+*!Ji>0$zWKlw|P|_rbe` z7ous?rd+pid=ZjHQS;XELxbo8CWrQA(Ri--YE8wxAVd2b+T=|U{v(t#Zrr#*g9hQu zq#%wT954O*_ouX(a04R6i}*K4!{^bLfG+`G0=@)%3HTE5CE!cImw+#UNJ=19tp5R$ Cp%38z literal 0 HcmV?d00001 diff --git a/test/fixtures/test-gif.gif b/test/fixtures/test-gif.gif new file mode 100644 index 0000000000000000000000000000000000000000..4d23612ec5d377c00ab343de59c18c6b97a49883 GIT binary patch literal 458 zcmV;*0X6xqEGps-U+?v5Fy zQ^&MCr?#ksise}!+3dE_?S2*E@EB1xpVR6wyKOZJ-e~C8o+y*?%;mz%z;`5=M+KI% zMOf&>g&5`N@H7J{q_~$fSv5#`SahXX$vLN0M^yL++C!M?xp+w$$|?)A2x}lJBgol$ zAc~8#n>s4jOY{2ZYkNz3dffMmN*oCdLtSh6s(gceZCxz9?fnfNDBi;DfnIIi#Ll9w z0l!Yp;ddubVef_?A)UzFPTv|{p8%d2_r~BsgbDeDYe;Y)L`(-KO4?_U(Z7tF7oTyQ zf(*+vK&nLcGx-o?K0_%rR$!S+QaY3q)v60LTNp#J*l4bS`};~u_l}j#rh6yL1Pu^ZPj+K1l)ym>)L(E_UPSc z^0d~K$#XAYpmzr=+1m|ZV8kvDBkm;7@8fIJCR@IYIkV=?oI88|3_7&v2n7HDJD6zR A6#xJL literal 0 HcmV?d00001 diff --git a/test/fixtures/test-jpg.jpg b/test/fixtures/test-jpg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..73dcf44d40afb251f70887a22132d05201cd4dd1 GIT binary patch literal 18107 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 aO^Zv-pur7&t7p9o&;v8etiSU=p8p^7_66hs literal 0 HcmV?d00001 diff --git a/test/fixtures/test-png.png b/test/fixtures/test-png.png new file mode 100644 index 0000000000000000000000000000000000000000..87908ebce9ec3d941155b2b7543ace9dbd6be22a GIT binary patch literal 4980 zcmV-)6N~JLP)pPPiaF#P*7-ZbZ>KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000P|Nkl1vVNL_bTKoJBh7QliERszNtHO3M}G#0=g#ugJJDrk&} zQDemT&u-M%0L5Mq1>-6fY^;hPx@!YOifdR{7FHLoKjypH<6-8Wa!`a$A~aCEPdhSLi;7C0Ul4U7;XdI7zGqJxljU<BWf4 zHsE#OxJ=et#t7LNxK;E(G3K%zcpT`L6JqWa^$8H+F24b%6r5x|;^kWng^r%6bfW^aGsecn3Q3Md0${gSMk(qfzKoGypzCL;@w*e* zbAZ|6K@SHm7Aq_c{02M$d?Z20;gzO3Ysd?dXK05Mg5d<9X@+mYH zXwJRNMnX=}yy*J@r0cW_$fy_p!mmm0KL0Tr3As`8qEiA8(jE9P1Q~6>F#+z=7ie-_ z<5SdVWbA|_Y4*Ck@;2a;0OxlA_lCIdOw=&0Uu@QlC>{a~u+38+1BtB#akJOYo?_*7`v5Jsx;)6J`iq7N&Cw3Rb`V(-XX8*GR?z;$B?Aq27cnmr2EjA!LO{7a;K~ryl!Gb4))?kJ)GwAth1c#6AXR z?I96K8-Uvkir-IaXp3R{OTaAIKi!~@hPi%kF*J&-@tTOF zJ|VAr4?D)g#wJ#82@`Uc=4B^Dpa=VjBiX0IYt@NPb3WfMnka)6!Nrp2>}G39h1cv5 zeY3iZv*{P-YQ)vM8Xw9Ukp=L9s|9udCzC#Q)`-*&5sla?vPwO|Ew+{bd!$Ur9h&EQ zC-H`y0wKF;S8#_abR;0+Ij{*O46^CXnsBo3b+PrV@b z7=p^VI!f+!l+KKGV7^#eZC-@LQg12G!mR}!#5{86Mw`UCnk4$#B9Y`~(M_eH+1?`d zhDlV}Z^p@c;um?Exwg(zZv~bHIKGcm^01hmXFX{nMIAB*H5O6KSozhDUu2t7KTpI> zF{7o;ON`n?$OR(zi&aprw4IQXMHv^Xq;vq6*lP9;MU7|gLv^8D#%=0tGJAJItuJzB zgtyo#q48y?aq$9bb)fx#gHYM_QLPd6J1R^6_qYj3N@QIZp&0oAxL%w+li9utD%<{P zqFXoROVTVNyus_mwG;JY!sS6Mt0Wq7Qi*ac;*Tu!aqNre z=XJz^7l9vr9QSKdfwQDD7ySel=Op+%n?)yhVT6r@)Zv}pvzTCW*Q3B3$}iCbYC$tA z390iq=4H$iZQ{aWQP}0s*G59N;yvkQUP@ygb3OL|Z6hJ2&qtW>Bf&CIqJ)>RQE#hK zf4t1TPwn-KA-^WUCX+SMdlO{%? zraxbSk6~gPv)@bTA&yrQogeo~13jf|^eb6nske-MgKAgQ)V4?H&k;{>&QNDwKz1eX-``NhiuF~ouS^5T*Zc%}9r4<#{cee0a z)KcaplKft4Zf5E&BZTzAJo(bAtf6z6zHuS1v56fQ3`m8Ltmu#-gb#7=N$1B`4h(sX z8lq1(s%oX)NVqk5OX%(T8x&7bW|4rd;HjH14wcK*5kTCmqjMzk)PSO@0hNT2nR?6W zw{Sn>YDJ|AEkNaOImgAvOT6p|QS!TrB-lvj2aD@bizR=7ntC0I zkgnhu;