22 #include <rtl/ustring.hxx>
23 #include <rtl/ustrbuf.hxx>
100 NameSpaceMap::const_iterator aIter =
aNameMap.find ( nKey );
108 pEntry->sName = rName;
110 pEntry->sPrefix = rPrefix;
130 nKey =
Add_( rPrefix, rName, nKey );
148 NameSpaceHash::const_iterator aIter =
aNameHash.find( rPrefix );
149 if( aIter ==
aNameHash.end() || (*aIter).second->sName != rName )
150 nKey =
Add_( rPrefix, rName, nKey );
159 NameSpaceHash::const_iterator aIter =
aNameHash.find(rPrefix);
160 return (aIter !=
aNameHash.end()) ? (*aIter).second->nKey : USHRT_MAX;
167 [&rName](
const NameSpaceHash::value_type& rEntry) {
return rEntry.second->sName == rName; });
170 nKey = (*aIter).second->nKey;
177 NameSpaceMap::const_iterator aIter =
aNameMap.find (nKey);
178 return (aIter !=
aNameMap.end()) ? (*aIter).second->sPrefix :
sEmpty;
183 NameSpaceMap::const_iterator aIter =
aNameMap.find (nKey);
184 return (aIter !=
aNameMap.end()) ? (*aIter).second->sName :
sEmpty;
189 NameSpaceMap::const_iterator aIter =
aNameMap.find ( nKey );
193 const OUString &
prefix( (*aIter).second->sPrefix );
194 if (prefix.isEmpty())
197 return sXMLNS +
":" + prefix;
201 const OUString& rLocalName,
210 SAL_WARN(
"xmloff.core",
"unknown namespace, probable missing xmlns: declaration");
219 OUStringBuffer sQName;
221 if (!rLocalName.isEmpty())
223 sQName.append (
':' );
224 sQName.append ( rLocalName );
226 return sQName.makeStringAndClear();
235 QNameCache::const_iterator aQCacheIter;
241 return (*aQCacheIter).second;
244 NameSpaceMap::const_iterator aIter =
aNameMap.find ( nKey );
248 const OUString &
prefix( (*aIter).second->sPrefix );
249 OUStringBuffer sQName(prefix.getLength() + 1 + rLocalName.getLength());
250 if (!prefix.isEmpty())
252 sQName.append( prefix );
253 sQName.append(
':' );
255 sQName.append ( rLocalName );
258 OUString sString(sQName.makeStringAndClear());
263 return sQName.makeStringAndClear();
277 const OUString& rAttrValue,
278 OUString *pLocalName)
const
290 OUString *pLocalName,
291 OUString *pNamespace,
296 NameSpaceHash::const_iterator it;
307 *pLocalName = rEntry.
sName;
311 NameSpaceMap::const_iterator aMapIter =
aNameMap.find (nKey);
312 *pNamespace = aMapIter !=
aNameMap.end() ? (*aMapIter).second->sName : OUString();
317 OUString sEntryPrefix, sEntryName;
319 sal_Int32 nColonPos = rQName.indexOf(
':' );
320 if( -1 == nColonPos )
328 sEntryPrefix = rQName.copy( 0, nColonPos );
329 sEntryName = rQName.copy( nColonPos + 1 );
334 SAL_INFO(
"xmloff",
"invalid attribute name with multiple ':'");
340 *pPrefix = sEntryPrefix;
342 *pLocalName = sEntryName;
344 NameSpaceHash::const_iterator aIter =
aNameHash.find( sEntryPrefix );
348 nKey = (*aIter).second->nKey;
350 *pNamespace = (*aIter).second->sName;
352 else if ( sEntryPrefix ==
sXMLNS )
355 else if( nColonPos == -1 )
364 xEntry->sPrefix = std::move(sEntryPrefix);
365 xEntry->sName = std::move(sEntryName);
367 aNameCache.emplace(rQName, std::move(xEntry));
381 NameSpaceMap::const_iterator aIter =
aNameMap.find ( nLastKey );
382 return (++aIter ==
aNameMap.end()) ? USHRT_MAX : (*aIter).second->nKey;
399 NameSpaceMap::const_iterator aIter =
aNameMap.find ( nOldIdx );
400 return (++aIter ==
aNameMap.end()) ? USHRT_MAX : (*aIter).second->nKey;
404 const OUString& rName, sal_uInt16 nKey )
412 Add_( rPrefix, rName, nKey );
423 NameSpaceMap::const_iterator aIter =
aNameMap.find (nIdx);
424 return (aIter !=
aNameMap.end()) ? (*aIter).second->sPrefix :
sEmpty;
429 NameSpaceMap::const_iterator aIter =
aNameMap.find (nIdx);
430 return (aIter !=
aNameMap.end()) ? (*aIter).second->sName :
sEmpty;
435 NameSpaceHash::const_iterator aIter =
aNameHash.find(rPrefix);
436 return (aIter !=
aNameHash.end()) ? (*aIter).second->nKey : USHRT_MAX;
439 const OUString& rAttrName,
440 OUString *pLocalName)
const
447 OUString *pLocalName,
448 OUString *pNamespace )
const
470 bool bSuccess =
false;
471 const OUString& sURIPrefix =
GetXMLToken( XML_URI_W3_PREFIX );
472 if( rName.startsWith( sURIPrefix ) )
474 const OUString& sURISuffix =
GetXMLToken( XML_URI_XFORMS_SUFFIX );
475 sal_Int32 nCompareFrom = rName.getLength() - sURISuffix.getLength();
476 if( rName.subView( nCompareFrom ) == sURISuffix )
514 sal_Int32 nNameLen = rName.getLength();
516 const OUString& rOasisURN =
GetXMLToken( XML_URN_OASIS_NAMES_TC );
517 if( !rName.startsWith( rOasisURN ) )
521 sal_Int32
nPos = rOasisURN.getLength();
522 if( nPos >= nNameLen || rName[nPos] !=
':' )
526 sal_Int32 nTCIdStart = nPos+1;
527 sal_Int32 nTCIdEnd = rName.indexOf(
':', nTCIdStart );
533 std::u16string_view sTmp( rName.subView( nPos ) );
539 nPos += rXMLNS.getLength();
540 if( nPos >= nNameLen || rName[nPos] !=
':' )
544 nPos = rName.indexOf(
':', nPos+1 );
549 sal_Int32 nVersionStart = nPos+1;
550 if( nVersionStart+2 >= nNameLen ||
551 -1 != rName.indexOf(
':', nVersionStart ) )
555 if( rName[nVersionStart] !=
'1' || rName[nVersionStart+1] !=
'.' )
560 rName = rName.subView( 0, nTCIdStart ) +
562 rName.subView( nTCIdEnd, nVersionStart-nTCIdEnd ) +
sal_uInt16 GetKeyByPrefix(const OUString &rPrefix) const
SAL_DLLPRIVATE sal_uInt16 Add_(const OUString &rPrefix, const OUString &rName, sal_uInt16 nKey)
static sal_uInt16 GetIndexByKey(sal_uInt16 nKey)
sal_uInt16 GetFirstKey() const
OUString GetAttrNameByKey(sal_uInt16 nKey) const
bool IsXMLToken(std::u16string_view rString, enum XMLTokenEnum eToken)
compare eToken to the string
sal_uInt16 GetKeyByAttrName(const OUString &rAttrName, OUString *pPrefix, OUString *pLocalName, OUString *pNamespace) const
constexpr bool starts_with(std::basic_string_view< charT, traits > sv, std::basic_string_view< charT, traits > x) noexcept
const sal_uInt16 XML_NAMESPACE_UNKNOWN
const sal_uInt16 XML_NAMESPACE_XMLNS
bool operator==(const SvXMLNamespaceMap &rCmp) const
sal_uInt16 GetKeyByAttrValueQName(const OUString &rAttrName, OUString *pLocalName) const
constexpr sal_uInt16 XML_NAMESPACE_XML
SvXMLNamespaceMap & operator=(const SvXMLNamespaceMap &rCmp)
sal_uInt16 GetIndexByPrefix(const OUString &rPrefix) const
static bool NormalizeURI(OUString &rName)
static bool NormalizeW3URI(OUString &rName)
const sal_uInt16 XML_NAMESPACE_UNKNOWN_FLAG
OUString GetAttrNameByIndex(sal_uInt16 nIdx) const
sal_uInt16 GetNextKey(sal_uInt16 nOldKey) const
const sal_uInt16 XML_NAMESPACE_NONE
OUString GetQNameByKey(sal_uInt16 nKey, const OUString &rLocalName, bool bCache=true) const
sal_uInt16 AddIfKnown(const OUString &rPrefix, const OUString &rName)
const OUString & GetNameByKey(sal_uInt16 nKey) const
static bool NormalizeOasisURN(OUString &rName)
const OUString & GetXMLToken(enum XMLTokenEnum eToken)
return the OUString representation for eToken
Handling of tokens in XML:
#define SAL_INFO(area, stream)
sal_uInt16 Add(const OUString &rPrefix, const OUString &rName, sal_uInt16 nKey=XML_NAMESPACE_UNKNOWN)
sal_uInt16 GetKeyByName(const OUString &rName) const
#define SAL_WARN(area, stream)
void AddAtIndex(const OUString &rPrefix, const OUString &rName, sal_uInt16 nKey)
const OUString & GetPrefixByIndex(sal_uInt16 nIdx) const
const OUString & GetNameByIndex(sal_uInt16 nIdx) const
::std::pair< sal_uInt16, OUString > QNamePair
const OUString & GetPrefixByKey(sal_uInt16 nKey) const
sal_uInt16 GetFirstIndex() const
sal_uInt16 GetKeyByQName(const OUString &rQName, OUString *pPrefix, OUString *pLocalName, OUString *pNamespace, QNameMode eMode) const
sal_uInt16 GetNextIndex(sal_uInt16 nOldIdx) const