1 // Copyright (c) 1997 James Clark
2 // See the file copying.txt for copying permission.
4 #ifndef Pattern_INCLUDED
5 #define Pattern_INCLUDED 1
11 #include "IListIter.h"
17 #ifdef DSSSL_NAMESPACE
18 namespace DSSSL_NAMESPACE {
23 class MatchContext : public SdataMapper {
25 const Vector<StringC> &classAttributeNames() const;
26 const Vector<StringC> &idAttributeNames() const;
28 Vector<StringC> classAttributeNames_;
29 Vector<StringC> idAttributeNames_;
31 class Qualifier : public Link {
34 virtual bool satisfies(const NodePtr &, MatchContext &) const = 0;
35 virtual void contributeSpecificity(int *) const = 0;
36 virtual bool vacuous() const;
38 static bool matchAttribute(const StringC &name,
41 MatchContext &context);
43 class IdQualifier : public Qualifier {
45 IdQualifier(const StringC &);
46 bool satisfies(const NodePtr &, MatchContext &) const;
47 void contributeSpecificity(int *) const;
51 class ClassQualifier : public Qualifier {
53 ClassQualifier(const StringC &);
54 bool satisfies(const NodePtr &, MatchContext &) const;
55 void contributeSpecificity(int *) const;
59 class AttributeHasValueQualifier : public Qualifier {
61 AttributeHasValueQualifier(const StringC &);
62 bool satisfies(const NodePtr &, MatchContext &) const;
63 void contributeSpecificity(int *) const;
67 class AttributeMissingValueQualifier : public Qualifier {
69 AttributeMissingValueQualifier(const StringC &);
70 bool satisfies(const NodePtr &, MatchContext &) const;
71 void contributeSpecificity(int *) const;
75 class AttributeQualifier : public Qualifier {
77 AttributeQualifier(const StringC &, const StringC &);
78 bool satisfies(const NodePtr &, MatchContext &) const;
79 void contributeSpecificity(int *) const;
84 class PositionQualifier : public Qualifier {
86 void contributeSpecificity(int *) const;
88 class FirstOfTypeQualifier : public PositionQualifier {
90 bool satisfies(const NodePtr &, MatchContext &) const;
92 class LastOfTypeQualifier : public PositionQualifier {
94 bool satisfies(const NodePtr &, MatchContext &) const;
96 class FirstOfAnyQualifier : public PositionQualifier {
98 bool satisfies(const NodePtr &, MatchContext &) const;
100 class LastOfAnyQualifier : public PositionQualifier {
102 bool satisfies(const NodePtr &, MatchContext &) const;
104 class OnlyQualifier : public Qualifier {
106 void contributeSpecificity(int *) const;
108 class OnlyOfTypeQualifier : public OnlyQualifier {
110 bool satisfies(const NodePtr &, MatchContext &) const;
112 class OnlyOfAnyQualifier : public OnlyQualifier {
114 bool satisfies(const NodePtr &, MatchContext &) const;
116 class VacuousQualifier : public Qualifier {
118 bool vacuous() const;
120 class PriorityQualifier : public VacuousQualifier {
122 PriorityQualifier(long);
123 void contributeSpecificity(int *) const;
124 bool satisfies(const NodePtr &, MatchContext &) const;
128 class ImportanceQualifier : public VacuousQualifier {
130 ImportanceQualifier(long);
131 void contributeSpecificity(int *) const;
132 bool satisfies(const NodePtr &, MatchContext &) const;
136 typedef unsigned Repeat;
137 class Element : public Link {
139 Element(const StringC &);
140 bool matches(const NodePtr &, MatchContext &) const;
141 void contributeSpecificity(int *) const;
142 void addQualifier(Qualifier *);
143 void setRepeat(Repeat minRepeat, Repeat maxRepeat);
144 Repeat minRepeat() const;
145 Repeat maxRepeat() const;
146 bool mustHaveGi(StringC &) const;
147 bool trivial() const;
152 IList<Qualifier> qualifiers_;
154 class ChildrenQualifier : public Qualifier {
156 ChildrenQualifier(IList<Element> &);
157 bool satisfies(const NodePtr &, MatchContext &) const;
158 void contributeSpecificity(int *) const;
160 IList<Element> children_;
163 Pattern(IList<Element> &);
164 void swap(Pattern &);
165 bool matches(const NodePtr &, MatchContext &) const;
166 // If mustHaveGi returns true, then any element that matches the pattern
167 // must have the string returned in str.
168 bool mustHaveGi(StringC &str) const;
169 // A pattern is trivial if any element that has the gi returned my mustHaveGi
170 // matches the pattern, or, if mustHaveGi returns false, if any element matches
172 bool trivial() const;
173 static int compareSpecificity(const Pattern &, const Pattern &);
175 importanceSpecificity,
183 attributeSpecificity,
187 Pattern(const Pattern &); // undefined
188 void operator=(const Pattern &); // undefined
189 void computeSpecificity(int *) const;
190 static bool computeTrivial(const IList<Element> &);
192 static bool matchAncestors(const IListIter<Element> &,
195 static bool matchAncestors1(const IListIter<Element> &,
199 IList<Element> ancestors_; // first is self, second is parent ...
204 void Pattern::Element::setRepeat(Repeat minRepeat, Repeat maxRepeat)
206 minRepeat_ = minRepeat;
207 maxRepeat_ = maxRepeat;
211 Pattern::Repeat Pattern::Element::minRepeat() const
217 Pattern::Repeat Pattern::Element::maxRepeat() const
223 void Pattern::Element::addQualifier(Qualifier *q)
225 qualifiers_.insert(q);
229 bool Pattern::matchAncestors(const IListIter<Element> &ancestors,
231 MatchContext &context)
233 return ancestors.done() || matchAncestors1(ancestors, node, context);
237 bool Pattern::matches(const NodePtr &nd, MatchContext &context) const
239 return matchAncestors(IListIter<Element>(ancestors_),
245 void Pattern::swap(Pattern &pattern)
247 ancestors_.swap(pattern.ancestors_);
249 trivial_ = pattern.trivial_;
250 pattern.trivial_ = tem;
254 bool Pattern::Element::mustHaveGi(StringC &gi) const
258 else if (gi_.size()) {
267 bool Pattern::mustHaveGi(StringC &gi) const
269 return !ancestors_.empty() && ancestors_.head()->mustHaveGi(gi);
273 const Vector<StringC> &Pattern::MatchContext::classAttributeNames() const
275 return classAttributeNames_;
279 const Vector<StringC> &Pattern::MatchContext::idAttributeNames() const
281 return idAttributeNames_;
285 bool Pattern::trivial() const
290 #ifdef DSSSL_NAMESPACE
294 #endif /* not Pattern_INCLUDED */