27 #include <com/sun/star/rdf/URI.hpp>
28 #include <com/sun/star/rdf/XDocumentRepository.hpp>
29 #include <com/sun/star/rdf/XRepositorySupplier.hpp>
31 #include <rtl/ustring.hxx>
50 OUString GetAbsoluteReference(OUString
const & i_rURI)
const
52 if (i_rURI.isEmpty() || i_rURI[0] ==
'#')
58 return GetImport().GetAbsoluteReference(i_rURI);
64 : m_rImport(i_rImport)
68 OUString ReadCURIE(OUString
const & i_rCURIE)
const;
70 std::vector< OUString >
71 ReadCURIEs(OUString
const & i_rCURIEs)
const;
74 ReadURIOrSafeCURIE( OUString
const & i_rURIOrSafeCURIE)
const;
83 typedef ::std::map< OUString, uno::Reference< rdf::XBlankNode > >
89 RDFaInserter(uno::Reference<uno::XComponentContext>
const & i_xContext,
90 uno::Reference< rdf::XDocumentRepository >
const & i_xRepository)
91 : m_xContext(i_xContext)
92 , m_xRepository(i_xRepository)
95 uno::Reference< rdf::XBlankNode >
96 LookupBlankNode(OUString
const & i_rNodeId );
98 uno::Reference< rdf::XURI >
99 MakeURI( OUString
const & i_rURI)
const;
101 uno::Reference< rdf::XResource>
102 MakeResource( OUString
const & i_rResource);
104 void InsertRDFaEntry(
struct RDFaEntry
const & i_rEntry);
118 OUString
const & i_rAbout,
119 ::std::vector< OUString >
const & i_rProperties,
120 OUString
const & i_rContent,
121 OUString
const & i_rDatatype)
123 , m_Properties(i_rProperties)
124 , m_Content(i_rContent)
125 , m_Datatype(i_rDatatype)
135 RDFaEntry(uno::Reference<rdf::XMetadatable>
const & i_xObject,
136 std::shared_ptr<ParsedRDFaAttributes>
const& i_pRDFaAttributes)
137 : m_xObject(i_xObject)
138 , m_xRDFaAttributes(i_pRDFaAttributes)
144 return (
'\t' == i_Char) || (
'\n' == i_Char) || (
'\r' == i_Char)
150 const sal_Int32 len( io_rString.getLength() );
152 while ((idxstt < len) && (
isWS(io_rString[idxstt])))
154 sal_Int32 idxend(idxstt);
155 while ((idxend < len) && (!
isWS(io_rString[idxend])))
157 const OUString ret(io_rString.copy(idxstt, idxend - idxstt));
158 io_rString = io_rString.copy(idxend);
163 RDFaReader::ReadCURIE(OUString
const & i_rCURIE)
const
166 const sal_Int32
idx( i_rCURIE.indexOf(
':') );
173 sal_uInt16 nKey( GetImport().GetNamespaceMap().GetKeyByQName(
188 const OUString URI(Namespace + LocalName);
189 return GetAbsoluteReference(URI);
193 SAL_INFO(
"xmloff.core",
"ReadCURIE: invalid CURIE: invalid prefix" );
198 SAL_INFO(
"xmloff.core",
"ReadCURIE: invalid CURIE: no prefix" );
202 ::std::vector< OUString >
203 RDFaReader::ReadCURIEs(OUString
const & i_rCURIEs)
const
205 std::vector< OUString > vec;
206 OUString CURIEs(i_rCURIEs);
209 if (!curie.isEmpty())
211 const OUString
uri(ReadCURIE(curie));
218 while (!CURIEs.isEmpty());
221 SAL_INFO(
"xmloff.core",
"ReadCURIEs: invalid CURIEs" );
227 RDFaReader::ReadURIOrSafeCURIE(OUString
const & i_rURIOrSafeCURIE)
const
229 const sal_Int32 len(i_rURIOrSafeCURIE.getLength());
230 if (len && (i_rURIOrSafeCURIE[0] ==
'['))
232 if ((len >= 2) && (i_rURIOrSafeCURIE[len - 1] ==
']'))
234 return ReadCURIE(i_rURIOrSafeCURIE.copy(1, len - 2));
238 SAL_INFO(
"xmloff.core",
"ReadURIOrSafeCURIE: invalid SafeCURIE" );
244 if (i_rURIOrSafeCURIE.startsWith(
"_:"))
246 SAL_INFO(
"xmloff.core",
"ReadURIOrSafeCURIE: invalid URI: scheme is _" );
251 return GetAbsoluteReference(i_rURIOrSafeCURIE);
256 uno::Reference< rdf::XBlankNode >
257 RDFaInserter::LookupBlankNode(OUString
const & i_rNodeId )
259 uno::Reference< rdf::XBlankNode > & rEntry(
m_BlankNodeMap[ i_rNodeId ] );
267 uno::Reference< rdf::XURI >
268 RDFaInserter::MakeURI( OUString
const & i_rURI)
const
270 if (i_rURI.startsWith(
"_:"))
272 SAL_INFO(
"xmloff.core",
"MakeURI: cannot create URI for blank node");
279 return rdf::URI::create(
m_xContext, i_rURI );
281 catch (uno::Exception &)
283 SAL_WARN(
"xmloff.core",
"MakeURI: cannot create URI");
289 uno::Reference<rdf::XResource>
290 RDFaInserter::MakeResource( OUString
const & i_rResource)
292 if (i_rResource.startsWith(
"_:"))
297 OUString
name( i_rResource.copy(2) );
298 const uno::Reference< rdf::XBlankNode > xBNode( LookupBlankNode(name) );
299 SAL_WARN_IF(!xBNode.is(),
"xmloff.core",
"no blank node?");
304 return MakeURI( i_rResource );
308 void RDFaInserter::InsertRDFaEntry(
309 struct RDFaEntry
const & i_rEntry)
311 SAL_WARN_IF(!i_rEntry.m_xObject.is(),
"xmloff.core",
"InsertRDFaEntry: invalid arg: null object");
312 if (!i_rEntry.m_xObject.is())
return;
314 const uno::Reference< rdf::XResource > xSubject(
315 MakeResource( i_rEntry.m_xRDFaAttributes->m_About ) );
321 ::std::vector< uno::Reference< rdf::XURI > > predicates;
323 predicates.reserve(i_rEntry.m_xRDFaAttributes->m_Properties.size());
325 for (OUString
const& prop : i_rEntry.m_xRDFaAttributes->m_Properties)
327 auto const xURI(MakeURI(prop));
330 predicates.push_back(xURI);
334 if (predicates.empty())
339 uno::Reference<rdf::XURI> xDatatype;
340 if (!i_rEntry.m_xRDFaAttributes->m_Datatype.isEmpty())
342 xDatatype = MakeURI( i_rEntry.m_xRDFaAttributes->m_Datatype );
352 i_rEntry.m_xRDFaAttributes->m_Content, xDatatype);
354 catch (uno::Exception &)
356 SAL_WARN(
"xmloff.core",
"InsertRDFaEntry: setStatementRDFa failed?");
361 : m_rImport(i_rImport)
369 std::shared_ptr<ParsedRDFaAttributes>
371 OUString
const & i_rAbout,
372 OUString
const & i_rProperty,
373 OUString
const & i_rContent,
374 OUString
const & i_rDatatype)
376 if (i_rProperty.isEmpty())
378 SAL_INFO(
"xmloff.core",
"AddRDFa: invalid input: xhtml:property empty");
379 return std::shared_ptr<ParsedRDFaAttributes>();
383 const OUString about( reader.ReadURIOrSafeCURIE(i_rAbout) );
384 if (about.isEmpty()) {
385 return std::shared_ptr<ParsedRDFaAttributes>();
388 reader.ReadCURIEs(i_rProperty) );
390 return std::shared_ptr<ParsedRDFaAttributes>();
392 const OUString datatype( !i_rDatatype.isEmpty()
393 ? reader.ReadCURIE(i_rDatatype)
395 return std::make_shared<ParsedRDFaAttributes>(
401 uno::Reference<rdf::XMetadatable>
const & i_xObject,
402 std::shared_ptr<ParsedRDFaAttributes>
const & i_pRDFaAttributes)
406 SAL_WARN(
"xmloff.core",
"AddRDFa: invalid arg: null textcontent");
409 if (!i_pRDFaAttributes)
411 SAL_WARN(
"xmloff.core",
"AddRDFa: invalid arg: null RDFa attributes");
419 uno::Reference<rdf::XMetadatable>
const & i_xObject,
420 OUString
const & i_rAbout,
421 OUString
const & i_rProperty,
422 OUString
const & i_rContent,
423 OUString
const & i_rDatatype)
425 std::shared_ptr<ParsedRDFaAttributes> pAttributes(
426 ParseRDFa(i_rAbout, i_rProperty, i_rContent, i_rDatatype) );
429 AddRDFa(i_xObject, pAttributes);
434 uno::Reference< rdf::XRepositorySupplier>
const & i_xModel)
436 SAL_WARN_IF(!i_xModel.is(),
"xmloff.core",
"InsertRDFa: invalid arg: model null");
437 if (!i_xModel.is())
return;
438 const uno::Reference< rdf::XDocumentRepository > xRepository(
439 i_xModel->getRDFRepository(), uno::UNO_QUERY);
440 SAL_WARN_IF(!xRepository.is(),
"xmloff.core",
"InsertRDFa: no DocumentRepository?");
441 if (!xRepository.is())
return;
442 RDFaInserter inserter(
GetImport().GetComponentContext(), xRepository);
OUString GetBaseURL() const
::std::vector< RDFaEntry > m_RDFaEntries
RDFaEntry(uno::Reference< rdf::XMetadatable > const &i_xObject, std::shared_ptr< ParsedRDFaAttributes > const &i_pRDFaAttributes)
const SvXMLImport & GetImport() const
BlankNodeMap_t m_BlankNodeMap
std::shared_ptr< ParsedRDFaAttributes > m_xRDFaAttributes
const sal_uInt16 XML_NAMESPACE_UNKNOWN
const sal_uInt16 XML_NAMESPACE_XMLNS
std::shared_ptr< ParsedRDFaAttributes > ParseRDFa(OUString const &i_rAbout, OUString const &i_rProperty, OUString const &i_rContent, OUString const &i_rDatatype)
Parse RDFa attributes.
store metadatable object and its RDFa attributes
static bool isWS(const sal_Unicode i_Char)
RDFaImportHelper(const SvXMLImport &i_rImport)
const sal_uInt16 XML_NAMESPACE_NONE
static OUString splitAtWS(OUString &io_rString)
const uno::Reference< uno::XComponentContext > m_xContext
ParsedRDFaAttributes(OUString const &i_rAbout,::std::vector< OUString > const &i_rProperties, OUString const &i_rContent, OUString const &i_rDatatype)
uno::Reference< rdf::XDocumentRepository > m_xRepository
void ParseAndAddRDFa(css::uno::Reference< css::rdf::XMetadatable > const &i_xObject, OUString const &i_rAbout, OUString const &i_rProperty, OUString const &i_rContent, OUString const &i_rDatatype)
Parse and add a RDFa statement; parameters are XML attribute values.
#define SAL_WARN_IF(condition, area, stream)
css::uno::Sequence< DstElementType > containerToSequence(const SrcType &i_Container)
const SvXMLImport & m_rImport
#define SAL_INFO(area, stream)
uno::Reference< rdf::XMetadatable > m_xObject
store parsed RDFa attributes
#define SAL_WARN(area, stream)
void InsertRDFa(css::uno::Reference< css::rdf::XRepositorySupplier > const &i_xModel)
Insert all added statements into the RDF repository.
void AddRDFa(css::uno::Reference< css::rdf::XMetadatable > const &i_xObject, std::shared_ptr< ParsedRDFaAttributes > const &i_pRDFaAttributes)
Add a RDFa statement; must have been parsed with ParseRDFa.
::std::vector< OUString > m_Properties
exports com.sun.star. uri