1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2017 The PDFium Authors 2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file. 4*3ac0a46fSAndroid Build Coastguard Worker 5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6*3ac0a46fSAndroid Build Coastguard Worker 7*3ac0a46fSAndroid Build Coastguard Worker #ifndef XFA_FXFA_CXFA_TEXTPARSER_H_ 8*3ac0a46fSAndroid Build Coastguard Worker #define XFA_FXFA_CXFA_TEXTPARSER_H_ 9*3ac0a46fSAndroid Build Coastguard Worker 10*3ac0a46fSAndroid Build Coastguard Worker #include <stdint.h> 11*3ac0a46fSAndroid Build Coastguard Worker 12*3ac0a46fSAndroid Build Coastguard Worker #include <map> 13*3ac0a46fSAndroid Build Coastguard Worker #include <memory> 14*3ac0a46fSAndroid Build Coastguard Worker #include <vector> 15*3ac0a46fSAndroid Build Coastguard Worker 16*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/css/cfx_css.h" 17*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/css/cfx_csscomputedstyle.h" 18*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/css/cfx_cssdeclaration.h" 19*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/retain_ptr.h" 20*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/widestring.h" 21*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/dib/fx_dib.h" 22*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/gc/heap.h" 23*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/abseil-cpp/absl/types/optional.h" 24*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/garbage-collected.h" 25*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/fxfa_basic.h" 26*3ac0a46fSAndroid Build Coastguard Worker 27*3ac0a46fSAndroid Build Coastguard Worker class CFGAS_GEFont; 28*3ac0a46fSAndroid Build Coastguard Worker class CFX_CSSStyleSelector; 29*3ac0a46fSAndroid Build Coastguard Worker class CFX_CSSStyleSheet; 30*3ac0a46fSAndroid Build Coastguard Worker class CFX_XMLNode; 31*3ac0a46fSAndroid Build Coastguard Worker class CXFA_FFDoc; 32*3ac0a46fSAndroid Build Coastguard Worker class CXFA_TextProvider; 33*3ac0a46fSAndroid Build Coastguard Worker class CXFA_TextTabstopsContext; 34*3ac0a46fSAndroid Build Coastguard Worker 35*3ac0a46fSAndroid Build Coastguard Worker class CXFA_TextParser : public cppgc::GarbageCollected<CXFA_TextParser> { 36*3ac0a46fSAndroid Build Coastguard Worker public: 37*3ac0a46fSAndroid Build Coastguard Worker class Context { 38*3ac0a46fSAndroid Build Coastguard Worker public: 39*3ac0a46fSAndroid Build Coastguard Worker Context(); 40*3ac0a46fSAndroid Build Coastguard Worker ~Context(); 41*3ac0a46fSAndroid Build Coastguard Worker 42*3ac0a46fSAndroid Build Coastguard Worker void SetParentStyle(RetainPtr<const CFX_CSSComputedStyle> style); GetParentStyle()43*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<const CFX_CSSComputedStyle> GetParentStyle() const { 44*3ac0a46fSAndroid Build Coastguard Worker return m_pParentStyle; 45*3ac0a46fSAndroid Build Coastguard Worker } 46*3ac0a46fSAndroid Build Coastguard Worker SetDisplay(CFX_CSSDisplay eDisplay)47*3ac0a46fSAndroid Build Coastguard Worker void SetDisplay(CFX_CSSDisplay eDisplay) { m_eDisplay = eDisplay; } GetDisplay()48*3ac0a46fSAndroid Build Coastguard Worker CFX_CSSDisplay GetDisplay() const { return m_eDisplay; } 49*3ac0a46fSAndroid Build Coastguard Worker 50*3ac0a46fSAndroid Build Coastguard Worker void SetDecls(std::vector<const CFX_CSSDeclaration*>&& decl); GetDecls()51*3ac0a46fSAndroid Build Coastguard Worker const std::vector<const CFX_CSSDeclaration*>& GetDecls() const { 52*3ac0a46fSAndroid Build Coastguard Worker return decls_; 53*3ac0a46fSAndroid Build Coastguard Worker } 54*3ac0a46fSAndroid Build Coastguard Worker 55*3ac0a46fSAndroid Build Coastguard Worker private: 56*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<const CFX_CSSComputedStyle> m_pParentStyle; 57*3ac0a46fSAndroid Build Coastguard Worker CFX_CSSDisplay m_eDisplay = CFX_CSSDisplay::None; 58*3ac0a46fSAndroid Build Coastguard Worker std::vector<const CFX_CSSDeclaration*> decls_; 59*3ac0a46fSAndroid Build Coastguard Worker }; 60*3ac0a46fSAndroid Build Coastguard Worker 61*3ac0a46fSAndroid Build Coastguard Worker CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; 62*3ac0a46fSAndroid Build Coastguard Worker virtual ~CXFA_TextParser(); 63*3ac0a46fSAndroid Build Coastguard Worker Trace(cppgc::Visitor * visitor)64*3ac0a46fSAndroid Build Coastguard Worker void Trace(cppgc::Visitor* visitor) const {} 65*3ac0a46fSAndroid Build Coastguard Worker 66*3ac0a46fSAndroid Build Coastguard Worker void Reset(); 67*3ac0a46fSAndroid Build Coastguard Worker void DoParse(const CFX_XMLNode* pXMLContainer, 68*3ac0a46fSAndroid Build Coastguard Worker CXFA_TextProvider* pTextProvider); 69*3ac0a46fSAndroid Build Coastguard Worker 70*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFX_CSSComputedStyle> CreateRootStyle( 71*3ac0a46fSAndroid Build Coastguard Worker CXFA_TextProvider* pTextProvider); 72*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFX_CSSComputedStyle> ComputeStyle( 73*3ac0a46fSAndroid Build Coastguard Worker const CFX_XMLNode* pXMLNode, 74*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<const CFX_CSSComputedStyle> pParentStyle); 75*3ac0a46fSAndroid Build Coastguard Worker IsParsed()76*3ac0a46fSAndroid Build Coastguard Worker bool IsParsed() const { return m_bParsed; } 77*3ac0a46fSAndroid Build Coastguard Worker 78*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue GetVAlign(CXFA_TextProvider* pTextProvider) const; 79*3ac0a46fSAndroid Build Coastguard Worker 80*3ac0a46fSAndroid Build Coastguard Worker float GetTabInterval(const CFX_CSSComputedStyle* pStyle) const; 81*3ac0a46fSAndroid Build Coastguard Worker int32_t CountTabs(const CFX_CSSComputedStyle* pStyle) const; 82*3ac0a46fSAndroid Build Coastguard Worker 83*3ac0a46fSAndroid Build Coastguard Worker bool IsSpaceRun(const CFX_CSSComputedStyle* pStyle) const; 84*3ac0a46fSAndroid Build Coastguard Worker bool GetTabstops(const CFX_CSSComputedStyle* pStyle, 85*3ac0a46fSAndroid Build Coastguard Worker CXFA_TextTabstopsContext* pTabstopContext); 86*3ac0a46fSAndroid Build Coastguard Worker 87*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFGAS_GEFont> GetFont(CXFA_FFDoc* doc, 88*3ac0a46fSAndroid Build Coastguard Worker CXFA_TextProvider* pTextProvider, 89*3ac0a46fSAndroid Build Coastguard Worker const CFX_CSSComputedStyle* pStyle) const; 90*3ac0a46fSAndroid Build Coastguard Worker float GetFontSize(CXFA_TextProvider* pTextProvider, 91*3ac0a46fSAndroid Build Coastguard Worker const CFX_CSSComputedStyle* pStyle) const; 92*3ac0a46fSAndroid Build Coastguard Worker int32_t GetHorScale(CXFA_TextProvider* pTextProvider, 93*3ac0a46fSAndroid Build Coastguard Worker const CFX_CSSComputedStyle* pStyle, 94*3ac0a46fSAndroid Build Coastguard Worker const CFX_XMLNode* pXMLNode) const; 95*3ac0a46fSAndroid Build Coastguard Worker int32_t GetVerScale(CXFA_TextProvider* pTextProvider, 96*3ac0a46fSAndroid Build Coastguard Worker const CFX_CSSComputedStyle* pStyle) const; 97*3ac0a46fSAndroid Build Coastguard Worker int32_t GetUnderline(CXFA_TextProvider* pTextProvider, 98*3ac0a46fSAndroid Build Coastguard Worker const CFX_CSSComputedStyle* pStyle) const; 99*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue GetUnderlinePeriod( 100*3ac0a46fSAndroid Build Coastguard Worker CXFA_TextProvider* pTextProvider, 101*3ac0a46fSAndroid Build Coastguard Worker const CFX_CSSComputedStyle* pStyle) const; 102*3ac0a46fSAndroid Build Coastguard Worker int32_t GetLinethrough(CXFA_TextProvider* pTextProvider, 103*3ac0a46fSAndroid Build Coastguard Worker const CFX_CSSComputedStyle* pStyle) const; 104*3ac0a46fSAndroid Build Coastguard Worker FX_ARGB GetColor(CXFA_TextProvider* pTextProvider, 105*3ac0a46fSAndroid Build Coastguard Worker const CFX_CSSComputedStyle* pStyle) const; 106*3ac0a46fSAndroid Build Coastguard Worker float GetBaseline(CXFA_TextProvider* pTextProvider, 107*3ac0a46fSAndroid Build Coastguard Worker const CFX_CSSComputedStyle* pStyle) const; 108*3ac0a46fSAndroid Build Coastguard Worker float GetLineHeight(CXFA_TextProvider* pTextProvider, 109*3ac0a46fSAndroid Build Coastguard Worker const CFX_CSSComputedStyle* pStyle, 110*3ac0a46fSAndroid Build Coastguard Worker bool bFirst, 111*3ac0a46fSAndroid Build Coastguard Worker float fVerScale) const; 112*3ac0a46fSAndroid Build Coastguard Worker 113*3ac0a46fSAndroid Build Coastguard Worker absl::optional<WideString> GetEmbeddedObj( 114*3ac0a46fSAndroid Build Coastguard Worker const CXFA_TextProvider* pTextProvider, 115*3ac0a46fSAndroid Build Coastguard Worker const CFX_XMLNode* pXMLNode); 116*3ac0a46fSAndroid Build Coastguard Worker Context* GetParseContextFromMap(const CFX_XMLNode* pXMLNode); 117*3ac0a46fSAndroid Build Coastguard Worker 118*3ac0a46fSAndroid Build Coastguard Worker protected: 119*3ac0a46fSAndroid Build Coastguard Worker CXFA_TextParser(); 120*3ac0a46fSAndroid Build Coastguard Worker 121*3ac0a46fSAndroid Build Coastguard Worker bool TagValidate(const WideString& str) const; 122*3ac0a46fSAndroid Build Coastguard Worker 123*3ac0a46fSAndroid Build Coastguard Worker private: 124*3ac0a46fSAndroid Build Coastguard Worker class TagProvider { 125*3ac0a46fSAndroid Build Coastguard Worker public: 126*3ac0a46fSAndroid Build Coastguard Worker TagProvider(); 127*3ac0a46fSAndroid Build Coastguard Worker ~TagProvider(); 128*3ac0a46fSAndroid Build Coastguard Worker GetTagName()129*3ac0a46fSAndroid Build Coastguard Worker WideString GetTagName() { return m_wsTagName; } 130*3ac0a46fSAndroid Build Coastguard Worker SetTagName(const WideString & wsName)131*3ac0a46fSAndroid Build Coastguard Worker void SetTagName(const WideString& wsName) { m_wsTagName = wsName; } SetAttribute(const WideString & wsAttr,const WideString & wsValue)132*3ac0a46fSAndroid Build Coastguard Worker void SetAttribute(const WideString& wsAttr, const WideString& wsValue) { 133*3ac0a46fSAndroid Build Coastguard Worker m_Attributes.insert({wsAttr, wsValue}); 134*3ac0a46fSAndroid Build Coastguard Worker } 135*3ac0a46fSAndroid Build Coastguard Worker GetAttribute(const WideString & wsAttr)136*3ac0a46fSAndroid Build Coastguard Worker WideString GetAttribute(const WideString& wsAttr) { 137*3ac0a46fSAndroid Build Coastguard Worker return m_Attributes[wsAttr]; 138*3ac0a46fSAndroid Build Coastguard Worker } 139*3ac0a46fSAndroid Build Coastguard Worker 140*3ac0a46fSAndroid Build Coastguard Worker bool m_bTagAvailable = false; 141*3ac0a46fSAndroid Build Coastguard Worker bool m_bContent = false; 142*3ac0a46fSAndroid Build Coastguard Worker 143*3ac0a46fSAndroid Build Coastguard Worker private: 144*3ac0a46fSAndroid Build Coastguard Worker WideString m_wsTagName; 145*3ac0a46fSAndroid Build Coastguard Worker std::map<WideString, WideString> m_Attributes; 146*3ac0a46fSAndroid Build Coastguard Worker }; 147*3ac0a46fSAndroid Build Coastguard Worker 148*3ac0a46fSAndroid Build Coastguard Worker // static 149*3ac0a46fSAndroid Build Coastguard Worker std::unique_ptr<TagProvider> ParseTagInfo(const CFX_XMLNode* pXMLNode); 150*3ac0a46fSAndroid Build Coastguard Worker 151*3ac0a46fSAndroid Build Coastguard Worker void InitCSSData(CXFA_TextProvider* pTextProvider); 152*3ac0a46fSAndroid Build Coastguard Worker void ParseRichText(const CFX_XMLNode* pXMLNode, 153*3ac0a46fSAndroid Build Coastguard Worker const CFX_CSSComputedStyle* pParentStyle); 154*3ac0a46fSAndroid Build Coastguard Worker std::unique_ptr<CFX_CSSStyleSheet> LoadDefaultSheetStyle(); 155*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFX_CSSComputedStyle> CreateStyle( 156*3ac0a46fSAndroid Build Coastguard Worker const CFX_CSSComputedStyle* pParentStyle); 157*3ac0a46fSAndroid Build Coastguard Worker 158*3ac0a46fSAndroid Build Coastguard Worker bool m_bParsed = false; 159*3ac0a46fSAndroid Build Coastguard Worker bool m_cssInitialized = false; 160*3ac0a46fSAndroid Build Coastguard Worker std::unique_ptr<CFX_CSSStyleSelector> m_pSelector; 161*3ac0a46fSAndroid Build Coastguard Worker std::map<const CFX_XMLNode*, std::unique_ptr<Context>> 162*3ac0a46fSAndroid Build Coastguard Worker m_mapXMLNodeToParseContext; 163*3ac0a46fSAndroid Build Coastguard Worker }; 164*3ac0a46fSAndroid Build Coastguard Worker 165*3ac0a46fSAndroid Build Coastguard Worker #endif // XFA_FXFA_CXFA_TEXTPARSER_H_ 166