// KTextParser.h: interface for the KTextParser class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_KTEXTPARSER_H__8015B58E_E66F_4CBF_9B38_FBAB7C1A61E4__INCLUDED_) #define AFX_KTEXTPARSER_H__8015B58E_E66F_4CBF_9B38_FBAB7C1A61E4__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 /* KTextParser Usage commands: Font - ex : - font 변경 Size - ex : - font size 조절 Color - <#RRGGBB[AA]> ex: <#ff00ff> , <#ff00ff88> Replacement - <$[ (L) ID | Alias string]> ex: <$L100> <$100> <$PLAYER_NAME> <$PLAYER_LEVEL> Paragraph Control -
Break line -

Break Page Bold - is bold on and is bold off. Inverse - is inverse text. is inverse off. Strike - : strike line on : strike line off Shadow - is shadow text is shadow off Outline - is outline text is outline off Glow - is glow text is glow off Underline - : underline on : underline off 줄맞춤은 한 Phrase당 한번밖에 설정 못함 Align - , , ,, , Emoticon Display - <%%ID > ex : <%%10> , <%%10> Pnx Emoticon Display - <%ID > ex : <%10> */ #include "K3DTypes.h" #include "KTextRender.h" #ifdef _COUNTRY_ME_ #include "Localization/MiddleEast.h" #endif class KTextParser { public: KTextParser(); ~KTextParser(); enum ICON_TYPE { KICON_TEXT = 0, KICON_EMOTICON, KICON_NX3, }; // maxWidth는 Pixel 좌표 // 2010.06.08 - prodongi int AddString(LPCSTR lpszString, DWORD dwMaxWidth = 256, bool bTagEnable = true, bool bUseSplit = false, bool scroll = false); //int AddString(LPCSTR lpszString, DWORD dwMaxWidth = 256, bool bTagEnable = true, bool bUseSplit = false); #ifdef _COUNTRY_ME_ int GetParagraphCount() { return (int)m_vtTextParagraph.size(); } KTextParagraph* GetTextParagraph(int nIndex) { return m_vtTextParagraph.at(nIndex); } const KTextParagraph* GetTextParagraph(int nIndex) const { return m_vtTextParagraph.at(nIndex); } struct StringTableHandler { virtual const char* getString( int nId ) = 0; }; static void SetStringTable( StringTableHandler *pHandler ) { s_pStringTableHandler = pHandler; } static const char* GetString( int nId ) { if( s_pStringTableHandler ) return s_pStringTableHandler->getString( nId ); return NULL; } static void AddEmoticonFilter( const std::string& strText, const std::string& strAni ); static StringTableHandler* s_pStringTableHandler; std::vector m_vtTextParagraph; typedef std::map mapEmoticon; typedef mapEmoticon::iterator imapEmoticon; static mapEmoticon s_mapEmoticonFilter; #else struct TEXT_PRIMITIVE { TEXT_PRIMITIVE() { Init(); } void Init() { bIsLineBreak = false; bIsWordWrap = false; nPageBreak = nBreak = 0; sFontName = KTextRender::KDEFAULT_FONT_NAME; nFontSize = KTextRender::KDEFAULT_FONT_SIZE; Color = KColor(0xFFFFFFFF); ColorFX = KColor(0xFF000000); dwFontFlag = 0; dwIconType = KICON_TEXT; dwIconID = 0; dwCount = 0; dwOffset = 0; nOffsetY = 0; ///< 그려질 오브젝트 y 오프셋 nBlankWidth = 0; bContinue = false; sText.erase(); } bool bIsLineBreak; ///< 라인을 끊어서 찍어야 함 -_- bool bIsWordWrap; /// 몇번 나왔나 숫자를 나타냄 int nBreak; // int nPageBreak; //

/// int nFontSize; std::string sFontName; /// <#ffffffff> KColor Color; KColor ColorFX; /// , , , , DWORD dwFontFlag; /// <%[ (S) | M | L ] ID >, <%%[ (S) | M | L ] ID > DWORD dwIconType; DWORD dwIconID; DWORD dwCount; // DWORD dwOffset; short nOffsetY; ///< 그려질 오브젝트 y 오프셋 unsigned short nBlankWidth; bool bContinue; std::string sText; }; int GetPrimitiveCount() { return (int)m_vtTextPrimitive.size(); } TEXT_PRIMITIVE & GetPrimitive(int nIndex) { return m_vtTextPrimitive.at(nIndex); } const TEXT_PRIMITIVE & GetPrimitive(int nIndex) const { return m_vtTextPrimitive.at(nIndex); } std::vector m_vtTextPrimitive; /// Using for changing phrase tag when tag is disabled. TEXT_PRIMITIVE & GetCurrentTP() { return m_CurrentTP; } TEXT_PRIMITIVE m_CurrentTP; #endif DWORD GetAlign() { return m_dwHAlign | m_dwVAlign; } void SetAlign(DWORD dwHAlign, DWORD dwVAlign) { m_dwHAlign = dwHAlign; m_dwVAlign = dwVAlign; } void Clear() { #ifdef _COUNTRY_ME_ for ( std::vector < KTextParagraph* >::iterator it = m_vtTextParagraph.begin(); it != m_vtTextParagraph.end(); ++it ) delete *it; m_vtTextParagraph.clear(); #else m_vtTextPrimitive.clear(); #endif m_dwCurrentLineWidth = 0; } void SetEditMode( bool bFlag ) { m_bEditMode = bFlag; } static void SetUseWordWrap( bool bFlag ) { s_bUseWordWrap = bFlag; } static bool GetUseWordWrap() { return s_bUseWordWrap; } private: struct TEXT_TOKEN { enum TOKEN_TYPE { NONE = 0, INVALID, ///< 1 EOS, ///< 2 TEXT, ///< 3 TEXTCMD, ///< 4 FONT, ///< 5 SIZE, ///< 6 COLOR, ///< 7 BOLD, ///< 8 UNBOLD, ///< 9 UNDER_LINE, ///< 10 UNDER_LINEOFF, ///< 11 STRIKE_LINE, ///< 12 STRIKE_LINEOFF,///< 13 SHADOW, ///< 14 SHADOWOFF, ///< 15 INVERSE, ///< 16 INVERSE_OFF, ///< 17 BREAK, ///< 18 PAGEBREAK, ///< 19 EMOTICON, ///< 20 NX3, ///< 21 HALIGN, ///< 22 VALIGN, ///< 23 OUTLINE, ///< 24 OUTLINEOFF, ///< 25 GLOW, ///< 26 GLOWOFF, ///< 27 COLOR_FX, ///< 28 GLOW2X, ///< 29 GLOW2XOFF, ///< 30 OFFSET, ///< 31 CARET, ///< 32 CARET_OFF, ///< 33 OFFSETY, ///< 34 // 그려질 오브젝트 y 오프셋 추가 적용 UNKNOWN }; DWORD dwType; std::string sText; std::string sTokenText; union { DWORD dwAlign; DWORD dwIconID; DWORD dwColor; DWORD dwFontSize; DWORD dwOffset; short nOffsetY; ///< 그려질 오브젝트 y 오프셋 }; }; // 2010.06.08 - prodongi void _AddString(LPCSTR lpszString, int nDepth, DWORD dwMaxWidth, bool bTagEnable, bool bUseSplit, bool scroll); //void _AddString(LPCSTR lpszString, int nDepth, DWORD dwMaxWidth, bool bTagEnable, bool bUseSplit); void _GetNextToken( TEXT_TOKEN *pToken, LPCSTR lpszToken, int & nCount); void _InterpretCommand( LPCSTR lpszToken, TEXT_TOKEN * pToken); DWORD m_dwCurrentLineWidth; ///< 현재까지 지나온 Line의 길이 저장 /// Parsing 해서 나온 Align Value 저장 DWORD m_dwHAlign; DWORD m_dwVAlign; bool m_bEditMode; static bool s_bUseWordWrap; }; #endif // !defined(AFX_KTEXTPARSER_H__8015B58E_E66F_4CBF_9B38_FBAB7C1A61E4__INCLUDED_)