Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Side by Side Diff: xfa/src/fxfa/parser/xfa_locale.cpp

Issue 1803723002: Move xfa/src up to xfa/. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Rebase to master Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « xfa/src/fxfa/parser/xfa_locale.h ('k') | xfa/src/fxfa/parser/xfa_localemgr.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "xfa/src/fxfa/parser/xfa_locale.h"
8
9 #include "core/include/fxcrt/fx_xml.h"
10 #include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
11 #include "xfa/src/fxfa/parser/xfa_docdata.h"
12 #include "xfa/src/fxfa/parser/xfa_doclayout.h"
13 #include "xfa/src/fxfa/parser/xfa_document.h"
14 #include "xfa/src/fxfa/parser/xfa_localemgr.h"
15 #include "xfa/src/fxfa/parser/xfa_object.h"
16 #include "xfa/src/fxfa/parser/xfa_parser.h"
17 #include "xfa/src/fxfa/parser/xfa_script.h"
18 #include "xfa/src/fxfa/parser/xfa_utils.h"
19
20 static const FX_WCHAR g_FX_Percent[] = L"z,zzz,zzz,zzz,zzz,zzz%";
21 static const FX_WCHAR g_FX_Currency[] = L"$z,zzz,zzz,zzz,zzz,zz9.99";
22 static const FX_WCHAR g_FX_Decimal[] = L"z,zzz,zzz,zzz,zzz,zz9.zzz";
23 static const FX_WCHAR g_FX_Integer[] = L"z,zzz,zzz,zzz,zzz,zzz";
24
25 CXFA_XMLLocale::CXFA_XMLLocale(CXML_Element* pLocaleData) {
26 m_pLocaleData = pLocaleData;
27 }
28 CXFA_XMLLocale::~CXFA_XMLLocale() {
29 if (m_pLocaleData) {
30 delete m_pLocaleData;
31 }
32 }
33 void CXFA_XMLLocale::Release() {
34 delete this;
35 }
36 CFX_WideString CXFA_XMLLocale::GetName() {
37 return m_pLocaleData ? m_pLocaleData->GetAttrValue("name") : CFX_WideString();
38 }
39 void CXFA_XMLLocale::GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
40 CFX_WideString& wsNumSymbol) const {
41 CFX_ByteString bsSymbols;
42 CFX_WideString wsName;
43 switch (eType) {
44 case FX_LOCALENUMSYMBOL_Decimal:
45 bsSymbols = "numberSymbols";
46 wsName = FX_WSTRC(L"decimal");
47 break;
48 case FX_LOCALENUMSYMBOL_Grouping:
49 bsSymbols = "numberSymbols";
50 wsName = FX_WSTRC(L"grouping");
51 break;
52 case FX_LOCALENUMSYMBOL_Percent:
53 bsSymbols = "numberSymbols";
54 wsName = FX_WSTRC(L"percent");
55 break;
56 case FX_LOCALENUMSYMBOL_Minus:
57 bsSymbols = "numberSymbols";
58 wsName = FX_WSTRC(L"minus");
59 break;
60 case FX_LOCALENUMSYMBOL_Zero:
61 bsSymbols = "numberSymbols";
62 wsName = FX_WSTRC(L"zero");
63 break;
64 case FX_LOCALENUMSYMBOL_CurrencySymbol:
65 bsSymbols = "currencySymbols";
66 wsName = FX_WSTRC(L"symbol");
67 break;
68 case FX_LOCALENUMSYMBOL_CurrencyName:
69 bsSymbols = "currencySymbols";
70 wsName = FX_WSTRC(L"isoname");
71 break;
72 default:
73 return;
74 }
75 CXML_Element* pElement = m_pLocaleData->GetElement("", bsSymbols);
76 if (!pElement) {
77 return;
78 }
79 GetPattern(pElement, CFX_ByteStringC((const FX_CHAR*)bsSymbols,
80 bsSymbols.GetLength() - 1),
81 wsName, wsNumSymbol);
82 }
83 void CXFA_XMLLocale::GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const {
84 if (!m_pLocaleData) {
85 return;
86 }
87 CFX_ByteString bsSpace;
88 CXML_Element* pNumberSymbols =
89 m_pLocaleData->GetElement(bsSpace, "dateTimeSymbols");
90 if (!pNumberSymbols) {
91 return;
92 }
93 wsDtSymbol = pNumberSymbols->GetContent(0);
94 }
95 void CXFA_XMLLocale::GetMonthName(int32_t nMonth,
96 CFX_WideString& wsMonthName,
97 FX_BOOL bAbbr) const {
98 wsMonthName = GetCalendarSymbol("month", nMonth, bAbbr);
99 }
100 void CXFA_XMLLocale::GetDayName(int32_t nWeek,
101 CFX_WideString& wsDayName,
102 FX_BOOL bAbbr) const {
103 wsDayName = GetCalendarSymbol("day", nWeek, bAbbr);
104 }
105 void CXFA_XMLLocale::GetMeridiemName(CFX_WideString& wsMeridiemName,
106 FX_BOOL bAM) const {
107 wsMeridiemName = GetCalendarSymbol("meridiem", bAM ? 0 : 1, FALSE);
108 }
109 void CXFA_XMLLocale::GetTimeZone(FX_TIMEZONE& tz) const {
110 IXFA_TimeZoneProvider* pProvider = IXFA_TimeZoneProvider::Get();
111 pProvider->GetTimeZone(tz);
112 }
113 void CXFA_XMLLocale::GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD) const {
114 wsEraName = GetCalendarSymbol("era", bAD ? 1 : 0, FALSE);
115 }
116 CFX_WideString CXFA_XMLLocale::GetCalendarSymbol(const CFX_ByteStringC& symbol,
117 int index,
118 FX_BOOL bAbbr) const {
119 CFX_ByteString pstrSymbolNames = symbol + "Names";
120 CFX_WideString wsSymbolName = L"";
121 if (m_pLocaleData) {
122 CXML_Element* pChild = m_pLocaleData->GetElement("", "calendarSymbols");
123 if (pChild) {
124 CXML_Element* pSymbolNames = pChild->GetElement("", pstrSymbolNames);
125 if (pSymbolNames) {
126 if (pSymbolNames->GetAttrInteger("abbr") != bAbbr) {
127 pSymbolNames = pChild->GetElement("", pstrSymbolNames, 1);
128 }
129 if (pSymbolNames && pSymbolNames->GetAttrInteger("abbr") == bAbbr) {
130 CXML_Element* pSymbolName =
131 pSymbolNames->GetElement("", symbol, index);
132 if (pSymbolName) {
133 wsSymbolName = pSymbolName->GetContent(0);
134 }
135 }
136 }
137 }
138 }
139 return wsSymbolName;
140 }
141 void CXFA_XMLLocale::GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
142 CFX_WideString& wsPattern) const {
143 CXML_Element* pElement = m_pLocaleData->GetElement("", "datePatterns");
144 if (pElement == NULL) {
145 return;
146 }
147 CFX_WideString wsName;
148 switch (eType) {
149 case FX_LOCALEDATETIMESUBCATEGORY_Short:
150 wsName = L"short";
151 break;
152 case FX_LOCALEDATETIMESUBCATEGORY_Default:
153 case FX_LOCALEDATETIMESUBCATEGORY_Medium:
154 wsName = L"med";
155 break;
156 case FX_LOCALEDATETIMESUBCATEGORY_Full:
157 wsName = L"full";
158 break;
159 case FX_LOCALEDATETIMESUBCATEGORY_Long:
160 wsName = L"long";
161 break;
162 }
163 GetPattern(pElement, "datePattern", wsName, wsPattern);
164 }
165 void CXFA_XMLLocale::GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
166 CFX_WideString& wsPattern) const {
167 CXML_Element* pElement = m_pLocaleData->GetElement("", "timePatterns");
168 if (pElement == NULL) {
169 return;
170 }
171 CFX_WideString wsName;
172 switch (eType) {
173 case FX_LOCALEDATETIMESUBCATEGORY_Short:
174 wsName = L"short";
175 break;
176 case FX_LOCALEDATETIMESUBCATEGORY_Default:
177 case FX_LOCALEDATETIMESUBCATEGORY_Medium:
178 wsName = L"med";
179 break;
180 case FX_LOCALEDATETIMESUBCATEGORY_Full:
181 wsName = L"full";
182 break;
183 case FX_LOCALEDATETIMESUBCATEGORY_Long:
184 wsName = L"long";
185 break;
186 }
187 GetPattern(pElement, "timePattern", wsName, wsPattern);
188 }
189 void CXFA_XMLLocale::GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
190 CFX_WideString& wsPattern) const {
191 CXML_Element* pElement = m_pLocaleData->GetElement("", "numberPatterns");
192 if (pElement == NULL) {
193 return;
194 }
195 switch (eType) {
196 case FX_LOCALENUMPATTERN_Percent:
197 wsPattern = g_FX_Percent;
198 break;
199 case FX_LOCALENUMPATTERN_Currency:
200 wsPattern = g_FX_Currency;
201 break;
202 case FX_LOCALENUMPATTERN_Decimal:
203 wsPattern = g_FX_Decimal;
204 break;
205 case FX_LOCALENUMPATTERN_Integer:
206 wsPattern = g_FX_Integer;
207 break;
208 }
209 }
210 void CXFA_XMLLocale::GetPattern(CXML_Element* pElement,
211 const CFX_ByteStringC& bsTag,
212 const CFX_WideStringC& wsName,
213 CFX_WideString& wsPattern) const {
214 int32_t iCount = pElement->CountElements("", bsTag);
215 for (int32_t i = 0; i < iCount; i++) {
216 CXML_Element* pChild = pElement->GetElement("", bsTag, i);
217 if (pChild->GetAttrValue("name") == wsName) {
218 wsPattern = pChild->GetContent(0);
219 return;
220 }
221 }
222 }
223 CXFA_NodeLocale::CXFA_NodeLocale(CXFA_Node* pLocale) {
224 m_pLocale = pLocale;
225 }
226 CXFA_NodeLocale::~CXFA_NodeLocale() {}
227 void CXFA_NodeLocale::Release() {
228 delete this;
229 }
230 CFX_WideString CXFA_NodeLocale::GetName() {
231 return m_pLocale ? m_pLocale->GetCData(XFA_ATTRIBUTE_Name) : NULL;
232 }
233 void CXFA_NodeLocale::GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
234 CFX_WideString& wsNumSymbol) const {
235 switch (eType) {
236 case FX_LOCALENUMSYMBOL_Decimal:
237 wsNumSymbol = GetSymbol(XFA_ELEMENT_NumberSymbols, FX_WSTRC(L"decimal"));
238 break;
239 case FX_LOCALENUMSYMBOL_Grouping:
240 wsNumSymbol = GetSymbol(XFA_ELEMENT_NumberSymbols, FX_WSTRC(L"grouping"));
241 break;
242 case FX_LOCALENUMSYMBOL_Percent:
243 wsNumSymbol = GetSymbol(XFA_ELEMENT_NumberSymbols, FX_WSTRC(L"percent"));
244 break;
245 case FX_LOCALENUMSYMBOL_Minus:
246 wsNumSymbol = GetSymbol(XFA_ELEMENT_NumberSymbols, FX_WSTRC(L"minus"));
247 break;
248 case FX_LOCALENUMSYMBOL_Zero:
249 wsNumSymbol = GetSymbol(XFA_ELEMENT_NumberSymbols, FX_WSTRC(L"zero"));
250 break;
251 case FX_LOCALENUMSYMBOL_CurrencySymbol:
252 wsNumSymbol = GetSymbol(XFA_ELEMENT_CurrencySymbols, FX_WSTRC(L"symbol"));
253 break;
254 case FX_LOCALENUMSYMBOL_CurrencyName:
255 wsNumSymbol =
256 GetSymbol(XFA_ELEMENT_CurrencySymbols, FX_WSTRC(L"isoname"));
257 break;
258 }
259 }
260 void CXFA_NodeLocale::GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const {
261 CXFA_Node* pSymbols =
262 m_pLocale ? m_pLocale->GetChild(0, XFA_ELEMENT_DateTimeSymbols) : NULL;
263 wsDtSymbol = pSymbols ? pSymbols->GetContent() : CFX_WideString();
264 }
265 void CXFA_NodeLocale::GetMonthName(int32_t nMonth,
266 CFX_WideString& wsMonthName,
267 FX_BOOL bAbbr) const {
268 wsMonthName = GetCalendarSymbol(XFA_ELEMENT_MonthNames, nMonth, bAbbr);
269 }
270 void CXFA_NodeLocale::GetDayName(int32_t nWeek,
271 CFX_WideString& wsDayName,
272 FX_BOOL bAbbr) const {
273 wsDayName = GetCalendarSymbol(XFA_ELEMENT_DayNames, nWeek, bAbbr);
274 }
275 void CXFA_NodeLocale::GetMeridiemName(CFX_WideString& wsMeridiemName,
276 FX_BOOL bAM) const {
277 wsMeridiemName =
278 GetCalendarSymbol(XFA_ELEMENT_MeridiemNames, bAM ? 0 : 1, FALSE);
279 }
280 void CXFA_NodeLocale::GetTimeZone(FX_TIMEZONE& tz) const {
281 IXFA_TimeZoneProvider* pProvider = IXFA_TimeZoneProvider::Get();
282 pProvider->GetTimeZone(tz);
283 }
284 void CXFA_NodeLocale::GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD) const {
285 wsEraName = GetCalendarSymbol(XFA_ELEMENT_EraNames, bAD ? 1 : 0, FALSE);
286 }
287 void CXFA_NodeLocale::GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
288 CFX_WideString& wsPattern) const {
289 switch (eType) {
290 case FX_LOCALEDATETIMESUBCATEGORY_Short:
291 wsPattern = GetSymbol(XFA_ELEMENT_DatePatterns, FX_WSTRC(L"short"));
292 break;
293 case FX_LOCALEDATETIMESUBCATEGORY_Medium:
294 case FX_LOCALEDATETIMESUBCATEGORY_Default:
295 wsPattern = GetSymbol(XFA_ELEMENT_DatePatterns, FX_WSTRC(L"med"));
296 break;
297 case FX_LOCALEDATETIMESUBCATEGORY_Full:
298 wsPattern = GetSymbol(XFA_ELEMENT_DatePatterns, FX_WSTRC(L"full"));
299 break;
300 case FX_LOCALEDATETIMESUBCATEGORY_Long:
301 wsPattern = GetSymbol(XFA_ELEMENT_DatePatterns, FX_WSTRC(L"long"));
302 break;
303 }
304 }
305 void CXFA_NodeLocale::GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
306 CFX_WideString& wsPattern) const {
307 switch (eType) {
308 case FX_LOCALEDATETIMESUBCATEGORY_Short:
309 wsPattern = GetSymbol(XFA_ELEMENT_TimePatterns, FX_WSTRC(L"short"));
310 break;
311 case FX_LOCALEDATETIMESUBCATEGORY_Medium:
312 case FX_LOCALEDATETIMESUBCATEGORY_Default:
313 wsPattern = GetSymbol(XFA_ELEMENT_TimePatterns, FX_WSTRC(L"med"));
314 break;
315 case FX_LOCALEDATETIMESUBCATEGORY_Full:
316 wsPattern = GetSymbol(XFA_ELEMENT_TimePatterns, FX_WSTRC(L"full"));
317 break;
318 case FX_LOCALEDATETIMESUBCATEGORY_Long:
319 wsPattern = GetSymbol(XFA_ELEMENT_TimePatterns, FX_WSTRC(L"long"));
320 break;
321 }
322 }
323 void CXFA_NodeLocale::GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
324 CFX_WideString& wsPattern) const {
325 switch (eType) {
326 case FX_LOCALENUMPATTERN_Percent:
327 wsPattern = g_FX_Percent;
328 break;
329 case FX_LOCALENUMPATTERN_Currency:
330 wsPattern = g_FX_Currency;
331 break;
332 case FX_LOCALENUMPATTERN_Decimal:
333 wsPattern = g_FX_Decimal;
334 break;
335 case FX_LOCALENUMPATTERN_Integer:
336 wsPattern = g_FX_Integer;
337 break;
338 }
339 }
340 CXFA_Node* CXFA_NodeLocale::GetNodeByName(CXFA_Node* pParent,
341 const CFX_WideStringC& wsName) const {
342 CXFA_Node* pChild =
343 pParent ? pParent->GetNodeItem(XFA_NODEITEM_FirstChild) : NULL;
344 while (pChild) {
345 CFX_WideString wsChild;
346 if (pChild->GetAttribute(XFA_ATTRIBUTE_Name, wsChild)) {
347 if (wsChild == wsName) {
348 return pChild;
349 }
350 }
351 pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
352 }
353 return NULL;
354 }
355 CFX_WideString CXFA_NodeLocale::GetSymbol(
356 XFA_ELEMENT eElement,
357 const CFX_WideStringC& symbol_type) const {
358 CXFA_Node* pSymbols = m_pLocale ? m_pLocale->GetChild(0, eElement) : NULL;
359 CXFA_Node* pSymbol = GetNodeByName(pSymbols, symbol_type);
360 return pSymbol ? pSymbol->GetContent() : CFX_WideString();
361 }
362 CFX_WideString CXFA_NodeLocale::GetCalendarSymbol(XFA_ELEMENT eElement,
363 int index,
364 FX_BOOL bAbbr) const {
365 CXFA_Node* pCalendar =
366 m_pLocale ? m_pLocale->GetChild(0, XFA_ELEMENT_CalendarSymbols) : NULL;
367 if (pCalendar) {
368 CXFA_Node* pNode = pCalendar->GetFirstChildByClass(eElement);
369 for (; pNode; pNode = pNode->GetNextSameClassSibling(eElement)) {
370 if (pNode->GetBoolean(XFA_ATTRIBUTE_Abbr) == bAbbr) {
371 CXFA_Node* pSymbol = pNode->GetChild(index, XFA_ELEMENT_UNKNOWN);
372 return pSymbol ? pSymbol->GetContent() : CFX_WideString();
373 }
374 }
375 }
376 return CFX_WideString();
377 }
OLDNEW
« no previous file with comments | « xfa/src/fxfa/parser/xfa_locale.h ('k') | xfa/src/fxfa/parser/xfa_localemgr.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698