%PDF- %PDF-
Direktori : /data/old/usr/local/include/znc/ |
Current File : //data/old/usr/local/include/znc/Template.h |
/* * Copyright (C) 2004-2018 ZNC, see the NOTICE file for details. * * Licensed 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 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ZNC_TEMPLATE_H #define ZNC_TEMPLATE_H #include <znc/zncconfig.h> #include <znc/ZNCString.h> #include <iostream> #include <list> #include <memory> class CTemplate; class CTemplateTagHandler { public: CTemplateTagHandler() {} virtual ~CTemplateTagHandler() {} virtual bool HandleVar(CTemplate& Tmpl, const CString& sName, const CString& sArgs, CString& sOutput) { return false; } virtual bool HandleTag(CTemplate& Tmpl, const CString& sName, const CString& sArgs, CString& sOutput) { return false; } virtual bool HandleIf(CTemplate& Tmpl, const CString& sName, const CString& sArgs, CString& sOutput) { return HandleVar(Tmpl, sName, sArgs, sOutput); } virtual bool HandleValue(CTemplate& Tmpl, CString& sValue, const MCString& msOptions) { return false; } private: }; class CTemplate; class CTemplateOptions { public: CTemplateOptions() : m_eEscapeFrom(CString::EASCII), m_eEscapeTo(CString::EASCII) {} virtual ~CTemplateOptions() {} void Parse(const CString& sLine); // Getters CString::EEscape GetEscapeFrom() const { return m_eEscapeFrom; } CString::EEscape GetEscapeTo() const { return m_eEscapeTo; } // !Getters private: CString::EEscape m_eEscapeFrom; CString::EEscape m_eEscapeTo; }; class CTemplateLoopContext { public: CTemplateLoopContext(unsigned long uFilePos, const CString& sLoopName, bool bReverse, std::vector<CTemplate*>* pRows) : m_bReverse(bReverse), m_bHasData(false), m_sName(sLoopName), m_uRowIndex(0), m_uFilePosition(uFilePos), m_pvRows(pRows) {} virtual ~CTemplateLoopContext() {} CTemplateLoopContext(const CTemplateLoopContext&) = default; CTemplateLoopContext& operator=(const CTemplateLoopContext&) = default; // Setters void SetHasData(bool b = true) { m_bHasData = b; } void SetName(const CString& s) { m_sName = s; } void SetRowIndex(unsigned int u) { m_uRowIndex = u; } unsigned int IncRowIndex() { return ++m_uRowIndex; } unsigned int DecRowIndex() { if (m_uRowIndex == 0) { return 0; } return --m_uRowIndex; } void SetFilePosition(unsigned int u) { m_uFilePosition = u; } // !Setters // Getters bool HasData() const { return m_bHasData; } const CString& GetName() const { return m_sName; } unsigned long GetFilePosition() const { return m_uFilePosition; } unsigned int GetRowIndex() const { return m_uRowIndex; } size_t GetRowCount() { return m_pvRows->size(); } std::vector<CTemplate*>* GetRows() { return m_pvRows; } CTemplate* GetNextRow() { return GetRow(IncRowIndex()); } CTemplate* GetCurRow() { return GetRow(m_uRowIndex); } CTemplate* GetRow(unsigned int uIndex); CString GetValue(const CString& sName, bool bFromIf = false); // !Getters private: bool m_bReverse; //!< Iterate through this loop in reverse order bool m_bHasData; //!< Tells whether this loop has real data or not CString m_sName; //!< The name portion of the <?LOOP name?> tag unsigned int m_uRowIndex; //!< The index of the current row we're on unsigned long m_uFilePosition; //!< The file position of the opening <?LOOP?> tag std::vector<CTemplate*>* m_pvRows; //!< This holds pointers to the templates associated with this loop }; class CTemplate : public MCString { public: CTemplate() : CTemplate("") {} CTemplate(const CString& sFileName) : MCString(), m_pParent(nullptr), m_sFileName(sFileName), m_lsbPaths(), m_mvLoops(), m_vLoopContexts(), m_spOptions(new CTemplateOptions), m_vspTagHandlers() {} CTemplate(const std::shared_ptr<CTemplateOptions>& Options, CTemplate* pParent = nullptr) : MCString(), m_pParent(pParent), m_sFileName(""), m_lsbPaths(), m_mvLoops(), m_vLoopContexts(), m_spOptions(Options), m_vspTagHandlers() {} virtual ~CTemplate(); CTemplate(const CTemplate& other) = default; CTemplate& operator=(const CTemplate& other) = default; //! Class for implementing custom tags in subclasses void AddTagHandler(std::shared_ptr<CTemplateTagHandler> spTagHandler) { m_vspTagHandlers.push_back(spTagHandler); } std::vector<std::shared_ptr<CTemplateTagHandler>>& GetTagHandlers() { if (m_pParent) { return m_pParent->GetTagHandlers(); } return m_vspTagHandlers; } CString ResolveLiteral(const CString& sString); void Init(); CTemplate* GetParent(bool bRoot); CString ExpandFile(const CString& sFilename, bool bFromInc = false); bool SetFile(const CString& sFileName); void SetPath(const CString& sPath); // Sets the dir:dir:dir type path to // look at for templates, as of right // now no ../../.. protection CString MakePath(const CString& sPath) const; void PrependPath(const CString& sPath, bool bIncludesOnly = false); void AppendPath(const CString& sPath, bool bIncludesOnly = false); void RemovePath(const CString& sPath); void ClearPaths(); bool PrintString(CString& sRet); bool Print(std::ostream& oOut); bool Print(const CString& sFileName, std::ostream& oOut); bool ValidIf(const CString& sArgs); bool ValidExpr(const CString& sExpr); bool IsTrue(const CString& sName); bool HasLoop(const CString& sName); CString GetValue(const CString& sName, bool bFromIf = false); CTemplate& AddRow(const CString& sName); CTemplate* GetRow(const CString& sName, unsigned int uIndex); std::vector<CTemplate*>* GetLoop(const CString& sName); void DelCurLoopContext(); CTemplateLoopContext* GetCurLoopContext(); CTemplate* GetCurTemplate(); // Getters const CString& GetFileName() const { return m_sFileName; } // !Getters private: CTemplate* m_pParent; CString m_sFileName; std::list<std::pair<CString, bool>> m_lsbPaths; std::map<CString, std::vector<CTemplate*>> m_mvLoops; std::vector<CTemplateLoopContext*> m_vLoopContexts; std::shared_ptr<CTemplateOptions> m_spOptions; std::vector<std::shared_ptr<CTemplateTagHandler>> m_vspTagHandlers; }; #endif // !ZNC_TEMPLATE_H