1 // Copyright (c) 1996 James Clark
2 // See the file copying.txt for copying permission.
3
4 #ifndef DssslSpecEventHandler_INCLUDED
5 #define DssslSpecEventHandler_INCLUDED 1
6
7 #include "ErrorCountEventHandler.h"
8 #include "ArcEngine.h"
9 #include "Message.h"
10 #include "Text.h"
11 #include "Owner.h"
12 #include "Boolean.h"
13 #include "InputSource.h"
14 #include "Vector.h"
15 #include "NCVector.h"
16 #include "IList.h"
17 #include "IListIter.h"
18 #include "StringC.h"
19
20 #ifdef DSSSL_NAMESPACE
21 namespace DSSSL_NAMESPACE {
22 #endif
23
24 class DssslSpecEventHandler
25 : private ErrorCountEventHandler, private ArcDirector {
26 public:
27 class BodyElement : public Link {
28 public:
29 virtual ~BodyElement();
30 virtual void makeInputSource(DssslSpecEventHandler &, Owner<InputSource> &) = 0;
31 };
32
33 class ImmediateBodyElement : public BodyElement {
34 public:
35 ImmediateBodyElement(Text &);
36 void makeInputSource(DssslSpecEventHandler &, Owner<InputSource> &);
37 private:
38 Text text_;
39 };
40
41 class EntityBodyElement : public BodyElement {
42 public:
43 EntityBodyElement(const ConstPtr<Entity> &);
44 void makeInputSource(DssslSpecEventHandler &, Owner<InputSource> &);
45 private:
46 ConstPtr<Entity> entity_;
47 };
48
49 class SpecPart;
50 class Doc;
51 class Part;
52 class MapSdataEntityElement;
53
54 class DeclarationElement : public Link {
55 public:
56 enum Type {
57 features,
58 basesetEncoding,
59 literalDescribedChar,
60 addNameChars,
61 addSeparatorChars,
62 standardChars,
63 otherChars,
64 combineChar,
65 mapSdataEntity,
66 charRepertoire,
67 sgmlGrovePlan,
68 };
69
70 DeclarationElement(Type);
71 void makeInputSource(DssslSpecEventHandler&, Owner<InputSource>&);
72 Type type() const;
73 void setContent(Text &);
setName(const StringC & s)74 void setName(const StringC &s) { name_ = s; };
name()75 const StringC &name() { return name_; };
setText(const StringC & s)76 void setText(const StringC &s) { text_ = s; };
text()77 const StringC &text() { return text_; };
setModadd(const StringC & s)78 void setModadd(const StringC &s) { modadd_ = s; };
modadd()79 const StringC &modadd() { return modadd_; };
setDesc(const StringC & s)80 void setDesc(const StringC &s) { desc_ = s; };
desc()81 const StringC &desc() { return desc_; };
82
83 private:
84 Type type_;
85 Text content_;
86 StringC name_;
87 StringC text_;
88 StringC modadd_;
89 StringC desc_;
90 };
91
92 class PartHeader : public Link {
93 public:
94 PartHeader(Doc *, const StringC &id);
95 const StringC &id() const;
96 Part *resolve(DssslSpecEventHandler &);
97 void setPart(SpecPart *);
98 void setRefLoc(const Location &);
99 private:
100 Doc *doc_;
101 StringC id_;
102 // Location of first reference
103 Location refLoc_;
104 Owner<SpecPart> specPart_;
105 };
106
107
108 class SpecPart {
109 public:
110 virtual ~SpecPart();
111 virtual Part *resolve(DssslSpecEventHandler &) = 0;
112 };
113
114 class ExternalPart : public SpecPart {
115 public:
116 ExternalPart(PartHeader *);
117 Part *resolve(DssslSpecEventHandler &);
118 private:
119 PartHeader *header_;
120 };
121
122 class ExternalFirstPart : public SpecPart {
123 public:
124 ExternalFirstPart(Doc *);
125 Part *resolve(DssslSpecEventHandler &);
126 private:
127 Doc *doc_;
128 };
129
130 class Part : public SpecPart {
131 public:
132 typedef IListIter<BodyElement> Iter;
133 typedef IListIter<DeclarationElement> DIter;
134 Part(Doc *);
135 Iter iter();
136 DIter diter();
137 Doc *doc();
138 const Vector<PartHeader *> &use() const;
139 void addUse(PartHeader *);
140 void append(BodyElement *);
141 void append(DeclarationElement *);
142 bool setMark(bool = 1);
143 private:
144 Part *resolve(DssslSpecEventHandler &);
145 IList<DeclarationElement> declarations_;
146 IList<BodyElement> bodyElements_;
147 Vector<PartHeader *> use_;
148 bool mark_;
149 Doc *doc_;
150 };
151
152 class Doc : public Link {
153 public:
154 Doc();
155 Doc(const StringC &sysid);
156 void setLocation(const Location &);
157 PartHeader *refPart(const StringC &);
158 PartHeader *refPart(const StringC &, const Location &refLoc);
159 Part *resolveFirstPart(DssslSpecEventHandler &);
160 Part::DIter diter();
161 void load(DssslSpecEventHandler &);
162 void append(DeclarationElement *);
163 const StringC &sysid() const;
164 private:
165 bool loaded_;
166 StringC sysid_;
167 IList<DeclarationElement> declarations_;
168 IList<PartHeader> headers_;
169 Location loc_;
170 friend class Part;
171 };
172 DssslSpecEventHandler(Messenger &);
173 void load(SgmlParser &specParser, const CharsetInfo &, const StringC &id,
174 Vector<Part *> &parts);
175 void externalSpecificationStart(const StartElementEvent &);
176 void externalSpecificationEnd(const EndElementEvent &);
177 void styleSpecificationStart(const StartElementEvent &);
178 void styleSpecificationEnd(const EndElementEvent &);
179 void styleSpecificationBodyStart(const StartElementEvent &);
180 void styleSpecificationBodyEnd(const EndElementEvent &);
181 void declarationStart(const StartElementEvent &);
182 void declarationEnd(const EndElementEvent &);
183 private:
184 Vector<Part *> &parts();
185 void startElement(StartElementEvent *);
186 void endElement(EndElementEvent *);
187 void data(DataEvent *);
188 void message(MessageEvent *);
189 void endProlog(EndPrologEvent *);
190 EventHandler *arcEventHandler(const StringC *,
191 const Notation *,
192 const Vector<StringC> &,
193 const SubstTable *);
194 void loadDoc(SgmlParser &, Doc &);
195 void resolveParts(Part *, Vector<Part *> &);
196 Doc *findDoc(const StringC &);
197 const StringC *attributeString(const StartElementEvent &, const char *);
198 const Text *attributeText(const StartElementEvent &, const char *);
199 ConstPtr<Entity> attributeEntity(const StartElementEvent &, const char *);
200
201 Messenger *mgr_;
202 bool gotArc_;
203 bool gatheringBody_;
204 Part *currentPart_;
205 Text currentBody_;
206 Doc *currentDoc_;
207 IList<Doc> docs_;
208 SgmlParser *parser_;
209 const CharsetInfo *charset_;
210 DeclarationElement *currentDecl_;
211 friend class Doc;
212 friend class EntityBodyElement;
213 friend class PartHeader;
214 };
215
216 inline
id()217 const StringC &DssslSpecEventHandler::PartHeader::id() const
218 {
219 return id_;
220 }
221
222 inline
setPart(SpecPart * part)223 void DssslSpecEventHandler::PartHeader::setPart(SpecPart *part)
224 {
225 specPart_ = part;
226 }
227
228 inline
addUse(PartHeader * header)229 void DssslSpecEventHandler::Part::addUse(PartHeader *header)
230 {
231 use_.push_back(header);
232 }
233
234 inline
235 const Vector<DssslSpecEventHandler::PartHeader *> &
use()236 DssslSpecEventHandler::Part::use() const
237 {
238 return use_;
239 }
240
241 inline
sysid()242 const StringC &DssslSpecEventHandler::Doc::sysid() const
243 {
244 return sysid_;
245 }
246
247 inline
iter()248 DssslSpecEventHandler::Part::Iter DssslSpecEventHandler::Part::iter()
249 {
250 return Iter(bodyElements_);
251 }
252
253 inline
diter()254 DssslSpecEventHandler::Part::DIter DssslSpecEventHandler::Part::diter()
255 {
256 return DIter(declarations_);
257 }
258
259 inline
diter()260 DssslSpecEventHandler::Part::DIter DssslSpecEventHandler::Doc::diter()
261 {
262 return Part::DIter(declarations_);
263 }
264
265 inline
setMark(bool b)266 bool DssslSpecEventHandler::Part::setMark(bool b)
267 {
268 bool tem = mark_;
269 mark_ = b;
270 return tem;
271 }
272
273 #ifdef DSSSL_NAMESPACE
274 }
275 #endif
276
277 #endif /* not DssslSpecEventHandler_INCLUDED */
278