]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/html/helpdata.cpp
Updated version to 2.3.2 so apps can test for differences in new merged source
[wxWidgets.git] / src / html / helpdata.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: helpdata.cpp
3// Purpose: wxHtmlHelpData
4// Notes: Based on htmlhelp.cpp, implementing a monolithic
5// HTML Help controller class, by Vaclav Slavik
6// Author: Harm van der Heijden and Vaclav Slavik
7// RCS-ID: $Id$
8// Copyright: (c) Harm van der Heijden and Vaclav Slavik
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13#pragma implementation
14#endif
15
16// For compilers that support precompilation, includes "wx.h".
17#include "wx/wxprec.h"
18
19#ifdef __BORLANDC__
20#pragma hdrstop
21#endif
22
23#include "wx/defs.h"
24
25#if wxUSE_HTML && wxUSE_STREAMS
26
27#ifndef WXPRECOMP
28#include "wx/wx.h"
29#endif
30
31#include "wx/html/helpdata.h"
32#include "wx/tokenzr.h"
33#include "wx/wfstream.h"
34#include "wx/busyinfo.h"
35#include "wx/encconv.h"
36#include "wx/fontmap.h"
37#include "wx/log.h"
38#include "wx/html/htmlpars.h"
39#include "wx/html/htmldefs.h"
40
41#include "wx/arrimpl.cpp"
42WX_DEFINE_OBJARRAY(wxHtmlBookRecArray)
43
44//-----------------------------------------------------------------------------
45// static helper functions
46//-----------------------------------------------------------------------------
47
48// Reads one line, stores it into buf and returns pointer to new line or NULL.
49static char* ReadLine(char *line, char *buf)
50{
51 char *writeptr = buf, *readptr = line;
52
53 while (*readptr != 0 && *readptr != '\r' && *readptr != '\n') *(writeptr++) = *(readptr++);
54 *writeptr = 0;
55 while (*readptr == '\r' || *readptr == '\n') readptr++;
56 if (*readptr == 0) return NULL;
57 else return readptr;
58}
59
60
61
62static int LINKAGEMODE IndexCompareFunc(const void *a, const void *b)
63{
64 return wxStrcmp(((wxHtmlContentsItem*)a)->m_Name, ((wxHtmlContentsItem*)b)->m_Name);
65}
66
67
68//-----------------------------------------------------------------------------
69// HP_Parser
70//-----------------------------------------------------------------------------
71
72class HP_Parser : public wxHtmlParser
73{
74 public:
75 void AddText(const char* WXUNUSED(text)) { }
76 wxObject* GetProduct() { return NULL; }
77};
78
79
80//-----------------------------------------------------------------------------
81// HP_TagHandler
82//-----------------------------------------------------------------------------
83
84class HP_TagHandler : public wxHtmlTagHandler
85{
86 private:
87 wxString m_Name, m_Page;
88 int m_Level;
89 int m_ID;
90 int m_Index;
91 wxHtmlContentsItem *m_Items;
92 int m_ItemsCnt;
93 wxHtmlBookRecord *m_Book;
94
95 public:
96 HP_TagHandler(wxHtmlBookRecord *b) : wxHtmlTagHandler()
97 { m_Book = b; m_Items = NULL; m_ItemsCnt = 0; m_Name = m_Page = wxEmptyString;
98 m_Level = 0; m_ID = -1; }
99 wxString GetSupportedTags() { return wxT("UL,OBJECT,PARAM"); }
100 bool HandleTag(const wxHtmlTag& tag);
101 void WriteOut(wxHtmlContentsItem*& array, int& size);
102 void ReadIn(wxHtmlContentsItem* array, int size);
103};
104
105
106bool HP_TagHandler::HandleTag(const wxHtmlTag& tag)
107{
108 if (tag.GetName() == wxT("UL"))
109 {
110 m_Level++;
111 ParseInner(tag);
112 m_Level--;
113 return TRUE;
114 }
115 else if (tag.GetName() == wxT("OBJECT"))
116 {
117 m_Name = m_Page = wxEmptyString;
118 ParseInner(tag);
119
120#if 0
121 if (!m_Page.IsEmpty())
122 /* Valid HHW's file may contain only two object tags:
123
124 <OBJECT type="text/site properties">
125 <param name="ImageType" value="Folder">
126 </OBJECT>
127
128 or
129
130 <OBJECT type="text/sitemap">
131 <param name="Name" value="main page">
132 <param name="Local" value="another.htm">
133 </OBJECT>
134
135 We're interested in the latter. !m_Page.IsEmpty() is valid
136 condition because text/site properties does not contain Local param
137 */
138#endif
139 if (tag.GetParam(wxT("TYPE")) == wxT("text/sitemap"))
140 {
141 if (m_ItemsCnt % wxHTML_REALLOC_STEP == 0)
142 m_Items = (wxHtmlContentsItem*) realloc(m_Items,
143 (m_ItemsCnt + wxHTML_REALLOC_STEP) *
144 sizeof(wxHtmlContentsItem));
145
146 m_Items[m_ItemsCnt].m_Level = m_Level;
147 m_Items[m_ItemsCnt].m_ID = m_ID;
148 m_Items[m_ItemsCnt].m_Page = new wxChar[m_Page.Length() + 1];
149 wxStrcpy(m_Items[m_ItemsCnt].m_Page, m_Page.c_str());
150 m_Items[m_ItemsCnt].m_Name = new wxChar [m_Name.Length() + 1];
151 wxStrcpy(m_Items[m_ItemsCnt].m_Name, m_Name.c_str());
152 m_Items[m_ItemsCnt].m_Book = m_Book;
153 m_ItemsCnt++;
154 }
155
156 return TRUE;
157 }
158 else
159 { // "PARAM"
160 if (m_Name == wxEmptyString && tag.GetParam(wxT("NAME")) == wxT("Name"))
161 {
162 m_Name = tag.GetParam(wxT("VALUE"));
163 if (m_Name.Find(wxT('&')) != -1)
164 {
165#define ESCSEQ(escape, subst) \
166 { _T("&") _T(escape) _T(";"), _T("&") _T(escape) _T(" "), _T("&") _T(escape), _T(subst) }
167 static wxChar* substitutions[][4] =
168 {
169 ESCSEQ("quot", "\""),
170 ESCSEQ("#34", "\""),
171 ESCSEQ("#8220", "\""),
172 ESCSEQ("#8221", "\""),
173 ESCSEQ("lt", "<"),
174 ESCSEQ("#60", "<"),
175 ESCSEQ("gt", ">"),
176 ESCSEQ("#62", ">"),
177
178 ESCSEQ("#94", "^"), /* ^ */
179
180 ESCSEQ("nbsp", " "),
181 ESCSEQ("#32", " "),
182 ESCSEQ("iexcl", "!"),
183 ESCSEQ("#33", "!"),
184