X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f890e2d474d26e47950717c802a3890497615484..3b111dbe5329143c501d4ff8853691a832b7d2ab:/src/html/helpdata.cpp?ds=inline diff --git a/src/html/helpdata.cpp b/src/html/helpdata.cpp index bc928a7ccb..e234941cb8 100644 --- a/src/html/helpdata.cpp +++ b/src/html/helpdata.cpp @@ -22,7 +22,7 @@ #include "wx/defs.h" -#if wxUSE_HTML +#if wxUSE_HTML && wxUSE_STREAMS #ifndef WXPRECOMP #include "wx/wx.h" @@ -34,6 +34,7 @@ #include "wx/busyinfo.h" #include "wx/encconv.h" #include "wx/fontmap.h" +#include "wx/log.h" #include "wx/html/htmlpars.h" #include "wx/html/htmldefs.h" @@ -92,7 +93,7 @@ class HP_TagHandler : public wxHtmlTagHandler wxHtmlBookRecord *m_Book; public: - HP_TagHandler(wxHtmlBookRecord *b) : wxHtmlTagHandler() {m_Book = b; m_Items = NULL; m_ItemsCnt = 0; m_Name = m_Page = wxEmptyString; m_Level = 0; } + HP_TagHandler(wxHtmlBookRecord *b) : wxHtmlTagHandler() {m_Book = b; m_Items = NULL; m_ItemsCnt = 0; m_Name = m_Page = wxEmptyString; m_Level = 0; m_ID = -1; } wxString GetSupportedTags() { return wxT("UL,OBJECT,PARAM"); } bool HandleTag(const wxHtmlTag& tag); void WriteOut(wxHtmlContentsItem*& array, int& size); @@ -147,7 +148,122 @@ bool HP_TagHandler::HandleTag(const wxHtmlTag& tag) return TRUE; } else { // "PARAM" - if (m_Name == wxEmptyString && tag.GetParam(wxT("NAME")) == wxT("Name")) m_Name = tag.GetParam(wxT("VALUE")); + if (m_Name == wxEmptyString && tag.GetParam(wxT("NAME")) == wxT("Name")) + { + m_Name = tag.GetParam(wxT("VALUE")); + if (m_Name.Find(wxT('&')) != -1) + { + #define ESCSEQ(escape, subst) \ + { _T("&") _T(escape) _T(";"), _T("&") _T(escape) _T(" "), _T(subst) } + static wxChar* substitutions[][3] = + { + ESCSEQ("quot", "\""), + ESCSEQ("lt", "<"), + ESCSEQ("gt", ">"), + + ESCSEQ("nbsp", " "), + ESCSEQ("iexcl", "!"), + ESCSEQ("cent", "¢"), + + ESCSEQ("yen", " "), + ESCSEQ("brkbar", " "), + ESCSEQ("sect", " "), + ESCSEQ("uml", " "), + + ESCSEQ("copy", "(c)"), + ESCSEQ("ordf", " "), + ESCSEQ("laquo", " "), + ESCSEQ("not", " "), + + ESCSEQ("reg", "(r)"), + + ESCSEQ("deg", " "), + ESCSEQ("plusm", " "), + + ESCSEQ("acute", " "), + ESCSEQ("micro", " "), + ESCSEQ("para", " "), + + ESCSEQ("ordm", " "), + ESCSEQ("raquo", " "), + + ESCSEQ("iquest", " "), + ESCSEQ("Agrave", "À"), + + ESCSEQ("Acirc", "Â"), + ESCSEQ("Atilde", "Ã"), + ESCSEQ("Auml", "Ä"), + ESCSEQ("Aring", " "), + ESCSEQ("AElig", " "), + ESCSEQ("Ccedil", "ç"), + ESCSEQ("Egrave", "È"), + ESCSEQ("Eacute", "É"), + ESCSEQ("Ecirc", "Ê"), + ESCSEQ("Euml", "Ë"), + ESCSEQ("Igrave", "Ì"), + + ESCSEQ("Icirc", "Î"), + ESCSEQ("Iuml", "Ï"), + + ESCSEQ("Ntilde", "Ñ"), + ESCSEQ("Ograve", "Ò"), + + ESCSEQ("Ocirc", "Ô"), + ESCSEQ("Otilde", "Õ"), + ESCSEQ("Ouml", "Ö"), + + ESCSEQ("Oslash", " "), + ESCSEQ("Ugrave", "Ù"), + + ESCSEQ("Ucirc", " "), + ESCSEQ("Uuml", "Ü"), + + ESCSEQ("szlig", "§"), + ESCSEQ("agrave;","à"), + ESCSEQ("aacute", "á"), + ESCSEQ("acirc", "â"), + ESCSEQ("atilde", "ã"), + ESCSEQ("auml", "ä"), + ESCSEQ("aring", "a"), + ESCSEQ("aelig", "ae"), + ESCSEQ("ccedil", "ç"), + ESCSEQ("egrave", "è"), + ESCSEQ("eacute", "é"), + ESCSEQ("ecirc", "ê"), + ESCSEQ("euml", "ë"), + ESCSEQ("igrave", "ì"), + ESCSEQ("iacute", "í"), + ESCSEQ("icirc", " "), + ESCSEQ("iuml", "ï"), + ESCSEQ("eth", " "), + ESCSEQ("ntilde", "ñ"), + ESCSEQ("ograve", "ò"), + ESCSEQ("oacute", "ó"), + ESCSEQ("ocirc", "ô"), + ESCSEQ("otilde", "õ"), + ESCSEQ("ouml", "ö"), + ESCSEQ("divide", " "), + ESCSEQ("oslash", " "), + ESCSEQ("ugrave", "ù"), + ESCSEQ("uacute", "ú"), + ESCSEQ("ucirc", "û"), + ESCSEQ("uuml", "ü"), + + ESCSEQ("yuml", ""), + + /* this one should ALWAYS stay the last one!!! */ + ESCSEQ("amp", "&"), + + { NULL, NULL, NULL } + }; + + for (int i = 0; substitutions[i][0] != NULL; i++) + { + m_Name.Replace(substitutions[i][0], substitutions[i][2], TRUE); + m_Name.Replace(substitutions[i][1], substitutions[i][2], TRUE); + } + } + } if (tag.GetParam(wxT("NAME")) == wxT("Local")) m_Page = tag.GetParam(wxT("VALUE")); if (tag.GetParam(wxT("NAME")) == wxT("ID")) tag.ScanParam(wxT("VALUE"), wxT("%i"), &m_ID); return FALSE; @@ -221,7 +337,7 @@ bool wxHtmlHelpData::LoadMSProject(wxHtmlBookRecord *book, wxFileSystem& fsys, c HP_TagHandler *handler = new HP_TagHandler(book); parser.AddTagHandler(handler); - f = ( contentsfile.IsEmpty() ? 0 : fsys.OpenFile(contentsfile) ); + f = ( contentsfile.IsEmpty() ? (wxFSFile*) NULL : fsys.OpenFile(contentsfile) ); if (f) { sz = f -> GetStream() -> GetSize(); buf = new char[sz + 1]; @@ -233,8 +349,10 @@ bool wxHtmlHelpData::LoadMSProject(wxHtmlBookRecord *book, wxFileSystem& fsys, c handler -> WriteOut(m_Contents, m_ContentsCnt); delete[] buf; } + else + wxLogError(_("Cannot open contents file: %s"), contentsfile.c_str()); - f = ( indexfile.IsEmpty() ? 0 : fsys.OpenFile(indexfile) ); + f = ( indexfile.IsEmpty() ? (wxFSFile*) NULL : fsys.OpenFile(indexfile) ); if (f) { sz = f -> GetStream() -> GetSize(); buf = new char[sz + 1]; @@ -246,6 +364,8 @@ bool wxHtmlHelpData::LoadMSProject(wxHtmlBookRecord *book, wxFileSystem& fsys, c handler -> WriteOut(m_Index, m_IndexCnt); delete[] buf; } + else if (!indexfile.IsEmpty()) + wxLogError(_("Cannot open index file: %s"), indexfile.c_str()); return TRUE; } @@ -278,9 +398,13 @@ bool wxHtmlHelpData::LoadCachedBook(wxHtmlBookRecord *book, wxInputStream *f) f -> Read(&x, sizeof(x)); version = wxINT32_SWAP_ON_BE(x); - if (version != CURRENT_CACHED_BOOK_VERSION) return FALSE; + if (version != CURRENT_CACHED_BOOK_VERSION) + { + wxLogError(_("Incorrect version of HTML help book")); + return FALSE; // NOTE: when adding new version, please ensure backward compatibility! - + } + /* load contents : */ f -> Read(&x, sizeof(x)); @@ -385,6 +509,17 @@ void wxHtmlHelpData::SetTempDir(const wxString& path) } + +static wxString SafeFileName(const wxString& s) +{ + wxString res(s); + res.Replace(wxT("#"), wxT("_")); + res.Replace(wxT(":"), wxT("_")); + res.Replace(wxT("\\"), wxT("_")); + res.Replace(wxT("/"), wxT("_")); + return res; +} + bool wxHtmlHelpData::AddBookParam(const wxFSFile& bookfile, wxFontEncoding encoding, const wxString& title, const wxString& contfile, @@ -437,7 +572,7 @@ bool wxHtmlHelpData::AddBookParam(const wxFSFile& bookfile, if (m_TempPath != wxEmptyString) { wxFileOutputStream *outs = new wxFileOutputStream(m_TempPath + - wxFileNameFromPath(bookfile.GetLocation()) + wxT(".cached")); + SafeFileName(wxFileNameFromPath(bookfile.GetLocation())) + wxT(".cached")); SaveCachedBook(bookr, outs); delete outs; } @@ -517,7 +652,11 @@ bool wxHtmlHelpData::AddBook(const wxString& book) else bookFull = wxGetCwd() + "/" + book; fi = fsys.OpenFile(bookFull); - if (fi == NULL) return FALSE; + if (fi == NULL) + { + wxLogError(_("Cannot open HTML help book: %s"), bookFull.c_str()); + return FALSE; + } fsys.ChangePathTo(bookFull); s = fi -> GetStream(); sz = s -> GetSize();