xmlreader::XmlReader::Text XcsParser::getTextMode() { if (bIsParsingInfo_) return xmlreader::XmlReader::Text::Raw; return valueParser_.getTextMode();
}
bool XcsParser::startElement(
xmlreader::XmlReader & reader, int nsId, xmlreader::Span const & name,
std::set< OUString > const * /*existingDependencies*/)
{ //TODO: ignoring component-schema import, component-schema uses, and // prop constraints; accepting all four at illegal places (and with // illegal content): if (ignoring_ > 0
|| (nsId == xmlreader::XmlReader::NAMESPACE_NONE
&& (name == "import" || name == "uses" || name == "constraints" || name == "desc" // the following are unused by LO but valid
|| name == "deprecated" || name == "author" || name == "label")))
{
assert(ignoring_ < LONG_MAX);
++ignoring_; returntrue;
}
if (bIsParsingInfo_) returntrue; if (valueParser_.startElement(reader, nsId, name)) { returntrue;
} if (state_ == STATE_START) { if (nsId == ParseManager::NAMESPACE_OOR &&
name == "component-schema")
{
handleComponentSchema(reader);
state_ = STATE_COMPONENT_SCHEMA;
ignoring_ = 0; returntrue;
}
} else { switch (state_) { case STATE_COMPONENT_SCHEMA: if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
name == "templates")
{
state_ = STATE_TEMPLATES; returntrue;
} if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
name == "info")
{
bIsParsingInfo_ = true; returntrue;
}
[[fallthrough]]; case STATE_TEMPLATES_DONE: if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
name == "component")
{
state_ = STATE_COMPONENT;
assert(elements_.empty());
elements_.push(
Element( new GroupNode(valueParser_.getLayer(), false, u""_ustr),
componentName_)); returntrue;
} break; case STATE_TEMPLATES: if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
name == "info")
{
bIsParsingInfo_ = true; returntrue;
} if (elements_.empty()) { if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
name == "group")
{
handleGroup(reader, true); returntrue;
} if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
name == "set")
{
handleSet(reader, true); returntrue;
} if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
name == "info")
{
bIsParsingInfo_ = true; returntrue;
} break;
}
[[fallthrough]]; case STATE_COMPONENT:
assert(!elements_.empty()); switch (elements_.top().node->kind()) { case Node::KIND_PROPERTY: case Node::KIND_LOCALIZED_PROPERTY: if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
name == "value")
{
handlePropValue(reader, elements_.top().node); returntrue;
} if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
name == "info")
{
bIsParsingInfo_ = true; returntrue;
} break; case Node::KIND_GROUP: if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
name == "prop")
{
handleProp(reader); returntrue;
} if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
name == "node-ref")
{
handleNodeRef(reader); returntrue;
} if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
name == "group")
{
handleGroup(reader, false); returntrue;
} if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
name == "set")
{
handleSet(reader, false); returntrue;
} if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
name == "info")
{
bIsParsingInfo_ = true; returntrue;
} break; case Node::KIND_SET: if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
name == "item")
{
handleSetItem(
reader, static_cast< SetNode * >(elements_.top().node.get())); returntrue;
} if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
name == "info")
{
bIsParsingInfo_ = true; returntrue;
} break; default: // Node::KIND_LOCALIZED_VALUE
assert(false); // this cannot happen break;
} break; case STATE_COMPONENT_DONE: break; default: // STATE_START
assert(false); // this cannot happen break;
}
} throw css::uno::RuntimeException( "bad member <" + name.convertFromUtf8() + "> in " + reader.getUrl());
}
void XcsParser::endElement(xmlreader::XmlReader const & reader) { if (ignoring_ > 0) {
--ignoring_; return;
} if (bIsParsingInfo_)
{
bIsParsingInfo_ = false; return;
} if (valueParser_.endElement()) { return;
} if (!elements_.empty()) {
Element top(std::move(elements_.top()));
elements_.pop(); if (top.node.is()) { if (top.node->kind() == Node::KIND_PROPERTY
|| top.node->kind() == Node::KIND_LOCALIZED_PROPERTY)
{ // Remove whitespace from description_ resulting from line breaks/indentation in xml files
OUString desc(description_.makeStringAndClear());
desc = desc.trim(); while (desc.indexOf(" ") != -1)
desc = desc.replaceAll(" ", " ");
top.node->setDescription(desc);
} if (elements_.empty()) { switch (state_) { case STATE_TEMPLATES:
{ auto itPair = data_.templates.insert({top.name, top.node}); if (!itPair.second) {
merge(itPair.first->second, top.node);
}
} break; case STATE_COMPONENT:
{
NodeMap & components = data_.getComponents(); auto itPair = components.insert({top.name, top.node}); if (!itPair.second) {
merge(itPair.first->second, top.node);
}
state_ = STATE_COMPONENT_DONE;
} break; default:
assert(false); throw css::uno::RuntimeException(
u"this cannot happen"_ustr);
}
} else { if (!elements_.top().node->getMembers().insert(
NodeMap::value_type(top.name, top.node)).second)
{ throw css::uno::RuntimeException( "duplicate " + top.name + " in " + reader.getUrl());
}
}
}
} else { switch (state_) { case STATE_COMPONENT_SCHEMA: // To support old, broken extensions with .xcs files that contain // empty <component-schema> elements:
state_ = STATE_COMPONENT_DONE; break; case STATE_TEMPLATES:
state_ = STATE_TEMPLATES_DONE; break; case STATE_TEMPLATES_DONE: throw css::uno::RuntimeException( "no component element in " + reader.getUrl()); case STATE_COMPONENT_DONE: break; default:
assert(false); // this cannot happen
}
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.