From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- comm/mailnews/import/src/rtfMailDecoder.cpp | 71 +++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 comm/mailnews/import/src/rtfMailDecoder.cpp (limited to 'comm/mailnews/import/src/rtfMailDecoder.cpp') diff --git a/comm/mailnews/import/src/rtfMailDecoder.cpp b/comm/mailnews/import/src/rtfMailDecoder.cpp new file mode 100644 index 0000000000..c5a234320e --- /dev/null +++ b/comm/mailnews/import/src/rtfMailDecoder.cpp @@ -0,0 +1,71 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "rtfMailDecoder.h" + +void CRTFMailDecoder::BeginGroup() { + ClearState(sAsterisk); + SetState(sBeginGroup); + if (m_skipLevel) ++m_skipLevel; +} + +void CRTFMailDecoder::EndGroup() { + ClearState(sAsterisk | sBeginGroup); + if (m_skipLevel) --m_skipLevel; +} + +void CRTFMailDecoder::AddText(const wchar_t* txt, size_t cch) { + if (!IsHtmlRtf()) { + if (cch == static_cast(-1)) + m_text += txt; + else + m_text.append(txt, cch); + } +} + +void CRTFMailDecoder::Keyword(const char* name, const int* Val) { + bool asterisk = IsAsterisk(); + ClearState(sAsterisk); // for inside use only + bool beginGroup = IsBeginGroup(); + ClearState(sBeginGroup); // for inside use only + if (!m_skipLevel) { + if (eq(name, "*") && beginGroup) + SetState(sAsterisk); + else if (asterisk) { + if (eq(name, "htmltag") && + (m_mode == + mHTML)) { // \*\htmltag -> don't ignore; include the following text + } else + ++m_skipLevel; + } else if (eq(name, "htmlrtf")) { + if (Val && (*Val == 0)) + ClearState(sHtmlRtf); + else + SetState(sHtmlRtf); + } else if (eq(name, "par") || eq(name, "line")) { + AddText(L"\r\n"); + } else if (eq(name, "tab")) { + AddText(L"\t"); + } else if (eq(name, "rquote")) { + AddText(L"\x2019"); // Unicode right single quotation mark + } else if (eq(name, "fromtext") && + (m_mode == mNone)) { // avoid double "fromX" + m_mode = mText; + } else if (eq(name, "fromhtml") && + (m_mode == mNone)) { // avoid double "fromX" + m_mode = mHTML; + } else if (eq(name, "fonttbl") || eq(name, "colortbl") || + eq(name, "stylesheet") || eq(name, "pntext")) + ++m_skipLevel; + } +} + +void CRTFMailDecoder::PCDATA(const wchar_t* data, size_t cch) { + ClearState(sAsterisk | sBeginGroup); + if (!m_skipLevel) AddText(data, cch); +} + +void CRTFMailDecoder::BDATA(const char* data, size_t sz) { + ClearState(sAsterisk | sBeginGroup); +} -- cgit v1.2.3