@@ -6,6 +6,9 @@ var randomInt = require('random-int');
66var pathExists = require ( 'path-exists' ) ;
77var objectAssign = require ( 'object-assign' ) ;
88var path = require ( 'path' ) ;
9+ var twemoji = require ( 'twemoji' ) ;
10+ var Promise = require ( 'pinkie-promise' ) ;
11+ var get = require ( 'simple-get' ) ;
912var canvasW = 600 ;
1013var canvasH = 600 ;
1114
@@ -19,15 +22,46 @@ var getEncoder = function (opts) {
1922 return encoder ;
2023} ;
2124
22- var addFrame = function ( encoder , canvas , word , opts ) {
23- canvas . fillStyle = opts . background ;
24- canvas . fillRect ( 0 , 0 , canvasW , canvasH ) ;
25- canvas . font = opts . fontsize + ' Impact' ;
26- canvas . textAlign = 'center' ;
27- canvas . textBaseline = 'middle' ;
28- canvas . fillStyle = opts . fontcolor ;
29- canvas . fillText ( word , canvasW / 2 , canvasH / 2 ) ;
30- encoder . addFrame ( canvas ) ;
25+ var addImage = function ( encoder , ctx , img ) {
26+ return new Promise ( function ( resolve , reject ) {
27+ var rex = / < i m g .* ?s r c = " ( .* ?) " / ; // http://stackoverflow.com/questions/12393671/substring-regex-to-get-a-src-value-held-in-a-string
28+ get . concat ( 'http:' + rex . exec ( img ) [ 1 ] , function ( err , src ) {
29+ if ( err ) {
30+ reject ( err ) ;
31+ }
32+ var img = new Canvas . Image ( ) ;
33+ img . src = src ;
34+ ctx . drawImage ( img , ( canvasW / 2 ) - 18 , ( canvasH / 2 ) - 18 ) ; // to put image in center => canvas/2 - image/2
35+ encoder . addFrame ( ctx ) ;
36+ resolve ( ) ;
37+ } ) ;
38+ } ) ;
39+ } ;
40+
41+ var fillText = function ( encoder , ctx , word ) {
42+ ctx . fillText ( word , canvasW / 2 , canvasH / 2 ) ;
43+ encoder . addFrame ( ctx ) ;
44+ } ;
45+
46+ var addFrame = function ( encoder , ctx , word , opts ) {
47+ return new Promise ( function ( resolve ) {
48+ ctx . fillStyle = opts . background ;
49+ ctx . fillRect ( 0 , 0 , opts . canvasW , opts . canvasH ) ;
50+ ctx . font = opts . fontsize + ' Impact' ;
51+ ctx . textAlign = 'center' ;
52+ ctx . textBaseline = 'middle' ;
53+ ctx . fillStyle = opts . fontcolor ;
54+
55+ var emoji = twemoji . parse ( word ) ;
56+ if ( emoji . split ( ' ' ) . length > 1 ) {
57+ addImage ( encoder , ctx , emoji , opts ) . then ( function ( ) {
58+ resolve ( ) ;
59+ } ) ;
60+ } else {
61+ fillText ( encoder , ctx , word , opts ) ;
62+ resolve ( ) ;
63+ }
64+ } ) ;
3165} ;
3266
3367var generateFileName = function ( ) {
@@ -39,9 +73,17 @@ var generateFileName = function () {
3973 return filename ;
4074} ;
4175
76+ var processText = function ( encoder , canvas , text , opts ) {
77+ return text . reduce ( function ( promise , word ) {
78+ return promise . then ( function ( ) {
79+ return addFrame ( encoder , canvas , word , opts ) ;
80+ } ) ;
81+ } , Promise . resolve ( ) ) ;
82+ } ;
83+
4284module . exports = function ( text , opts ) {
4385 if ( typeof text !== 'string' || text === '' ) {
44- throw new Error ( 'Expected some string value' ) ;
86+ return Promise . reject ( new Error ( 'Expected some string value' ) ) ;
4587 }
4688
4789 opts = objectAssign ( {
@@ -51,29 +93,29 @@ module.exports = function (text, opts) {
5193 fontsize : '50px' ,
5294 filename : generateFileName ( ) ,
5395 dest : ''
54- } , opts , { repeat : 1 , quality : 10 } ) ;
96+ } , opts , { repeat : 0 , quality : 10 } ) ;
5597
5698 text = text . split ( ' ' ) ;
5799
58100 console . log ( opts . dest ) ;
59101 if ( opts . dest !== '' && ! pathExists . sync ( opts . dest ) ) {
60- throw new Error ( 'Please provide valid path' ) ;
102+ return Promise . reject ( new Error ( 'Please provide valid path' ) ) ;
61103 }
62104
63105 if ( opts . imagesize !== undefined ) {
64106 canvasW = opts . imagesize ;
65107 canvasH = opts . imagesize ;
66108 }
67-
109+ opts . canvasW = canvasW ;
110+ opts . canvasH = canvasH ;
68111 var canvas = new Canvas ( canvasW , canvasH ) ;
69112 var ctx = canvas . getContext ( '2d' ) ;
70113 var encoder = getEncoder ( opts ) ;
71114
72- for ( var i = 0 ; i < text . length ; i ++ ) {
73- addFrame ( encoder , ctx , text [ i ] , opts ) ;
74- }
75-
76- encoder . finish ( ) ;
77-
78- return opts . filename ;
115+ return new Promise ( function ( resolve ) {
116+ processText ( encoder , ctx , text , opts ) . then ( function ( ) {
117+ encoder . finish ( ) ;
118+ resolve ( opts . filename ) ;
119+ } ) ;
120+ } ) ;
79121} ;
0 commit comments