import extractTextContent from './extractTextContent'; import SerializablePath from '../SerializablePath'; import _ from 'lodash'; const fontRegExp = /^\s*((?:(?:normal|bold|italic)\s+)*)(?:(\d+(?:\.\d+)?)[ptexm%]*(?:\s*\/.*?)?\s+)?\s*"?([^"]*)/i; const fontFamilyPrefix = /^[\s"']*/; const fontFamilySuffix = /[\s"']*$/; const spaceReg = /\s+/; const commaReg = /,/; let cachedFontObjectsFromString = {}; function extractSingleFontFamily(fontFamilyString) { // SVG on the web allows for multiple font-families to be specified. // For compatibility, we extract the first font-family, hoping // we'll get a match. return fontFamilyString ? fontFamilyString.split(commaReg)[0] .replace(fontFamilyPrefix, '') .replace(fontFamilySuffix, '') : null; } function parseFontString(font) { if (cachedFontObjectsFromString.hasOwnProperty(font)) { return cachedFontObjectsFromString[font]; } let match = fontRegExp.exec(font); if (!match) { return null; } let fontFamily = extractSingleFontFamily(match[3]); let fontSize = +match[2] || 12; let isBold = /bold/.exec(match[1]); let isItalic = /italic/.exec(match[1]); cachedFontObjectsFromString[font] = { fontFamily: fontFamily, fontSize: fontSize, fontWeight: isBold ? 'bold' : 'normal', fontStyle: isItalic ? 'italic' : 'normal' }; return cachedFontObjectsFromString[font]; } function extractFont(props) { let font = props.font; let fontSize = +props.fontSize; let ownedFont = { fontFamily: extractSingleFontFamily(props.fontFamily), fontSize: isNaN(fontSize) ? null : fontSize, fontWeight: props.fontWeight, fontStyle: props.fontStyle }; if (typeof props.font === 'string') { font = parseFontString(props.font); } ownedFont = _.pickBy(ownedFont, prop => !_.isNil(prop)); return _.defaults(ownedFont, font); } function parseDelta(delta) { return delta.toString().split(spaceReg); } export default function(props) { return { dx: parseDelta(props.dx || ''), dy: parseDelta(props.dy || ''), ...extractFont(props) }; }