📄 arcengine.cxx
字号:
return; } else { currentLocation_ = event->location(); for (size_t i = 0; i < arcProcessors_.size(); i++) { if (arcProcessors_[i].valid() && arcProcessors_[i].processData()) { const Entity *entity = event->entity(); arcProcessors_[i].docHandler() .sdataEntity(new (alloc_) SdataEntityEvent(entity->asInternalEntity(), event->location().origin())); } } } DelegateEventHandler::sdataEntity(event);}void ArcEngineImpl::externalDataEntity(ExternalDataEntityEvent *event){ if (!gatheringContent_) { currentLocation_ = event->location(); for (size_t i = 0; i < arcProcessors_.size(); i++) { if (arcProcessors_[i].valid() && arcProcessors_[i].processData()) { ConstPtr<Entity> entity = arcProcessors_[i].dtdPointer() ->lookupEntity(0, event->entity()->name()); if (!entity.isNull()) { ConstPtr<EntityOrigin> oldOrigin = event->entityOrigin(); Owner<Markup> markup; if (oldOrigin->markup()) markup = new Markup(*oldOrigin->markup()); ConstPtr<EntityOrigin> newOrigin = EntityOrigin::make(entity, oldOrigin->parent(), oldOrigin->refLength(), markup); arcProcessors_[i].docHandler() .externalDataEntity(new (alloc_) ExternalDataEntityEvent(entity->asExternalDataEntity(), newOrigin)); } // otherwise entity is not architectural } } } DelegateEventHandler::externalDataEntity(event);}void ArcEngineImpl::endElement(EndElementEvent *event){ while (gatheringContent_) { if (--gatheringContent_ > 0) { DelegateEventHandler::endElement(event); return; } delegateTo_ = delegateHandler(); // Clear out eventQueue_ in case handling the events // causes events to be queued again. IQueue<Event> tem; tem.swap(eventQueue_); while (!tem.empty()) tem.get()->handle(*this); } currentLocation_ = event->location(); for (size_t i = 0; i < arcProcessors_.size(); i++) if (arcProcessors_[i].valid()) arcProcessors_[i].processEndElement(*event, alloc_); DelegateEventHandler::endElement(event); if (haveLinkProcess_) linkProcess_.endElement();}void ArcEngineImpl::uselink(UselinkEvent *event){ if (!gatheringContent_) linkProcess_.uselink(event->linkSet(), event->restore(), event->lpd().pointer()); DelegateEventHandler::uselink(event);}void ArcEngineImpl::dispatchMessage(const Message &msg){ mgr_->dispatchMessage(msg);}void ArcEngineImpl::dispatchMessage(Message &msg){ mgr_->dispatchMessage(msg);}void ArcEngineImpl::initMessage(Message &msg){ mgr_->initMessage(msg); msg.loc = currentLocation_;}ArcProcessor::ArcProcessor(): errorIdref_(1), docHandler_(0), arcAuto_(1), arcDtdIsParam_(0){}void ArcProcessor::setName(const StringC &name){ name_ = name;}const Syntax &ArcProcessor::attributeSyntax() const{ return *docSyntax_;}ConstPtr<Notation> ArcProcessor::getAttributeNotation(const StringC &name, const Location &){ if (!metaDtd_.isNull()) return metaDtd_->lookupNotation(name); return 0;}ConstPtr<Entity> ArcProcessor::getAttributeEntity(const StringC &name, const Location &){ // FIXME What about default entity if (!metaDtd_.isNull()) return metaDtd_->lookupEntity(0, name); return 0;}void ArcProcessor::noteCurrentAttribute(size_t i, AttributeValue *value){ if (valid_) currentAttributes_[i] = value;}ConstPtr<AttributeValue> ArcProcessor::getCurrentAttribute(size_t i) const{ return currentAttributes_[i];}// This code is the same as in the main parser.// Once handling of ID/IDREF in architectures has been clarified.// Maybe factor out into AttributeContext.Boolean ArcProcessor::defineId(const StringC &str, const Location &loc, Location &prevLoc){ if (!valid_) return 1; Id *id = lookupCreateId(str); if (id->defined()) { prevLoc = id->defLocation(); return 0; } id->define(loc); return 1;}void ArcProcessor::noteIdref(const StringC &str, const Location &loc){ if (!valid_ || !errorIdref_) return; Id *id = lookupCreateId(str); if (!id->defined()) id->addPendingRef(loc);}Id *ArcProcessor::lookupCreateId(const StringC &name){ Id *id = idTable_.lookup(name); if (!id) { id = new Id(name); idTable_.insert(id); } return id;}void ArcProcessor::checkIdrefs(){ NamedTableIter<Id> iter(idTable_); Id *id; while ((id = iter.next()) != 0) { for (size_t i = 0; i < id->pendingRefs().size(); i++) { Messenger::setNextLocation(id->pendingRefs()[i]); message(ArcEngineMessages::missingId, StringMessageArg(id->name())); } }}void ArcProcessor::init(const EndPrologEvent &event, const ConstPtr<Sd> &sd, const ConstPtr<Syntax> &syntax, const SgmlParser *parentParser, Messenger *mgr, const Vector<StringC> &superName, ArcDirector &director, const volatile sig_atomic_t *cancelPtr){ director_ = &director; mgr_ = mgr; docSyntax_ = syntax; docSd_ = sd; mgr_ = mgr; valid_ = 0; docDtd_ = event.dtdPointer(); metaSyntax_ = docSyntax_; mayDefaultAttribute_ = 1; docSyntax_->generalSubstTable()->subst(name_); Vector<StringC> docName(superName); docName.push_back(name_); ConstPtr<Notation> notation; notation = docDtd_->lookupNotation(name_); if (!notation.isNull()) { ConstPtr<AttributeDefinitionList> notAttDef = notation->attributeDef(); attributeList_.init(notAttDef); attributeList_.finish(*this); supportAttributes(attributeList_); } else message(ArcEngineMessages::noArcNotation, StringMessageArg(name_)); ArcEngineImpl *engine = new ArcEngineImpl(*mgr, parentParser, director, cancelPtr, notation.pointer(), docName, docSyntax_->generalSubstTable()); docHandler_ = engine; ownEventHandler_ = engine; if (supportAtts_[rArcDocF].size() == 0) supportAtts_[rArcDocF] = name_; if (supportAtts_[rArcFormA].size() == 0) supportAtts_[rArcFormA] = name_; rniContent_ = docSyntax_->delimGeneral(Syntax::dRNI); rniContent_ += sd->execToInternal("CONTENT"); rniDefault_ = docSyntax_->delimGeneral(Syntax::dRNI); rniDefault_ += docSyntax_->reservedName(Syntax::rDEFAULT); rniArcCont_ = metaSyntax_->delimGeneral(Syntax::dRNI); rniArcCont_ += sd->execToInternal("ARCCONT"); ConstPtr<Entity> dtdent = makeDtdEntity(notation.pointer()); if (dtdent.isNull()) return; StringC sysid = dtdent->asExternalEntity()->externalId().effectiveSystemId(); if (sysid.size() == 0 && !parentParser->entityCatalog().lookup(*dtdent, *docSyntax_, sd->internalCharset(), *mgr_, sysid)) { message(ArcEngineMessages::arcGenerateSystemId, StringMessageArg(name_)); return; } docHandler_->sgmlDecl(new SgmlDeclEvent(sd, syntax)); docHandler_->startDtd(new StartDtdEvent(dtdent->name(), dtdent, 0, event.location(), 0)); SgmlParser::Params params; params.entityType = SgmlParser::Params::dtd; params.sysid = sysid; params.parent = parentParser; ParserOptions options = parentParser->options(); errorIdref_ = options.errorIdref; options.errorAfdr = 0; options.includes = arcOpts_; params.options = &options; params.sd = docSd_; if (metaSyntax_->reservedName(Syntax::rALL).size() == 0) { Ptr<Syntax> tem(new Syntax(*metaSyntax_)); tem->setName(Syntax::rALL, docSd_->execToInternal("ALL")); metaSyntax_ = tem; } params.prologSyntax = metaSyntax_; params.instanceSyntax = metaSyntax_; params.doctypeName = dtdent->name(); SgmlParser parser(params); parser.parseAll(*docHandler_, cancelPtr); Ptr<Dtd> baseDtd = parser.baseDtd(); if (baseDtd.isNull() || baseDtd->documentElementType()->definition()->undefined()) return; metaDtd_ = baseDtd; metaMapCache_.resize(docDtd_->nElementTypeIndex()); mungeMetaDtd(*baseDtd, *docDtd_); docHandler_->endDtd(new EndDtdEvent(metaDtd_, event.location(), 0)); startContent(*metaDtd_); currentAttributes_.resize(metaDtd_->nCurrentAttribute()); valid_ = 1; docHandler_->endProlog(new EndPrologEvent(metaDtd_, event.location())); if (engine->nBases() == 0) docHandler_ = engine->delegateHandler();}void ArcProcessor::mungeMetaDtd(Dtd &metaDtd, const Dtd &docDtd){ if (supportAtts_[rArcDataF].size() > 0 && metaDtd.lookupNotation(supportAtts_[rArcDataF]).isNull()) { Messenger::message(ArcEngineMessages::noArcDataF, StringMessageArg(supportAtts_[rArcDataF])); metaDtd.insertNotation(new Notation(supportAtts_[rArcDataF], metaDtd.namePointer(), metaDtd.isBase())); } // FIXME check for ArcAutoF Dtd::ConstEntityIter iter(docDtd.generalEntityIter()); for (;;) { ConstPtr<Entity> ent = iter.next(); if (ent.isNull()) break; Ptr<Entity> copy(ent->copy()); if (!copy->asExternalDataEntity() || mungeDataEntity(*(ExternalDataEntity *)copy.pointer())) metaDtd.insertEntity(copy, 1); }}Boolean ArcProcessor::mungeDataEntity(ExternalDataEntity &entity){ const MetaMap &map = buildMetaMap(0, entity.notation(), entity.attributes(), 0, 0); if (!map.attributed) return 0; AttributeList atts; const Notation *notation = (const Notation *)map.attributed; ConstPtr<AttributeValue> arcContent; if (mapAttributes(entity.attributes(), 0, 0, atts, arcContent, map)) { // FIXME check arcContent entity.setNotation((Notation *)notation, atts); return 1; } // FIXME error tried to use #CONTENT return 0;}ConstPtr<Entity> ArcProcessor::makeDtdEntity(const Notation *){ if (!supportAtts_[rArcDTD].size()) { mgr_->message(ArcEngineMessages::noArcDTDAtt); return 0; } ConstPtr<Entity> entity = docDtd_->lookupEntity(arcDtdIsParam_, supportAtts_[rArcDTD]); if (entity.isNull()) { mgr_->message(arcDtdIsParam_ ? ArcEngineMessages::arcDtdNotDeclaredParameter : ArcEngineMessages::arcDtdNotDeclaredParameter, StringMessageArg(supportAtts_[rArcDTD])); return 0; } if (!entity->asExternalEntity()) { mgr_->message(ArcEngineMessages::arcDtdNotExternal, StringMessageArg(supportAtts_[rArcDTD])); return 0; } ExternalId externalId(entity->asExternalEntity()->externalId());#if 0 // Use the public identifier of the notation to find the meta-DTD. if (externalId.effectiveSystemId().size() == 0 && notation) { if (notation->externalId().effectiveSystemId().size()) { StringC tem(notation->externalId().effectiveSystemId()); externalId.setEffectiveSystem(tem); } else if (!externalId.publicId()) { const PublicId *pubid = notation->externalId().publicId(); PublicId::OwnerType ownerType; if (pubid && pubid->getOwnerType(ownerType)) { Text pubidText; unsigned textClassPos = 2; if (ownerType != PublicId::ISO) textClassPos += 3; StringC owner; pubid->getOwner(owner); textClassPos += owner.size(); pubidText.addChars(pubid->string().data(), textClassPos, pubid->text().charLocation(0)); pubidText.addChars(docSd_->execToInternal("DTD"), pubid->text().charLocation(textClassPos)); for (; textClassPos < pubid->string().size(); textClassPos++) if (pubid->string()[textClassPos] == docSyntax_->space()) break; pubidText.addChars(pubid->string().data() + textClassPos, pubid->string().size() - textClassPos, pubid->text().charLocation(textClassPos)); const MessageType1 *msg; externalId.setPublic(pubidText, docSd_->internalCharset(), docSyntax_->space(), msg); } } }#endif return new ExternalTextEntity(supportAtts_[rArcDocF], Entity::doctype, entity->defLocation(), externalId);}void ArcProcessor::supportAttributes(const AttributeList &atts){ static const char *const s[] = { "ArcFormA", "ArcNamrA", "ArcSuprA", "ArcIgnDA", "ArcDocF", "ArcSuprF", "ArcBridF", "ArcDataF", "ArcAuto", "ArcIndr", "ArcDTD", "ArcQuant", }; for (size_t i = 0; i < SIZEOF(s); i++) { StringC attName(docSd_->execToInternal(s[i])); docSyntax_->generalSubstTable()->subst(attName); unsigned ind; if (atts.attributeIndex(attName, ind)) { const AttributeValue *value = atts.value(ind); if (value) { const Text *textP = value->text(); // FIXME check for empty value if (textP) { supportAtts_[i] = textP->string(); switch (i) { case rArcQuant: processArcQuant(*textP); break; case rArcAuto: docSyntax_->generalSubstTable()->subst(supportAtts_[i]); if (supportAtts_[i] == docSd_->execToInternal("ARCAUTO")) arcAuto_ = 1; else if (supportAtts_[i] == docSd_->execToInternal("NARCAUTO")) arcAuto_ = 0; else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -