-
Notifications
You must be signed in to change notification settings - Fork 478
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Move utility methods in src/utils.js
- Loading branch information
1 parent
bd80224
commit 028840c
Showing
3 changed files
with
191 additions
and
77 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
'use strict'; | ||
|
||
import Chart from 'chart.js'; | ||
|
||
var helpers = Chart.helpers; | ||
|
||
var utils = { | ||
// @todo move this in Chart.helpers.toTextLines | ||
toTextLines: function(inputs) { | ||
var lines = []; | ||
var input; | ||
|
||
inputs = [].concat(inputs); | ||
while (inputs.length) { | ||
input = inputs.pop(); | ||
if (typeof input === 'string') { | ||
lines.unshift.apply(lines, input.split('\n')); | ||
} else if (Array.isArray(input)) { | ||
inputs.push.apply(inputs, input); | ||
} else if (!helpers.isNullOrUndef(inputs)) { | ||
lines.unshift('' + input); | ||
} | ||
} | ||
|
||
return lines; | ||
}, | ||
|
||
// @todo move this method in Chart.helpers.canvas.toFont (deprecates helpers.fontString) | ||
// @see https://developer.mozilla.org/en-US/docs/Web/CSS/font | ||
toFontString: function(font) { | ||
if (!font || helpers.isNullOrUndef(font.size) || helpers.isNullOrUndef(font.family)) { | ||
return null; | ||
} | ||
|
||
return (font.style ? font.style + ' ' : '') | ||
+ (font.weight ? font.weight + ' ' : '') | ||
+ font.size + 'px ' | ||
+ font.family; | ||
}, | ||
|
||
// @todo move this in Chart.helpers.canvas.textSize | ||
// @todo cache calls of measureText if font doesn't change?! | ||
textSize: function(ctx, lines, font) { | ||
var items = [].concat(lines); | ||
var ilen = items.length; | ||
var prev = ctx.font; | ||
var width = 0; | ||
var i; | ||
|
||
ctx.font = font.string; | ||
|
||
for (i = 0; i < ilen; ++i) { | ||
width = Math.max(ctx.measureText(items[i]).width, width); | ||
} | ||
|
||
ctx.font = prev; | ||
|
||
return { | ||
height: ilen * font.lineHeight, | ||
width: width | ||
}; | ||
}, | ||
|
||
// @todo move this method in Chart.helpers.options.toFont | ||
parseFont: function(value) { | ||
var global = Chart.defaults.global; | ||
var size = helpers.valueOrDefault(value.size, global.defaultFontSize); | ||
var font = { | ||
family: helpers.valueOrDefault(value.family, global.defaultFontFamily), | ||
lineHeight: helpers.options.toLineHeight(value.lineHeight, size), | ||
size: size, | ||
style: helpers.valueOrDefault(value.style, global.defaultFontStyle), | ||
weight: helpers.valueOrDefault(value.weight, null), | ||
string: '' | ||
}; | ||
|
||
font.string = utils.toFontString(font); | ||
return font; | ||
} | ||
}; | ||
|
||
export default utils; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
import Chart from 'chart.js'; | ||
import utils from '../../src/utils'; | ||
|
||
describe('utils.js', function() { | ||
describe('toTextLines', function() { | ||
var toTextLines = utils.toTextLines; | ||
|
||
it('should return an array containing the input string', function() { | ||
expect(toTextLines('')).toEqual(['']); | ||
expect(toTextLines('foo')).toEqual(['foo']); | ||
expect(toTextLines('foo bar')).toEqual(['foo bar']); | ||
}); | ||
it('should return an array with converted values', function() { | ||
expect(toTextLines(null)).toEqual(['null']); | ||
expect(toTextLines(undefined)).toEqual(['undefined']); | ||
expect(toTextLines(42)).toEqual(['42']); | ||
expect(toTextLines(true)).toEqual(['true']); | ||
}); | ||
it('should return an array of strings if inputs is an array', function() { | ||
expect(toTextLines([])).toEqual([]); | ||
expect(toTextLines(['foo'])).toEqual(['foo']); | ||
expect(toTextLines(['foo', 'bar'])).toEqual(['foo', 'bar']); | ||
}); | ||
it('should split the input string if it contains \\n', function() { | ||
expect(toTextLines('foo\nbar')).toEqual(['foo', 'bar']); | ||
expect(toTextLines('foo\nbar\nbla')).toEqual(['foo', 'bar', 'bla']); | ||
}); | ||
it('should preserve spaces when splitting strings', function() { | ||
expect(toTextLines('foo \n bar')).toEqual(['foo ', ' bar']); | ||
expect(toTextLines('foo \n bar \n bla')).toEqual(['foo ', ' bar ', ' bla']); | ||
}); | ||
it('should flatten children arrays in the correct order', function() { | ||
expect(toTextLines(['foo', [['bar', 'xxx'], 'bla']])).toEqual(['foo', 'bar', 'xxx', 'bla']); | ||
}); | ||
it('should split strings children in the correct order', function() { | ||
expect(toTextLines(['foo', [['bar\nxxx'], 'bla\nyyy']])).toEqual(['foo', 'bar', 'xxx', 'bla', 'yyy']); | ||
}); | ||
}); | ||
|
||
describe('toFontString', function() { | ||
var toFontString = utils.toFontString; | ||
|
||
it('should return null if the given font is invalid', function() { | ||
expect(toFontString({})).toBeNull(); | ||
expect(toFontString(null)).toBeNull(); | ||
expect(toFontString(undefined)).toBeNull(); | ||
expect(toFontString(42)).toBeNull(); | ||
expect(toFontString('foo')).toBeNull(); | ||
expect(toFontString(new Date())).toBeNull(); | ||
}); | ||
it('should return null if size or family are missing', function() { | ||
expect(toFontString({style: 'italic', weight: 300, size: 12})).toBeNull(); | ||
expect(toFontString({style: 'italic', weight: 300, family: 'serif'})).toBeNull(); | ||
}); | ||
it('should return the string representation of the given font', function() { | ||
expect(toFontString({style: 'italic', weight: 300, size: 12, family: 'serif'})).toBe('italic 300 12px serif'); | ||
}); | ||
it('weigth and style should be optional', function() { | ||
expect(toFontString({size: 12, family: 'serif'})).toBe('12px serif'); | ||
expect(toFontString({style: 'italic', size: 12, family: 'serif'})).toBe('italic 12px serif'); | ||
expect(toFontString({weight: 300, size: 12, family: 'serif'})).toBe('300 12px serif'); | ||
}); | ||
}); | ||
|
||
describe('parseFont', function() { | ||
var parseFont = utils.parseFont; | ||
|
||
it ('should return a font with default values', function() { | ||
var global = Chart.defaults.global; | ||
|
||
Chart.defaults.global = { | ||
defaultFontFamily: 'foobar', | ||
defaultFontSize: 42, | ||
defaultFontStyle: 'xxxyyy' | ||
}; | ||
|
||
expect(parseFont({})).toEqual({ | ||
family: 'foobar', | ||
lineHeight: 50.4, | ||
size: 42, | ||
string: 'xxxyyy 42px foobar', | ||
style: 'xxxyyy', | ||
weight: null | ||
}); | ||
|
||
Chart.defaults.global = global; | ||
}); | ||
it ('should return a font with given values', function() { | ||
expect(parseFont({ | ||
family: 'bla', | ||
lineHeight: 8, | ||
size: 21, | ||
style: 'zzz', | ||
weight: 400 | ||
})).toEqual({ | ||
family: 'bla', | ||
lineHeight: 8 * 21, | ||
size: 21, | ||
string: 'zzz 400 21px bla', | ||
style: 'zzz', | ||
weight: 400 | ||
}); | ||
}); | ||
}); | ||
}); |