]> git.saurik.com Git - wxWidgets.git/blame - src/html/helpdata.cpp
OS/2 fixes
[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{
66a77a74 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;
94
95 public:
5da69e38 96 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; }
66a77a74 97 wxString GetSupportedTags() { return wxT("UL,OBJECT,PARAM"); }
8ec2b484
HH
98 bool HandleTag(const wxHtmlTag& tag);
99 void WriteOut(wxHtmlContentsItem*& array, int& size);
100 void ReadIn(wxHtmlContentsItem* array, int size);
101};
102
103
104bool HP_TagHandler::HandleTag(const wxHtmlTag& tag)
105{
0413cec5 106 if (tag.GetName() == wxT("UL")) {
8ec2b484
HH
107 m_Level++;
108 ParseInner(tag);
109 m_Level--;
110 return TRUE;
111 }
66a77a74 112 else if (tag.GetName() == wxT("OBJECT")) {
8ec2b484
HH
113 m_Name = m_Page = wxEmptyString;
114 ParseInner(tag);
50494a55 115
4157f43f
VS
116 if (!m_Page.IsEmpty())
117 /* should be 'if (tag.GetParam("TYPE") == "text/sitemap")'
118 but this works fine. Valid HHW's file may contain only two
119 object tags:
120
121 <OBJECT type="text/site properties">
122 <param name="ImageType" value="Folder">
123 </OBJECT>
124
125 or
126
127 <OBJECT type="text/sitemap">
128 <param name="Name" value="main page">
129 <param name="Local" value="another.htm">
130 </OBJECT>
131
132 We're interested in the latter. !m_Page.IsEmpty() is valid
133 condition because text/site properties does not contain Local param
134 */
135 {
136 if (m_ItemsCnt % wxHTML_REALLOC_STEP == 0)
137 m_Items = (wxHtmlContentsItem*) realloc(m_Items, (m_ItemsCnt + wxHTML_REALLOC_STEP) * sizeof(wxHtmlContentsItem));
138 m_Items[m_ItemsCnt].m_Level = m_Level;
139 m_Items[m_ItemsCnt].m_ID = m_ID;
140 m_Items[m_ItemsCnt].m_Page = new wxChar[m_Page.Length() + 1];
141 wxStrcpy(m_Items[m_ItemsCnt].m_Page, m_Page.c_str());
142 m_Items[m_ItemsCnt].m_Name = new wxChar [m_Name.Length() + 1];
143 wxStrcpy(m_Items[m_ItemsCnt].m_Name, m_Name.c_str());
144 m_Items[m_ItemsCnt].m_Book = m_Book;
145 m_ItemsCnt++;
146 }
50494a55 147
8ec2b484
HH
148 return TRUE;
149 }
8ec2b484 150 else { // "PARAM"
f6bcfd97
BP
151 if (m_Name == wxEmptyString && tag.GetParam(wxT("NAME")) == wxT("Name"))
152 {
153 m_Name = tag.GetParam(wxT("VALUE"));
154 if (m_Name.Find(wxT('&')) != -1)
155 {
156 #define ESCSEQ(escape, subst) \
157 { _T("&") _T(escape) _T(";"), _T("&") _T(escape) _T(" "), _T(subst) }
158 static wxChar* substitutions[][3] =
159 {
160 ESCSEQ("quot", "\""),
161 ESCSEQ("lt", "<"),
162 ESCSEQ("gt", ">"),
163
164 ESCSEQ("nbsp", " "),
165 ESCSEQ("iexcl", "!"),
166