The other day I wanted to adapt (well, err, fundamentally: to copy!) the neat javascript trick in diotalevi's home node to my blog. Except that I wanted to roll it on my own image.
Thus I first found the png I wanted; then as a side note I tried to compress it as much as possible: not everybody knows that while png is a well defined standard, much freedom is left to the encoding program; those interested in these topics may find some relevant info in a few bookmarks I gathered.
Next step is to translate the binary data in the image's content into a JS literal string. (To be precise, following diotalevi's example again, in JS code consisting of the concatenation of several literal strings.)
Eventually, it turns out that the neat trick doesn't work any more: with FF3, that is... Whatever, this left me with the quick script I concocted up to do the conversion to JS literal strings, which I'm pasting hereafter. Since JS literal strings are not too different from Perl literal strings, and also independently of this detail, I thought of sharing it:
#!/usr/bin/perl use strict; use warnings; use 5.010; # JS String literals specs from # http://developer.mozilla.org/En/Core_JavaScript_1.5_Guide:Literals#S +tring_Literals { my %subst = ( "\b" => '\\b', "\f" => '\\f', "\n" => '\\n', "\r" => '\\r', "\t" => '\\t', "\cK" => '\\v', q{"} => q{\\"}, q{'} => q{\\'}, q{\\} => q{\\\\}, map { $_ => $_ } 0..7 ); my $lastisnum; sub subst { my $s=$subst{local $_=shift}; ( ($lastisnum, undef) = /\d/ && $lastisnum || !defined $s ? (1, sprintf '\\%o', ord) : (0, $s) )[1]; } } ( my $s = do { use open IN => ':raw'; local $/; scalar <>; } ) =~ s { ([\"\'\\[:^print:]0-7]) }{ subst $1 }gsex; while (defined $s) { my ($c, $t); say +( ($c,$t) = $s =~ /(^.{60,}?)([\D].*)/ ) ? qq|'$c'+| : qq|'$s'|; $s=$t; } __END__
Example output:
'\211PNG\r\n\32\n\0\0\0\rIHDR\0\0\1\364\0\0\1M\b\3\0\0\0\301\315'+ 'm\5\0\0\0\3sBIT\b\b\b\333\341O\340\0\0\0\tpHYs\0\0\4\235\0\0'+ '\4\235\1|\64k\241\0\0\0\31tEXtSoftware\0www.inkscape.org\233'+ '\356<\32\0\0\2\240PLTE\330\356\343\351\241\246\0\222F\316+\67'+ '\316,\67\316-\67\317-\66\317.\67\317/\67\317\60\66\317\60\67'+ '\317\61\66\320\61\66\320\62\66\320\63\66\320\63\67\320\64\66'+ '\320\65\66\320\66\66\320\67\65\3208\66\321\65\66\321\66\66\3218'+ '\66\3219\65\321:\66\321;\65\322;\65\322<\65\322=\65\322=\66\322'+ '>\65\322?\65\323?\65\323@\65\323A\64\323A\65\323B\65\323C\65'+ '\324C\65\324D\65\324E\64\324F\64\324G\64\325G\64\325H\64\325'+ 'I\64\325J\64\326L\64\326M\64\326N\63\326N\64\326O\63\326P\63'+ '\326P\64\326Q\63\326Q\64\327R\63\327S\63\327T\62\327T\63\327'+ 'U\63\330V\63\330W\62\330W\63\330Y\62\331Z\62\331Z\63\331\\2\332'+ ']\62\332^\62\332_\62\332`\62\332a\62\333a\62\333b\61\333c\61'+ '\333d\61\333e\61\333h\61\334g\61\334i\61\334j\61\334k\61\334'+ 'l\60\335n\60\335o\60\336p\60\336q\60\336r\60\336s\60\337t\60'+ '\337v\60\337w/\337x/\340w\60\340x/\340y/\340z/\340|/\340}/\341'+ '}/\341\177/\341\200.\341\200/\341\201.\341\201/\342\202.\342'+ '\203.\342\204.\343\206.\343\207.\343\211.\344\213-\344\214-\345'+ '\215-\345\216-\345\217-\345\220-\345\222-\345\223-\346\223-\346'+ '\224-\346\225-\346\226,\346\227,\347\230,\347\231,\347\232,\347'+ '\233,\350\234,\350\235+\350\235,\350\236,\350\237+\351\237,\351'+ '\242+\351\243+\351\245+\352\243+\352\245+\352\246+\352\247*\352'+ '\247+\352\250+\352\251+\353\252*\353\253*\353\254*\353\256*\354'+ '\257*\354\260)\354\260*\354\261)\354\261*\355\263)\355\263*\355'+ '\264)\355\265)\355\266)\356\266)\356\267)\356\267*\356\270)\356'+ '\271)\356\272)\357\272)\357\273(\357\273)\357\274)\357\275)\357'+ '\276(\357\277(\357\300(\360\300(\360\301(\360\302(\360\303(\360'+ '\304(\361\304(\361\305(\361\306(\361\307(\361\310\'\362\310\'+ ''\362\311\'\362\312\'\362\312(\362\313\'\362\314\'\363\314\''+ '\363\315\'\363\316&\363\316\'\363\317\'\363\320\'\364\320\'\364'+ '\321&\364\322&\364\322\'\364\323&\364\325&\364\326&\365\323&'+ '\365\324\'\365\325&\365\326&\365\327&\365\330%\365\330&\365\331'+ '%\365\331&\365\332&\366\332&\366\333%\366\333&\366\334%\366\335'+ '%\366\336&\367\336%\367\337%\367\337&\367\340%\377\377\377K,'+ '(c\0\0\0\2tRNS\306\306\231\64\332u\0\0\6\375IDATx\332\355\335'+ '\367{\324d\0\300q\64E\252\210\342B\5\334\342@m\35(\212\33\367'+ '@\305\211\342B\334(Kp\3\342\36(nq\357\275\7\342@q\2418\260\342'+ '`\330\63\376+\266M\322\273k\357Z\344\361\7\337\334\347\373S/'+ 'y\357)O?\334%y/\311\365X\275\273z\374\335M\253E\n\253\36\320'+ '\241C\207\16\35:t\350\320\241\v\272\240\v\272\240\v\272\240\'+ 'v\272\240\v\272\376\227\350\365\273\325\371\313\327\334+}\307'+ '\373\247\356\351o_ko\357\275\247\305s\'\354\340\317_c\333\364'+ '\223\232\342\346[w\2P[;r;\275\35\307\205\333\33\21\324\324\336'+ '{\237\33\343\26\366\273w\205PS\207l\247\375\321\302\336<\271'+ '\67\206Z:N\37\276\244E=~\177\30\207Z\232\234\331oq\253za\252'+ '\27{\r\241GC\26\265\252\307s\275\330k\b=j\374\252M}\351\b\26'+ '\265\203\36\3558\277M\275\371t\309D\357\331\253\362\362m?jS\217'+ '/\241\221;\364\272\233\226\275:s\314A\33u^\323\320\224\250_\351'+ 'c\230\274\241OKd\v\363\356\276\374\230\376\345\253NHV\305\67'+ '\360\310\27\372Uq\261\257\6wX9%]q\36\220<\241O.\61\377\256\241'+ '\343\332^\217\'kV\34@$?\350\343K\314\177\252\60\333>`A\262\356'+ '\313\201H\362\202~Q\211\371\17{W\32\261_!Y\373d/&\371@?\257\304'+ '\374\227\375+\217\271\65]?\225I.\320G\227\230\377~p\225A\333'+ '-OG\354\16%\7\350\247\26\212\346\313\16\253:\354\332t\310l(\341'+ '\243\237\330\\4_ql\365q\3\227\244\7\362N\246\t\36\375\270\25'+ 'E\363\277\216\357j\344\304t\324\355T\2G?\262\304<\216\247u\65'+ '\321\272i\272\31(\f\306\22\64\372\241\313\342\262f\366\354b\360'+ '\263\351\240\33\261\204\214~\320oq\207nY\243\372\350\213\263'+ '-\377\0.\341\242\17k*\341\276\63\335bW\237}i\314\206\216\344'+ '\222\17\364\313\242K\223\37fUWO?X\217\257\347\22\360\333\373'+ '\201\355o\357\23[\36]\221\374xo}\265\341\323\323\301\357r\311'+ '\303\216\\2\271:#y\360\300\232UF_\226\375\27\261Q\317\301!\333'+ 'u\311\203\236w%\246\17\257]y\360\250\f\375\4\60\301O\316\314'+ '\314\16\317\353\37JP\37\355Sq\354\341\31\372\65`\202Fo\231\206'+ '\275\255xp\336\347\271\364\23\324\276\225\206\356\232\241\277'+ '\16&l\364\350\220\322C\363\365\337HX\237\253p\202d\264u\206\376'+ '\31\230\300\321\313\353\377A\342\372\322\372]\34\250\177\r&W'+ '\350\321\66\237\'\260\257n\330y\2/C_\4&_\350\321.\v\23\331\67'+ '\67\351\270fD\206\336\4&g\350\321\220t\242\356\355\376\325\16'+ '\331\376\0\223\67\364\350\300\337\23\333\367\266(_>!Co\6\223'+ ';\364\350\350\364S\366\17\266,[\374p\373L\275\v\234\362\207\36'+ '\235\234\236\60\61o\233\222\205u?\267\243\327\223\311\37ztN\252'+ '\373\351\366\25\216\330\342\357\301\344\21=\32\227\372~^<9\252'+ 'x\252\364\213`r\211\36MM\201\277\3309[\362|\361\374\32\60\371'+ 'D\217f\246\302\337\244\347<\357Vz\306\205\362\211\276\306\254'+ '\224xarE\343\364\"\372\241`r\212\36\325g\207h?\16iy\324oI\273'+ '\371\222\265\300\4\216\276\331\231\325\f\327\315\266\342\213'+ '\207F\321\35\305\27\372}\\\2G\257\177\66^pv\25\366\r\336\314'+ '\256_\336\267\364\312\326\63\270\4\216\336vab\65\366\201\37\246'+ '\316\277\226\\\t\263x=.\1\243\367\233rev<^\205}\320\202\270S'+ '\223\260\204\214~\177\251\345\202\363\267\250\60\244\341\333'+ '\216\346K\335\202$h\364\344f\220\247NJ9\v\317\214\351\354\276'+ 'wS\7\364)T\202FO\366\316\33\242\221\355\27=\24\236:w\263\362'+ '-\300\250\227\313\315?\352C%h\3649m\214gE\321\36\363KX\277||'+ '\306\205#\32\7\f\36v\324)c\357[\336\361\335}8\224\240\321OO>'+ '@m\235p\333tN\274rMf\22\62\372\266\255\273q\313\37\230=\276\355'+ 'Q\335\231M+c\376\264\323\'BF?\373\267\16\27(\rzl%\320\233G\61'+ '\t\26\275\367\315m\206\17\226.\253\33\275\260{\365\302h(\201'+ '\242o\365JBxT\371\342\276\343\276\357\236}\f\225 \321w\370:\361'+ '\233\333i\v\335ob\367\233\366\261X\2D\257{*\345\253\364\305,'+ '\353\234\362D\241\202\364kG<\322\376\363E\\\302C\277 \305\233'+ 'S\345\227\16\32\367X\371\35\210\26]\335rs\320\276/\264?\36\7'+ '&\64\364\1K\323=\361.\356\375X\277\317\330kg\277\360\311\307'+ '\357\274\62\347\352\323\366H\316x\336\360\255\f}>\230\320\320'+ '\217[\325[\vl>/}\346\307`BCO\277\305a\326\277\277ba\373/\222'+ '\247\36\17&\64\364\344~A\323Wen\255\361\307\326\247\336\303%8'+ '\364\255[\316\202\371\344\374U\373\367\fm\212\377\234\350\333'+ '\35\2\334{\337x\344\360U\236Bo8i/*a\316\310\t\272\240\v\272\240'+ '\v\272\240\v\272\240\v\272\240\v:t\350\320\241C\207\16\35:tA'+ '\27tA\27tA\27tA\27tA\27tA\27t\350\320\241C\207\16\35:t\350\320'+ '\241\v\272\240\v\272\240\v\272\240\v\272\240\v\272\240\v:t\350'+ '\320\241C\207\16\35:t\350\320\5]\320\5]\320\5]\320\5]\320\5]'+ '\320\5]\320\241C\207\16\35:t\350\320\241\v\272\240\v\272\240'+ '\v\272\240\v\272\240\v\272\240\v\272\240C\207\16\35:t\350\320'+ '\241C\27tA\27tA\27tA\27tA\27tA\27tA\207\16\35:t\350\320\241C'+ '\207.\350\202.\350\202.\350\202.\350\202.\350\202.\350\202\16'+ '\35:t\350\320\241C\207\16\35:tA\27tA\27tA\27tA\27tA\27tA\207'+ '\16\35:t\350\320\241C\207\16\35\272\240\v\272\240\v\272\240\'+ 'v\272\240\v\272\240\v\272\240\v:t\350\320\241C\207\16\35:tA\27'+ 'tA\27tA\27tA\27tA\27tA\27t\350\320\241C\207\16\35:t\350\202.'+ '\350\202.\350\202.\350\202.\350\202.\350\202.\350\320\241C\207'+ '\16\35:t\350\320\5]\320\5]\320\5]\320\5]\320\5]\320\5]\320\241'+ 'C\207\16\35:t\350\320\241C\207.\350\202.\350\202.\350\202.\350'+ '\202.\350\202.\350\320\241C\207\16\35:t\350\320\241C\27tA\27'+ 'tA\27tA\27tA\27tA\27tA\207\16\35:t\350\320\241C\207.\350\202'+ '.\350\202.\350\202\256\377\266\177\0\227h\376\312\300\24!\1\0'+ '\0\0\0IEND\256B`\202'
Update: added defined in the while clause as per ikegami's remark.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Simple binary data to JS string literal converter
by ikegami (Patriarch) on Sep 16, 2008 at 08:58 UTC | |
by blazar (Canon) on Sep 16, 2008 at 11:31 UTC | |
|
Re: Simple binary data to JS string literal converter
by ambrus (Abbot) on Sep 16, 2008 at 14:23 UTC | |
by blazar (Canon) on Sep 16, 2008 at 15:22 UTC | |
|
Re: Simple binary data to JS string literal converter
by Anonymous Monk on Sep 16, 2008 at 05:14 UTC | |
by blazar (Canon) on Sep 16, 2008 at 11:19 UTC |