diff options
author | Laurent Alonso <alonso@loria.fr> | 2011-10-23 21:02:14 +0200 |
---|---|---|
committer | Fridrich Štrba <fridrich.strba@bluewin.ch> | 2011-10-23 21:02:14 +0200 |
commit | 55170dd7a0cfd552a89b4bea6c7f4a9854971161 (patch) | |
tree | 4813a4cb861988fbd35347bff03ca4d68804d562 /writerperfect | |
parent | c77a9254dde41f222bc65af957c91fa5bc166103 (diff) |
Handle styles in a more intelligent way
Diffstat (limited to 'writerperfect')
-rw-r--r-- | writerperfect/StaticLibrary_writerperfect.mk | 1 | ||||
-rw-r--r-- | writerperfect/source/filter/DocumentElement.hxx | 2 | ||||
-rw-r--r-- | writerperfect/source/filter/FilterInternal.hxx | 9 | ||||
-rw-r--r-- | writerperfect/source/filter/FontStyle.cxx | 42 | ||||
-rw-r--r-- | writerperfect/source/filter/FontStyle.hxx | 24 | ||||
-rw-r--r-- | writerperfect/source/filter/InternalHandler.hxx | 2 | ||||
-rw-r--r-- | writerperfect/source/filter/OdgGenerator.cxx | 110 | ||||
-rw-r--r-- | writerperfect/source/filter/OdgGenerator.hxx | 1 | ||||
-rw-r--r-- | writerperfect/source/filter/OdtGenerator.cxx | 277 | ||||
-rw-r--r-- | writerperfect/source/filter/Style.hxx | 22 | ||||
-rw-r--r-- | writerperfect/source/filter/TextRunStyle.cxx | 107 | ||||
-rw-r--r-- | writerperfect/source/filter/TextRunStyle.hxx | 49 | ||||
-rw-r--r-- | writerperfect/source/filter/libwriterperfect_filter.cxx | 47 | ||||
-rw-r--r-- | writerperfect/source/filter/libwriterperfect_filter.hxx | 48 |
14 files changed, 411 insertions, 330 deletions
diff --git a/writerperfect/StaticLibrary_writerperfect.mk b/writerperfect/StaticLibrary_writerperfect.mk index 67e6afc2e6cd..2569cba96ae1 100644 --- a/writerperfect/StaticLibrary_writerperfect.mk +++ b/writerperfect/StaticLibrary_writerperfect.mk @@ -55,6 +55,7 @@ $(eval $(call gb_StaticLibrary_add_exception_objects,writerperfect,\ writerperfect/source/filter/SectionStyle \ writerperfect/source/filter/TableStyle \ writerperfect/source/filter/TextRunStyle \ + writerperfect/source/filter/libwriterperfect_filter \ writerperfect/source/stream/WPXSvStream \ )) diff --git a/writerperfect/source/filter/DocumentElement.hxx b/writerperfect/source/filter/DocumentElement.hxx index b191de50b678..f56cfb25772a 100644 --- a/writerperfect/source/filter/DocumentElement.hxx +++ b/writerperfect/source/filter/DocumentElement.hxx @@ -57,7 +57,7 @@ private: class TagOpenElement : public TagElement { public: - TagOpenElement(const WPXString &szTagName) : TagElement(szTagName) {} + TagOpenElement(const WPXString &szTagName) : TagElement(szTagName), maAttrList() {} virtual ~TagOpenElement() {} void addAttribute(const WPXString &szAttributeName, const WPXString &sAttributeValue); virtual void write(OdfDocumentHandler *pHandler) const; diff --git a/writerperfect/source/filter/FilterInternal.hxx b/writerperfect/source/filter/FilterInternal.hxx index 04a0561a25b1..eb8c6e6a879a 100644 --- a/writerperfect/source/filter/FilterInternal.hxx +++ b/writerperfect/source/filter/FilterInternal.hxx @@ -30,20 +30,11 @@ #define WRITER_DEBUG_MSG(M) #endif #include <libwpd/libwpd.h> -#include <string.h> // for strcmp const double fDefaultSideMargin = 1.0; // inches const double fDefaultPageWidth = 8.5f; // inches (OOo required default: we will handle this later) const double fDefaultPageHeight = 11.0; // inches -struct ltstr -{ - bool operator()(const WPXString & s1, const WPXString & s2) const - { - return strcmp(s1.cstr(), s2.cstr()) < 0; - } -}; - #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerperfect/source/filter/FontStyle.cxx b/writerperfect/source/filter/FontStyle.cxx index e9a5be195d84..a3f0ef7e8fd7 100644 --- a/writerperfect/source/filter/FontStyle.cxx +++ b/writerperfect/source/filter/FontStyle.cxx @@ -44,10 +44,50 @@ void FontStyle::write(OdfDocumentHandler *pHandler) const TagOpenElement styleOpen("style:font-face"); styleOpen.addAttribute("style:name", getName()); styleOpen.addAttribute("svg:font-family", msFontFamily); -// styleOpen.addAttribute("style:font-pitch", msFontPitch); styleOpen.write(pHandler); TagCloseElement styleClose("style:font-face"); styleClose.write(pHandler); } +//////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////// +void FontStyleManager::clean() +{ + for (std::map<WPXString, FontStyle *, ltstr>::iterator iter = mHash.begin(); + iter != mHash.end(); iter++) { + delete(iter->second); + } + mHash.clear(); +} + +void FontStyleManager::writeFontsDeclaration(OdfDocumentHandler *pHandler) const +{ + TagOpenElement("office:font-face-decls").write(pHandler); + for (std::map<WPXString, FontStyle *, ltstr>::const_iterator iter = mHash.begin(); + iter != mHash.end(); iter++) + { + (iter->second)->write(pHandler); + } + + TagOpenElement symbolFontOpen("style:font-face"); + symbolFontOpen.addAttribute("style:name", "StarSymbol"); + symbolFontOpen.addAttribute("svg:font-family", "StarSymbol"); + symbolFontOpen.addAttribute("style:font-charset", "x-symbol"); + symbolFontOpen.write(pHandler); + pHandler->endElement("style:font-face"); + + pHandler->endElement("office:font-face-decls"); +} + +WPXString FontStyleManager::findOrAdd(const char *psFontFamily) +{ + std::map<WPXString, FontStyle *, ltstr>::const_iterator iter = mHash.find(psFontFamily); + if (iter!=mHash.end()) return iter->second->getName(); + + // ok create a new font + mHash[psFontFamily] = new FontStyle(psFontFamily, psFontFamily); + return psFontFamily; +} + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerperfect/source/filter/FontStyle.hxx b/writerperfect/source/filter/FontStyle.hxx index c146eed9acc2..129846ef9e35 100644 --- a/writerperfect/source/filter/FontStyle.hxx +++ b/writerperfect/source/filter/FontStyle.hxx @@ -27,6 +27,8 @@ */ #ifndef _FONTSTYLE_H #define _FONTSTYLE_H +#include <map> + #include <libwpd/libwpd.h> #include "Style.hxx" @@ -44,6 +46,28 @@ private: WPXString msFontFamily; WPXString msFontPitch; }; + +class FontStyleManager : public StyleManager +{ +public: + FontStyleManager() : mHash() {} + virtual ~FontStyleManager() { FontStyleManager::clean(); } + + /* create a new font if the font does not exists and returns a font name + + Note: the returned font name is actually equalled to psFontFamily + */ + WPXString findOrAdd(const char *psFontFamily); + + virtual void clean(); + virtual void write(OdfDocumentHandler *) const {} + virtual void writeFontsDeclaration(OdfDocumentHandler *) const; + + +protected: + std::map<WPXString, FontStyle *, ltstr> mHash; +}; + #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerperfect/source/filter/InternalHandler.hxx b/writerperfect/source/filter/InternalHandler.hxx index dde0c7679991..f2255966f2d2 100644 --- a/writerperfect/source/filter/InternalHandler.hxx +++ b/writerperfect/source/filter/InternalHandler.hxx @@ -42,6 +42,8 @@ public: void endElement(const char *psName); void characters(const WPXString &sCharacters); private: + InternalHandler(InternalHandler const &orig) : mpElements(0) { *this = orig; } + InternalHandler &operator=(InternalHandler const &) { mpElements=0L; return *this; } std::vector<DocumentElement *> *mpElements; }; #endif diff --git a/writerperfect/source/filter/OdgGenerator.cxx b/writerperfect/source/filter/OdgGenerator.cxx index 56a9c6ba2729..79653fa98c3a 100644 --- a/writerperfect/source/filter/OdgGenerator.cxx +++ b/writerperfect/source/filter/OdgGenerator.cxx @@ -25,6 +25,8 @@ * Corel Corporation or Corel Corporation Limited." */ +#include "libwriterperfect_filter.hxx" + #include "OdgGenerator.hxx" #include "DocumentElement.hxx" #include "OdfDocumentHandler.hxx" @@ -254,13 +256,13 @@ public: std::vector<DocumentElement *> mPageMasterStyles; // paragraph styles - std::map<WPXString, ParagraphStyle *, ltstr> mParagraphStyles; + ParagraphStyleManager mParagraphManager; // span styles - std::map<WPXString, SpanStyle *, ltstr> mSpanStyles; + SpanStyleManager mSpanManager; // font styles - std::map<WPXString, FontStyle *, ltstr> mFontStyles; + FontStyleManager mFontManager; OdfDocumentHandler *mpHandler; @@ -287,10 +289,11 @@ OdgGeneratorPrivate::OdgGeneratorPrivate(OdfDocumentHandler *pHandler, const Odf mGraphicsAutomaticStyles(), mPageAutomaticStyles(), mPageMasterStyles(), - mParagraphStyles(), - mSpanStyles(), - mFontStyles(), + mParagraphManager(), + mSpanManager(), + mFontManager(), mpHandler(pHandler), + mxStyle(), mxGradient(), miGradientIndex(1), miDashIndex(1), miGraphicsStyleIndex(1), @@ -345,23 +348,9 @@ OdgGeneratorPrivate::~OdgGeneratorPrivate() delete((*iterPageMasterStyles)); } - for (std::map<WPXString, ParagraphStyle*, ltstr>::iterator iterParagraphStyles = mParagraphStyles.begin(); - iterParagraphStyles != mParagraphStyles.end(); ++iterParagraphStyles) - { - delete(iterParagraphStyles->second); - } - - for (std::map<WPXString, SpanStyle*, ltstr>::iterator iterSpanStyles = mSpanStyles.begin(); - iterSpanStyles != mSpanStyles.end(); ++iterSpanStyles) - { - delete(iterSpanStyles->second); - } - - for (std::map<WPXString, FontStyle *, ltstr>::iterator iterFont = mFontStyles.begin(); - iterFont != mFontStyles.end(); ++iterFont) - { - delete(iterFont->second); - } + mParagraphManager.clean(); + mSpanManager.clean(); + mFontManager.clean(); } @@ -456,22 +445,7 @@ OdgGenerator::~OdgGenerator() if ((mpImpl->mxStreamType == ODF_FLAT_XML) || (mpImpl->mxStreamType == ODF_CONTENT_XML) || (mpImpl->mxStreamType == ODF_STYLES_XML)) { - TagOpenElement("office:font-face-decls").write(mpImpl->mpHandler); - - for (std::map<WPXString, FontStyle *, ltstr>::iterator iterFont = mpImpl->mFontStyles.begin(); - iterFont != mpImpl->mFontStyles.end(); ++iterFont) - { - iterFont->second->write(mpImpl->mpHandler); - } - - TagOpenElement symbolFontOpen("style:font-face"); - symbolFontOpen.addAttribute("style:name", "StarSymbol"); - symbolFontOpen.addAttribute("svg:font-family", "StarSymbol"); - symbolFontOpen.addAttribute("style:font-charset", "x-symbol"); - symbolFontOpen.write(mpImpl->mpHandler); - TagCloseElement("style:font-face").write(mpImpl->mpHandler); - - TagCloseElement("office:font-face-decls").write(mpImpl->mpHandler); + mpImpl->mFontManager.writeFontsDeclaration(mpImpl->mpHandler); TagOpenElement("office:automatic-styles").write(mpImpl->mpHandler); } @@ -484,16 +458,8 @@ OdgGenerator::~OdgGenerator() { (*iterGraphicsAutomaticStyles)->write(mpImpl->mpHandler); } - for (std::map<WPXString, ParagraphStyle*, ltstr>::iterator iterParagraphStyles = mpImpl->mParagraphStyles.begin(); - iterParagraphStyles != mpImpl->mParagraphStyles.end(); ++iterParagraphStyles) - { - (iterParagraphStyles->second)->write(mpImpl->mpHandler); - } - for (std::map<WPXString, SpanStyle*, ltstr>::iterator iterSpanStyles = mpImpl->mSpanStyles.begin(); - iterSpanStyles != mpImpl->mSpanStyles.end(); ++iterSpanStyles) - { - (iterSpanStyles->second)->write(mpImpl->mpHandler); - } + mpImpl->mParagraphManager.write(mpImpl->mpHandler); + mpImpl->mSpanManager.write(mpImpl->mpHandler); } #ifdef MULTIPAGE_WORKAROUND if ((mpImpl->mxStreamType == ODF_FLAT_XML) || (mpImpl->mxStreamType == ODF_STYLES_XML)) @@ -1369,31 +1335,14 @@ void OdgGenerator::endTextObject() void OdgGenerator::startTextLine(WPXPropertyList const &propList) { - WPXPropertyList *pPersistPropList = new WPXPropertyList(propList); - ParagraphStyle *pStyle = 0; - - WPXString sKey = propListToStyleKey(*pPersistPropList); - - pPersistPropList->insert("style:parent-style-name", "Standard"); + WPXPropertyList finalPropList(propList); + finalPropList.insert("style:parent-style-name", "Standard"); + WPXString paragName = mpImpl->mParagraphManager.findOrAdd(finalPropList, WPXPropertyListVector()); - if (mpImpl->mParagraphStyles.find(sKey) == mpImpl->mParagraphStyles.end()) - { - WPXString sName; - sName.sprintf("S%i", mpImpl->mParagraphStyles.size()); - - pStyle = new ParagraphStyle(pPersistPropList, WPXPropertyListVector(), sName); - - mpImpl->mParagraphStyles[sKey] = pStyle; - } - else - { - pStyle = mpImpl->mParagraphStyles[sKey]; - delete pPersistPropList; - } // create a document element corresponding to the paragraph, and append it to our list of document elements TagOpenElement *pParagraphOpenElement = new TagOpenElement("text:p"); - pParagraphOpenElement->addAttribute("text:style-name", pStyle->getName()); + pParagraphOpenElement->addAttribute("text:style-name", paragName); mpImpl->mBodyElements.push_back(pParagraphOpenElement); } @@ -1405,26 +1354,9 @@ void OdgGenerator::endTextLine() void OdgGenerator::startTextSpan(WPXPropertyList const&propList) { if (propList["style:font-name"]) - { - WPXString sFontName = propList["style:font-name"]->getStr(); - if (mpImpl->mFontStyles.find(sFontName) == mpImpl->mFontStyles.end()) - mpImpl->mFontStyles[sFontName] = new FontStyle(sFontName.cstr(), sFontName.cstr()); - } + mpImpl->mFontManager.findOrAdd(propList["style:font-name"]->getStr().cstr()); - WPXString sName; - WPXString sSpanHashKey = propListToStyleKey(propList); - if (mpImpl->mSpanStyles.find(sSpanHashKey) == mpImpl->mSpanStyles.end()) - { - // allocate a new paragraph style - sName.sprintf("Span%i", mpImpl->mSpanStyles.size()); - SpanStyle *pStyle = new SpanStyle(sName.cstr(), propList); - - mpImpl->mSpanStyles[sSpanHashKey] = pStyle; - } - else - { - sName.sprintf("%s", mpImpl->mSpanStyles.find(sSpanHashKey)->second->getName().cstr()); - } + WPXString sName = mpImpl->mSpanManager.findOrAdd(propList); TagOpenElement *pSpanOpenElement = new TagOpenElement("text:span"); pSpanOpenElement->addAttribute("text:style-name", sName.cstr()); diff --git a/writerperfect/source/filter/OdgGenerator.hxx b/writerperfect/source/filter/OdgGenerator.hxx index 55d8eea77d9a..fb3ca5ee2359 100644 --- a/writerperfect/source/filter/OdgGenerator.hxx +++ b/writerperfect/source/filter/OdgGenerator.hxx @@ -28,6 +28,7 @@ #include <libwpd/libwpd.h> #include <libwpg/libwpg.h> + #include "OdfDocumentHandler.hxx" class OdgGeneratorPrivate; diff --git a/writerperfect/source/filter/OdtGenerator.cxx b/writerperfect/source/filter/OdtGenerator.cxx index 008871a358fa..e681a395ba7c 100644 --- a/writerperfect/source/filter/OdtGenerator.cxx +++ b/writerperfect/source/filter/OdtGenerator.cxx @@ -35,6 +35,7 @@ #include <stack> #include <string> +#include "libwriterperfect_filter.hxx" #include "OdtGenerator.hxx" #include "DocumentElement.hxx" #include "TextRunStyle.hxx" @@ -110,14 +111,11 @@ class OdtGeneratorPrivate public: OdtGeneratorPrivate(OdfDocumentHandler *pHandler, const OdfStreamType streamType); ~OdtGeneratorPrivate(); - void _resetDocumentState(); - bool _parseSourceDocument(WPXInputStream &input, const char *password); bool _writeTargetDocument(OdfDocumentHandler *pHandler); void _writeBegin(); void _writeDefaultStyles(OdfDocumentHandler *pHandler); void _writeMasterPages(OdfDocumentHandler *pHandler); void _writePageLayouts(OdfDocumentHandler *pHandler); - void _allocateFontName(const WPXString &); void _openListLevel(TagOpenElement *pListLevelOpenElement); void _closeListLevel(); @@ -133,20 +131,16 @@ public: std::stack<WriterListState> mWriterListStates; // paragraph styles - std::map<WPXString, ParagraphStyle *, ltstr> mTextStyleHash; + ParagraphStyleManager mParagraphManager; // span styles - std::map<WPXString, SpanStyle *, ltstr> mSpanStyleHash; + SpanStyleManager mSpanManager; // font styles - std::map<WPXString, FontStyle *, ltstr> mFontHash; - - // embedded object handlers - std::map<WPXString, OdfEmbeddedObject, ltstr > mObjectHandlers; + FontStyleManager mFontManager; // section styles std::vector<SectionStyle *> mSectionStyles; - double mfSectionSpaceAfter; // table styles std::vector<TableStyle *> mTableStyles; @@ -156,14 +150,15 @@ public: std::vector<DocumentElement *> mFrameAutomaticStyles; + // embedded object handlers + std::map<WPXString, OdfEmbeddedObject, ltstr > mObjectHandlers; + // metadata std::vector<DocumentElement *> mMetaData; // list styles unsigned int miNumListStyles; - // style elements - std::vector<DocumentElement *> mStylesElements; // content elements std::vector<DocumentElement *> mBodyElements; // the current set of elements that we're writing to @@ -190,20 +185,25 @@ public: }; OdtGeneratorPrivate::OdtGeneratorPrivate(OdfDocumentHandler *pHandler, const OdfStreamType streamType) : - mpInput(NULL), + mpInput(0), mpHandler(pHandler), mbUsed(false), mWriterDocumentStates(), mWriterListStates(), - mfSectionSpaceAfter(0.0), + mParagraphManager(), mSpanManager(), mFontManager(), + mSectionStyles(), mTableStyles(), mFrameStyles(), mFrameAutomaticStyles(), + mObjectHandlers(), mMetaData(), miNumListStyles(0), + mBodyElements(), mpCurrentContentElements(&mBodyElements), - mpCurrentPageSpan(NULL), + mPageSpans(), + mpCurrentPageSpan(0), miNumPageStyles(0), + mListStyles(), miObjectNumber(0), - mpCurrentTableStyle(NULL), + mpCurrentTableStyle(0), mxStreamType(streamType), - mpPassword(NULL) + mpPassword(0) { mWriterDocumentStates.push(WriterDocumentState()); mWriterListStates.push(WriterListState()); @@ -215,61 +215,42 @@ OdtGeneratorPrivate::~OdtGeneratorPrivate() WRITER_DEBUG_MSG(("WriterWordPerfect: Cleaning up our mess..\n")); WRITER_DEBUG_MSG(("Destroying the body elements\n")); - for (std::vector<DocumentElement *>::iterator iterBody = mBodyElements.begin(); iterBody != mBodyElements.end(); ++iterBody) { + for (std::vector<DocumentElement *>::iterator iterBody = mBodyElements.begin(); iterBody != mBodyElements.end(); iterBody++) { delete (*iterBody); - (*iterBody) = NULL; - } - - WRITER_DEBUG_MSG(("Destroying the styles elements\n")); - for (std::vector<DocumentElement *>::iterator iterStyles = mStylesElements.begin(); iterStyles != mStylesElements.end(); ++iterStyles) { - delete (*iterStyles); - (*iterStyles) = NULL; // we may pass over the same element again (in the case of headers/footers spanning multiple pages) - // so make sure we don't do a double del - } - - WRITER_DEBUG_MSG(("Destroying the rest of the styles elements\n")); - for (std::map<WPXString, ParagraphStyle *, ltstr>::iterator iterTextStyle = mTextStyleHash.begin(); - iterTextStyle != mTextStyleHash.end(); ++iterTextStyle) { - delete (iterTextStyle->second); + (*iterBody) = 0; } - for (std::map<WPXString, SpanStyle *, ltstr>::iterator iterSpanStyle = mSpanStyleHash.begin(); - iterSpanStyle != mSpanStyleHash.end(); ++iterSpanStyle) { - delete(iterSpanStyle->second); - } - - for (std::map<WPXString, FontStyle *, ltstr>::iterator iterFont = mFontHash.begin(); - iterFont != mFontHash.end(); ++iterFont) { - delete(iterFont->second); - } + mParagraphManager.clean(); + mSpanManager.clean(); + mFontManager.clean(); for (std::vector<ListStyle *>::iterator iterListStyles = mListStyles.begin(); - iterListStyles != mListStyles.end(); ++iterListStyles) { + iterListStyles != mListStyles.end(); iterListStyles++) { delete(*iterListStyles); } for (std::vector<SectionStyle *>::iterator iterSectionStyles = mSectionStyles.begin(); - iterSectionStyles != mSectionStyles.end(); ++iterSectionStyles) { + iterSectionStyles != mSectionStyles.end(); iterSectionStyles++) { delete(*iterSectionStyles); } for (std::vector<TableStyle *>::iterator iterTableStyles = mTableStyles.begin(); - iterTableStyles != mTableStyles.end(); ++iterTableStyles) { + iterTableStyles != mTableStyles.end(); iterTableStyles++) { delete((*iterTableStyles)); } for (std::vector<PageSpan *>::iterator iterPageSpans = mPageSpans.begin(); - iterPageSpans != mPageSpans.end(); ++iterPageSpans) { + iterPageSpans != mPageSpans.end(); iterPageSpans++) { delete(*iterPageSpans); } for (std::vector<DocumentElement *>::iterator iterFrameStyles = mFrameStyles.begin(); - iterFrameStyles != mFrameStyles.end(); ++iterFrameStyles) { + iterFrameStyles != mFrameStyles.end(); iterFrameStyles++) { delete(*iterFrameStyles); } for (std::vector<DocumentElement *>::iterator iterFrameAutomaticStyles = mFrameAutomaticStyles.begin(); - iterFrameAutomaticStyles != mFrameAutomaticStyles.end(); ++iterFrameAutomaticStyles) { + iterFrameAutomaticStyles != mFrameAutomaticStyles.end(); iterFrameAutomaticStyles++) { delete(*iterFrameAutomaticStyles); } for (std::vector<DocumentElement *>::iterator iterMetaData = mMetaData.begin(); - iterMetaData != mMetaData.end(); ++iterMetaData) { + iterMetaData != mMetaData.end(); iterMetaData++) { delete(*iterMetaData); } } @@ -411,7 +392,7 @@ bool OdtGeneratorPrivate::_writeTargetDocument(OdfDocumentHandler *pHandler) docContentPropList.insert("xmlns:draw", "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"); docContentPropList.insert("xmlns:fo", "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"); docContentPropList.insert("xmlns:xlink", "http://www.w3.org/1999/xlink"); - docContentPropList.insert("xmlns:number", "http://openoffice.org/2000/datastyle"); + docContentPropList.insert("xmlns:number", "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"); docContentPropList.insert("xmlns:svg", "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"); docContentPropList.insert("xmlns:chart", "urn:oasis:names:tc:opendocument:xmlns:chart:1.0"); docContentPropList.insert("xmlns:dr3d", "urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"); @@ -435,21 +416,9 @@ bool OdtGeneratorPrivate::_writeTargetDocument(OdfDocumentHandler *pHandler) } mpHandler->endElement("office:meta"); - // write out the font styles - TagOpenElement("office:font-face-decls").write(mpHandler); - for (std::map<WPXString, FontStyle *, ltstr>::iterator iterFont = mFontHash.begin(); iterFont != mFontHash.end(); ++iterFont) { - iterFont->second->write(mpHandler); - } - TagOpenElement symbolFontOpen("style:font-face"); - symbolFontOpen.addAttribute("style:name", "StarSymbol"); - symbolFontOpen.addAttribute("svg:font-family", "StarSymbol"); - symbolFontOpen.addAttribute("style:font-charset", "x-symbol"); - symbolFontOpen.write(mpHandler); - mpHandler->endElement("style:font-face"); - - mpHandler->endElement("office:font-face-decls"); + mFontManager.writeFontsDeclaration(mpHandler); - WRITER_DEBUG_MSG(("WriterWordPerfect: Document Body: Writing out the styles..\n")); + WRITER_DEBUG_MSG(("WriterWordPerfect: Document Body: Writing out the styles..\n")); // write default styles _writeDefaultStyles(mpHandler); @@ -462,23 +431,9 @@ bool OdtGeneratorPrivate::_writeTargetDocument(OdfDocumentHandler *pHandler) (*iterFrameAutomaticStyles)->write(pHandler); } - for (std::map<WPXString, ParagraphStyle *, ltstr>::const_iterator iterTextStyle = mTextStyleHash.begin(); - iterTextStyle != mTextStyleHash.end(); ++iterTextStyle) - { - // writing out the paragraph styles - if (strcmp((iterTextStyle->second)->getName().cstr(), "Standard")) - { - // don't write standard paragraph "no styles" style - (iterTextStyle->second)->write(pHandler); - } - } - - // span styles.. - for (std::map<WPXString, SpanStyle *, ltstr>::const_iterator iterSpanStyle = mSpanStyleHash.begin(); - iterSpanStyle != mSpanStyleHash.end(); ++iterSpanStyle) - { - (iterSpanStyle->second)->write(pHandler); - } + mFontManager.write(pHandler); // do nothing + mParagraphManager.write(pHandler); + mSpanManager.write(pHandler); // writing out the sections styles for (std::vector<SectionStyle *>::const_iterator iterSectionStyles = mSectionStyles.begin(); iterSectionStyles != mSectionStyles.end(); ++iterSectionStyles) { @@ -526,16 +481,6 @@ bool OdtGeneratorPrivate::_writeTargetDocument(OdfDocumentHandler *pHandler) } -// _allocateFontName: add a (potentially mapped) font style to the hash if it's not already there, do nothing otherwise -void OdtGeneratorPrivate::_allocateFontName(const WPXString & sFontName) -{ - if (mFontHash.find(sFontName) == mFontHash.end()) - { - FontStyle *pFontStyle = new FontStyle(sFontName.cstr(), sFontName.cstr()); - mFontHash[sFontName] = pFontStyle; - } -} - void OdtGenerator::setDocumentMetaData(const WPXPropertyList &propList) { WPXPropertyList::Iter i(propList); @@ -602,18 +547,19 @@ void OdtGenerator::openSection(const WPXPropertyList &propList, const WPXPropert int iNumColumns = columns.count(); double fSectionMarginLeft = 0.0; double fSectionMarginRight = 0.0; + double fSectionSpaceAfter = 0.0; if (propList["fo:margin-left"]) fSectionMarginLeft = propList["fo:margin-left"]->getDouble(); if (propList["fo:margin-right"]) fSectionMarginRight = propList["fo:margin-right"]->getDouble(); - - if (iNumColumns > 1 || fSectionMarginLeft != 0 || fSectionMarginRight != 0) - { if (propList["fo:margin-bottom"]) - mpImpl->mfSectionSpaceAfter = propList["fo:margin-bottom"]->getDouble(); + fSectionSpaceAfter = propList["fo:margin-bottom"]->getDouble(); else if (propList["libwpd:margin-bottom"]) - mpImpl->mfSectionSpaceAfter = propList["libwpd:margin-bottom"]->getDouble(); + fSectionSpaceAfter = propList["libwpd:margin-bottom"]->getDouble(); + + if (iNumColumns > 1 || fSectionMarginLeft != 0 || fSectionMarginRight != 0) + { WPXString sSectionName; sSectionName.sprintf("Section%i", mpImpl->mSectionStyles.size()); @@ -635,24 +581,6 @@ void OdtGenerator::closeSection() mpImpl->mpCurrentContentElements->push_back(new TagCloseElement("text:section")); else mpImpl->mWriterDocumentStates.top().mbInFakeSection = false; - - mpImpl->mfSectionSpaceAfter = 0.0; -} - -static WPXString getParagraphStyleKey(const WPXPropertyList & xPropList, const WPXPropertyListVector & xTabStops) -{ - WPXString sKey = propListToStyleKey(xPropList); - - WPXString sTabStops; - sTabStops.sprintf("[num-tab-stops:%i]", xTabStops.count()); - WPXPropertyListVector::Iter i(xTabStops); - for (i.rewind(); i.next();) - { - sTabStops.append(propListToStyleKey(i())); - } - sKey.append(sTabStops); - - return sKey; } void OdtGenerator::openParagraph(const WPXPropertyList &propList, const WPXPropertyListVector &tabStops) @@ -660,67 +588,31 @@ void OdtGenerator::openParagraph(const WPXPropertyList &propList, const WPXPrope // FIXMENOW: What happens if we open a footnote inside a table? do we then inherit the footnote's style // from "Table Contents" - WPXPropertyList *pPersistPropList = new WPXPropertyList(propList); - ParagraphStyle *pStyle = NULL; - - if (mpImpl->mWriterDocumentStates.top().mbFirstElement && mpImpl->mpCurrentContentElements == &(mpImpl->mBodyElements)) + WPXPropertyList finalPropList(propList); + if (mpImpl->mWriterDocumentStates.top().mbFirstParagraphInPageSpan && mpImpl->mpCurrentContentElements == &(mpImpl->mBodyElements)) { - // we don't have to go through the fuss of determining if the paragraph style is - // unique in this case, because if we are the first document element, then we - // are singular. Neither do we have to determine what our parent style is-- we can't - // be inside a table in this case (the table would be the first document element - //in that case) - pPersistPropList->insert("style:parent-style-name", "Standard"); - WPXString sName; - sName.sprintf("FS"); - - WPXString sParagraphHashKey("P|FS"); - pPersistPropList->insert("style:master-page-name", "Page_Style_1"); - pStyle = new ParagraphStyle(pPersistPropList, tabStops, sName); - mpImpl->mTextStyleHash[sParagraphHashKey] = pStyle; + WPXString sPageStyleName; + sPageStyleName.sprintf("Page_Style_%i", mpImpl->miNumPageStyles); + finalPropList.insert("style:master-page-name", sPageStyleName); mpImpl->mWriterDocumentStates.top().mbFirstElement = false; mpImpl->mWriterDocumentStates.top().mbFirstParagraphInPageSpan = false; - } - else - { - if (mpImpl->mWriterDocumentStates.top().mbFirstParagraphInPageSpan && mpImpl->mpCurrentContentElements == &(mpImpl->mBodyElements)) - { - WPXString sPageStyleName; - sPageStyleName.sprintf("Page_Style_%i", mpImpl->miNumPageStyles); - pPersistPropList->insert("style:master-page-name", sPageStyleName); - mpImpl->mWriterDocumentStates.top().mbFirstParagraphInPageSpan = false; - } + } - if (mpImpl->mWriterDocumentStates.top().mbTableCellOpened) - { - if (mpImpl->mWriterDocumentStates.top().mbHeaderRow) - pPersistPropList->insert("style:parent-style-name", "Table_Heading"); - else - pPersistPropList->insert("style:parent-style-name", "Table_Contents"); - } + if (mpImpl->mWriterDocumentStates.top().mbTableCellOpened) + { + if (mpImpl->mWriterDocumentStates.top().mbHeaderRow) + finalPropList.insert("style:parent-style-name", "Table_Heading"); else - pPersistPropList->insert("style:parent-style-name", "Standard"); - - WPXString sKey = getParagraphStyleKey(*pPersistPropList, tabStops); - - if (mpImpl->mTextStyleHash.find(sKey) == mpImpl->mTextStyleHash.end()) - { - WPXString sName; - sName.sprintf("S%i", mpImpl->mTextStyleHash.size()); + finalPropList.insert("style:parent-style-name", "Table_Contents"); + } + else + finalPropList.insert("style:parent-style-name", "Standard"); - pStyle = new ParagraphStyle(pPersistPropList, tabStops, sName); + WPXString sName = mpImpl->mParagraphManager.findOrAdd(finalPropList, tabStops); - mpImpl->mTextStyleHash[sKey] = pStyle; - } - else - { - pStyle = mpImpl->mTextStyleHash[sKey]; - delete pPersistPropList; - } - } // create a document element corresponding to the paragraph, and append it to our list of document elements TagOpenElement *pParagraphOpenElement = new TagOpenElement("text:p"); - pParagraphOpenElement->addAttribute("text:style-name", pStyle->getName()); + pParagraphOpenElement->addAttribute("text:style-name", sName); mpImpl->mpCurrentContentElements->push_back(pParagraphOpenElement); } @@ -732,24 +624,10 @@ void OdtGenerator::closeParagraph() void OdtGenerator::openSpan(const WPXPropertyList &propList) { if (propList["style:font-name"]) - mpImpl->_allocateFontName(propList["style:font-name"]->getStr()); - WPXString sSpanHashKey = propListToStyleKey(propList); - WRITER_DEBUG_MSG(("WriterWordPerfect: Span Hash Key: %s\n", sSpanHashKey.cstr())); + mpImpl->mFontManager.findOrAdd(propList["style:font-name"]->getStr().cstr()); // Get the style - WPXString sName; - if (mpImpl->mSpanStyleHash.find(sSpanHashKey) == mpImpl->mSpanStyleHash.end()) - { - // allocate a new paragraph style - sName.sprintf("Span%i", mpImpl->mSpanStyleHash.size()); - SpanStyle *pStyle = new SpanStyle(sName.cstr(), propList); - - mpImpl->mSpanStyleHash[sSpanHashKey] = pStyle; - } - else - { - sName.sprintf("%s", mpImpl->mSpanStyleHash.find(sSpanHashKey)->second->getName().cstr()); - } + WPXString sName = mpImpl->mSpanManager.findOrAdd(propList); // create a document element corresponding to the paragraph, and append it to our list of document elements TagOpenElement *pSpanOpenElement = new TagOpenElement("text:span"); @@ -778,7 +656,7 @@ void OdtGenerator::defineOrderedListLevel(const WPXPropertyList &propList) // is starting a new list at level 1 (and only level 1) if (pOrderedListStyle == NULL || pOrderedListStyle->getListID() != id || (propList["libwpd:level"] && propList["libwpd:level"]->getInt()==1 && - (propList["text:start-value"] && static_cast<unsigned>(propList["text:start-value"]->getInt()) != (mpImpl->mWriterListStates.top().miLastListNumber+1)))) + (propList["text:start-value"] && static_cast<unsigned>(propList["text:start-value"]->getInt()) != int(mpImpl->mWriterListStates.top().miLastListNumber+1)))) { WRITER_DEBUG_MSG(("Attempting to create a new ordered list style (listid: %i)\n", id)); WPXString sName; @@ -914,36 +792,21 @@ void OdtGenerator::openListElement(const WPXPropertyList &propList, const WPXPro mpImpl->mWriterListStates.top().mbListElementOpened.top() = false; } - ParagraphStyle *pStyle = NULL; - - WPXPropertyList *pPersistPropList = new WPXPropertyList(propList); - pPersistPropList->insert("style:list-style-name", mpImpl->mWriterListStates.top().mpCurrentListStyle->getName()); - pPersistPropList->insert("style:parent-style-name", "Standard"); - - WPXString sKey = getParagraphStyleKey(*pPersistPropList, tabStops); - - if (mpImpl->mTextStyleHash.find(sKey) == mpImpl->mTextStyleHash.end()) - { - WPXString sName; - sName.sprintf("S%i", mpImpl->mTextStyleHash.size()); - - pStyle = new ParagraphStyle(pPersistPropList, tabStops, sName); - - mpImpl->mTextStyleHash[sKey] = pStyle; - } - else - { - pStyle = mpImpl->mTextStyleHash[sKey]; - delete pPersistPropList; - } + WPXPropertyList finalPropList(propList); +#if 0 + // this property is ignored in TextRunStyle.c++ + finalPropList.insert("style:list-style-name", mpImpl->mWriterListStates.top().mpCurrentListStyle->getName()); +#endif + finalPropList.insert("style:parent-style-name", "Standard"); + WPXString paragName = mpImpl->mParagraphManager.findOrAdd(finalPropList, tabStops); mpImpl->mpCurrentContentElements->push_back(new TagOpenElement("text:list-item")); - TagOpenElement *pOpenListElementParagraph = new TagOpenElement("text:p"); - pOpenListElementParagraph->addAttribute("text:style-name", pStyle->getName()); + TagOpenElement *pOpenListElementParagraph = new TagOpenElement("text:p"); + pOpenListElementParagraph->addAttribute("text:style-name", paragName); mpImpl->mpCurrentContentElements->push_back(pOpenListElementParagraph); - if (mpImpl->mpCurrentContentElements == &(mpImpl->mBodyElements)) + if (mpImpl->mpCurrentContentElements == &(mpImpl->mBodyElements)) mpImpl->mWriterDocumentStates.top().mbFirstParagraphInPageSpan = false; mpImpl->mWriterListStates.top().mbListElementOpened.top() = true; diff --git a/writerperfect/source/filter/Style.hxx b/writerperfect/source/filter/Style.hxx index 4d4177667944..83fb2b510d9d 100644 --- a/writerperfect/source/filter/Style.hxx +++ b/writerperfect/source/filter/Style.hxx @@ -30,6 +30,7 @@ #define _STYLE_H #include <cstdlib> #include <libwpd/libwpd.h> +#include "libwriterperfect_filter.hxx" #include "DocumentElement.hxx" class TopLevelElementStyle @@ -41,21 +42,38 @@ public: const WPXString * getMasterPageName() const { return mpsMasterPageName; } private: + TopLevelElementStyle(TopLevelElementStyle const &orig) : mpsMasterPageName(0) { *this = orig; } + TopLevelElementStyle &operator=(TopLevelElementStyle const &) { mpsMasterPageName=0L; return *this; } WPXString *mpsMasterPageName; }; class Style { - public: +public: Style(const WPXString &psName) : msName(psName) {} virtual ~Style() {} virtual void write(OdfDocumentHandler *) const {}; const WPXString &getName() const { return msName; } - private: +private: WPXString msName; }; + +class StyleManager +{ +public: + StyleManager() {} + virtual ~StyleManager() {} + + virtual void clean() {}; + virtual void write(OdfDocumentHandler *) const = 0; + +private: + // forbide copy constructor/operator + StyleManager(StyleManager const &orig); + StyleManager &operator=(StyleManager const &); +}; #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerperfect/source/filter/TextRunStyle.cxx b/writerperfect/source/filter/TextRunStyle.cxx index c4f9d2558314..6a1eec6de751 100644 --- a/writerperfect/source/filter/TextRunStyle.cxx +++ b/writerperfect/source/filter/TextRunStyle.cxx @@ -39,7 +39,7 @@ #include <string.h> -ParagraphStyle::ParagraphStyle(WPXPropertyList *pPropList, const WPXPropertyListVector &xTabStops, const WPXString &sName) : +ParagraphStyle::ParagraphStyle(WPXPropertyList const &pPropList, const WPXPropertyListVector &xTabStops, const WPXString &sName) : mpPropList(pPropList), mxTabStops(xTabStops), msName(sName) @@ -48,7 +48,6 @@ ParagraphStyle::ParagraphStyle(WPXPropertyList *pPropList, const WPXPropertyList ParagraphStyle::~ParagraphStyle() { - delete mpPropList; } void ParagraphStyle::write(OdfDocumentHandler *pHandler) const @@ -58,14 +57,14 @@ void ParagraphStyle::write(OdfDocumentHandler *pHandler) const WPXPropertyList propList; propList.insert("style:name", msName.cstr()); propList.insert("style:family", "paragraph"); - if ((*mpPropList)["style:parent-style-name"]) - propList.insert("style:parent-style-name", (*mpPropList)["style:parent-style-name"]->getStr()); - if ((*mpPropList)["style:master-page-name"]) - propList.insert("style:master-page-name", (*mpPropList)["style:master-page-name"]->getStr()); + if (mpPropList["style:parent-style-name"]) + propList.insert("style:parent-style-name", mpPropList["style:parent-style-name"]->getStr()); + if (mpPropList["style:master-page-name"]) + propList.insert("style:master-page-name", mpPropList["style:master-page-name"]->getStr()); pHandler->startElement("style:style", propList); propList.clear(); - WPXPropertyList::Iter i((*mpPropList)); + WPXPropertyList::Iter i(mpPropList); for (i.rewind(); i.next(); ) { #if 0 @@ -180,19 +179,91 @@ void SpanStyle::write(OdfDocumentHandler *pHandler) const pHandler->endElement("style:style"); } -WPXString propListToStyleKey(const WPXPropertyList & xPropList) +//////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////// +void ParagraphStyleManager::clean() { - WPXString sKey; - WPXPropertyList::Iter i(xPropList); - for (i.rewind(); i.next(); ) - { - WPXString sProp; - sProp.sprintf("[%s:%s]", i.key(), i()->getStr().cstr()); - sKey.append(sProp); - } - - return sKey; + for (std::map<WPXString, ParagraphStyle *, ltstr>::iterator iter = mHash.begin(); + iter != mHash.end(); iter++) { + delete(iter->second); + } + mHash.clear(); } +void ParagraphStyleManager::write(OdfDocumentHandler *pHandler) const +{ + for (std::map<WPXString, ParagraphStyle *, ltstr>::const_iterator iter = mHash.begin(); + iter != mHash.end(); iter++) + { + if (strcmp(iter->second->getName().cstr(), "Standard") == 0) + continue; + (iter->second)->write(pHandler); + } +} + +WPXString ParagraphStyleManager::getKey(WPXPropertyList const &xPropList, WPXPropertyListVector const &tabStops) const +{ + WPXString sKey = propListToStyleKey(xPropList); + + WPXString sTabStops; + sTabStops.sprintf("[num-tab-stops:%i]", tabStops.count()); + WPXPropertyListVector::Iter i(tabStops); + for (i.rewind(); i.next(); ) + sTabStops.append(propListToStyleKey(i())); + sKey.append(sTabStops); + + return sKey; +} + +WPXString ParagraphStyleManager::findOrAdd (WPXPropertyList const &propList, WPXPropertyListVector const &tabStops) +{ + WPXString hashKey = getKey(propList, tabStops); + std::map<WPXString, ParagraphStyle *, ltstr>::const_iterator iter = mHash.find(hashKey); + if (iter!=mHash.end()) + return iter->second->getName(); + + // ok create a new list + WRITER_DEBUG_MSG(("ParagraphStyleManager::findOrAdd: Paragraph Hash Key: %s\n", hasKey.cstr())); + + WPXString sName; + sName.sprintf("S%i", mHash.size()); + ParagraphStyle *pStyle = new ParagraphStyle(propList, tabStops, sName); + mHash[hashKey] = pStyle; + return sName; +} + +//////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////// +void SpanStyleManager::clean() +{ + for (std::map<WPXString, SpanStyle *, ltstr>::iterator iter = mHash.begin(); + iter != mHash.end(); iter++) + delete(iter->second); + mHash.clear(); +} + +void SpanStyleManager::write(OdfDocumentHandler *pHandler) const +{ + for (std::map<WPXString, SpanStyle *, ltstr>::const_iterator iter = mHash.begin(); + iter != mHash.end(); iter++) + iter->second->write(pHandler); +} + +WPXString SpanStyleManager::findOrAdd(WPXPropertyList const &propList) +{ + WPXString hashKey = propListToStyleKey(propList); + std::map<WPXString, SpanStyle *, ltstr>::const_iterator iter = mHash.find(hashKey); + if (iter!=mHash.end()) + return iter->second->getName(); + + // ok create a new list + WRITER_DEBUG_MSG(("SpanStyleManager::findOrAdd: Span Hash Key: %s\n", hasKey.cstr())); + + WPXString sName; + sName.sprintf("Span%i", mHash.size()); + SpanStyle *pStyle = new SpanStyle(sName.cstr(), propList); + mHash[hashKey] = pStyle; + return sName; +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerperfect/source/filter/TextRunStyle.hxx b/writerperfect/source/filter/TextRunStyle.hxx index 88f47cc756ac..5bd1381ac375 100644 --- a/writerperfect/source/filter/TextRunStyle.hxx +++ b/writerperfect/source/filter/TextRunStyle.hxx @@ -30,6 +30,9 @@ #ifndef _TEXTRUNSTYLE_H #define _TEXTRUNSTYLE_H + +#include <map> + #include <libwpd/libwpd.h> #include "Style.hxx" @@ -41,12 +44,12 @@ class OdfDocumentHandler; class ParagraphStyle { public: - ParagraphStyle(WPXPropertyList *propList, const WPXPropertyListVector &tabStops, const WPXString &sName); + ParagraphStyle(WPXPropertyList const &propList, const WPXPropertyListVector &tabStops, const WPXString &sName); virtual ~ParagraphStyle(); virtual void write(OdfDocumentHandler *pHandler) const; WPXString getName() const { return msName; } private: - WPXPropertyList *mpPropList; + WPXPropertyList mpPropList; WPXPropertyListVector mxTabStops; WPXString msName; }; @@ -62,8 +65,48 @@ private: WPXPropertyList mPropList; }; -WPXString propListToStyleKey(const WPXPropertyList & xPropList); +class ParagraphStyleManager : public StyleManager +{ +public: + ParagraphStyleManager() : mHash() {} + virtual ~ParagraphStyleManager() { ParagraphStyleManager::clean(); } + + /* create a new style if it does not exists. In all case, returns the name of the style + Note: using S%i as new name*/ + WPXString findOrAdd(WPXPropertyList const &xPropList, WPXPropertyListVector const &tabStops); + + virtual void clean(); + virtual void write(OdfDocumentHandler *) const; + + +protected: + // return a unique key + WPXString getKey(WPXPropertyList const &xPropList, WPXPropertyListVector const &tabStops) const; + + // paragraph styles + std::map<WPXString, ParagraphStyle *, ltstr> mHash; +}; + +class SpanStyleManager : public StyleManager +{ +public: + SpanStyleManager() : mHash() {} + virtual ~SpanStyleManager() { SpanStyleManager::clean(); } + + /* create a new style if it does not exists. In all case, returns the name of the style + + Note: using Span%i as new name*/ + WPXString findOrAdd(WPXPropertyList const &xPropList); + + + virtual void clean(); + virtual void write(OdfDocumentHandler *) const; + +protected: + // span styles + std::map<WPXString, SpanStyle *, ltstr> mHash; +}; #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerperfect/source/filter/libwriterperfect_filter.cxx b/writerperfect/source/filter/libwriterperfect_filter.cxx new file mode 100644 index 000000000000..684c034ce416 --- /dev/null +++ b/writerperfect/source/filter/libwriterperfect_filter.cxx @@ -0,0 +1,47 @@ +/* libwriterperfect_filter.hxx: define basic functions for libwriterperfect/fileter + * + * Copyright (C) 2002-2004 William Lachance (wrlach@gmail.com) + * Copyright (C) 2004 Net Integration Technologies, Inc. (http://www.net-itech.com) + * Copyright (C) 2004 Fridrich Strba (fridrich.strba@bluewin.ch) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * For further information visit http://libwpd.sourceforge.net + * + */ + +/* "This product is not manufactured, approved, or supported by + * Corel Corporation or Corel Corporation Limited." + */ + +#include <libwpd/WPXPropertyList.h> + +#include "libwriterperfect_filter.hxx" + +WPXString propListToStyleKey(const WPXPropertyList & xPropList) +{ + WPXString sKey; + WPXPropertyList::Iter i(xPropList); + for (i.rewind(); i.next(); ) + { + WPXString sProp; + sProp.sprintf("[%s:%s]", i.key(), i()->getStr().cstr()); + sKey.append(sProp); + } + + return sKey; +} + + diff --git a/writerperfect/source/filter/libwriterperfect_filter.hxx b/writerperfect/source/filter/libwriterperfect_filter.hxx new file mode 100644 index 000000000000..b908da300864 --- /dev/null +++ b/writerperfect/source/filter/libwriterperfect_filter.hxx @@ -0,0 +1,48 @@ +/* libwriterperfect_filter.hxx: define basic functions for libwriterperfect/fileter + * + * Copyright (C) 2002-2003 William Lachance (wrlach@gmail.com) + * Copyright (C) 2004 Fridrich Strba (fridrich.strba@bluewin.ch) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * For further information visit http://libwpd.sourceforge.net + * + */ + +/* "This product is not manufactured, approved, or supported by + * Corel Corporation or Corel Corporation Limited." + */ + +#ifndef _LIBWRITERPERFECT_FILTER_H +#define _LIBWRITERPERFECT_FILTER_H +#include <string.h> // for strcmp + +#include <libwpd/libwpd.h> +#include <libwpd/WPXString.h> + +class WPXPropertyList; + +WPXString propListToStyleKey(const WPXPropertyList & xPropList); + +struct ltstr +{ + bool operator()(const WPXString & s1, const WPXString & s2) const + { + return strcmp(s1.cstr(), s2.cstr()) < 0; + } +}; + + +#endif |