]> git.saurik.com Git - wxWidgets.git/blame - src/html/helpdata.cpp
typo fixed
[wxWidgets.git] / src / html / helpdata.cpp
CommitLineData
8ec2b484
HH
1/////////////////////////////////////////////////////////////////////////////
2// Name: helpdata.cpp
3// Purpose: wxHtmlHelpData
f42b1601 4// Notes: Based on htmlhelp.cpp, implementing a monolithic
8ec2b484
HH
5// HTML Help controller class, by Vaclav Slavik
6// Author: Harm van der Heijden and Vaclav Slavik
69941f05 7// RCS-ID: $Id$
8ec2b484
HH
8// Copyright: (c) Harm van der Heijden and Vaclav Slavik
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
69941f05 13#pragma implementation
8ec2b484
HH
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
f6bcfd97 25#if wxUSE_HTML && wxUSE_STREAMS
8ec2b484
HH
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"
f890e2d4
VS
35#include "wx/encconv.h"
36#include "wx/fontmap.h"
f3c82859 37#include "wx/log.h"
69941f05 38#include "wx/html/htmlpars.h"
8ec2b484
HH
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
8ec2b484 61
16a12a3d 62static int LINKAGEMODE IndexCompareFunc(const void *a, const void *b)
8ec2b484 63{
4f9297b0 64 return wxStrcmp(((wxHtmlContentsItem*)a)->m_Name, ((wxHtmlContentsItem*)b)->m_Name);
8ec2b484
HH
65}
66
67
68//-----------------------------------------------------------------------------
69// HP_Parser
70//-----------------------------------------------------------------------------
71
72class HP_Parser : public wxHtmlParser
73{
74 public:
0c5d3e1c
VZ
75 void AddText(const char* WXUNUSED(text)) { }
76 wxObject* GetProduct() { return NULL; }
8ec2b484
HH
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;
d5bb85a0 89 int m_ID;
8ec2b484
HH
90 int m_Index;
91 wxHtmlContentsItem *m_Items;
92 int m_ItemsCnt;
93 wxHtmlBookRecord *m_Book;
7df9fbc3 94 bool m_firstTime; // For checking if we're adding sections at level zero, so we 'delete' the first one
8ec2b484
HH
95
96 public:
4f9297b0
VS
97 HP_TagHandler(wxHtmlBookRecord *b) : wxHtmlTagHandler()
98 { m_Book = b; m_Items = NULL; m_ItemsCnt = 0; m_Name = m_Page = wxEmptyString;
7df9fbc3 99 m_Level = 0; m_ID = -1; m_firstTime = TRUE; }
66a77a74 100 wxString GetSupportedTags() { return wxT("UL,OBJECT,PARAM"); }
8ec2b484
HH
101 bool HandleTag(const wxHtmlTag& tag);
102 void WriteOut(wxHtmlContentsItem*& array, int& size);
103 void ReadIn(wxHtmlContentsItem* array, int size);
104};
105
106
107bool HP_TagHandler::HandleTag(const wxHtmlTag& tag)
108{
4f9297b0
VS
109 if (tag.GetName() == wxT("UL"))
110 {
8ec2b484
HH
111 m_Level++;
112 ParseInner(tag);
113 m_Level--;
114 return TRUE;
115 }
4f9297b0
VS
116 else if (tag.GetName() == wxT("OBJECT"))
117 {
8ec2b484
HH
118 m_Name = m_Page = wxEmptyString;
119 ParseInner(tag);
50494a55 120
7df9fbc3
JS
121 if (tag.GetParam("TYPE") == "text/sitemap")
122
123 // if (!m_Page.IsEmpty())
124 /* Valid HHW's file may contain only two object tags:
4157f43f
VS
125
126 <OBJECT type="text/site properties">
127 <param name="ImageType" value="Folder">
128 </OBJECT>
129
130 or
131
132 <OBJECT type="text/sitemap">
133 <param name="Name" value="main page">
134 <param name="Local" value="another.htm">
135 </OBJECT>
136
137 We're interested in the latter. !m_Page.IsEmpty() is valid
138 condition because text/site properties does not contain Local param
139 */
140 {
7df9fbc3
JS
141 // We're reading in items at level zero, which must mean we want to specify
142 // our own 'books', so chuck out the first (empty) one that AddBook already
143 // created
144 if (m_firstTime && (m_Level == 0) && (m_ItemsCnt > 0))
145 {
146 m_ItemsCnt --;
147 }
148 else
149 {
150 if (m_ItemsCnt % wxHTML_REALLOC_STEP == 0)
151 m_Items = (wxHtmlContentsItem*) realloc(m_Items, (m_ItemsCnt + wxHTML_REALLOC_STEP) * sizeof(wxHtmlContentsItem));
152 }
4157f43f
VS
153 m_Items[m_ItemsCnt].m_Level = m_Level;
154 m_Items[m_ItemsCnt].m_ID = m_ID;
155 m_Items[m_ItemsCnt].m_Page = new wxChar[m_Page.Length() + 1];
156 wxStrcpy(m_Items[m_ItemsCnt].m_Page, m_Page.c_str());
157 m_Items[m_ItemsCnt].m_Name = new wxChar [m_Name.Length() + 1];
158 wxStrcpy(m_Items[m_ItemsCnt].m_Name, m_Name.c_str());
159 m_Items[m_ItemsCnt].m_Book = m_Book;
160 m_ItemsCnt++;
7df9fbc3
JS
161
162 m_firstTime = FALSE;
4157f43f 163 }
50494a55 164
8ec2b484
HH
165 return TRUE;
166 }
4f9297b0
VS
167 else
168 { // "PARAM"
f6bcfd97
BP
169 if (m_Name == wxEmptyString && tag.GetParam(wxT("NAME")) == wxT("Name"))
170 {
171 m_Name = tag.GetParam(wxT("VALUE"));
172 if (m_Name.Find(wxT('&')) != -1)
173 {
0bbfe845
JS
174#define ESCSEQ(escape, subst) \
175 { _T("&") _T(escape) _T(";"), _T("&") _T(escape) _T(" "), _T("&") _T(escape), _T(subst) }
176 static wxChar* substitutions[][4] =
f6bcfd97 177 {
0bbfe845
JS
178 ESCSEQ("quot", "\""),
179 ESCSEQ("#34", "\""),
180 ESCSEQ("lt", "<"),
181 ESCSEQ("#60", "<"),
182 ESCSEQ("gt", ">"),
183 ESCSEQ("#62", ">"),
184
185 ESCSEQ("#94", "^"), /* ^ */
186
187 ESCSEQ("nbsp", " "),
188 ESCSEQ("#32", " "),
189 ESCSEQ("iexcl", "!"),
190 ESCSEQ("#33", "!"),
191