scour
scour copied to clipboard
Enhancement: Delete Empty FlowText
If you open a SVG-file (f.e. InOut.svg.txt) containing empty flowRoots Inkscape cannnot resolve flowtext.
<?xml version="1.0" encoding="UTF-8"?>
<svg id="svg26" version="1.1" viewBox="0 0 1102 751.35" xmlns="http://www.w3.org/2000/svg">
<flowRoot id="flowRoot8" optionalFlowRootAttributes="value1" xml:space="preserve">
<flowRegion id="flowRegion4" optionalflowRegenAtributes="value3">
<rect id="rect2" x="375" y="182" width="132" height="8"/>
</flowRegion>
<flowPara id="flowPara6" optionalFlowParaAttributes="value2" xml:space="preserve"> </flowPara>
</flowRoot>
<flowRoot id="flowRoot16" optionalFlowRootAttributes="value1">
<flowRegion id="flowRegion12" optionalflowRegenAtributes="value3">
<rect id="rect10" x="375" y="182" width="132" height="8"/>
</flowRegion>
<flowPara id="flowPara14" optionalFlowParaAttributes="value2"/>
</flowRoot>
<flowRoot id="flowRoot18" optionalFlowRootAttributes="value1"/>
<flowRoot id="flowRoot24">
<flowRegion id="flowRegion20"/>
<flowDiv id="flowDiv22"/>
</flowRoot>
</svg>
(I found them in some real examples on Wikimedia.)
I would like that Scour deletes empty flowRoots if --error-on-flowtext
or/and --renderer-workaround
are specified.
remove empty flow Text in svg
sed -ri 's/<flowPara([-[:alnum:]\" \.\:\%\=\;#\(\)]*)\/>//g;s/<flowRoot([-[:alnum:]" \.:%=;]*)\/>//g' $i
sed -i 's/<flowSpan[-[:alnum:]=\":;\. ]*>[[:space:]]*<\/flowSpan>//g' $i
sed -ri -e ':a' -e 'N' -e '$!ba' -e "s/<flowRoot([-[:alnum:]\.=\" \:\(\)\%\#\,\';]*)>[[:space:]]*<flowRegion(\/|[[:alnum:]\"= ]*>[[:space:]]*<(path|rect) [-[:alnum:]\. \"\=:]*\/>[[:space:]]*<\/flowRegion)>[[:space:]]*(<flowDiv\/>|)[[:space:]]*<\/flowRoot>//g" $i #delete empty flowRoot
sed -ri -e ':a' -e 'N' -e '$!ba' -e "s/<flowRoot([-[:alnum:]\.=\" \:\(\)\%\#\,\';]*)>[[:space:]]*<flowRegion([-[:alnum:]=:\" ]*)>[[:space:]]*(<path[-[:alnum:]\.=\"\ \#]*\/>|<rect( id=\"[-[:alnum:]]*\"|) x=\"([-[:digit:]\. ]+)\" y=\"([-[:digit:]\. ]+)\"([[:lower:][:digit:]=\.\" \#:]+)\/>)[[:space:]]*<\/flowRegion>[[:space:]]*(|<flowPara([-[:alnum:]\.=\" \:\#;% ]*)>([[:space:] ]*)<\/flowPara>)[[:space:]]*<\/flowRoot>//g" $i ##delete flowRoot only containing spaces
Resolve FlowText to text (only for rect)
You could introduce --resolve-flowtext
with
sed -ri "s/<flowRoot([-[:alnum:]\.=\" \:\(\)\%\#\,\';]*)>[[:space:]]*<flowRegion([-[:alnum:]=:\" ]*)>[[:space:]]*<rect([-[:lower:][:digit:]\"= \.]*) x=\"([-[:digit:]\. ]+)\" y=\"([-[:digit:]\. ]+)\"([-[:lower:][:digit:]=\.\" \#:]*)\/>[[:space:]]*<\/flowRegion>[[:space:]]*<flowPara([-[:alnum:]\.=\" \:\#;\%]*)>([-−[:alnum:] \{\}\(\)\+\ \ ]+)<\/flowPara>[[:space:]]*<\/flowRoot>/<text x=\"\4\" y=\"\5\"\1><tspan x=\"\4\" y=\"\5\"\7>\8<\/tspan><\/text>/g" $i
this is similar what Inkscape does. (or at least it gives identcal sourc-code-result)
Resolving is in some not perfect, but at least as perfect as Inkscapes --verb=ObjectFlowtextToText
(and better results as Inkscapes --verb=ObjectUnFlowText
).