X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/14f355c2b5c71fc7c3d680aea366582d2ac60f7b..d41e1ab4817b8a603c1399b1e4b006ec951839a7:/src/html/htmlpars.cpp diff --git a/src/html/htmlpars.cpp b/src/html/htmlpars.cpp index 9718c67ee3..7efb69af34 100644 --- a/src/html/htmlpars.cpp +++ b/src/html/htmlpars.cpp @@ -1,29 +1,25 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: htmlpars.cpp +// Name: src/html/htmlpars.cpp // Purpose: wxHtmlParser class (generic parser) // Author: Vaclav Slavik // RCS-ID: $Id$ // Copyright: (c) 1999 Vaclav Slavik -// Licence: wxWindows Licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// - -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "htmlpars.h" -#endif - #include "wx/wxprec.h" -#include "wx/defs.h" -#if wxUSE_HTML && wxUSE_STREAMS - #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif +#if wxUSE_HTML && wxUSE_STREAMS + #ifndef WXPRECOMP + #include "wx/dynarray.h" #include "wx/log.h" #include "wx/intl.h" + #include "wx/app.h" #endif #include "wx/tokenzr.h" @@ -32,14 +28,17 @@ #include "wx/fontmap.h" #include "wx/html/htmldefs.h" #include "wx/html/htmlpars.h" -#include "wx/dynarray.h" #include "wx/arrimpl.cpp" +#ifdef __WXWINCE__ + #include "wx/msw/wince/missing.h" // for bsearch() +#endif // DLL options compatibility check: -#include "wx/app.h" WX_CHECK_BUILD_OPTIONS("wxHTML") +const wxChar *wxTRACE_HTML_DEBUG = _T("htmldebug"); + //----------------------------------------------------------------------------- // wxHtmlParser helpers //----------------------------------------------------------------------------- @@ -52,7 +51,7 @@ public: }; WX_DECLARE_OBJARRAY(wxHtmlTextPiece, wxHtmlTextPieces); -WX_DEFINE_OBJARRAY(wxHtmlTextPieces); +WX_DEFINE_OBJARRAY(wxHtmlTextPieces) class wxHtmlParserState { @@ -114,7 +113,7 @@ wxObject* wxHtmlParser::Parse(const wxString& source) void wxHtmlParser::InitParser(const wxString& source) { SetSource(source); - m_stopParsing = FALSE; + m_stopParsing = false; } void wxHtmlParser::DoneParser() @@ -135,7 +134,7 @@ void wxHtmlParser::CreateDOMTree() { wxHtmlTagsCache cache(m_Source); m_TextPieces = new wxHtmlTextPieces; - CreateDOMSubTree(NULL, 0, m_Source.Length(), &cache); + CreateDOMSubTree(NULL, 0, m_Source.length(), &cache); m_CurTextPiece = 0; } @@ -199,7 +198,7 @@ void wxHtmlParser::CreateDOMSubTree(wxHtmlTag *cur, // add another tag to the tree: else if (i < end_pos-1 && m_Source.GetChar(i+1) != wxT('/')) - { + { wxHtmlTag *chd; if (cur) chd = new wxHtmlTag(cur, m_Source, @@ -232,7 +231,7 @@ void wxHtmlParser::CreateDOMSubTree(wxHtmlTag *cur, } else i = chd->GetBeginPos(); - + textBeginning = i; } @@ -272,7 +271,7 @@ void wxHtmlParser::DoParsing() { m_CurTag = m_Tags; m_CurTextPiece = 0; - DoParsing(0, m_Source.Length()); + DoParsing(0, m_Source.length()); } void wxHtmlParser::DoParsing(int begin_pos, int end_pos) @@ -304,14 +303,10 @@ void wxHtmlParser::DoParsing(int begin_pos, int end_pos) } else if (m_CurTag) { - // Add tag: - if (m_CurTag) - { - if (m_CurTag->HasEnding()) - begin_pos = m_CurTag->GetEndPos2(); - else - begin_pos = m_CurTag->GetBeginPos(); - } + if (m_CurTag->HasEnding()) + begin_pos = m_CurTag->GetEndPos2(); + else + begin_pos = m_CurTag->GetBeginPos(); wxHtmlTag *t = m_CurTag; m_CurTag = m_CurTag->GetNextTag(); AddTag(*t); @@ -325,7 +320,7 @@ void wxHtmlParser::DoParsing(int begin_pos, int end_pos) void wxHtmlParser::AddTag(const wxHtmlTag& tag) { wxHtmlTagHandler *h; - bool inner = FALSE; + bool inner = false; h = (wxHtmlTagHandler*) m_HandlersHash.Get(tag.GetName()); if (h) @@ -355,7 +350,7 @@ void wxHtmlParser::AddTagHandler(wxHtmlTagHandler *handler) handler->SetParser(this); } -void wxHtmlParser::PushTagHandler(wxHtmlTagHandler *handler, wxString tags) +void wxHtmlParser::PushTagHandler(wxHtmlTagHandler *handler, const wxString& tags) { wxStringTokenizer tokenizer(tags, wxT(", ")); wxString key; @@ -419,7 +414,7 @@ void wxHtmlParser::SetSourceAndSaveState(const wxString& src) bool wxHtmlParser::RestoreState() { - if (!m_SavedStates) return FALSE; + if (!m_SavedStates) return false; DestroyDOMTree(); @@ -433,7 +428,13 @@ bool wxHtmlParser::RestoreState() m_Source = s->m_source; delete s; - return TRUE; + return true; +} + +wxString wxHtmlParser::GetInnerSource(const wxHtmlTag& tag) +{ + return GetSource()->Mid(tag.GetBeginPos(), + tag.GetEndPos1() - tag.GetBeginPos()); } //----------------------------------------------------------------------------- @@ -442,6 +443,15 @@ bool wxHtmlParser::RestoreState() IMPLEMENT_ABSTRACT_CLASS(wxHtmlTagHandler,wxObject) +void wxHtmlTagHandler::ParseInnerSource(const wxString& source) +{ + // It is safe to temporarily change the source being parsed, + // provided we restore the state back after parsing + m_Parser->SetSourceAndSaveState(source); + m_Parser->DoParsing(); + m_Parser->RestoreState(); +} + //----------------------------------------------------------------------------- // wxHtmlEntitiesParser @@ -486,7 +496,7 @@ wxString wxHtmlEntitiesParser::Parse(const wxString& input) const wxChar *c, *last; const wxChar *in_str = input.c_str(); wxString output; - + output.reserve(input.length()); for (c = in_str, last = in_str; *c != wxT('\0'); c++) @@ -495,12 +505,13 @@ wxString wxHtmlEntitiesParser::Parse(const wxString& input) { if (c - last > 0) output.append(last, c - last); - if (++c == wxT('\0')) break; - + if ( *++c == wxT('\0') ) + break; + wxString entity; const wxChar *ent_s = c; wxChar entity_char; - + for (; (*c >= wxT('a') && *c <= wxT('z')) || (*c >= wxT('A') && *c <= wxT('Z')) || (*c >= wxT('0') && *c <= wxT('9')) || @@ -514,7 +525,9 @@ wxString wxHtmlEntitiesParser::Parse(const wxString& input) else { output.append(ent_s-1, c-ent_s+2); - wxLogDebug(wxT("Unrecognized HTML entity: '%s'"), entity.c_str()); + wxLogTrace(wxTRACE_HTML_DEBUG, + wxT("Unrecognized HTML entity: '%s'"), + entity.c_str()); } } } @@ -835,11 +848,24 @@ wxChar wxHtmlEntitiesParser::GetEntityChar(const wxString& entity) while (substitutions[substitutions_cnt].code != 0) substitutions_cnt++; - wxHtmlEntityInfo *info; + wxHtmlEntityInfo *info = NULL; +#ifdef __WXWINCE__ + // bsearch crashes under WinCE for some reason + size_t i; + for (i = 0; i < substitutions_cnt; i++) + { + if (entity == substitutions[i].name) + { + info = & substitutions[i]; + break; + } + } +#else info = (wxHtmlEntityInfo*) bsearch(entity.c_str(), substitutions, substitutions_cnt, sizeof(wxHtmlEntityInfo), wxHtmlEntityCompare); +#endif if (info) code = info->code; } @@ -850,10 +876,11 @@ wxChar wxHtmlEntitiesParser::GetEntityChar(const wxString& entity) return GetCharForCode(code); } -wxFSFile *wxHtmlParser::OpenURL(wxHtmlURLType WXUNUSED(type), +wxFSFile *wxHtmlParser::OpenURL(wxHtmlURLType WXUNUSED(type), const wxString& url) const { - return GetFS()->OpenFile(url); + return m_FS ? m_FS->OpenFile(url) : NULL; + } @@ -892,21 +919,21 @@ bool wxMetaTagHandler::HandleTag(const wxHtmlTag& tag) if (tag.GetName() == _T("BODY")) { m_Parser->StopParsing(); - return FALSE; + return false; } if (tag.HasParam(_T("HTTP-EQUIV")) && tag.GetParam(_T("HTTP-EQUIV")).IsSameAs(_T("Content-Type"), false) && tag.HasParam(_T("CONTENT"))) { - wxString content = tag.GetParam(_T("CONTENT")); + wxString content = tag.GetParam(_T("CONTENT")).Lower(); if (content.Left(19) == _T("text/html; charset=")) { *m_retval = content.Mid(19); m_Parser->StopParsing(); } } - return FALSE; + return false; } @@ -914,9 +941,13 @@ bool wxMetaTagHandler::HandleTag(const wxHtmlTag& tag) wxString wxHtmlParser::ExtractCharsetInformation(const wxString& markup) { wxString charset; - wxMetaTagParser parser; - parser.AddTagHandler(new wxMetaTagHandler(&charset)); - parser.Parse(markup); + wxMetaTagParser *parser = new wxMetaTagParser(); + if(parser) + { + parser->AddTagHandler(new wxMetaTagHandler(&charset)); + parser->Parse(markup); + delete parser; + } return charset; }