📄 parsedecl.cxx
字号:
case Param::reservedName + Syntax::rNUMBER: declaredValue = new TokenizedDeclaredValue(TokenizedDeclaredValue::number, 0); if (options().warnNumberDeclaredValue) message(ParserMessages::numberDeclaredValue); break; case Param::reservedName + Syntax::rNUMBERS: declaredValue = new TokenizedDeclaredValue(TokenizedDeclaredValue::number, 1); if (options().warnNumberDeclaredValue) message(ParserMessages::numberDeclaredValue); break; case Param::reservedName + Syntax::rNUTOKEN: declaredValue = new TokenizedDeclaredValue(TokenizedDeclaredValue::numberToken, 0); if (options().warnNutokenDeclaredValue) message(ParserMessages::nutokenDeclaredValue); break; case Param::reservedName + Syntax::rNUTOKENS: declaredValue = new TokenizedDeclaredValue(TokenizedDeclaredValue::numberToken, 1); if (options().warnNutokenDeclaredValue) message(ParserMessages::nutokenDeclaredValue); break; case Param::reservedName + Syntax::rNOTATION: { static AllowedParams allowNameGroup(Param::nameGroup); if (!parseParam(allowNameGroup, declInputLevel, parm)) return 0; Vector<StringC> group(parm.nameTokenVector.size()); for (size_t i = 0; i < group.size(); i++) parm.nameTokenVector[i].name.swap(group[i]); declaredValue = new NotationDeclaredValue(group); allowedFlags = 0; } break; case Param::nameTokenGroup: { Vector<StringC> group(parm.nameTokenVector.size()); for (size_t i = 0; i < group.size(); i++) parm.nameTokenVector[i].name.swap(group[i]); declaredValue = new NameTokenGroupDeclaredValue(group); } break; default: CANNOT_HAPPEN(); } if (isNotation) { if (!(allowedFlags & asDataAttribute)) message(ParserMessages::dataAttributeDeclaredValue); } else if (haveDefLpd() && !isNotation && !(allowedFlags & asLinkAttribute)) message(ParserMessages::linkAttributeDeclaredValue); return 1;}Boolean Parser::parseDefaultValue(unsigned declInputLevel, Boolean isNotation, Param &parm, const StringC &attributeName, Owner<DeclaredValue> &declaredValue, Owner<AttributeDefinition> &def, Boolean &anyCurrent){ // default value static AllowedParams allowDefaultValue(Param::indicatedReservedName + Syntax::rFIXED, Param::indicatedReservedName + Syntax::rREQUIRED, Param::indicatedReservedName + Syntax::rCURRENT, Param::indicatedReservedName + Syntax::rCONREF, Param::indicatedReservedName + Syntax::rIMPLIED, Param::attributeValue, Param::attributeValueLiteral); static AllowedParams allowTokenDefaultValue(Param::indicatedReservedName + Syntax::rFIXED, Param::indicatedReservedName + Syntax::rREQUIRED, Param::indicatedReservedName + Syntax::rCURRENT, Param::indicatedReservedName + Syntax::rCONREF, Param::indicatedReservedName + Syntax::rIMPLIED, Param::attributeValue, Param::tokenizedAttributeValueLiteral); if (!parseParam(declaredValue->tokenized() ? allowTokenDefaultValue : allowDefaultValue, declInputLevel, parm)) return 0; switch (parm.type) { case Param::indicatedReservedName + Syntax::rFIXED: { static AllowedParams allowValue(Param::attributeValue, Param::attributeValueLiteral); static AllowedParams allowTokenValue(Param::attributeValue, Param::tokenizedAttributeValueLiteral); if (!parseParam(declaredValue->tokenized() ? allowTokenValue : allowValue, declInputLevel, parm)) return 0; unsigned specLength = 0; AttributeValue *value = declaredValue->makeValue(parm.literalText, *this, attributeName, specLength); if (declaredValue->isId()) message(ParserMessages::idDeclaredValue); def = new FixedAttributeDefinition(attributeName, declaredValue.extract(), value); } break; case Param::attributeValue: if (options().warnAttributeValueNotLiteral) message(ParserMessages::attributeValueNotLiteral); // falll through case Param::attributeValueLiteral: case Param::tokenizedAttributeValueLiteral: { unsigned specLength = 0; AttributeValue *value = declaredValue->makeValue(parm.literalText, *this, attributeName, specLength); if (declaredValue->isId()) message(ParserMessages::idDeclaredValue); def = new DefaultAttributeDefinition(attributeName, declaredValue.extract(), value); } break; case Param::indicatedReservedName + Syntax::rREQUIRED: def = new RequiredAttributeDefinition(attributeName, declaredValue.extract()); break; case Param::indicatedReservedName + Syntax::rCURRENT: anyCurrent = 1; if (declaredValue->isId()) message(ParserMessages::idDeclaredValue); def = new CurrentAttributeDefinition(attributeName, declaredValue.extract(), defDtd().allocCurrentAttributeIndex()); if (isNotation) message(ParserMessages::dataAttributeDefaultValue); else if (haveDefLpd()) message(ParserMessages::linkAttributeDefaultValue); else if (options().warnCurrent) message(ParserMessages::currentAttribute); break; case Param::indicatedReservedName + Syntax::rCONREF: if (declaredValue->isId()) message(ParserMessages::idDeclaredValue); def = new ConrefAttributeDefinition(attributeName, declaredValue.extract()); if (isNotation) message(ParserMessages::dataAttributeDefaultValue); else if (haveDefLpd()) message(ParserMessages::linkAttributeDefaultValue); else if (options().warnConref) message(ParserMessages::conrefAttribute); break; case Param::indicatedReservedName + Syntax::rIMPLIED: def = new ImpliedAttributeDefinition(attributeName, declaredValue.extract()); break; default: CANNOT_HAPPEN(); } return 1;}// parm contains either system or publicBoolean Parser::parseExternalId(const AllowedParams &sysidAllow, const AllowedParams &endAllow, Boolean maybeWarnMissingSystemId, unsigned declInputLevel, Param &parm, ExternalId &id){ id.setLocation(currentLocation()); if (parm.type == Param::reservedName + Syntax::rPUBLIC) { static AllowedParams allowMinimumLiteral(Param::minimumLiteral); if (!parseParam(allowMinimumLiteral, declInputLevel, parm)) return 0; const MessageType1 *err; if (id.setPublic(parm.literalText, sd().internalCharset(), syntax().space(), err)) { PublicId::TextClass textClass; if (sd().formal() && id.publicId()->getTextClass(textClass) && textClass == PublicId::SD) message(ParserMessages::wwwRequired); } else if (sd().formal()) message(*err, StringMessageArg(*id.publicIdString())); } if (!parseParam(sysidAllow, declInputLevel, parm)) return 0; if (parm.type == Param::systemIdentifier) { id.setSystem(parm.literalText); if (!parseParam(endAllow, declInputLevel, parm)) return 0; } else if (options().warnMissingSystemId && maybeWarnMissingSystemId) message(ParserMessages::missingSystemId); return 1;}Boolean Parser::parseNotationDecl(){ unsigned declInputLevel = inputLevel(); Param parm; if (!parseParam(allowName, declInputLevel, parm)) return 0; Notation *nt = lookupCreateNotation(parm.token); if (validate() && nt->defined()) message(ParserMessages::duplicateNotationDeclaration, StringMessageArg(parm.token)); static AllowedParams allowPublicSystem(Param::reservedName + Syntax::rPUBLIC, Param::reservedName + Syntax::rSYSTEM); if (!parseParam(allowPublicSystem, declInputLevel, parm)) return 0; static AllowedParams allowSystemIdentifierMdc(Param::systemIdentifier, Param::mdc); ExternalId id; if (!parseExternalId(allowSystemIdentifierMdc, allowMdc, parm.type == Param::reservedName + Syntax::rSYSTEM, declInputLevel, parm, id)) return 0; if (validate() && sd().formal()) { PublicId::TextClass textClass; const PublicId *publicId = id.publicId(); if (publicId && publicId->getTextClass(textClass) && textClass != PublicId::NOTATION) message(ParserMessages::notationIdentifierTextClass); } if (!nt->defined()) { nt->setExternalId(id, markupLocation()); nt->generateSystemId(*this); if (currentMarkup()) eventHandler().notationDecl(new (eventAllocator()) NotationDeclEvent(nt, markupLocation(), currentMarkup())); } return 1;}Boolean Parser::parseEntityDecl(){ unsigned declInputLevel = inputLevel(); Param parm; static AllowedParams allowEntityNamePero(Param::entityName, Param::indicatedReservedName + Syntax::rDEFAULT, Param::pero); if (!parseParam(allowEntityNamePero, declInputLevel, parm)) return 0; Entity::DeclType declType; StringC name; // empty for default entity if (parm.type == Param::pero) { declType = Entity::parameterEntity; static AllowedParams allowParamEntityName(Param::paramEntityName); if (!parseParam(allowParamEntityName, declInputLevel, parm)) return 0; parm.token.swap(name); } else { declType = Entity::generalEntity; if (parm.type == Param::entityName) parm.token.swap(name); else if (options().warnDefaultEntityDecl) message(ParserMessages::defaultEntityDecl); } static AllowedParams allowEntityTextType(Param::paramLiteral, Param::reservedName + Syntax::rCDATA, Param::reservedName + Syntax::rSDATA, Param::reservedName + Syntax::rPI, Param::reservedName + Syntax::rSTARTTAG, Param::reservedName + Syntax::rENDTAG, Param::reservedName + Syntax::rMS, Param::reservedName + Syntax::rMD, Param::reservedName + Syntax::rSYSTEM, Param::reservedName + Syntax::rPUBLIC); if (!parseParam(allowEntityTextType, declInputLevel, parm)) return 0; Location typeLocation(currentLocation()); Entity::DataType dataType = Entity::sgmlText; InternalTextEntity::Bracketed bracketed = InternalTextEntity::none; switch (parm.type) { case Param::reservedName + Syntax::rSYSTEM: case Param::reservedName + Syntax::rPUBLIC: return parseExternalEntity(name, declType, declInputLevel, parm); case Param::reservedName + Syntax::rCDATA: dataType = Entity::cdata; if (options().warnInternalCdataEntity) message(ParserMessages::internalCdataEntity); break; case Param::reservedName + Syntax::rSDATA: dataType = Entity::sdata; if (options().warnInternalSdataEntity) message(ParserMessages::internalSdataEntity); break; case Param::reservedName + Syntax::rPI: dataType = Entity::pi; if (options().warnPiEntity) message(ParserMessages::piEntity); break; case Param::reservedName + Syntax::rSTARTTAG: bracketed = InternalTextEntity::starttag; if (options().warnBracketEntity) message(ParserMessages::bracketEntity); break; case Param::reservedName + Syntax::rENDTAG: bracketed = InternalTextEntity::endtag; if (options().warnBracketEntity) message(ParserMessages::bracketEntity); break; case Param::reservedName + Syntax::rMS: bracketed = InternalTextEntity::ms; if (options().warnBracketEntity) message(ParserMessages::bracketEntity); break; case Param::reservedName + Syntax::rMD: bracketed = InternalTextEntity::md; if (options().warnBracketEntity) message(ParserMessages::bracketEntity); break; } if (parm.type != Param::paramLiteral) { if (!parseParam(allowParamLiteral, declInputLevel, parm)) return 0; } Text text; parm.literalText.swap(text); if (bracketed != InternalTextEntity::none) { StringC open; StringC close; switch (bracketed) { case InternalTextEntity::starttag: open = syntax().delimGeneral(Syntax::dSTAGO); close = syntax().delimGeneral(Syntax::dTAGC); break; case InternalTextEntity::endtag: open = syntax().delimGeneral(Syntax::dETAGO); close = syntax().delimGeneral(Syntax::dTAGC); break; case InternalTextEntity::ms: open = syntax().delimGeneral(Syntax::dMDO); open += syntax().delimGeneral(Syntax::dDSO); close = syntax().delimGeneral(Syntax::dMSC); close += syntax().delimGeneral(Syntax::dMDC); break; case InternalTextEntity::md: open = syntax().delimGeneral(Syntax::dMDO); close = syntax().delimGeneral(Syntax::dMDC); break; default: CANNOT_HAPPEN(); } text.insertChars(open, Location(new BracketOrigin(typeLocation, BracketOrigin::open), 0)); text.addChars(close, Location(new BracketOrigin(typeLocation, BracketOrigin::close), 0)); if (text.size() > syntax().litlen() && text.size() - open.size() - close.size() <= syntax().litlen()) message(ParserMessages::bracketedLitlen, NumberMessageArg(syntax().litlen())); } if (!parseParam(allowMdc, declInputLevel, parm)) return 0; if (declType == Entity::parameterEntity && (dataType == Entity::cdata || dataType == Entity::sdata)) { message(ParserMessages::internalParameterDataEntity, StringMessageArg(name)); return 1; } Ptr<Entity> entity; switch (dataType) { case Entity::cdata: entity = new InternalCdataEntity(name, markupLocation(), text); break; case Entity::sdata: entity = new InternalSdataEntity(name, markupLocation(), text); break; case Entity::pi: entity = new PiEntity(name, declType, markupLocation(), text); break; case Entity::sgmlText: entity = new InternalTextEntity(name, declType, markupLocation(), text, bracketed); break; default: CANNOT_HAPPEN(); break; } maybeDefineEntity(entity); return 1;}Boolean Parser::parseExternalEntity(StringC &name, Entity::DeclType declType, unsigned declInputLevel, Param &parm){ static AllowedParams allowSystemIdentifierEntityTypeMdc(Param::systemIdentifier, Param::reservedName + Syntax::rSUBDOC, Param::reservedName + Syntax::rCDATA, Param::reservedName + Syntax::rSDATA, Param::reservedName + Syntax::rNDATA, Param::mdc); static AllowedParams allowEntityTypeMdc(Param::reservedName + Syntax::rSUBDOC, Param::reservedName + Syntax::rCDATA, Param::reservedName + Syntax::rSDATA, Param::reservedName + Syntax::rNDATA,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -