@@ -16,6 +16,10 @@ var canvas = require('./bindings')
16
16
, CanvasPattern = canvas . CanvasPattern
17
17
, ImageData = canvas . ImageData ;
18
18
19
+ var parseCssFont = require ( 'parse-css-font' ) ;
20
+
21
+ var unitsCss = require ( 'units-css' ) ;
22
+
19
23
/**
20
24
* Export `Context2d` as the module.
21
25
*/
@@ -34,26 +38,6 @@ var cache = {};
34
38
35
39
var baselines = [ 'alphabetic' , 'top' , 'bottom' , 'middle' , 'ideographic' , 'hanging' ] ;
36
40
37
- /**
38
- * Font RegExp helpers.
39
- */
40
-
41
- var weights = 'normal|bold|bolder|lighter|[1-9]00'
42
- , styles = 'normal|italic|oblique'
43
- , units = 'px|pt|pc|in|cm|mm|%'
44
- , string = '\'([^\']+)\'|"([^"]+)"|[\\w-]+' ;
45
-
46
- /**
47
- * Font parser RegExp;
48
- */
49
-
50
- var fontre = new RegExp ( '^ *'
51
- + '(?:(' + weights + ') *)?'
52
- + '(?:(' + styles + ') *)?'
53
- + '([\\d\\.]+)(' + units + ') *'
54
- + '((?:' + string + ')( *, *(?:' + string + '))*)'
55
- ) ;
56
-
57
41
/**
58
42
* Parse font `str`.
59
43
*
@@ -62,40 +46,51 @@ var fontre = new RegExp('^ *'
62
46
* @api private
63
47
*/
64
48
65
- var parseFont = exports . parseFont = function ( str ) {
66
- var font = { }
67
- , captures = fontre . exec ( str ) ;
49
+ var parseFont = exports . parseFont = function ( str ) {
50
+ var parsedFont ;
68
51
69
- // Invalid
70
- if ( ! captures ) return ;
52
+ // Try to parse the font string using parse-css-font.
53
+ // It will throw an exception if it fails.
54
+ try {
55
+ parsedFont = parseCssFont ( str ) ;
56
+ }
57
+ catch ( e ) {
58
+ // Invalid
59
+ return ;
60
+ }
71
61
72
62
// Cached
73
63
if ( cache [ str ] ) return cache [ str ] ;
74
64
75
- // Populate font object
76
- font . weight = captures [ 1 ] || 'normal' ;
77
- font . style = captures [ 2 ] || 'normal' ;
78
- font . size = parseFloat ( captures [ 3 ] ) ;
79
- font . unit = captures [ 4 ] ;
80
- font . family = captures [ 5 ] . replace ( / [ " ' ] / g, '' ) . split ( ',' ) [ 0 ] . trim ( ) ;
65
+ // Parse size into value and unit using units-css
66
+ var size = unitsCss . parse ( parsedFont . size ) ;
81
67
82
68
// TODO: dpi
83
69
// TODO: remaining unit conversion
84
- switch ( font . unit ) {
70
+ switch ( size . unit ) {
85
71
case 'pt' :
86
- font . size /= .75 ;
72
+ size . value /= .75 ;
87
73
break ;
88
74
case 'in' :
89
- font . size *= 96 ;
75
+ size . value *= 96 ;
90
76
break ;
91
77
case 'mm' :
92
- font . size *= 96.0 / 25.4 ;
78
+ size . value *= 96.0 / 25.4 ;
93
79
break ;
94
80
case 'cm' :
95
- font . size *= 96.0 / 2.54 ;
81
+ size . value *= 96.0 / 2.54 ;
96
82
break ;
97
83
}
98
84
85
+ // Populate font object
86
+ var font = {
87
+ weight : parsedFont . weight ,
88
+ style : parsedFont . style ,
89
+ size : size . value ,
90
+ unit : size . unit ,
91
+ family : parsedFont . family [ 0 ]
92
+ } ;
93
+
99
94
return cache [ str ] = font ;
100
95
} ;
101
96
0 commit comments