X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d1da887276915d7b83dc7beff43bbe0deea35939..73b2a9a749a960c7c5150d70e847cd740983c034:/src/html/winpars.cpp diff --git a/src/html/winpars.cpp b/src/html/winpars.cpp index 344ade10a0..265572a844 100644 --- a/src/html/winpars.cpp +++ b/src/html/winpars.cpp @@ -7,11 +7,6 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// - -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "winpars.h" -#endif - #include "wx/wxprec.h" #include "wx/defs.h" @@ -32,6 +27,7 @@ #include "wx/fontmap.h" #include "wx/log.h" #include "wx/settings.h" +#include "wx/uri.h" //----------------------------------------------------------------------------- @@ -115,7 +111,7 @@ void wxHtmlWinParser::RemoveModule(wxHtmlTagsModule *module) m_Modules.DeleteObject(module); } -void wxHtmlWinParser::SetFonts(wxString normal_face, wxString fixed_face, +void wxHtmlWinParser::SetFonts(const wxString& normal_face, const wxString& fixed_face, const int *sizes) { static int default_sizes[7] = @@ -192,10 +188,12 @@ void wxHtmlWinParser::InitParser(const wxString& source) */ m_UseLink = false; - m_Link = wxHtmlLinkInfo( wxT(""), wxT("") ); + m_Link = wxHtmlLinkInfo( wxEmptyString ); m_LinkColor.Set(0, 0, 0xFF); m_ActualColor.Set(0, 0, 0); m_Align = wxHTML_ALIGN_LEFT; + m_ScriptMode = wxHTML_SCRIPT_NORMAL; + m_ScriptBaseline = 0; m_tmpLastWasSpace = false; m_lastWordCell = NULL; @@ -248,16 +246,45 @@ wxObject* wxHtmlWinParser::GetProduct() wxFSFile *wxHtmlWinParser::OpenURL(wxHtmlURLType type, const wxString& url) const { - // FIXME - normalize the URL to full path before passing to - // OnOpeningURL!! if ( m_Window ) { wxString myurl(url); wxHtmlOpeningStatus status; for (;;) { + wxString myfullurl(myurl); + + // consider url as absolute path first + wxURI current(myurl); + myfullurl = current.BuildUnescapedURI(); + + // if not absolute then ... + if( current.IsReference() ) + { + wxString basepath = GetFS()->GetPath(); + wxURI base(basepath); + + // ... try to apply base path if valid ... + if( !base.IsReference() ) + { + wxURI path(myfullurl); + path.Resolve( base ); + myfullurl = path.BuildUnescapedURI(); + } + else + { + // ... or force such addition if not included already + if( !current.GetPath().Contains(base.GetPath()) ) + { + basepath += myurl; + wxURI connected( basepath ); + myfullurl = connected.BuildUnescapedURI(); + } + } + } + wxString redirect; - status = m_Window->OnOpeningURL(type, myurl, &redirect); + status = m_Window->OnOpeningURL(type, myfullurl, &redirect); if ( status != wxHTML_REDIRECT ) break; @@ -275,7 +302,6 @@ wxFSFile *wxHtmlWinParser::OpenURL(wxHtmlURLType type, void wxHtmlWinParser::AddText(const wxChar* txt) { - wxHtmlCell *c; size_t i = 0, x, lng = wxStrlen(txt); @@ -313,45 +339,40 @@ void wxHtmlWinParser::AddText(const wxChar* txt) if (x) { temp[templen-1] = wxT(' '); - temp[templen] = 0; - templen = 0; -#if !wxUSE_UNICODE - if (m_EncConv) - m_EncConv->Convert(temp); -#endif - size_t len = wxStrlen(temp); - for (size_t j = 0; j < len; j++) - if (temp[j] == nbsp) - temp[j] = wxT(' '); - c = new wxHtmlWordCell(temp, *(GetDC())); - if (m_UseLink) - c->SetLink(m_Link); - m_Container->InsertCell(c); - ((wxHtmlWordCell*)c)->SetPreviousWord(m_lastWordCell); - m_lastWordCell = (wxHtmlWordCell*)c; + DoAddText(temp, templen, nbsp); m_tmpLastWasSpace = true; } } if (templen && (templen > 1 || temp[0] != wxT(' '))) { - temp[templen] = 0; + DoAddText(temp, templen, nbsp); + m_tmpLastWasSpace = false; + } +} + +void wxHtmlWinParser::DoAddText(wxChar *temp, int& templen, wxChar nbsp) +{ + temp[templen] = 0; + templen = 0; #if !wxUSE_UNICODE - if (m_EncConv) - m_EncConv->Convert(temp); + if (m_EncConv) + m_EncConv->Convert(temp); #endif - size_t len = wxStrlen(temp); - for (size_t j = 0; j < len; j++) - if (temp[j] == nbsp) - temp[j] = wxT(' '); - c = new wxHtmlWordCell(temp, *(GetDC())); - if (m_UseLink) - c->SetLink(m_Link); - m_Container->InsertCell(c); - ((wxHtmlWordCell*)c)->SetPreviousWord(m_lastWordCell); - m_lastWordCell = (wxHtmlWordCell*)c; - m_tmpLastWasSpace = false; + size_t len = wxStrlen(temp); + for (size_t j = 0; j < len; j++) + { + if (temp[j] == nbsp) + temp[j] = wxT(' '); } + + wxHtmlCell *c = new wxHtmlWordCell(temp, *(GetDC())); + + ApplyStateToCell(c); + + m_Container->InsertCell(c); + ((wxHtmlWordCell*)c)->SetPreviousWord(m_lastWordCell); + m_lastWordCell = (wxHtmlWordCell*)c; } @@ -445,7 +466,6 @@ void wxHtmlWinParser::SetLink(const wxHtmlLinkInfo& link) m_UseLink = (link.GetHref() != wxEmptyString); } - void wxHtmlWinParser::SetFontFace(const wxString& face) { if (GetFontFixed()) m_FontFaceFixed = face; @@ -457,6 +477,15 @@ void wxHtmlWinParser::SetFontFace(const wxString& face) #endif } +void wxHtmlWinParser::ApplyStateToCell(wxHtmlCell *cell) +{ + // set the link: + if (m_UseLink) + cell->SetLink(GetLink()); + + // apply current script mode settings: + cell->SetScriptMode(GetScriptMode(), GetScriptBaseline()); +} #if !wxUSE_UNICODE