11import { isNumber } from '@antv/util' ;
22import type { ParsedTextStyleProps } from '../display-objects/Text' ;
3+ import { memoize } from './memoize' ;
34
45const genericFontFamilies = [
56 'serif' ,
@@ -11,37 +12,50 @@ const genericFontFamilies = [
1112] ;
1213const stringRegExp = / ( [ \" \' ] ) [ ^ \' \" ] + \1/ ;
1314
14- export function toFontString ( attributes : Partial < ParsedTextStyleProps > ) {
15+ function getFontAttr ( attributes : Partial < ParsedTextStyleProps > ) {
1516 const {
1617 fontSize = 16 ,
1718 fontFamily = 'sans-serif' ,
1819 fontStyle = 'normal' ,
1920 fontVariant = 'normal' ,
2021 fontWeight = 'normal' ,
2122 } = attributes ;
23+ return { fontSize, fontFamily, fontStyle, fontVariant, fontWeight } ;
24+ }
25+
26+ export const toFontString = memoize (
27+ function toFontStringRaw ( attributes : Partial < ParsedTextStyleProps > ) {
28+ const { fontSize, fontFamily, fontStyle, fontVariant, fontWeight } =
29+ getFontAttr ( attributes ) ;
2230
23- // build canvas api font setting from individual components. Convert a numeric this.fontSize to px
24- // const fontSizeString: string = isNumber(fontSize) ? `${fontSize}px` : fontSize.toString();
25- const fontSizeString : string =
26- ( isNumber ( fontSize ) && `${ fontSize } px` ) || '16px' ;
27- // Clean-up fontFamily property by quoting each font name
28- // this will support font names with spaces
31+ // build canvas api font setting from individual components. Convert a numeric this.fontSize to px
32+ // const fontSizeString: string = isNumber(fontSize) ? `${fontSize}px` : fontSize.toString();
33+ const fontSizeString : string =
34+ ( isNumber ( fontSize ) && `${ fontSize } px` ) || '16px' ;
35+ // Clean-up fontFamily property by quoting each font name
36+ // this will support font names with spaces
2937
30- const fontFamilies : string [ ] = fontFamily . split ( ',' ) ;
38+ const fontFamilies : string [ ] = fontFamily . split ( ',' ) ;
3139
32- for ( let i = fontFamilies . length - 1 ; i >= 0 ; i -- ) {
33- // Trim any extra white-space
34- let fontFamily = fontFamilies [ i ] . trim ( ) ;
35- // Check if font already contains strings
36- if (
37- ! stringRegExp . test ( fontFamily ) &&
38- genericFontFamilies . indexOf ( fontFamily ) < 0
39- ) {
40- fontFamily = `"${ fontFamily } "` ;
40+ for ( let i = fontFamilies . length - 1 ; i >= 0 ; i -- ) {
41+ // Trim any extra white-space
42+ let fontFamily = fontFamilies [ i ] . trim ( ) ;
43+ // Check if font already contains strings
44+ if (
45+ ! stringRegExp . test ( fontFamily ) &&
46+ genericFontFamilies . indexOf ( fontFamily ) < 0
47+ ) {
48+ fontFamily = `"${ fontFamily } "` ;
49+ }
50+ fontFamilies [ i ] = fontFamily ;
4151 }
42- fontFamilies [ i ] = fontFamily ;
43- }
44- return `${ fontStyle } ${ fontVariant } ${ fontWeight } ${ fontSizeString } ${ fontFamilies . join (
45- ',' ,
46- ) } `;
47- }
52+ return `${ fontStyle } ${ fontVariant } ${ fontWeight } ${ fontSizeString } ${ fontFamilies . join (
53+ ',' ,
54+ ) } `;
55+ } ,
56+ ( attributes : Partial < ParsedTextStyleProps > ) => {
57+ const { fontSize, fontFamily, fontStyle, fontVariant, fontWeight } =
58+ getFontAttr ( attributes ) ;
59+ return `${ fontStyle } _${ fontVariant } _${ fontWeight } _${ fontSize } _${ fontFamily } ` ;
60+ } ,
61+ ) ;
0 commit comments