📄 xmloutputeventhandler.cxx
字号:
StringMessageArg(notation->name())); } } } if (options_.ndata) { Dtd::ConstEntityIter iter(dtd.generalEntityIter()); for (;;) { const Entity *entity = iter.nextTemp(); if (!entity) break; const ExternalDataEntity *extDataEntity = entity->asExternalDataEntity(); if (extDataEntity) { maybeStartDoctype(doctypeStarted, dtd); os() << "<!ENTITY " << entity->name(); outputExternalId(*entity); if (extDataEntity->dataType() != EntityDecl::ndata) { mgr_->setNextLocation(entity->defLocation()); mgr_->message(XmlOutputMessages::externalDataNdata, StringMessageArg(entity->name())); } os() << " NDATA " << generalName(extDataEntity->notation()->name(), nameBuf_) << ">" << RE; } } } if (options_.id || options_.attlist) { Dtd::ConstElementTypeIter iter(dtd.elementTypeIter()); for (;;) { const ElementType *elementType = iter.next(); if (!elementType) break; const AttributeDefinitionList *adl = elementType->attributeDefTemp(); if (adl) { if (options_.attlist) { maybeStartDoctype(doctypeStarted, dtd); os() << "<!ATTLIST " << generalName(elementType->name(), nameBuf_); for (size_t i = 0; i < adl->size(); i++) { const AttributeDefinition *def = adl->def(i); os() << RE << generalName(def->name(), nameBuf_); AttributeDefinitionDesc desc; def->getDesc(desc); switch (desc.declaredValue) { case AttributeDefinitionDesc::cdata: os() << " CDATA #IMPLIED"; break; case AttributeDefinitionDesc::name: case AttributeDefinitionDesc::number: case AttributeDefinitionDesc::nmtoken: case AttributeDefinitionDesc::nutoken: os() << " NMTOKEN #IMPLIED"; break; case AttributeDefinitionDesc::entity: os() << " ENTITY #IMPLIED"; break; case AttributeDefinitionDesc::idref: os() << " IDREF #IMPLIED"; break; case AttributeDefinitionDesc::names: case AttributeDefinitionDesc::numbers: case AttributeDefinitionDesc::nmtokens: case AttributeDefinitionDesc::nutokens: os() << " NMTOKENS #IMPLIED"; break; case AttributeDefinitionDesc::entities: os() << " ENTITIES #IMPLIED"; break; case AttributeDefinitionDesc::idrefs: os() << " IDREFS #IMPLIED"; break; case AttributeDefinitionDesc::id: os() << " ID #IMPLIED"; break; case AttributeDefinitionDesc::notation: os() << " NOTATION"; // fall through case AttributeDefinitionDesc::nameTokenGroup: { os() << " ("; for (size_t j = 0; j < desc.allowedValues.size(); j++) { if (j > 0) os() << '|'; os() << desc.allowedValues[j]; } os() << ") #IMPLIED"; } break; default: CANNOT_HAPPEN(); } } os() << '>' << RE; } else { size_t idIndex = adl->idIndex(); if (idIndex != size_t(-1)) { maybeStartDoctype(doctypeStarted, dtd); os() << "<!ATTLIST " << generalName(elementType->name(), nameBuf_); os() << ' ' << generalName(adl->def(idIndex)->name(), nameBuf_) << " ID #IMPLIED>" << RE; } } } } } if (doctypeStarted) os() << "]>" << RE; delete event;}void XmlOutputEventHandler::outputExternalId(const EntityDecl &decl){ const StringC *pubIdP = decl.publicIdPointer(); const StringC *sysIdP = decl.effectiveSystemIdPointer(); if (pubIdP) { os() << " PUBLIC \"" << *pubIdP << "\""; if (decl.declType() == EntityDecl::notation && !sysIdP) return; os() << " \""; } else os() << " SYSTEM \""; if (sysIdP) { StringC url; switch(fsiToUrl(*sysIdP, decl.defLocation(), url)) { case 1: os() << url; break; case 0: break; default: mgr_->setNextLocation(decl.defLocation()); mgr_->message(XmlOutputMessages::cannotConvertFsiToUrl, StringMessageArg(*sysIdP)); break; } } os() << "\"";}// Return 1 if OK; return -1 to generate generic error; return 0 if error already generated.int XmlOutputEventHandler::fsiToUrl(const StringC &fsi, const Location &loc, StringC &url){ ParsedSystemId parsedBuf; if (!entityManager_->parseSystemId(fsi, *systemCharset_, 0, 0, *mgr_, parsedBuf)) return 0; if (parsedBuf.size() != 1) return -1; if (strcmp(parsedBuf[0].storageManager->type(), "URL") == 0) { url = parsedBuf[0].specId; return 1; } Owner<InputSource> in(entityManager_->open(fsi, *systemCharset_, InputSourceOrigin::make(), 0, *mgr_)); if (!in) return 0; Xchar c = in->get(*mgr_); StorageObjectLocation soLoc; if (c == InputSource::eE && in->accessError()) { if (parsedBuf[0].baseId.size()) return 0; soLoc.storageObjectSpec = &parsedBuf[0]; soLoc.actualStorageId = parsedBuf[0].specId; } else { const Location &loc = in->currentLocation(); if (loc.origin().isNull()) return -1; const InputSourceOrigin *tem = loc.origin()->asInputSourceOrigin(); if (!tem) return -1; const ParsedSystemId *psi = ExtendEntityManager::externalInfoParsedSystemId(tem->externalInfo()); if (!psi || psi->size() != 1) return -1; if (!ExtendEntityManager::externalize(tem->externalInfo(), 0, soLoc)) return -1; } if (strcmp(soLoc.storageObjectSpec->storageManager->type(), "OSFILE") != 0) return -1; return filenameToUrl(soLoc.actualStorageId, loc, url);}staticStringC hexEncode(unsigned char c){ static const char hexDigits[] = "0123456789ABCDEF"; StringC result; result.resize(2); result[0] = hexDigits[c >> 4]; result[1] = hexDigits[c & 0xF]; return result;}staticStringC urlEncode(Char c){ if (c >= 0x80) { StringC tem; tem += c;#if 0 // This is what the URN spec says. UTF8CodingSystem utf8; String<char> bytes(utf8.convertOut(tem)); tem.resize(0); for (size_t i = 0; i < bytes.size(); i++) tem += hexEncode(bytes[i]);#endif return tem; } if (strchr("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$-_.+!*'(),", char(c))) { StringC tem; tem += c; return tem; } return hexEncode((unsigned char)c);}int XmlOutputEventHandler::filenameToUrl(const StringC &filename, const Location &loc, StringC &url){#ifdef SP_MSDOS_FILENAMES if (filename.size() >= 3 && filename[1] == ':' && (('a' <= filename[0] && filename[0] <= 'z') || ('A' <= filename[0] && filename[0] <= 'Z')) && (filename[2] == '/' || filename[2] == '\\')) { url += "file://"; url += filename; return 1; }#endif for (size_t i = 0; i < filename.size(); i++) { if (filename[i] == '/'#ifdef SP_MSDOS_FILENAMES || filename[i] == '\\'#endif ) { url += '/'; } else url += urlEncode(filename[i]); } return 1;}void XmlOutputEventHandler::commentDecl(CommentDeclEvent *event){ if (!inDtd_ && options_.comment) { Boolean started = 0; for (MarkupIter iter(event->markup()); iter.valid(); iter.advance()) { if (iter.type() == Markup::comment) { if (!started) { os() << "<!--"; started = 1; } os().write(iter.charsPointer(), iter.charsLength()); } } if (started) os() << "-->"; } delete event;}void XmlOutputEventHandler::markedSectionStart(MarkedSectionStartEvent *event){ if (options_.cdata && event->status() == MarkedSectionEvent::cdata) useCdata_ = 1; delete event;}void XmlOutputEventHandler::markedSectionEnd(MarkedSectionEndEvent *event){ if (event->status() == MarkedSectionEvent::cdata) closeCdataSection(); delete event;}void XmlOutputEventHandler::outputCdata(const Char *s, size_t n){ static const char cdataEnd[] = "]]>"; for (; n > 0; s++, n--) { Char c = *s; if (!inCdata_) { os() << "<![CDATA["; inCdata_ = 1; } if (c == cdataEnd[nCdataEndMatched_]) { if (nCdataEndMatched_ == 2) { os() << "]]><![CDATA["; nCdataEndMatched_ = 0; } else nCdataEndMatched_++; } else nCdataEndMatched_ = 0; os().put(c); }}void XmlOutputEventHandler::outputData(const Char *s, size_t n, Boolean inLit){ for (; n > 0; s++, n--) { Char c = *s; switch (c) { case '&': os() << "&"; break; case '<': os() << "<"; break; case '>': os() << ">"; break; case 9: case 10: case 13: if (inLit) os() << "&#" << int(c) << ';'; else os().put(c); break; case '"': if (inLit) { os() << """; break; } // fall through default: os().put(c); break; } }}const StringC &XmlOutputEventHandler::generalName(const StringC &name, StringC &buf){ if (options_.lower && namecaseGeneral_) { for (size_t i = 0; i < name.size(); i++) { Char c = lowerSubst_[name[i]]; if (c != name[i]) { buf = name; buf[i] = c; for (i++; i < name.size(); i++) lowerSubst_.subst(buf[i]); return buf; } } } return name;}#ifdef SP_NAMESPACE}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -