From b4661d535cb2a924cd3818e2c01d054b8632e81b Mon Sep 17 00:00:00 2001 From: "Zane U. Ji" Date: Sat, 7 Jun 2014 17:00:28 +0800 Subject: [PATCH] Preserve the original EOL --- src/Makefile.am | 34 ++++----- src/Makefile.in | 89 ++++++++++++----------- src/xmlassociatedtd.cpp | 16 +++-- src/xmlassociatedtd.h | 5 +- src/xmlassociatexsl.cpp | 5 +- src/xmlassociatexsl.h | 5 +- src/xmlcopyeditor.cpp | 17 +++-- src/xmltextinfo.cpp | 155 ++++++++++++++++++++++++++++++++++++++++ src/xmltextinfo.h | 64 +++++++++++++++++ 9 files changed, 313 insertions(+), 77 deletions(-) create mode 100644 src/xmltextinfo.cpp create mode 100644 src/xmltextinfo.h diff --git a/src/Makefile.am b/src/Makefile.am index decf6bc..7faf540 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -13,22 +13,24 @@ pixmapdir = /usr/share/pixmaps applicationsdir = /usr/share/applications # the application source, library search path, and link libraries -xmlcopyeditor_SOURCES = xmlcopyeditor.cpp associatedialog.cpp casehandler.cpp \ - contexthandler.cpp dtd2schema.cpp globalreplacedialog.cpp housestyle.cpp \ - housestylereader.cpp myhtmlpane.cpp nocasecompare.cpp readfile.cpp \ - replace.cpp styledialog.cpp threadreaper.cpp wraplibxml.cpp \ - wrapregex.cpp wraptempfilename.cpp xmlassociatedtd.cpp xmlassociatexsd.cpp \ - xmlassociatexsl.cpp xmlctrl.cpp xmldoc.cpp xmlencodinghandler.cpp \ - xmlfilterreader.cpp xmlpromptgenerator.cpp xmlrulereader.cpp \ - xmlschemalocator.cpp xmlutf8reader.cpp xsllocator.cpp \ - wrapexpat.cpp mypropertysheet.cpp rule.cpp housestylewriter.cpp myipc.cpp \ - aboutdialog.cpp pathresolver.cpp mynotebook.cpp insertpanel.cpp \ - xmlwordcount.cpp getword.cpp locationpanel.cpp catalogresolver.cpp \ - xmlparseschemans.cpp xmlshallowvalidator.cpp wrapxerces.cpp \ - findreplacepanel.cpp commandpanel.cpp xercescatalogresolver.cpp \ - binaryfile.cpp xmlencodingspy.cpp wrapaspell.cpp validationthread.cpp \ - wrapdaisy.cpp exportdialog.cpp mp3album.cpp xmlprodnote.cpp \ - xmlsuppressprodnote.cpp xmlcopyimg.cpp xmlschemagenerator.cpp \ +xmlcopyeditor_SOURCES = aboutdialog.cpp associatedialog.cpp binaryfile.cpp \ + casehandler.cpp catalogresolver.cpp commandpanel.cpp \ + contexthandler.cpp dtd2schema.cpp exportdialog.cpp \ + findreplacepanel.cpp getword.cpp globalreplacedialog.cpp \ + housestyle.cpp housestylereader.cpp housestylewriter.cpp \ + insertpanel.cpp locationpanel.cpp mp3album.cpp myhtmlpane.cpp \ + myipc.cpp mynotebook.cpp mypropertysheet.cpp nocasecompare.cpp \ + pathresolver.cpp readfile.cpp replace.cpp rule.cpp styledialog.cpp \ + threadreaper.cpp validationthread.cpp wrapaspell.cpp wrapdaisy.cpp \ + wrapexpat.cpp wraplibxml.cpp wrapregex.cpp wraptempfilename.cpp \ + wrapxerces.cpp xercescatalogresolver.cpp xmlassociatedtd.cpp \ + xmlassociatexsd.cpp xmlassociatexsl.cpp xmlcopyeditor.cpp \ + xmlcopyimg.cpp xmlctrl.cpp xmldoc.cpp xmlencodinghandler.cpp \ + xmlencodingspy.cpp xmlfilterreader.cpp xmlparseschemans.cpp \ + xmlprodnote.cpp xmlpromptgenerator.cpp xmlrulereader.cpp \ + xmlschemagenerator.cpp xmlschemalocator.cpp xmlshallowvalidator.cpp \ + xmlsuppressprodnote.cpp xmltextinfo.cpp xmlutf8reader.cpp \ + xmlwordcount.cpp xsllocator.cpp \ xmlcopyeditor.spec xmlcopyeditor.png custom.xpm xmlcopyeditor_LDADD = $(WX_LIBS) \ diff --git a/src/Makefile.in b/src/Makefile.in index 273d9c7..e75918f 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -50,35 +50,35 @@ CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" \ "$(DESTDIR)$(xmlcopyeditordir)" "$(DESTDIR)$(pixmapdir)" PROGRAMS = $(bin_PROGRAMS) -am_xmlcopyeditor_OBJECTS = xmlcopyeditor.$(OBJEXT) \ - associatedialog.$(OBJEXT) casehandler.$(OBJEXT) \ - contexthandler.$(OBJEXT) dtd2schema.$(OBJEXT) \ +am_xmlcopyeditor_OBJECTS = aboutdialog.$(OBJEXT) \ + associatedialog.$(OBJEXT) binaryfile.$(OBJEXT) \ + casehandler.$(OBJEXT) catalogresolver.$(OBJEXT) \ + commandpanel.$(OBJEXT) contexthandler.$(OBJEXT) \ + dtd2schema.$(OBJEXT) exportdialog.$(OBJEXT) \ + findreplacepanel.$(OBJEXT) getword.$(OBJEXT) \ globalreplacedialog.$(OBJEXT) housestyle.$(OBJEXT) \ - housestylereader.$(OBJEXT) myhtmlpane.$(OBJEXT) \ - nocasecompare.$(OBJEXT) readfile.$(OBJEXT) replace.$(OBJEXT) \ + housestylereader.$(OBJEXT) housestylewriter.$(OBJEXT) \ + insertpanel.$(OBJEXT) locationpanel.$(OBJEXT) \ + mp3album.$(OBJEXT) myhtmlpane.$(OBJEXT) myipc.$(OBJEXT) \ + mynotebook.$(OBJEXT) mypropertysheet.$(OBJEXT) \ + nocasecompare.$(OBJEXT) pathresolver.$(OBJEXT) \ + readfile.$(OBJEXT) replace.$(OBJEXT) rule.$(OBJEXT) \ styledialog.$(OBJEXT) threadreaper.$(OBJEXT) \ - wraplibxml.$(OBJEXT) wrapregex.$(OBJEXT) \ - wraptempfilename.$(OBJEXT) xmlassociatedtd.$(OBJEXT) \ - xmlassociatexsd.$(OBJEXT) xmlassociatexsl.$(OBJEXT) \ - xmlctrl.$(OBJEXT) xmldoc.$(OBJEXT) \ - xmlencodinghandler.$(OBJEXT) xmlfilterreader.$(OBJEXT) \ - xmlpromptgenerator.$(OBJEXT) xmlrulereader.$(OBJEXT) \ - xmlschemalocator.$(OBJEXT) xmlutf8reader.$(OBJEXT) \ - xsllocator.$(OBJEXT) wrapexpat.$(OBJEXT) \ - mypropertysheet.$(OBJEXT) rule.$(OBJEXT) \ - housestylewriter.$(OBJEXT) myipc.$(OBJEXT) \ - aboutdialog.$(OBJEXT) pathresolver.$(OBJEXT) \ - mynotebook.$(OBJEXT) insertpanel.$(OBJEXT) \ - xmlwordcount.$(OBJEXT) getword.$(OBJEXT) \ - locationpanel.$(OBJEXT) catalogresolver.$(OBJEXT) \ - xmlparseschemans.$(OBJEXT) xmlshallowvalidator.$(OBJEXT) \ - wrapxerces.$(OBJEXT) findreplacepanel.$(OBJEXT) \ - commandpanel.$(OBJEXT) xercescatalogresolver.$(OBJEXT) \ - binaryfile.$(OBJEXT) xmlencodingspy.$(OBJEXT) \ - wrapaspell.$(OBJEXT) validationthread.$(OBJEXT) \ - wrapdaisy.$(OBJEXT) exportdialog.$(OBJEXT) mp3album.$(OBJEXT) \ - xmlprodnote.$(OBJEXT) xmlsuppressprodnote.$(OBJEXT) \ - xmlcopyimg.$(OBJEXT) xmlschemagenerator.$(OBJEXT) + validationthread.$(OBJEXT) wrapaspell.$(OBJEXT) \ + wrapdaisy.$(OBJEXT) wrapexpat.$(OBJEXT) wraplibxml.$(OBJEXT) \ + wrapregex.$(OBJEXT) wraptempfilename.$(OBJEXT) \ + wrapxerces.$(OBJEXT) xercescatalogresolver.$(OBJEXT) \ + xmlassociatedtd.$(OBJEXT) xmlassociatexsd.$(OBJEXT) \ + xmlassociatexsl.$(OBJEXT) xmlcopyeditor.$(OBJEXT) \ + xmlcopyimg.$(OBJEXT) xmlctrl.$(OBJEXT) xmldoc.$(OBJEXT) \ + xmlencodinghandler.$(OBJEXT) xmlencodingspy.$(OBJEXT) \ + xmlfilterreader.$(OBJEXT) xmlparseschemans.$(OBJEXT) \ + xmlprodnote.$(OBJEXT) xmlpromptgenerator.$(OBJEXT) \ + xmlrulereader.$(OBJEXT) xmlschemagenerator.$(OBJEXT) \ + xmlschemalocator.$(OBJEXT) xmlshallowvalidator.$(OBJEXT) \ + xmlsuppressprodnote.$(OBJEXT) xmltextinfo.$(OBJEXT) \ + xmlutf8reader.$(OBJEXT) xmlwordcount.$(OBJEXT) \ + xsllocator.$(OBJEXT) xmlcopyeditor_OBJECTS = $(am_xmlcopyeditor_OBJECTS) am__DEPENDENCIES_1 = xmlcopyeditor_DEPENDENCIES = $(am__DEPENDENCIES_1) \ @@ -287,22 +287,24 @@ pixmapdir = /usr/share/pixmaps applicationsdir = /usr/share/applications # the application source, library search path, and link libraries -xmlcopyeditor_SOURCES = xmlcopyeditor.cpp associatedialog.cpp casehandler.cpp \ - contexthandler.cpp dtd2schema.cpp globalreplacedialog.cpp housestyle.cpp \ - housestylereader.cpp myhtmlpane.cpp nocasecompare.cpp readfile.cpp \ - replace.cpp styledialog.cpp threadreaper.cpp wraplibxml.cpp \ - wrapregex.cpp wraptempfilename.cpp xmlassociatedtd.cpp xmlassociatexsd.cpp \ - xmlassociatexsl.cpp xmlctrl.cpp xmldoc.cpp xmlencodinghandler.cpp \ - xmlfilterreader.cpp xmlpromptgenerator.cpp xmlrulereader.cpp \ - xmlschemalocator.cpp xmlutf8reader.cpp xsllocator.cpp \ - wrapexpat.cpp mypropertysheet.cpp rule.cpp housestylewriter.cpp myipc.cpp \ - aboutdialog.cpp pathresolver.cpp mynotebook.cpp insertpanel.cpp \ - xmlwordcount.cpp getword.cpp locationpanel.cpp catalogresolver.cpp \ - xmlparseschemans.cpp xmlshallowvalidator.cpp wrapxerces.cpp \ - findreplacepanel.cpp commandpanel.cpp xercescatalogresolver.cpp \ - binaryfile.cpp xmlencodingspy.cpp wrapaspell.cpp validationthread.cpp \ - wrapdaisy.cpp exportdialog.cpp mp3album.cpp xmlprodnote.cpp \ - xmlsuppressprodnote.cpp xmlcopyimg.cpp xmlschemagenerator.cpp \ +xmlcopyeditor_SOURCES = aboutdialog.cpp associatedialog.cpp binaryfile.cpp \ + casehandler.cpp catalogresolver.cpp commandpanel.cpp \ + contexthandler.cpp dtd2schema.cpp exportdialog.cpp \ + findreplacepanel.cpp getword.cpp globalreplacedialog.cpp \ + housestyle.cpp housestylereader.cpp housestylewriter.cpp \ + insertpanel.cpp locationpanel.cpp mp3album.cpp myhtmlpane.cpp \ + myipc.cpp mynotebook.cpp mypropertysheet.cpp nocasecompare.cpp \ + pathresolver.cpp readfile.cpp replace.cpp rule.cpp styledialog.cpp \ + threadreaper.cpp validationthread.cpp wrapaspell.cpp wrapdaisy.cpp \ + wrapexpat.cpp wraplibxml.cpp wrapregex.cpp wraptempfilename.cpp \ + wrapxerces.cpp xercescatalogresolver.cpp xmlassociatedtd.cpp \ + xmlassociatexsd.cpp xmlassociatexsl.cpp xmlcopyeditor.cpp \ + xmlcopyimg.cpp xmlctrl.cpp xmldoc.cpp xmlencodinghandler.cpp \ + xmlencodingspy.cpp xmlfilterreader.cpp xmlparseschemans.cpp \ + xmlprodnote.cpp xmlpromptgenerator.cpp xmlrulereader.cpp \ + xmlschemagenerator.cpp xmlschemalocator.cpp xmlshallowvalidator.cpp \ + xmlsuppressprodnote.cpp xmltextinfo.cpp xmlutf8reader.cpp \ + xmlwordcount.cpp xsllocator.cpp \ xmlcopyeditor.spec xmlcopyeditor.png custom.xpm xmlcopyeditor_LDADD = $(WX_LIBS) \ @@ -499,6 +501,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlschemalocator.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlshallowvalidator.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlsuppressprodnote.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmltextinfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlutf8reader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlwordcount.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xsllocator.Po@am__quote@ diff --git a/src/xmlassociatedtd.cpp b/src/xmlassociatedtd.cpp index a1da446..9c094c4 100644 --- a/src/xmlassociatedtd.cpp +++ b/src/xmlassociatedtd.cpp @@ -25,12 +25,14 @@ #include "xmlassociatedtd.h" XmlAssociateDtd::XmlAssociateDtd ( - const wxString &path, - const wxString &publicID, - const char *encoding, - size_t size ) - : WrapExpat ( encoding ) - , d ( new DtdData() ) + const XmlTextInfo &info, + const wxString &path, + const wxString &publicID, + const char *encoding, + size_t size ) + : WrapExpat ( encoding ) + , d ( new DtdData() ) + , mInfo ( info ) { d->buffer.reserve ( size ); d->path = path; @@ -67,7 +69,7 @@ void XMLCALL XmlAssociateDtd::start ( void *data, if ( !d->associated ) { associate ( d, el ); - d->buffer += "\n"; + d->buffer += pThis->mInfo.mEOL.utf8_str(); d->associated = true; } diff --git a/src/xmlassociatedtd.h b/src/xmlassociatedtd.h index 03a49d3..667120e 100644 --- a/src/xmlassociatedtd.h +++ b/src/xmlassociatedtd.h @@ -24,7 +24,7 @@ #include #include #include -#include "wrapexpat.h" +#include "xmltextinfo.h" struct DtdData : public ParserData { @@ -37,6 +37,7 @@ class XmlAssociateDtd : public WrapExpat { public: XmlAssociateDtd ( + const XmlTextInfo &info, const wxString &path = wxEmptyString, const wxString &publicID = wxEmptyString, const char *encoding = NULL, @@ -48,7 +49,7 @@ class XmlAssociateDtd : public WrapExpat } private: std::auto_ptr d; - std::string encoding; + const XmlTextInfo &mInfo; static void XMLCALL start ( void *data, const XML_Char *el, diff --git a/src/xmlassociatexsl.cpp b/src/xmlassociatexsl.cpp index 589d612..c0d2690 100644 --- a/src/xmlassociatexsl.cpp +++ b/src/xmlassociatexsl.cpp @@ -25,11 +25,13 @@ #include "xmlassociatexsl.h" XmlAssociateXsl::XmlAssociateXsl ( + const XmlTextInfo &info, const wxString &path, const char *encoding, size_t size ) : WrapExpat ( encoding ) , d ( new XslData() ) + , mInfo ( info ) { d->buffer.reserve ( size ); d->path = path; @@ -64,7 +66,8 @@ void XMLCALL XmlAssociateXsl::start ( void *data, { d->buffer += "buffer += d->path.utf8_str(); // TODO: Apply the encoding of the parser - d->buffer += "\"?>\n"; + d->buffer += "\"?>"; + d->buffer += pThis->mInfo.mEOL.utf8_str(); d->associated = true; } diff --git a/src/xmlassociatexsl.h b/src/xmlassociatexsl.h index a36a8a0..abe7271 100644 --- a/src/xmlassociatexsl.h +++ b/src/xmlassociatexsl.h @@ -25,7 +25,7 @@ #include #include #include -#include "wrapexpat.h" +#include "xmltextinfo.h" struct XslData : public ParserData { @@ -38,6 +38,7 @@ class XmlAssociateXsl : public WrapExpat { public: XmlAssociateXsl ( + const XmlTextInfo &info, const wxString &path = wxEmptyString, const char *encoding = NULL, size_t size = BUFSIZ ); @@ -48,7 +49,7 @@ class XmlAssociateXsl : public WrapExpat } private: std::auto_ptr d; - std::string encoding; + const XmlTextInfo &mInfo; static void XMLCALL start ( void *data, const XML_Char *el, diff --git a/src/xmlcopyeditor.cpp b/src/xmlcopyeditor.cpp index df119bf..bb43054 100644 --- a/src/xmlcopyeditor.cpp +++ b/src/xmlcopyeditor.cpp @@ -5739,6 +5739,9 @@ void MyFrame::OnAssociate ( wxCommandEvent& event ) if ( ( doc = getActiveDocument() ) == NULL ) return; + XmlTextInfo info ( doc->getFullFileName() ); + info.parse ( doc->myGetTextRaw() ); + wxString title, label, type, extension, path, defaulturl, defaultaux; wxString auxiliaryLabel; int id = event.GetId(); @@ -5748,24 +5751,26 @@ void MyFrame::OnAssociate ( wxCommandEvent& event ) type = _ ( "Public DTD" ); extension = _T ( "*.dtd" ); defaulturl = lastDtdPublic; - defaultaux = lastDtdPublicAux; + defaultaux = info.mDtdFile.empty() + ? lastDtdPublicAux : info.mDtdFile; break; case ID_ASSOCIATE_DTD_SYSTEM: type = _ ( "System DTD" ); extension = _T ( "*.dtd" ); - defaulturl = lastDtdSystem; + defaulturl = info.mDtdFile.empty() ? lastDtdSystem : info.mDtdFile; defaultaux = _T ( "" ); break; case ID_ASSOCIATE_W3C_SCHEMA: type = _ ( "XML Schema" ); extension = _T ( "*.xsd" ); - defaulturl = lastSchema; + defaulturl = info.mXsdFile.empty() ? lastSchema : info.mXsdFile; defaultaux = _T ( "" ); break; case ID_ASSOCIATE_XSL: type = _ ( "XSLT stylesheet" ); extension = _T ( "*.xsl;*.xslt" ); - defaulturl = lastXslStylesheet; + defaulturl = info.mXslFile.empty() + ? lastXslStylesheet : info.mXslFile; defaultaux = _T ( "" ); break; default: @@ -5856,14 +5861,14 @@ void MyFrame::OnAssociate ( wxCommandEvent& event ) } else if ( id == ID_ASSOCIATE_DTD_SYSTEM || id == ID_ASSOCIATE_DTD_PUBLIC ) { - XmlAssociateDtd parser ( path, aux, "UTF-8" ); + XmlAssociateDtd parser ( info, path, aux, "UTF-8" ); if ( !parser.parse ( utf8Buffer ) ) return; modifiedBuffer = parser.getBuffer(); } else if ( id == ID_ASSOCIATE_XSL ) { - XmlAssociateXsl parser( path, "UTF-8" ); + XmlAssociateXsl parser( info, path, "UTF-8" ); if ( !parser.parse ( utf8Buffer ) ) return; modifiedBuffer = parser.getBuffer(); diff --git a/src/xmltextinfo.cpp b/src/xmltextinfo.cpp new file mode 100644 index 0000000..0ad7baf --- /dev/null +++ b/src/xmltextinfo.cpp @@ -0,0 +1,155 @@ +/* + * Copyright 2014 Zane U. Ji. + * + * This file is part of Xml Copy Editor. + * + * Xml Copy Editor is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * Xml Copy Editor is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Xml Copy Editor; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "xmltextinfo.h" + +XmlTextInfo::XmlTextInfo + ( const wxString &path + , const char *encoding /*= NULL*/ + ) + : WrapExpat ( encoding ) +{ + XML_SetUserData ( p, this ); + XML_SetBase ( p, path.utf8_str() ); + XML_SetDoctypeDeclHandler ( p, startdoctypehandler, NULL ); + XML_SetProcessingInstructionHandler ( p, processinghandler ); + XML_SetElementHandler ( p, start, NULL ); + XML_SetDefaultHandlerExpand ( p, defaulthandler ); +} + +XmlTextInfo::~XmlTextInfo() +{ +} + +void XMLCALL XmlTextInfo::startdoctypehandler + ( void *data + , const XML_Char *doctypeName + , const XML_Char *sysid + , const XML_Char *pubid + , int has_internal_subset + ) +{ + XmlTextInfo *pThis = (XmlTextInfo *)data; + + pThis->mDocTypeName = wxString::FromUTF8 ( doctypeName ); +} + +void XMLCALL XmlTextInfo::processinghandler + ( void *data + , const XML_Char *target + , const XML_Char *datastring + ) +{ + XmlTextInfo *pThis = (XmlTextInfo *)data; + + if ( strcmp ( target, "xml-stylesheet" ) ) + return; + + char *href = strstr ( ( char * ) datastring, "href" ); + if ( !href ) + return; + href += strlen ( "href" ); + + char ch = '"'; // Is '' or "" used? + char *start = strchr ( href, ch); + char *p = strchr ( href, '\''); + if ( start == NULL + || ( p != NULL && start > p ) ) + { + start = p; + ch = '\''; + } + if ( !start++ ) + return; + while ( isspace ( *start ) ) + start++; + + char *end = strchr ( start, ch); + if ( !end ) + return; + while ( isspace ( end[-1] ) ) + end--; + + pThis->mXslFile = wxString::FromUTF8 ( start, end - start ); +} + +void XMLCALL XmlTextInfo::start + ( void *data + , const XML_Char *el + , const XML_Char **attr + ) +{ + XmlTextInfo *pThis = (XmlTextInfo *)data; + + for ( ; *attr; attr += 2 ) + { + if ( strstr ( *attr, ":noNamespaceSchemaLocation" ) ) + { + pThis->mXsdFile = wxString::FromUTF8 ( attr[1] ); + break; + } + if ( strstr ( *attr, ":schemaLocation" ) ) + { // TODO: Support multiple schemas + std::string str ( attr[1] ); + char *p = strtok ( ( char * ) str.c_str(), " \t\r\n" ); + if ( !p ) + continue; + p = strtok ( NULL, " \t\r\n" ); + if ( !p ) + continue; + pThis->mXsdFile = wxString::FromUTF8 ( p ); + break; + } + } + + pThis->mDocTypeName = wxString::FromUTF8 ( el ); + + XML_SetElementHandler ( pThis->p, NULL, NULL ); +} + +void XMLCALL XmlTextInfo::defaulthandler + ( void *data + , const XML_Char *s + , int len + ) +{ + XmlTextInfo *pThis = (XmlTextInfo *)data; + const char *p = s; + const char *end = s + len; + while ( p < end && *p != '\r' ) + p++; + if ( p < end ) + { + if ( p + 1 < end && p[1] == '\n' ) + pThis->mEOL = _T ( "\r\n" ); + else + pThis->mEOL = _T ( "\n" ); + XML_SetDefaultHandlerExpand ( pThis->p, NULL ); + return; + } + + p = s; + while ( p < end && *p != '\r') + p++; + if ( p < end ) + { + pThis->mEOL = _T ( "\n" ); + XML_SetDefaultHandlerExpand ( pThis->p, NULL ); + } +} diff --git a/src/xmltextinfo.h b/src/xmltextinfo.h new file mode 100644 index 0000000..3749194 --- /dev/null +++ b/src/xmltextinfo.h @@ -0,0 +1,64 @@ +/* + * Copyright 2014 Zane U. Ji. + * + * This file is part of Xml Copy Editor. + * + * Xml Copy Editor is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * Xml Copy Editor is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Xml Copy Editor; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef XMLASSOCIATEINFO_H_ +#define XMLASSOCIATEINFO_H_ + +#include "wrapexpat.h" + +class XmlTextInfo : public WrapExpat +{ +public: + XmlTextInfo + ( const wxString &path + , const char *encoding = NULL + ); + virtual ~XmlTextInfo(); + +private: + static void XMLCALL startdoctypehandler + ( void *userData + , const XML_Char *doctypeName + , const XML_Char *sysid + , const XML_Char *pubid + , int has_internal_subset + ); + static void XMLCALL processinghandler + ( void *data + , const XML_Char *target + , const XML_Char *datastring + ); + static void XMLCALL start + ( void *data + , const XML_Char *el + , const XML_Char **attr + ); + static void XMLCALL defaulthandler + ( void *data + , const XML_Char *s + , int len + ); + +public: + wxString mDocTypeName; + wxString mDtdFile, mXsdFile, mXslFile; + wxString mEOL; +}; + +#endif /* XMLASSOCIATEINFO_H_ */