Skip to content

Commit a636890

Browse files
authored
Merge pull request #6 from Exelord/feature-optimize-svg
Optimize SVG initials
2 parents b93e98d + b08fb7d commit a636890

File tree

4 files changed

+39
-22
lines changed

4 files changed

+39
-22
lines changed

addon/-private/generators.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,18 @@ function capitalizedFirstLetter(word) {
2828
return word ? word[0].toUpperCase() : '';
2929
}
3030

31+
export function removeImage(url) {
32+
URL.revokeObjectURL(url);
33+
}
34+
3135
export function generateImage(properties) {
3236
let textElement = generateTextElement(properties.initials, properties.initialsColor, properties.textStyles);
3337
let svgElement = generateSvgElement(properties.width, properties.height, properties.backgroundStyles);
3438

3539
svgElement.append(textElement);
3640
let finalElement = Ember.$('<div>').append(svgElement);
37-
let imageContent = window.btoa(unescape(encodeURIComponent(finalElement.html())));
38-
return 'data:image/svg+xml;base64,' + imageContent;
41+
let blob = new Blob([finalElement.html()], { type: "image/svg+xml" });
42+
return URL.createObjectURL(blob);
3943
}
4044

4145
export function generateInitials(name) {

addon/mixin.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Ember from 'ember';
22
import { colorIndex } from './-private/utils';
3-
import { generateInitials, generateImage } from './-private/generators';
3+
import { generateInitials, generateImage, removeImage } from './-private/generators';
44

55
export default Ember.Mixin.create({
66
tagName: 'img',
@@ -20,7 +20,7 @@ export default Ember.Mixin.create({
2020
textStyles: {},
2121

2222
textColor: 'white',
23-
fontSize: 12,
23+
fontSize: 50,
2424
fontWeight: 200,
2525
fontFamily: 'Helvetica Neue Light, Arial, sans-serif',
2626

@@ -37,6 +37,7 @@ export default Ember.Mixin.create({
3737
],
3838

3939
initialsObserver: Ember.observer('name', 'seedText', 'fontSize', 'fontWeight', 'fontFamily', 'textColor', 'defaultName', 'size', function () {
40+
removeImage(this.get('src'));
4041
this.notifyPropertyChange('src');
4142
}),
4243

@@ -59,8 +60,8 @@ export default Ember.Mixin.create({
5960

6061
initialsProperties() {
6162
return {
62-
width: this.get('width'),
63-
height: this.get('height'),
63+
width: 100,
64+
height: 100,
6465
initials: generateInitials(this.get('name') || this.get('defaultName')),
6566
initialsColor: this.get('textColor'),
6667
textStyles: Ember.assign(this._textStyles(), this.get('textStyles')),

tests/dummy/app/components/initials-form/component.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export default Ember.Component.extend({
66
seedText: Ember.computed.reads('name'),
77
defaultName: '?',
88
textColor: 'white',
9-
fontSize: 100,
9+
fontSize: 70,
1010
fontWeight: 100,
1111
fontFamily: 'Helvetica Neue Light, Arial, sans-serif',
1212

tests/integration/components/ember-initials-test.js

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,14 @@ import hbs from 'htmlbars-inline-precompile';
55

66
moduleForComponent('ember-initials', 'Ember initials Component Tests', { integration: true });
77

8-
function svgObject(container) {
9-
let base64 = container.$('img').attr('src').split('base64,')[1];
10-
return Ember.$(window.atob(base64))[0];
8+
function imagePromise(container) {
9+
return new Ember.RSVP.Promise((resolve) => {
10+
let src = container.$('img').attr('src');
11+
12+
Ember.$.get(src, (svg) => {
13+
resolve(Ember.$(svg));
14+
});
15+
});
1116
}
1217

1318
test('has correct tag name', function (assert) {
@@ -16,28 +21,35 @@ test('has correct tag name', function (assert) {
1621
});
1722

1823
test('has correct initials', function (assert) {
19-
this.render(hbs`{{ember-initials name="Super cool"}}`);
24+
let done = assert.async();
2025

21-
let svg = svgObject(this);
22-
let initials = svg.textContent;
26+
this.render(hbs`{{ember-initials name="Super cool"}}`);
2327

24-
assert.equal(initials, 'SC');
28+
imagePromise(this).then((svg) => {
29+
let initials = svg.text();
30+
assert.equal(initials, 'SC');
31+
done();
32+
});
2533
});
2634

2735
test('has correct default name', function (assert) {
36+
let done = assert.async();
2837
this.render(hbs`{{ember-initials}}`);
2938

30-
let svg = svgObject(this);
31-
let initials = svg.textContent;
32-
33-
assert.equal(initials, '?');
39+
imagePromise(this).then((svg) => {
40+
let initials = svg.text();
41+
assert.equal(initials, '?');
42+
done();
43+
});
3444
});
3545

3646
test('when name and default name are empty', function (assert) {
47+
let done = assert.async();
3748
this.render(hbs`{{ember-initials name='' defaultName=''}}`);
3849

39-
let svg = svgObject(this);
40-
let initials = svg.textContent;
41-
42-
assert.equal(initials, '');
50+
imagePromise(this).then((svg) => {
51+
let initials = svg.text();
52+
assert.equal(initials, '');
53+
done();
54+
});
4355
});

0 commit comments

Comments
 (0)