// Copyright (C) 2000-2007, Luca Padovani . // // This file is part of GtkMathView, a flexible, high-quality rendering // engine for MathML documents. // // GtkMathView is free software; you can redistribute it and/or modify it // under the terms of the GNU Lesser General Public License as published // by the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // GtkMathView is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program. If not, see . #ifndef __TemplateReaderRefinementContext_hh__ #define __TemplateReaderRefinementContext_hh__ #include #include "Attribute.hh" #include "AttributeSet.hh" template class TemplateReaderRefinementContext { public: TemplateReaderRefinementContext(void) { } SmartPtr get(const class AttributeSignature& sig) const { for (typename std::list::const_iterator p = context.begin(); p != context.end(); p++) { const Context& c = *p; if (SmartPtr attr = c.attributes->get(ATTRIBUTE_ID_OF_SIGNATURE(sig))) return attr; else if (const String* rawValue = c.get(sig.name)) { SmartPtr attr = Attribute::create(sig, *rawValue); c.attributes->set(attr); return attr; } } return 0; } void push(const SmartPtr& reader) { assert(reader); context.push_front(Context(reader)); } void pop(void) { assert(!context.empty()); context.pop_front(); } private: struct Context { typedef std::pair RawAttribute; Context(const SmartPtr& reader) : attributes(AttributeSet::create()) { for (int index = 0; index < reader->getAttributeCount(); index++) { String namespaceURI; String name; String value; reader->getAttribute(index, namespaceURI, name, value); if (namespaceURI.empty()) rawAttributes.push_back(RawAttribute(name, value)); } } const String* get(const String& name) const { for (std::vector::const_iterator p = rawAttributes.begin(); p != rawAttributes.end(); p++) if (p->first == name) return &p->second; return 0; } std::vector > rawAttributes; SmartPtr attributes; }; std::list context; }; #endif // __TemplateReaderRefinementContext_hh__