mirror of
https://github.com/zoriya/react-native-svg.git
synced 2025-12-19 21:45:10 +00:00
110 lines
2.8 KiB
JavaScript
110 lines
2.8 KiB
JavaScript
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 = /,/;
|
|
|
|
const anchors = {
|
|
end: 1,
|
|
middle: 2,
|
|
start: 0
|
|
};
|
|
|
|
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 parseText(props, inheritedProps) {
|
|
let {
|
|
children,
|
|
dx = '',
|
|
dy = ''
|
|
} = props;
|
|
|
|
if (typeof children === 'string') {
|
|
|
|
} else {
|
|
|
|
}
|
|
|
|
console.log(dx, dy, children);
|
|
}
|
|
|
|
function parseDelta(delta) {
|
|
return delta.toString().trim().split(spaceReg);
|
|
}
|
|
|
|
export default function(props) {
|
|
parseText(props, null);
|
|
|
|
let alignment;
|
|
//if (firstSpan && firstSpan.props.hasOwnProperty('textAnchor')) {
|
|
// alignment = anchors[firstSpan.props.textAnchor];
|
|
//} else if (anchors[props.textAnchor]) {
|
|
// alignment = anchors[props.textAnchor];
|
|
//}
|
|
//
|
|
//if (!alignment) {
|
|
// alignment = 0;
|
|
//}
|
|
|
|
return {
|
|
//alignment,
|
|
//children,
|
|
fontFamily: 'Helvetica Neue',
|
|
fontSize: 12,
|
|
fontStyle: 'normal',
|
|
fontWeight: 'normal',
|
|
...extractFont(props)
|
|
}
|
|
}
|