diff --git a/mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp b/mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp index 1a12eaeefaa..4a90993e2f9 100644 --- a/mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp +++ b/mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp @@ -275,11 +275,18 @@ nsHTMLContentSinkStream::Initialize(nsIOutputStream* aOutStream, { mDoFormat = (aFlags & nsIDocumentEncoder::OutputFormatted) ? PR_TRUE : PR_FALSE; + // I don't think anyone calls us with OutputFormatted +#ifdef DEBUG_akkana + NS_ASSERTION(!mDoFormat, "nsHTMLContentSinkStream called with OutputFormatted!\n"); +#endif + mBodyOnly = (aFlags & nsIDocumentEncoder::OutputBodyOnly) ? PR_TRUE : PR_FALSE; mDoHeader = (!mBodyOnly) && (mDoFormat) && ((aFlags & nsIDocumentEncoder::OutputNoDoctype) ? PR_FALSE : PR_TRUE); + mMaxColumn = 72; + mStream = aOutStream; mString = aOutString; if (aCharsetOverride != nsnull) @@ -1004,66 +1011,29 @@ nsHTMLContentSinkStream::AddLeaf(const nsIParserNode& aNode){ else if (type == eHTMLTag_text) { const nsString& text = aNode.GetText(); - if (!mDoFormat || preformatted) + if (preformatted) { Write(text); mColPos += text.Length(); } - else + else if (!mDoFormat) { - PRInt32 mMaxColumn = 72; - - // 1. Determine the length of the input string - PRInt32 length = text.Length(); - - // 2. If the offset plus the length of the text is smaller - // than the max then just add it - if (mColPos + length < mMaxColumn) +#ifdef DEBUG_akkana + printf("Conditionally formatting\n"); +#endif + if (HasLongLines(text)) + { + WriteWrapped(text); + } + else { Write(text); mColPos += text.Length(); } - else - { - nsString str = text; - PRBool done = PR_FALSE; - PRInt32 indx = 0; - PRInt32 offset = mColPos; - - while (!done) - { - // find the next break - PRInt32 start = mMaxColumn-offset; - if (start < 0) - start = 0; - - indx = str.FindChar(' ',PR_FALSE,start); - - // if there is no break than just add it - if (indx == kNotFound) - { - Write(str); - mColPos += str.Length(); - done = PR_TRUE; - } - else - { - // make first equal to the str from the - // beginning to the index - nsString first = str; - - first.Truncate(indx); - - Write(first); - Write(NS_LINEBREAK); - mColPos = 0; - - // cut the string from the beginning to the index - str.Cut(0,indx); - offset = 0; - } - } - } + } + else + { + WriteWrapped(text); } } else if (type == eHTMLTag_whitespace) @@ -1087,7 +1057,78 @@ nsHTMLContentSinkStream::AddLeaf(const nsIParserNode& aNode){ return NS_OK; } +// See if the string has any lines longer than longLineLen: +// if so, we presume formatting is wonky (e.g. the node has been edited) +// and we'd better rewrap the whole text node. +PRBool nsHTMLContentSinkStream::HasLongLines(const nsString& text) +{ + const PRInt32 longLineLen = 128; + nsString str = text; + for (PRInt32 start = 0; start < text.Length(); ) + { + PRInt32 eol = text.FindChar('\n', PR_FALSE, start); + if (eol < 0) eol = text.Length(); + if (eol - start > longLineLen) + return PR_TRUE; + start = eol+1; + } + return PR_FALSE; +} +void nsHTMLContentSinkStream::WriteWrapped(const nsString& text) +{ + // 1. Determine the length of the input string + PRInt32 length = text.Length(); + + // 2. If the offset plus the length of the text is smaller + // than the max then just add it + if (mColPos + length < mMaxColumn) + { + Write(text); + mColPos += text.Length(); + } + else + { + nsString str = text; + PRBool done = PR_FALSE; + PRInt32 indx = 0; + PRInt32 offset = mColPos; + + while (!done) + { + // find the next break + PRInt32 start = mMaxColumn-offset; + if (start < 0) + start = 0; + + indx = str.FindChar(' ', PR_FALSE, start); + + // if there is no break than just add it + if (indx == kNotFound) + { + Write(str); + mColPos += str.Length(); + done = PR_TRUE; + } + else + { + // make first equal to the str from the + // beginning to the index + nsString first = str; + + first.Truncate(indx); + + Write(first); + Write(NS_LINEBREAK); + mColPos = 0; + + // cut the string from the beginning to the index + str.Cut(0,indx); + offset = 0; + } + } + } +} /** * This gets called by the parser when you want to add diff --git a/mozilla/htmlparser/src/nsHTMLContentSinkStream.h b/mozilla/htmlparser/src/nsHTMLContentSinkStream.h index 58607ffa736..dbbff2d670a 100644 --- a/mozilla/htmlparser/src/nsHTMLContentSinkStream.h +++ b/mozilla/htmlparser/src/nsHTMLContentSinkStream.h @@ -160,6 +160,10 @@ protected: void Write(const char* aCharBuffer); void Write(char aChar); + // Handle wrapping and conditional wrapping: + PRBool HasLongLines(const nsString& text); + void WriteWrapped(const nsString& text); + protected: nsIOutputStream* mStream; @@ -182,6 +186,8 @@ protected: PRBool mDoHeader; PRBool mBodyOnly; + PRInt32 mMaxColumn; + nsCOMPtr mUnicodeEncoder; nsCAutoString mCharsetOverride; }; diff --git a/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.cpp b/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.cpp index 1a12eaeefaa..4a90993e2f9 100644 --- a/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.cpp +++ b/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.cpp @@ -275,11 +275,18 @@ nsHTMLContentSinkStream::Initialize(nsIOutputStream* aOutStream, { mDoFormat = (aFlags & nsIDocumentEncoder::OutputFormatted) ? PR_TRUE : PR_FALSE; + // I don't think anyone calls us with OutputFormatted +#ifdef DEBUG_akkana + NS_ASSERTION(!mDoFormat, "nsHTMLContentSinkStream called with OutputFormatted!\n"); +#endif + mBodyOnly = (aFlags & nsIDocumentEncoder::OutputBodyOnly) ? PR_TRUE : PR_FALSE; mDoHeader = (!mBodyOnly) && (mDoFormat) && ((aFlags & nsIDocumentEncoder::OutputNoDoctype) ? PR_FALSE : PR_TRUE); + mMaxColumn = 72; + mStream = aOutStream; mString = aOutString; if (aCharsetOverride != nsnull) @@ -1004,66 +1011,29 @@ nsHTMLContentSinkStream::AddLeaf(const nsIParserNode& aNode){ else if (type == eHTMLTag_text) { const nsString& text = aNode.GetText(); - if (!mDoFormat || preformatted) + if (preformatted) { Write(text); mColPos += text.Length(); } - else + else if (!mDoFormat) { - PRInt32 mMaxColumn = 72; - - // 1. Determine the length of the input string - PRInt32 length = text.Length(); - - // 2. If the offset plus the length of the text is smaller - // than the max then just add it - if (mColPos + length < mMaxColumn) +#ifdef DEBUG_akkana + printf("Conditionally formatting\n"); +#endif + if (HasLongLines(text)) + { + WriteWrapped(text); + } + else { Write(text); mColPos += text.Length(); } - else - { - nsString str = text; - PRBool done = PR_FALSE; - PRInt32 indx = 0; - PRInt32 offset = mColPos; - - while (!done) - { - // find the next break - PRInt32 start = mMaxColumn-offset; - if (start < 0) - start = 0; - - indx = str.FindChar(' ',PR_FALSE,start); - - // if there is no break than just add it - if (indx == kNotFound) - { - Write(str); - mColPos += str.Length(); - done = PR_TRUE; - } - else - { - // make first equal to the str from the - // beginning to the index - nsString first = str; - - first.Truncate(indx); - - Write(first); - Write(NS_LINEBREAK); - mColPos = 0; - - // cut the string from the beginning to the index - str.Cut(0,indx); - offset = 0; - } - } - } + } + else + { + WriteWrapped(text); } } else if (type == eHTMLTag_whitespace) @@ -1087,7 +1057,78 @@ nsHTMLContentSinkStream::AddLeaf(const nsIParserNode& aNode){ return NS_OK; } +// See if the string has any lines longer than longLineLen: +// if so, we presume formatting is wonky (e.g. the node has been edited) +// and we'd better rewrap the whole text node. +PRBool nsHTMLContentSinkStream::HasLongLines(const nsString& text) +{ + const PRInt32 longLineLen = 128; + nsString str = text; + for (PRInt32 start = 0; start < text.Length(); ) + { + PRInt32 eol = text.FindChar('\n', PR_FALSE, start); + if (eol < 0) eol = text.Length(); + if (eol - start > longLineLen) + return PR_TRUE; + start = eol+1; + } + return PR_FALSE; +} +void nsHTMLContentSinkStream::WriteWrapped(const nsString& text) +{ + // 1. Determine the length of the input string + PRInt32 length = text.Length(); + + // 2. If the offset plus the length of the text is smaller + // than the max then just add it + if (mColPos + length < mMaxColumn) + { + Write(text); + mColPos += text.Length(); + } + else + { + nsString str = text; + PRBool done = PR_FALSE; + PRInt32 indx = 0; + PRInt32 offset = mColPos; + + while (!done) + { + // find the next break + PRInt32 start = mMaxColumn-offset; + if (start < 0) + start = 0; + + indx = str.FindChar(' ', PR_FALSE, start); + + // if there is no break than just add it + if (indx == kNotFound) + { + Write(str); + mColPos += str.Length(); + done = PR_TRUE; + } + else + { + // make first equal to the str from the + // beginning to the index + nsString first = str; + + first.Truncate(indx); + + Write(first); + Write(NS_LINEBREAK); + mColPos = 0; + + // cut the string from the beginning to the index + str.Cut(0,indx); + offset = 0; + } + } + } +} /** * This gets called by the parser when you want to add diff --git a/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.h b/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.h index 58607ffa736..dbbff2d670a 100644 --- a/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.h +++ b/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.h @@ -160,6 +160,10 @@ protected: void Write(const char* aCharBuffer); void Write(char aChar); + // Handle wrapping and conditional wrapping: + PRBool HasLongLines(const nsString& text); + void WriteWrapped(const nsString& text); + protected: nsIOutputStream* mStream; @@ -182,6 +186,8 @@ protected: PRBool mDoHeader; PRBool mBodyOnly; + PRInt32 mMaxColumn; + nsCOMPtr mUnicodeEncoder; nsCAutoString mCharsetOverride; };