Skip to content

Commit 78ea1e3

Browse files
committed
add support for 😍
1 parent 05f69da commit 78ea1e3

File tree

5 files changed

+75
-25
lines changed

5 files changed

+75
-25
lines changed

emoji.gif

9.79 KB
Loading

index.js

Lines changed: 62 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ var randomInt = require('random-int');
66
var pathExists = require('path-exists');
77
var objectAssign = require('object-assign');
88
var path = require('path');
9+
var twemoji = require('twemoji');
10+
var Promise = require('pinkie-promise');
11+
var get = require('simple-get');
912
var canvasW = 600;
1013
var 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 = /<img.*?src="(.*?)"/; // 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

3367
var 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+
4284
module.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
};

package.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "text-meme",
3-
"version": "2.2.0",
3+
"version": "2.3.0",
44
"description": "Generate text meme",
55
"license": "MIT",
66
"repository": "beatfreaker/text-meme",
@@ -32,7 +32,10 @@
3232
"object-assign": "^4.0.1",
3333
"path": "^0.12.7",
3434
"path-exists": "^2.1.0",
35-
"random-int": "^1.0.0"
35+
"pinkie-promise": "^2.0.0",
36+
"random-int": "^1.0.0",
37+
"simple-get": "^1.4.3",
38+
"twemoji": "^1.4.1"
3639
},
3740
"devDependencies": {
3841
"ava": "^0.8.0",

readme.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
> Generate text meme
44
55
<img src="meme.gif" width="300">
6+
<img src="emoji.gif" width="300">
67

78
## Install
89

@@ -16,10 +17,14 @@ $ npm install --save text-meme
1617
```js
1718
const textMeme = require('text-meme');
1819

19-
textMeme('unicorns');
20+
textMeme('unicorns ❤️').then(function (filename) {
21+
console.log(filename);
22+
});
2023
//=> 'generated text-meme > filename.gif'
2124

22-
textMeme(input, {delay: 600, filename: 'quote.gif', background: '#4f656d'});
25+
textMeme(input, {delay: 600, filename: 'quote.gif', background: '#4f656d'}).then(function (filename) {
26+
console.log(filename);
27+
});
2328
//=> 'generated text-meme > quote.gif'
2429
```
2530

test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import pathExists from 'path-exists';
33
import fn from './';
44

55
test('meme', t => {
6-
fn('Don\t forget to be awesome', {delay: 500, background: '#1d2628', filename: 'out.gif'});
6+
await fn('Don\t forget to be awesome', {delay: 500, background: '#1d2628', filename: 'out.gif'});
77

88
t.true(pathExists.sync('out.gif'));
99
});

0 commit comments

Comments
 (0)