/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project .
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License , v . 2 . 0 . If a copy of the MPL was not distributed with this
* file , You can obtain one at http : //mozilla.org/MPL/2.0/.
*/
#include <sal/config.h>
#include <libxml/parser.h>
#include <o3tl/safeint.hxx>
#include <o3tl/string_view.hxx>
#include <rtl/strbuf.hxx>
#include <helper.hxx>
namespace helper {
OString escapeAll(
std::string_view rText, std::string_view rUnEscaped, std::string_view rEscaped )
{
assert( rEscaped.size() == 2 *rUnEscaped.size() );
OStringBuffer sReturn;
for ( size_t nIndex = 0 ; nIndex < rText.size(); ++nIndex )
{
size_t nUnEscapedOne = rUnEscaped.find(rText[nIndex]);
if ( nUnEscapedOne != std::string_view::npos )
{
sReturn.append(rEscaped.substr(nUnEscapedOne*2 ,2 ));
}
else
sReturn.append(rText[nIndex]);
}
return sReturn.makeStringAndClear();
}
OString unEscapeAll(
std::string_view rText, std::string_view rEscaped, std::string_view rUnEscaped)
{
assert( rEscaped.size() == 2 *rUnEscaped.length() );
OStringBuffer sReturn;
const size_t nLength = rText.size();
for ( size_t nIndex = 0 ; nIndex < nLength; ++nIndex )
{
if ( rText[nIndex] == '\\' && nIndex+1 < nLength )
{
size_t nEscapedOne = rEscaped.find(rText.substr(nIndex,2 ));
if ( nEscapedOne != std::string_view::npos )
{
sReturn.append(rUnEscaped[nEscapedOne/2 ]);
++nIndex;
}
else
{
sReturn.append(rText[nIndex]);
}
}
else
sReturn.append(rText[nIndex]);
}
return sReturn.makeStringAndClear();
}
OString QuotHTML(std::string_view rString)
{
OStringBuffer sReturn;
for (size_t i = 0 ; i < rString.size(); ++i)
{
switch (rString[i])
{
case '<' :
sReturn.append("<" );
break ;
case '>' :
sReturn.append(">" );
break ;
case '"' :
sReturn.append(""" );
break ;
case '\' ':
sReturn.append("'" );
break ;
case '&' :
if (o3tl::starts_with(rString.substr(i), "&" ))
sReturn.append('&' );
else
sReturn.append("&" );
break ;
default :
sReturn.append(rString[i]);
break ;
}
}
return sReturn.makeStringAndClear();
}
OString UnQuotHTML( std::string_view rString )
{
OStringBuffer sReturn;
for (size_t i = 0 ; i != rString.size();) {
auto tmp = rString.substr(i);
if (o3tl::starts_with(tmp, "&" )) {
sReturn.append('&' );
i += RTL_CONSTASCII_LENGTH("&" );
} else if (o3tl::starts_with(tmp, "<" )) {
sReturn.append('<' );
i += RTL_CONSTASCII_LENGTH("<" );
} else if (o3tl::starts_with(tmp, ">" )) {
sReturn.append('>' );
i += RTL_CONSTASCII_LENGTH(">" );
} else if (o3tl::starts_with(tmp, """ )) {
sReturn.append('"' );
i += RTL_CONSTASCII_LENGTH(""" );
} else if (o3tl::starts_with(tmp, "'" )) {
sReturn.append('\' ');
i += RTL_CONSTASCII_LENGTH("'" );
} else {
sReturn.append(rString[i]);
++i;
}
}
return sReturn.makeStringAndClear();
}
bool isWellFormedXML( std::string_view text )
{
xmlDocPtr doc;
bool result = true ;
OString content = OString::Concat("<root>" ) + text + "</root>" ;
doc = xmlParseMemory(content.getStr(),static_cast <int >(content.getLength()));
if (doc == nullptr) {
result = false ;
}
xmlFreeDoc(doc);
xmlCleanupParser();
return result;
}
//Convert xmlChar* to OString
OString xmlStrToOString( const xmlChar* pString )
{
xmlChar* pTemp = xmlStrdup( pString );
OString sResult = reinterpret_cast <char *>( pTemp );
xmlFree( pTemp );
return sResult;
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Messung V0.5 in Prozent C=97 H=86 G=91
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-09-29)
¤
*© Formatika GbR, Deutschland