// Copyright 2017 The PDFium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #ifndef XFA_FXFA_CXFA_TEXTPARSER_H_ #define XFA_FXFA_CXFA_TEXTPARSER_H_ #include #include #include #include #include "core/fxcrt/css/cfx_css.h" #include "core/fxcrt/css/cfx_csscomputedstyle.h" #include "core/fxcrt/css/cfx_cssdeclaration.h" #include "core/fxcrt/retain_ptr.h" #include "core/fxcrt/widestring.h" #include "core/fxge/dib/fx_dib.h" #include "fxjs/gc/heap.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "v8/include/cppgc/garbage-collected.h" #include "xfa/fxfa/fxfa_basic.h" class CFGAS_GEFont; class CFX_CSSStyleSelector; class CFX_CSSStyleSheet; class CFX_XMLNode; class CXFA_FFDoc; class CXFA_TextProvider; class CXFA_TextTabstopsContext; class CXFA_TextParser : public cppgc::GarbageCollected { public: class Context { public: Context(); ~Context(); void SetParentStyle(RetainPtr style); RetainPtr GetParentStyle() const { return m_pParentStyle; } void SetDisplay(CFX_CSSDisplay eDisplay) { m_eDisplay = eDisplay; } CFX_CSSDisplay GetDisplay() const { return m_eDisplay; } void SetDecls(std::vector&& decl); const std::vector& GetDecls() const { return decls_; } private: RetainPtr m_pParentStyle; CFX_CSSDisplay m_eDisplay = CFX_CSSDisplay::None; std::vector decls_; }; CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; virtual ~CXFA_TextParser(); void Trace(cppgc::Visitor* visitor) const {} void Reset(); void DoParse(const CFX_XMLNode* pXMLContainer, CXFA_TextProvider* pTextProvider); RetainPtr CreateRootStyle( CXFA_TextProvider* pTextProvider); RetainPtr ComputeStyle( const CFX_XMLNode* pXMLNode, RetainPtr pParentStyle); bool IsParsed() const { return m_bParsed; } XFA_AttributeValue GetVAlign(CXFA_TextProvider* pTextProvider) const; float GetTabInterval(const CFX_CSSComputedStyle* pStyle) const; int32_t CountTabs(const CFX_CSSComputedStyle* pStyle) const; bool IsSpaceRun(const CFX_CSSComputedStyle* pStyle) const; bool GetTabstops(const CFX_CSSComputedStyle* pStyle, CXFA_TextTabstopsContext* pTabstopContext); RetainPtr GetFont(CXFA_FFDoc* doc, CXFA_TextProvider* pTextProvider, const CFX_CSSComputedStyle* pStyle) const; float GetFontSize(CXFA_TextProvider* pTextProvider, const CFX_CSSComputedStyle* pStyle) const; int32_t GetHorScale(CXFA_TextProvider* pTextProvider, const CFX_CSSComputedStyle* pStyle, const CFX_XMLNode* pXMLNode) const; int32_t GetVerScale(CXFA_TextProvider* pTextProvider, const CFX_CSSComputedStyle* pStyle) const; int32_t GetUnderline(CXFA_TextProvider* pTextProvider, const CFX_CSSComputedStyle* pStyle) const; XFA_AttributeValue GetUnderlinePeriod( CXFA_TextProvider* pTextProvider, const CFX_CSSComputedStyle* pStyle) const; int32_t GetLinethrough(CXFA_TextProvider* pTextProvider, const CFX_CSSComputedStyle* pStyle) const; FX_ARGB GetColor(CXFA_TextProvider* pTextProvider, const CFX_CSSComputedStyle* pStyle) const; float GetBaseline(CXFA_TextProvider* pTextProvider, const CFX_CSSComputedStyle* pStyle) const; float GetLineHeight(CXFA_TextProvider* pTextProvider, const CFX_CSSComputedStyle* pStyle, bool bFirst, float fVerScale) const; absl::optional GetEmbeddedObj( const CXFA_TextProvider* pTextProvider, const CFX_XMLNode* pXMLNode); Context* GetParseContextFromMap(const CFX_XMLNode* pXMLNode); protected: CXFA_TextParser(); bool TagValidate(const WideString& str) const; private: class TagProvider { public: TagProvider(); ~TagProvider(); WideString GetTagName() { return m_wsTagName; } void SetTagName(const WideString& wsName) { m_wsTagName = wsName; } void SetAttribute(const WideString& wsAttr, const WideString& wsValue) { m_Attributes.insert({wsAttr, wsValue}); } WideString GetAttribute(const WideString& wsAttr) { return m_Attributes[wsAttr]; } bool m_bTagAvailable = false; bool m_bContent = false; private: WideString m_wsTagName; std::map m_Attributes; }; // static std::unique_ptr ParseTagInfo(const CFX_XMLNode* pXMLNode); void InitCSSData(CXFA_TextProvider* pTextProvider); void ParseRichText(const CFX_XMLNode* pXMLNode, const CFX_CSSComputedStyle* pParentStyle); std::unique_ptr LoadDefaultSheetStyle(); RetainPtr CreateStyle( const CFX_CSSComputedStyle* pParentStyle); bool m_bParsed = false; bool m_cssInitialized = false; std::unique_ptr m_pSelector; std::map> m_mapXMLNodeToParseContext; }; #endif // XFA_FXFA_CXFA_TEXTPARSER_H_