sw/inc/rdfhelper.hxx | 2 sw/source/core/doc/rdfhelper.cxx | 4 + sw/source/filter/basflt/fltshell.cxx | 77 ++++++++++++++++++++++++++++++++++- sw/source/filter/inc/fltshell.hxx | 19 ++++++++ sw/source/filter/ww8/ww8par.cxx | 36 +++++++++++++++- sw/source/filter/ww8/ww8par.hxx | 2 sw/source/filter/ww8/ww8par5.cxx | 7 +-- 7 files changed, 141 insertions(+), 6 deletions(-)
New commits: commit 0b7ef6957193edd7c4adfe76872df8ec2754f6f2 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Wed Dec 9 12:33:36 2015 +0100 sw: handle RDF mark in SwFltControlStack::SetAttrInDoc() Change-Id: I13e510e305c4aa24c37b1c25b4c3116ef3f06a8a diff --git a/sw/inc/rdfhelper.hxx b/sw/inc/rdfhelper.hxx index d9787cb..edee106 100644 --- a/sw/inc/rdfhelper.hxx +++ b/sw/inc/rdfhelper.hxx @@ -24,6 +24,8 @@ class SW_DLLPUBLIC SwRDFHelper public: /// Gets all (rTextNode, key, value) statements in RDF graphs of type rType. static std::map<OUString, OUString> getTextNodeStatements(const OUString& rType, SwTextNode& rTextNode); + /// Add an (rTextNode, key, value) statement in the graph of type rType -- or if it does not exist, create a graph at rPath first. + static void addTextNodeStatement(const OUString& rType, const OUString& rPath, SwTextNode& rTextNode, const OUString& rKey, const OUString& rValue); }; #endif // INCLUDED_SW_INC_RDFHELPER_HXX diff --git a/sw/source/core/doc/rdfhelper.cxx b/sw/source/core/doc/rdfhelper.cxx index f476bf7..25acac9 100644 --- a/sw/source/core/doc/rdfhelper.cxx +++ b/sw/source/core/doc/rdfhelper.cxx @@ -48,4 +48,8 @@ std::map<OUString, OUString> SwRDFHelper::getTextNodeStatements(const OUString& return aRet; } +void SwRDFHelper::addTextNodeStatement(const OUString& /*rType*/, const OUString& /*rPath*/, SwTextNode& /*rTextNode*/, const OUString& /*rKey*/, const OUString& /*rValue*/) +{ +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/filter/basflt/fltshell.cxx b/sw/source/filter/basflt/fltshell.cxx index 37aad9f..6c37888 100644 --- a/sw/source/filter/basflt/fltshell.cxx +++ b/sw/source/filter/basflt/fltshell.cxx @@ -64,6 +64,7 @@ #include <fltshell.hxx> #include <viewsh.hxx> #include <shellres.hxx> +#include <rdfhelper.hxx> using namespace com::sun::star; @@ -80,6 +81,14 @@ static SwContentNode* GetContentNode(SwDoc* pDoc, SwNodeIndex& rIdx, bool bNext) return pCNd; } +static OUString lcl_getTypePath(const OUString& rType) +{ + OUString aRet; + if (rType == "urn:tscp:names:baf:1.1") + aRet = "tscp/baf.rdf"; + return aRet; +} + // Stack entry for all text attributes SwFltStackEntry::SwFltStackEntry(const SwPosition& rStartPos, SfxPoolItem* pHt) : m_aMkPos(rStartPos) @@ -614,7 +623,25 @@ void SwFltControlStack::SetAttrInDoc(const SwPosition& rTmpPos, { if (MakeBookRegionOrPoint(rEntry, pDoc, aRegion, true)) { - // TODO handle RDF mark + SwFltRDFMark* pMark = static_cast<SwFltRDFMark*>(rEntry.pAttr); + if (aRegion.GetNode().IsTextNode()) + { + SwTextNode& rTextNode = *aRegion.GetNode().GetTextNode(); + + for (const std::pair<OUString, OUString>& rAttribute : pMark->GetAttributes()) + { + sal_Int32 nIndex = rAttribute.first.indexOf('#'); + if (nIndex == -1) + continue; + + OUString aTypeNS = rAttribute.first.copy(0, nIndex); + OUString aMetadataFilePath = lcl_getTypePath(aTypeNS); + if (aMetadataFilePath.isEmpty()) + continue; + + SwRDFHelper::addTextNodeStatement(aTypeNS, aMetadataFilePath, rTextNode, rAttribute.first, rAttribute.second); + } + } } else SAL_WARN("sw", "failed to make book region or point"); diff --git a/sw/source/filter/ww8/ww8par5.cxx b/sw/source/filter/ww8/ww8par5.cxx index 2cc0743..05a109b 100644 --- a/sw/source/filter/ww8/ww8par5.cxx +++ b/sw/source/filter/ww8/ww8par5.cxx @@ -253,7 +253,7 @@ long SwWW8ImplReader::Read_FactoidBook(WW8PLCFManResult*) SwFltRDFMark aMark; aMark.SetHandle(pFactoidBook->getHandle()); GetSmartTagInfo(aMark); - m_pReffedStck->NewAttr(*m_pPaM->GetPoint(), CntUInt16Item(RES_FLTR_RDFMARK, pFactoidBook->getHandle())); + m_pReffedStck->NewAttr(*m_pPaM->GetPoint(), aMark); } } return 0; commit 97824ec98932284c7668fec90630b5d474266609 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Wed Dec 9 10:49:17 2015 +0100 SwWW8ImplReader::GetSmartTagInfo: read from SmartTagData With this, SwWW8ImplReader::Read_FactoidBook() gets exactly the matching key/value strings for the smart-tag bookmark, so now only SwFltControlStack has to store the item and process it. Change-Id: If799d7d0bd1d69ddf8325d05f2b7c6e55112bba2 diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx index 15a731b..85557ce 100644 --- a/sw/source/filter/ww8/ww8par.cxx +++ b/sw/source/filter/ww8/ww8par.cxx @@ -5978,13 +5978,47 @@ const OUString* SwWW8ImplReader::GetAnnotationAuthor(sal_uInt16 nIdx) return pRet; } -void SwWW8ImplReader::GetSmartTagInfo(sal_uInt16 /*nIndex*/) +void SwWW8ImplReader::GetSmartTagInfo(SwFltRDFMark& rMark) { if (!m_pSmartTagData && m_pWwFib->lcbFactoidData) { m_pSmartTagData.reset(new WW8SmartTagData()); m_pSmartTagData->Read(*m_pTableStream, m_pWwFib->fcFactoidData, m_pWwFib->lcbFactoidData); } + + // Check if the handle is a valid smart tag bookmark index. + size_t nIndex = rMark.GetHandle(); + if (nIndex >= m_pSmartTagData->m_aPropBags.size()) + return; + + // Check if the smart tag bookmark refers to a valid factoid type. + const MSOPropertyBag& rPropertyBag = m_pSmartTagData->m_aPropBags[rMark.GetHandle()]; + auto itPropertyBag = m_pSmartTagData->m_aPropBagStore.m_aFactoidTypes.begin(); + for (; itPropertyBag != m_pSmartTagData->m_aPropBagStore.m_aFactoidTypes.end(); ++itPropertyBag) + if (itPropertyBag->m_nId == rPropertyBag.m_nId) + break; + if (itPropertyBag == m_pSmartTagData->m_aPropBagStore.m_aFactoidTypes.end()) + return; + + // Check if the factoid is an RDF one. + const MSOFactoidType& rFactoidType = *itPropertyBag; + if (rFactoidType.m_aUri != "http://www.w3.org/1999/02/22-rdf-syntax-ns#") + return; + + // Finally put the relevant attributes to the mark. + std::vector< std::pair<OUString, OUString> > aAttributes; + for (const MSOProperty& rProperty : rPropertyBag.m_aProperties) + { + OUString aKey; + OUString aValue; + if (rProperty.m_nKey < m_pSmartTagData->m_aPropBagStore.m_aStringTable.size()) + aKey = m_pSmartTagData->m_aPropBagStore.m_aStringTable[rProperty.m_nKey]; + if (rProperty.m_nValue < m_pSmartTagData->m_aPropBagStore.m_aStringTable.size()) + aValue = m_pSmartTagData->m_aPropBagStore.m_aStringTable[rProperty.m_nValue]; + if (!aKey.isEmpty() && !aValue.isEmpty()) + aAttributes.push_back(std::make_pair(aKey, aValue)); + } + rMark.SetAttributes(aAttributes); } sal_uLong SwWW8ImplReader::LoadDoc(WW8Glossary *pGloss) diff --git a/sw/source/filter/ww8/ww8par.hxx b/sw/source/filter/ww8/ww8par.hxx index d231d57..65632bd 100644 --- a/sw/source/filter/ww8/ww8par.hxx +++ b/sw/source/filter/ww8/ww8par.hxx @@ -1640,7 +1640,7 @@ private: const OUString* GetAnnotationAuthor(sal_uInt16 nIdx); - void GetSmartTagInfo(sal_uInt16 nIndex); + void GetSmartTagInfo(SwFltRDFMark& rMark); // interfaces for the toggle attributes void SetToggleAttr(sal_uInt8 nAttrId, bool bOn); diff --git a/sw/source/filter/ww8/ww8par5.cxx b/sw/source/filter/ww8/ww8par5.cxx index 5394be4..2cc0743 100644 --- a/sw/source/filter/ww8/ww8par5.cxx +++ b/sw/source/filter/ww8/ww8par5.cxx @@ -250,8 +250,9 @@ long SwWW8ImplReader::Read_FactoidBook(WW8PLCFManResult*) m_pReffedStck->SetAttr(*m_pPaM->GetPoint(), RES_FLTR_RDFMARK, true, pFactoidBook->getHandle()); else { - // TODO make this non-void and put keys/values into the RDF mark. - GetSmartTagInfo(pFactoidBook->getHandle()); + SwFltRDFMark aMark; + aMark.SetHandle(pFactoidBook->getHandle()); + GetSmartTagInfo(aMark); m_pReffedStck->NewAttr(*m_pPaM->GetPoint(), CntUInt16Item(RES_FLTR_RDFMARK, pFactoidBook->getHandle())); } } commit 0c5c971d36e444b0d50eb385c6c5105edcfe045c Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Wed Dec 9 09:17:14 2015 +0100 sw: initial SwFltRDFMark So that SwWW8ImplReader::Read_FactoidBook() can put this as an attribute on the import stack instead of CntUInt16Item. Change-Id: I1753bc4a94f49332a945a4c6de7f58768d35ff16 diff --git a/sw/source/filter/basflt/fltshell.cxx b/sw/source/filter/basflt/fltshell.cxx index 97ebd67..37aad9f 100644 --- a/sw/source/filter/basflt/fltshell.cxx +++ b/sw/source/filter/basflt/fltshell.cxx @@ -969,6 +969,54 @@ SfxPoolItem* SwFltBookmark::Clone(SfxItemPool*) const return new SwFltBookmark(*this); } +SwFltRDFMark::SwFltRDFMark() + : SfxPoolItem(RES_FLTR_RDFMARK), + m_nHandle(0) +{ +} + +SwFltRDFMark::SwFltRDFMark(const SwFltRDFMark& rMark) + : SfxPoolItem(RES_FLTR_RDFMARK), + m_nHandle(rMark.m_nHandle), + m_aAttributes(rMark.m_aAttributes) +{ +} + +bool SwFltRDFMark::operator==(const SfxPoolItem& rItem) const +{ + if (!SfxPoolItem::operator==(rItem)) + return false; + + const SwFltRDFMark& rMark = static_cast<const SwFltRDFMark&>(rItem); + + return m_nHandle == rMark.m_nHandle && m_aAttributes == rMark.m_aAttributes; +} + +SfxPoolItem* SwFltRDFMark::Clone(SfxItemPool*) const +{ + return new SwFltRDFMark(*this); +} + +void SwFltRDFMark::SetHandle(long nHandle) +{ + m_nHandle = nHandle; +} + +long SwFltRDFMark::GetHandle() const +{ + return m_nHandle; +} + +void SwFltRDFMark::SetAttributes(const std::vector< std::pair<OUString, OUString> >& rAttributes) +{ + m_aAttributes = rAttributes; +} + +const std::vector< std::pair<OUString, OUString> >& SwFltRDFMark::GetAttributes() const +{ + return m_aAttributes; +} + // methods of SwFltTOX follow SwFltTOX::SwFltTOX(SwTOXBase* pBase, sal_uInt16 _nCols) : SfxPoolItem(RES_FLTR_TOX), pTOXBase(pBase), nCols( _nCols ), diff --git a/sw/source/filter/inc/fltshell.hxx b/sw/source/filter/inc/fltshell.hxx index e0e2df0..7dce671 100644 --- a/sw/source/filter/inc/fltshell.hxx +++ b/sw/source/filter/inc/fltshell.hxx @@ -286,6 +286,25 @@ public: } }; +/// Stores RDF statements on a paragraph (key-value pairs where the subject is the paragraph). +class SW_DLLPUBLIC SwFltRDFMark : public SfxPoolItem +{ + long m_nHandle; + std::vector< std::pair<OUString, OUString> > m_aAttributes; + +public: + SwFltRDFMark(); + SwFltRDFMark(const SwFltRDFMark&); + + virtual bool operator==(const SfxPoolItem&) const override; + virtual SfxPoolItem* Clone(SfxItemPool* = nullptr) const override; + + void SetHandle(long nHandle); + long GetHandle() const; + void SetAttributes(const std::vector< std::pair<OUString, OUString> >& rAttributes); + const std::vector< std::pair<OUString, OUString> >& GetAttributes() const; +}; + class SW_DLLPUBLIC SwFltTOX : public SfxPoolItem { SwTOXBase* pTOXBase; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits