X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b23bb1f962436b7705cbd7386022c6774ef6d57f..fb8d7eb7a880f1f2e32d8830f9c5e12b2536e05f:/src/html/m_pre.cpp diff --git a/src/html/m_pre.cpp b/src/html/m_pre.cpp index 026ae9c018..1a0ef36813 100644 --- a/src/html/m_pre.cpp +++ b/src/html/m_pre.cpp @@ -28,43 +28,47 @@ FORCE_LINK_ME(m_pre) // replaces '\t', ' ' and '\n' with HTML markup: -static wxString LINKAGEMODE HtmlizeWhitespaces(const wxString& str) +static wxString LINKAGEMODE HtmlizeLinebreaks(const wxString& str) { wxString out; - size_t len = str.Len(); - size_t linepos = 0; - for (size_t i = 0; i < len; i++) + out.reserve(str.length()); // we'll certainly need at least that + + const wxString::const_iterator end = str.end(); + for ( wxString::const_iterator i = str.begin(); i != end; ++i ) { - switch ( str[i].GetValue() ) + switch ( (*i).GetValue() ) { - case wxT('<'): - while (i < len && str[i] != wxT('>')) + case '<': + while ( i != end && *i != '>' ) { - out << str[i++]; + out << *i++; } - out << wxT('>'); - break; - case wxT(' '): - out << wxT(" "); - linepos++; + out << '>'; + if ( i == end ) + return out; break; - case wxT('\n'): - out << wxT("
"); - linepos = 0; - break; - case wxT('\t'): + + // We need to translate any line break into exactly one
. + // Quoting HTML spec: "A line break is defined to be a carriage + // return ( ), a line feed ( ), or a carriage + // return/line feed pair." + case '\r': { - for (size_t j = 8 - linepos % 8; j > 0; j--) - out << wxT(" "); - linepos += 8 - linepos % 8; + wxString::const_iterator j(i + 1); + if ( j != end && *j == '\n' ) + i = j; } + // fall through + case '\n': + out << "
"; break; + default: - out << str[i]; - linepos++; + out << *i; break; } } + return out; } @@ -81,13 +85,16 @@ TAG_HANDLER_BEGIN(PRE, "PRE") { wxHtmlContainerCell *c; - int fixed = m_WParser->GetFontFixed(), - italic = m_WParser->GetFontItalic(), - underlined = m_WParser->GetFontUnderlined(), - bold = m_WParser->GetFontBold(), - fsize = m_WParser->GetFontSize(); + const int fixed = m_WParser->GetFontFixed(); + const int italic = m_WParser->GetFontItalic(); + const int underlined = m_WParser->GetFontUnderlined(); + const int bold = m_WParser->GetFontBold(); + const int fsize = m_WParser->GetFontSize(); + const wxHtmlWinParser::WhitespaceMode whitespace = + m_WParser->GetWhitespaceMode(); c = m_WParser->GetContainer(); + m_WParser->SetWhitespaceMode(wxHtmlWinParser::Whitespace_Pre); m_WParser->SetFontUnderlined(false); m_WParser->SetFontBold(false); m_WParser->SetFontItalic(false); @@ -103,12 +110,17 @@ TAG_HANDLER_BEGIN(PRE, "PRE") c->SetIndent(m_WParser->GetCharHeight(), wxHTML_INDENT_TOP); wxString srcMid = m_WParser->GetInnerSource(tag); - ParseInnerSource(HtmlizeWhitespaces(srcMid)); + + // setting Whitespace_Pre mode takes care of spaces and TABs, but + // not linebreaks, so we have to translate them into
by + // calling HtmlizeLinebreaks() here + ParseInnerSource(HtmlizeLinebreaks(srcMid)); m_WParser->CloseContainer(); m_WParser->CloseContainer(); c = m_WParser->OpenContainer(); + m_WParser->SetWhitespaceMode(whitespace); m_WParser->SetFontUnderlined(underlined); m_WParser->SetFontBold(bold); m_WParser->SetFontItalic(italic);