/* -*- 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/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ #ifndef INCLUDED_HELPCOMPILER_INC_HELPCOMPILER_HXX #define INCLUDED_HELPCOMPILER_INC_HELPCOMPILER_HXX #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if OSL_DEBUG_LEVEL > 2 #include #define HCDBG(foo) do { if (true) foo; } while(false) #else #define HCDBG(foo) do { } while(false) #endif namespace fs { enum convert { native }; class path { public: OUString data; public: path() {} path(const std::string &in, convert) { OUString sWorkingDir; osl_getProcessWorkingDir(&sWorkingDir.pData); OUString ustrSystemPath(OStringToOUString(in, FileNameEnc())); osl::File::getFileURLFromSystemPath(ustrSystemPath, data); (void)osl::File::getAbsoluteFileURL(sWorkingDir, data, data); } path(const std::string &FileURL) { data = OStringToOUString(FileURL, FileNameEnc()); } std::string native_file_string() const { OUString ustrSystemPath; osl::File::getSystemPathFromFileURL(data, ustrSystemPath); OString tmp(OUStringToOString(ustrSystemPath, FileNameEnc())); HCDBG(std::cerr << "native_file_string is " << tmp.getStr() << std::endl); return std::string(tmp.getStr()); } #ifdef _WIN32 std::wstring native_file_string_w() const { OUString ustrSystemPath; osl::File::getSystemPathFromFileURL(data, ustrSystemPath); return std::wstring(o3tl::toW(ustrSystemPath.getStr())); } #endif std::string toUTF8() const { OString tmp(OUStringToOString(data, RTL_TEXTENCODING_UTF8)); return std::string(tmp.getStr()); } bool empty() const { return data.isEmpty(); } path operator/(const std::string &in) const { path ret(*this); HCDBG(std::cerr << "orig was " << OUStringToOString(ret.data, RTL_TEXTENCODING_UTF8).getStr() << std::endl); OUString ustrSystemPath(OStringToOUString(in, FileNameEnc())); ret.data += "/" + ustrSystemPath; HCDBG(std::cerr << "final is " << OUStringToOString(ret.data, RTL_TEXTENCODING_UTF8).getStr() << std::endl); return ret; } void append(const char *in) { OUString ustrSystemPath(OStringToOUString(in, FileNameEnc())); data += ustrSystemPath; } void append(const std::string &in) { append(in.c_str()); } private: #ifdef _WIN32 // On Windows, libxslt and libxml use UTF-8 path strings static constexpr rtl_TextEncoding FileNameEnc() { return RTL_TEXTENCODING_UTF8; } #else static rtl_TextEncoding FileNameEnc() { return osl_getThreadTextEncoding(); } #endif }; void create_directory(const fs::path& indexDirName); void copy(const fs::path &src, const fs::path &dest); } typedef std::unordered_map Stringtable; typedef std::deque LinkedList; typedef std::unordered_map Hashtable; class StreamTable { public: std::string document_path; std::string document_module; std::string document_title; std::unique_ptr< std::vector > appl_hidlist; std::unique_ptr appl_keywords; std::unique_ptr appl_helptexts; xmlDocPtr appl_doc; StreamTable() : appl_doc(nullptr) {} void dropappl() { appl_hidlist.reset(); appl_keywords.reset(); appl_helptexts.reset(); if (appl_doc) xmlFreeDoc(appl_doc); } ~StreamTable() { dropappl(); } }; struct HelpProcessingException { HelpProcessingErrorClass m_eErrorClass; std::string m_aErrorMsg; std::string m_aXMLParsingFile; int m_nXMLParsingLine; HelpProcessingException( HelpProcessingErrorClass eErrorClass, std::string aErrorMsg ) : m_eErrorClass( eErrorClass ) , m_aErrorMsg(std::move( aErrorMsg )) , m_nXMLParsingLine( 0 ) {} HelpProcessingException( std::string aErrorMsg, std::string aXMLParsingFile, int nXMLParsingLine ) : m_eErrorClass( HelpProcessingErrorClass::XmlParsing ) , m_aErrorMsg(std::move( aErrorMsg )) , m_aXMLParsingFile(std::move( aXMLParsingFile )) , m_nXMLParsingLine( nXMLParsingLine ) {} }; class HelpCompiler { public: HelpCompiler(StreamTable &streamTable, fs::path in_inputFile, fs::path in_src, fs::path in_zipdir, fs::path in_resCompactStylesheet, fs::path in_resEmbStylesheet, std::string in_module, std::string in_lang, bool in_bExtensionMode); /// @throws HelpProcessingException /// @throws BasicCodeTagger::TaggerException void compile(); private: xmlDocPtr getSourceDocument(const fs::path &filePath); static void tagBasicCodeExamples(xmlDocPtr doc); xmlDocPtr compactXhpForJar(xmlDocPtr doc); void saveXhpForJar(xmlDocPtr doc, const fs::path &filePath); xmlNodePtr clone(xmlNodePtr node, const std::string& appl); StreamTable &streamTable; const fs::path inputFile, src, zipdir; const std::string module, lang; const fs::path resCompactStylesheet; const fs::path resEmbStylesheet; bool bExtensionMode; std::string gui; }; inline char tocharlower(char c) { return static_cast( rtl::toAsciiLowerCase(static_cast(c))); } #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */