svg-paper
Version:
The world's most maintainable way to create paper-printable documents 🖨💘
31 lines (25 loc) • 1.95 kB
JavaScript
export default (textSvg) => {
let fixedTextSvg = textSvg
// if <text> doesn't have transform="translate(x y)", just add it with (0 0)
if (!fixedTextSvg.match(/<text [^>]*transform="[^"]*"[^>]*>/)) {
fixedTextSvg = fixedTextSvg.replace(new RegExp('<text([^>]*)>'), '<text$1 transform="translate(0 0)">')
}
// if <tspan> doesn't have x="" y="", just add it with x="0" y="0"
if (!fixedTextSvg.match(/<tspan [^>]*x="[^"]*"[^>]*>/)) {
fixedTextSvg = fixedTextSvg.replace(new RegExp('<tspan([^>]*)>'), '<tspan$1 x="0">')
}
if (!fixedTextSvg.match(/<tspan [^>]*y="[^"]*"[^>]*>/)) {
fixedTextSvg = fixedTextSvg.replace(new RegExp('<tspan([^>]*)>'), '<tspan$1 y="0">')
}
// copy x from <tspan x=""> and add it to <text transform="translate(x y)">
fixedTextSvg = fixedTextSvg.replace(new RegExp('<text([\\s\\S]+)transform="translate\\((\\S+)\\s+(.+)\\)"([^>]*)>\s*<tspan([^>]+)x="([^"]+)"'), '<text$1transform="translate(###$2+$6### $3)"$4><tspan$5x="0"')
const expression1 = fixedTextSvg.match(new RegExp('<text[\\s\\S]+transform="translate\\(###(.+)###.+\\)"'))[1]
const x = expression1.match(/\d+\+\d+/) ? eval(expression1) : 0
fixedTextSvg = fixedTextSvg.replace(new RegExp('<text([\\s\\S]+)transform="translate\\(###.+###(.+)\\)"'), `<text$1transform="translate(${x}$2)"`)
// copy y from <tspan y=""> and add it to <text transform="translate(x y)">
fixedTextSvg = fixedTextSvg.replace(new RegExp('<text([\\s\\S]+)transform="translate\\((.+)\\s+(\\S+)\\)"([^>]*)>\s*<tspan([^>]+)y="([^"]+)"'), '<text$1transform="translate($2 ###$3+$6###)"$4><tspan$5y="0"')
const expression2 = fixedTextSvg.match(new RegExp('<text[\\s\\S]+transform="translate\\(.+###(.+)###\\)"'))[1]
const y = expression2.match(/\d+\+\d+/) ? eval(expression2) : 0
fixedTextSvg = fixedTextSvg.replace(new RegExp('<text([\\s\\S]+)transform="translate\\((.+)###.+###\\)"'), `<text$1transform="translate($2${y})"`)
return fixedTextSvg
}