scour icon indicating copy to clipboard operation
scour copied to clipboard

Enhancement: Delete Empty FlowText

Open JoKalliauer opened this issue 6 years ago • 0 comments

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).

JoKalliauer avatar Oct 02 '18 17:10 JoKalliauer