⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmloutputeventhandler.cxx

📁 SP是一个基于GNU C++编译器
💻 CXX
📖 第 1 页 / 共 2 页
字号:
	              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() << "&amp;";      break;    case '<':      os() << "&lt;";      break;    case '>':      os() << "&gt;";      break;    case 9:    case 10:    case 13:      if (inLit)	os() << "&#" << int(c) << ';';      else	os().put(c);      break;    case '"':      if (inLit) {	os() << "&quot;";	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 + -