preserve TAB characters when copying HTML <pre> content to clipboard
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@53282 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -28,40 +28,28 @@
|
||||
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;
|
||||
out.reserve(str.length()); // we'll certainly need at least that
|
||||
|
||||
size_t len = str.Len();
|
||||
size_t linepos = 0;
|
||||
for (size_t i = 0; i < len; i++)
|
||||
{
|
||||
switch ( str[i].GetValue() )
|
||||
{
|
||||
case wxT('<'):
|
||||
while (i < len && str[i] != wxT('>'))
|
||||
case '<':
|
||||
while (i < len && str[i] != '>')
|
||||
{
|
||||
out << str[i++];
|
||||
}
|
||||
out << wxT('>');
|
||||
out << '>';
|
||||
break;
|
||||
case wxT(' '):
|
||||
out << wxT(" ");
|
||||
linepos++;
|
||||
break;
|
||||
case wxT('\n'):
|
||||
out << wxT("<br>");
|
||||
linepos = 0;
|
||||
break;
|
||||
case wxT('\t'):
|
||||
{
|
||||
for (size_t j = 8 - linepos % 8; j > 0; j--)
|
||||
out << wxT(" ");
|
||||
linepos += 8 - linepos % 8;
|
||||
}
|
||||
case '\n':
|
||||
out << "<br>";
|
||||
break;
|
||||
default:
|
||||
out << str[i];
|
||||
linepos++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -81,13 +69,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 +94,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 <br> 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);
|
||||
|
Reference in New Issue
Block a user