30#include <osl/file.hxx>
31#include <osl/process.h>
33#include <rtl/ustring.hxx>
34#include <rtl/strbuf.hxx>
35#include <unicode/regex.h>
54 m_pParent(rObj.m_pParent)
100 default: fprintf(stdout,
"XMLParentNode::XMLParentNode( const XMLParentNode& rObj) strange obj");
150 aFilename.getStr(), std::ios_base::out | std::ios_base::trunc);
154 <<
"Error: helpex cannot create file " << aFilename
156 std::exit(EXIT_FAILURE);
165 Write( rStream,
this );
180 rStream << pElement->
GetName();
200 rStream << pElement->
GetName();
248 fprintf( stdout,
"<%s", pElement->
GetName().getStr());
256 fprintf( stdout,
" %s=\"%s\"",
263 fprintf( stdout,
"/>" );
266 fprintf( stdout,
">" );
269 fprintf( stdout,
"</%s>", pElement->
GetName().getStr());
276 fprintf( stdout,
"%s",
pData->GetData().getStr());
282 fprintf( stdout,
"<!--%s-->", pComment->
GetComment().getStr());
288 fprintf( stdout,
"%s", pDefault->
GetDefault().getStr());
307 , m_sFileName(
std::move( _sFileName ))
344 if (sTempStr ==
"id")
358 fprintf(stdout,
"XMLFile::InsertL10NElement: No AttributeList found");
359 fprintf(stdout,
"++++++++++++++++++++++++++++++++++++++++++++++++++");
361 fprintf(stdout,
"++++++++++++++++++++++++++++++++++++++++++++++++++");
377 fprintf(stdout,
"Error: Duplicated entry. ID = %s LANG = %s in File %s\n",
sId.getStr(),
sLanguage.getStr(),
m_sFileName.getStr() );
386 , m_sFileName( rObj.m_sFileName )
414 for (
auto const& pos2 : *pElem)
416 (*pNewelem)[ pos2.first ] =
new XMLElement( *pos2.second );
418 (*m_pXMLStrings)[
pos.first ] = pNewelem;
449 const OString
sName(pElement->
GetName().toAsciiLowerCase());
452 for (
size_t j = 0 , cnt = pElement->
GetAttributeList()->size(); j < cnt && bInsert; ++j )
479 static bool bStatusExport =
true;
501 if (pElement->
GetName().equalsIgnoreAsciiCase(
"TOPIC"))
505 for (
size_t j = 0 , cnt = pElement->
GetAttributeList()->size(); j < cnt; ++j)
508 if (tmpStr.equalsIgnoreAsciiCase(
"STATUS"))
511 if (!tmpStrVal.equalsIgnoreAsciiCase(
"PUBLISH") &&
512 !tmpStrVal.equalsIgnoreAsciiCase(
"DEPRECATED"))
514 bStatusExport =
false;
532 return bStatusExport;
540 , m_sElementName(
std::move( _sName ))
546 , m_sElementName( rObj.m_sElementName )
590 bool bWasSet =
false;
595 (*m_pAttributes)[
i ]->setValue(rValue);
608 for (
size_t i = 0;
i < pCList->size();
i++ )
633 OStringBuffer sBuffer;
634 Print(
this,sBuffer,
true);
635 return sBuffer.makeStringAndClear();
649 for (
size_t k = 0; k < pElement->
GetChildList()->size(); k++ )
652 Print( pTmp, rBuffer ,
false);
665 if( !pElement->
GetName().equalsIgnoreAsciiCase(
"comment") )
667 rBuffer.append(
"<" );
668 rBuffer.append( pElement->
GetName() );
677 " " + aAttrName +
"=\"" +
683 rBuffer.append(
"/>" );
686 rBuffer.append(
">" );
690 Print( pTmp, rBuffer ,
false);
692 rBuffer.append(
"</" + pElement->
GetName() +
">" );
700 rBuffer.append(
pData->GetData() );
706 rBuffer.append(
"<!--" + pComment->
GetComment() +
"-->" );
722 fprintf(stdout,
"\n#+------Error: NULL Pointer in XMLELement::Print------+#\n");
733OUString lcl_pathnameToAbsoluteUrl(std::string_view rPathname)
735 OUString sPath = OStringToOUString(rPathname, RTL_TEXTENCODING_UTF8 );
737 if (osl::FileBase::getFileURLFromSystemPath(sPath, sUrl)
738 != osl::FileBase::E_None)
740 std::cerr <<
"Error: Cannot convert input pathname to URL\n";
741 std::exit(EXIT_FAILURE);
744 if (osl_getProcessWorkingDir(&sCwd.pData) != osl_Process_E_None)
746 std::cerr <<
"Error: Cannot determine cwd\n";
747 std::exit(EXIT_FAILURE);
749 if (osl::FileBase::getAbsoluteFileURL(sCwd, sUrl, sUrl)
750 != osl::FileBase::E_None)
752 std::cerr <<
"Error: Cannot convert input URL to absolute URL\n";
753 std::exit(EXIT_FAILURE);
761 : m_pCurNode(nullptr)
762 , m_pCurData(nullptr)
778 void *userData,
const XML_Char *name,
const XML_Char **atts )
784 void *userData,
const XML_Char * )
790 void *userData,
const XML_Char *s,
int len )
796 void *userData,
const XML_Char *data )
802 void *userData,
const XML_Char *s,
int len )
808 const XML_Char *name,
const XML_Char **atts )
863 OUString aFileURL(lcl_pathnameToAbsoluteUrl(rFileName));
866 if (osl_openFile(aFileURL.pData, &
h, osl_File_OpenFlag_Read)
873 oslFileError e = osl_getFileSize(
h, &s);
875 if (e == osl_File_E_None)
877 e = osl_mapFile(
h, &
p, s, 0, 0);
879 if (e != osl_File_E_None)
885 pXMLFile->
SetName( rFileName );
893 if ( !pXMLFile->
GetName().isEmpty())
908 if ( !pXMLFile->
GetName().isEmpty())
919 case XML_ERROR_NO_MEMORY:
922 case XML_ERROR_SYNTAX:
925 case XML_ERROR_NO_ELEMENTS:
928 case XML_ERROR_INVALID_TOKEN:
931 case XML_ERROR_UNCLOSED_TOKEN:
934 case XML_ERROR_PARTIAL_CHAR:
937 case XML_ERROR_TAG_MISMATCH:
940 case XML_ERROR_DUPLICATE_ATTRIBUTE:
943 case XML_ERROR_JUNK_AFTER_DOC_ELEMENT:
946 case XML_ERROR_PARAM_ENTITY_REF:
949 case XML_ERROR_UNDEFINED_ENTITY:
952 case XML_ERROR_RECURSIVE_ENTITY_REF:
955 case XML_ERROR_ASYNC_ENTITY:
958 case XML_ERROR_BAD_CHAR_REF:
961 case XML_ERROR_BINARY_ENTITY_REF:
964 case XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF:
967 case XML_ERROR_MISPLACED_XML_PI:
970 case XML_ERROR_UNKNOWN_ENCODING:
973 case XML_ERROR_INCORRECT_ENCODING:
976 case XML_ERROR_UNCLOSED_CDATA_SECTION:
979 case XML_ERROR_EXTERNAL_ENTITY_HANDLING:
982 case XML_ERROR_NOT_STANDALONE:
992 osl_unmapMappedFile(
h,
p, s);
1001icu::UnicodeString lcl_QuotRange(
1002 const icu::UnicodeString& rString,
const sal_Int32 nStart,
1003 const sal_Int32 nEnd,
bool bInsideTag =
false )
1005 icu::UnicodeString sReturn;
1006 assert( nStart < nEnd );
1007 assert( nStart >= 0 );
1008 assert( nEnd <= rString.length() );
1009 for (sal_Int32 i = nStart;
i < nEnd; ++
i)
1014 sReturn.append(
"<");
1017 sReturn.append(
">");
1021 sReturn.append(
""");
1023 sReturn.append(rString[i]);
1026 if (rString.startsWith(
"&", i, 5))
1027 sReturn.append(
'&');
1029 sReturn.append(
"&");
1032 sReturn.append(rString[i]);
1039bool lcl_isTag(
const icu::UnicodeString& rString )
1041 static const int nSize = 20;
1042 static const icu::UnicodeString vTags[nSize] = {
1043 "ahelp",
"link",
"item",
"emph",
"defaultinline",
1044 "switchinline",
"caseinline",
"variable",
1045 "bookmark_value",
"image",
"object",
1046 "embedvar",
"alt",
"sup",
"sub",
1047 "menuitem",
"keycode",
"input",
"literal",
"widget"
1052 if( rString.startsWith(
"<" + vTags[nIndex]) ||
1053 rString ==
"</" + vTags[nIndex] +
">" )
1057 return rString ==
"<br/>" || rString ==
"<help-id-missing/>";
1066 UErrorCode nIcuErr = U_ZERO_ERROR;
1067 static const sal_uInt32 nSearchFlags =
1068 UREGEX_DOTALL | UREGEX_CASE_INSENSITIVE;
1069 static const icu::UnicodeString sSearchPat(
"<[/]\?\?[a-z_-]+?(?:| +[a-z]+?=\".*?\") *[/]\?\?>" );
1071 const OUString sOUSource = OStringToOUString(rString, RTL_TEXTENCODING_UTF8);
1072 icu::UnicodeString sSource(
1073 reinterpret_cast<const UChar*
>(
1074 sOUSource.getStr()), sOUSource.getLength() );
1076 icu::RegexMatcher aRegexMatcher( sSearchPat, nSearchFlags, nIcuErr );
1077 aRegexMatcher.reset( sSource );
1079 icu::UnicodeString sReturn;
1080 int32_t nEndPos = 0;
1081 int32_t nStartPos = 0;
1082 while( aRegexMatcher.find(nStartPos, nIcuErr) && U_SUCCESS(nIcuErr) )
1084 nStartPos = aRegexMatcher.start(nIcuErr);
1085 if ( nEndPos < nStartPos )
1086 sReturn.append(lcl_QuotRange(sSource, nEndPos, nStartPos));
1087 nEndPos = aRegexMatcher.end(nIcuErr);
1088 icu::UnicodeString sMatch = aRegexMatcher.group(nIcuErr);
1089 if( lcl_isTag(sMatch) )
1091 sReturn.append(
"<");
1092 sReturn.append(lcl_QuotRange(sSource, nStartPos+1, nEndPos-1,
true));
1093 sReturn.append(
">");
1096 sReturn.append(lcl_QuotRange(sSource, nStartPos, nEndPos));
1097 nStartPos = nEndPos;
1099 if( nEndPos < sSource.length() )
1100 sReturn.append(lcl_QuotRange(sSource, nEndPos, sSource.length()));
1101 sReturn.append(
'\0');
1104 reinterpret_cast<const sal_Unicode*
>(sReturn.getBuffer()),
1105 RTL_TEXTENCODING_UTF8);
validating xml parser, creates a document tree with xml nodes
void Default(const XML_Char *s, int len)
static void StartElementHandler(void *userData, const XML_Char *name, const XML_Char **atts)
static void CommentHandler(void *userData, const XML_Char *data)
SimpleXMLParser()
creates a new parser
XMLParentNode * m_pCurNode
static void CharacterDataHandler(void *userData, const XML_Char *s, int len)
bool Execute(const OString &rFileName, XMLFile *pXMLFile)
parse a file, return false on critical errors
static void DefaultHandler(void *userData, const XML_Char *s, int len)
void CharacterData(const XML_Char *s, int len)
static void EndElementHandler(void *userData, const XML_Char *name)
void Comment(const XML_Char *data)
void StartElement(const XML_Char *name, const XML_Char **atts)
XMLError m_aErrorInformation
Holds data of Attributes.
Virtual base to handle different kinds of child nodes.
XMLChildNode & operator=(const XMLChildNode &rObj)
XMLParentNode * m_pParent
XMLChildNode(XMLParentNode *pPar)
XMLParentNode * GetParent()
returns the parent of this node
void AddData(const OString &rData)
adds new character data to the existing one
Holds additional file content like those for which no handler exists.
const OString & GetDefault() const
returns the comment
Hold information of an element node.
void Print(XMLNode *pCur, OStringBuffer &rBuffer, bool bRootelement) const
const OString & GetName() const
returns element name
void AddAttribute(const OString &rAttribute, const OString &rValue)
adds a new attribute to this element, typically used by parser
XMLAttributeList * GetAttributeList()
returns list of attributes of this element
XMLElement & operator=(const XMLElement &rObj)
void ChangeLanguageTag(const OString &rValue)
std::unique_ptr< XMLAttributeList > m_pAttributes
OString ToOString()
Return a Unicode String representation of this object.
virtual ~XMLElement() override
XMLElement(OString sName, XMLParentNode *pParent)
create an element node
Holds information of a XML file, is root node of tree.
std::unique_ptr< XMLHashMap > m_pXMLStrings
void Write(OString const &rFilename)
const OString & GetName() const
returns file name
std::vector< OString > m_vOrder
std::unordered_map< OString, bool > m_aNodes_localize
Mapping XML tag names <-> have localizable strings.
virtual ~XMLFile() override
bool CheckExportStatus(XMLChildNode *pCur=nullptr)
void SearchL10NElements(XMLChildNode *pCur)
void SetName(const OString &rFilename)
XMLFile & operator=(const XMLFile &rObj)
void InsertL10NElement(XMLElement *pElement)
void Print(XMLNode *pCur, sal_uInt16 nLevel=0)
XMLFile(OString sFileName)
Virtual base to handle different kinds of XML nodes.
virtual XMLNodeType GetNodeType() const =0
Virtual base to handle different kinds of parent nodes.
void RemoveAndDeleteAllChildren()
void AddChild(XMLChildNode *pChild)
adds a new child
XMLParentNode(XMLParentNode *pPar)
virtual ~XMLParentNode() override
XMLChildNodeList * GetChildList()
returns child list of this node
std::unique_ptr< XMLChildNodeList > m_pChildList
XMLParentNode & operator=(const XMLParentNode &rObj)
static OString QuotHTML(const OString &rString)
Quot the XML characters.
std::unique_ptr< sal_Int32[]> pData
OString UnQuotHTML(std::string_view rString)
Convert XML entity references to single characters.
std::basic_string_view< charT, traits > trim(std::basic_string_view< charT, traits > str)
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)
XML_Error m_eCode
the error code
std::size_t m_nLine
error line number
OString m_sMessage
readable error message
std::size_t m_nColumn
error column number
constexpr OStringLiteral XML_LANG
std::unordered_map< OString, LangHashMap * > XMLHashMap
Mapping XML Element string identifier <-> Language Map.
std::vector< XMLChildNode * > XMLChildNodeList
std::vector< XMLAttribute * > XMLAttributeList
std::unordered_map< OString, XMLElement * > LangHashMap
Mapping numeric Language code <-> XML Element.