prettyprint/formatxml.cpp | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-)
New commits: commit df83cccc7fc15cfc4b669dc805e1a786a38282ac Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Wed Feb 11 11:34:35 2015 +0100 formatxml: avoid corrupting ODF paragraphs / headings The problem was that <text:p>a<text:span>b</text:span>c</text:p> was formatted as <text:p text:style-name="P1">He <text:span text:style-name="T1">ll</text:span> o</text:p> So the resulting imported paragraph string changed from "Hello" to "He ll o". If there is situation where formatting children of text:p / text:h is wanted, it would be possible to add a cmdline option to disable this behavior. Also, for now this assumes that all children of these elements should not be formatted to be on the safe side. Change-Id: Ifcb846eef594d53206fa870b5eb31afabba7b5ae diff --git a/prettyprint/formatxml.cpp b/prettyprint/formatxml.cpp index 938cc32..4bf2546 100644 --- a/prettyprint/formatxml.cpp +++ b/prettyprint/formatxml.cpp @@ -153,16 +153,29 @@ static TokenType analyzeToken( const QString& token ) return Text; } +static int noFormat = 0; + +static bool shouldNoFormat(const QString& rString) +{ + // Formatting children of a few elements would change the meaning of the + // document, don't do that. + return rString == "text:p" || rString == "text:h"; +} + static QString indent( int size ) { - return QString().fill( ' ', size ); + if (noFormat) + return QString(); + else + return QString().fill( ' ', size ); } static void ensureNewLine( QTextStream& out, bool* needNewLine ) { if( *needNewLine ) { - out << endl; + if (!noFormat) + out << endl; *needNewLine = false; } } @@ -183,11 +196,16 @@ static bool format( QTextStream& in, QTextStream& out ) switch( analyzeToken( token )) { case OpeningTag: + { ensureNewLine( out, &needNewLine ); out << INDENT << token; + QString tag = tagName(token); + if (shouldNoFormat(tag)) + ++noFormat; needNewLine = true; - stack.push( tagName( token )); + stack.push(tag); break; + } case ClosingTag: { QString tag = tagName( token ); @@ -207,13 +225,19 @@ static bool format( QTextStream& in, QTextStream& out ) } if( !needNewLine ) // not line continuation out << INDENT; - out << token << endl; + if (shouldNoFormat(tag)) + --noFormat; + out << token; + if (!noFormat) + out << endl; needNewLine = false; break; } case StandaloneTag: ensureNewLine( out, &needNewLine ); - out << INDENT << token << endl; + out << INDENT << token; + if (!noFormat) + out << endl; break; case OtherTag: ensureNewLine( out, &needNewLine ); @@ -261,3 +285,5 @@ int main( int argc, char* argv[] ) out.setCodec( "UTF-8" ); return format( in, out ) ? 0 : 1; } + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits