X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8907154c1a8a6882c6797d1f16393ddfb23e7f3a..4b5e178a4c22caac92952131632641c63821fc0c:/src/html/m_pre.cpp diff --git a/src/html/m_pre.cpp b/src/html/m_pre.cpp index f522512994..1a0ef36813 100644 --- a/src/html/m_pre.cpp +++ b/src/html/m_pre.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: m_pre.cpp +// Name: src/html/m_pre.cpp // Purpose: wxHtml module for
 ... 
tag (code citation) // Author: Vaclav Slavik // RCS-ID: $Id$ @@ -9,13 +9,13 @@ #include "wx/wxprec.h" -#include "wx/defs.h" -#if wxUSE_HTML && wxUSE_STREAMS #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif -#ifndef WXPRECOMP +#if wxUSE_HTML && wxUSE_STREAMS + +#ifndef WX_PRECOMP #endif #include "wx/html/forcelnk.h" @@ -28,45 +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]) + switch ( (*i).GetValue() ) { - case wxT('<'): - while (i < len && str[i] != wxT('>')) + case '<': + while ( i != end && *i != '>' ) { - out << str[i++]; - linepos++; + out << *i++; } - out << wxT('>'); - linepos++; - 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; } @@ -83,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); @@ -104,19 +109,18 @@ TAG_HANDLER_BEGIN(PRE, "PRE") c->SetAlignHor(wxHTML_ALIGN_LEFT); c->SetIndent(m_WParser->GetCharHeight(), wxHTML_INDENT_TOP); - wxString srcMid = - m_WParser->GetSource()->Mid(tag.GetBeginPos(), - tag.GetEndPos1() - tag.GetBeginPos()); - // It is safe to temporarily change the source being parsed, - // provided we restore the state back after parsing - m_Parser->SetSourceAndSaveState(HtmlizeWhitespaces(srcMid)); - m_Parser->DoParsing(); - m_Parser->RestoreState(); + wxString srcMid = m_WParser->GetInnerSource(tag); + + // 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);