update dev300-m58
[ooovba.git] / writerfilter / source / dmapper / ConversionHelper.cxx
blobb05c771dd4bc7dcb879f76513959c2b9287dab46
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: ConversionHelper.cxx,v $
11 * $Revision: 1.12 $
13 * This file is part of OpenOffice.org.
15 * OpenOffice.org is free software: you can redistribute it and/or modify
16 * it under the terms of the GNU Lesser General Public License version 3
17 * only, as published by the Free Software Foundation.
19 * OpenOffice.org is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU Lesser General Public License version 3 for more details
23 * (a copy is included in the LICENSE file that accompanied this code).
25 * You should have received a copy of the GNU Lesser General Public License
26 * version 3 along with OpenOffice.org. If not, see
27 * <http://www.openoffice.org/license.html>
28 * for a copy of the LGPLv3 License.
30 ************************************************************************/
31 #include <ConversionHelper.hxx>
32 #include <com/sun/star/table/BorderLine.hpp>
33 #include <com/sun/star/lang/Locale.hpp>
34 #include <com/sun/star/text/HoriOrientation.hpp>
35 #include <com/sun/star/style/NumberingType.hpp>
36 #include <ooxml/resourceids.hxx>
37 #include <tools/color.hxx>
38 #include <rtl/ustrbuf.hxx>
39 #include <algorithm>
40 #include <functional>
42 using namespace com::sun::star;
44 namespace writerfilter {
45 namespace dmapper{
46 namespace ConversionHelper{
48 #define TWIP_TO_MM100(TWIP) ((TWIP) >= 0 ? (((TWIP)*127L+36L)/72L) : (((TWIP)*127L-36L)/72L))
50 //line definitions in 1/100 mm
51 #define LINE_WIDTH_0 2
52 #define LINE_WIDTH_1 36
53 #define LINE_WIDTH_2 89
54 #define LINE_WIDTH_3 142
55 #define LINE_WIDTH_4 177
56 #define LINE_WIDTH_5 18
58 #define DOUBLE_LINE0_OUT LINE_WIDTH_0
59 #define DOUBLE_LINE0_IN LINE_WIDTH_0
60 #define DOUBLE_LINE0_DIST LINE_WIDTH_1
62 #define DOUBLE_LINE1_OUT LINE_WIDTH_1
63 #define DOUBLE_LINE1_IN LINE_WIDTH_1
64 #define DOUBLE_LINE1_DIST LINE_WIDTH_1
66 #define DOUBLE_LINE2_OUT LINE_WIDTH_2
67 #define DOUBLE_LINE2_IN LINE_WIDTH_2
68 #define DOUBLE_LINE2_DIST LINE_WIDTH_2
70 #define DOUBLE_LINE3_OUT LINE_WIDTH_2
71 #define DOUBLE_LINE3_IN LINE_WIDTH_1
72 #define DOUBLE_LINE3_DIST LINE_WIDTH_2
74 #define DOUBLE_LINE4_OUT LINE_WIDTH_1
75 #define DOUBLE_LINE4_IN LINE_WIDTH_2
76 #define DOUBLE_LINE4_DIST LINE_WIDTH_1
78 #define DOUBLE_LINE5_OUT LINE_WIDTH_3
79 #define DOUBLE_LINE5_IN LINE_WIDTH_2
80 #define DOUBLE_LINE5_DIST LINE_WIDTH_2
82 #define DOUBLE_LINE6_OUT LINE_WIDTH_2
83 #define DOUBLE_LINE6_IN LINE_WIDTH_3
84 #define DOUBLE_LINE6_DIST LINE_WIDTH_2
86 #define DOUBLE_LINE7_OUT LINE_WIDTH_0
87 #define DOUBLE_LINE7_IN LINE_WIDTH_0
88 #define DOUBLE_LINE7_DIST LINE_WIDTH_2
90 #define DOUBLE_LINE8_OUT LINE_WIDTH_1
91 #define DOUBLE_LINE8_IN LINE_WIDTH_0
92 #define DOUBLE_LINE8_DIST LINE_WIDTH_2
94 #define DOUBLE_LINE9_OUT LINE_WIDTH_2
95 #define DOUBLE_LINE9_IN LINE_WIDTH_0
96 #define DOUBLE_LINE9_DIST LINE_WIDTH_2
98 #define DOUBLE_LINE10_OUT LINE_WIDTH_3
99 #define DOUBLE_LINE10_IN LINE_WIDTH_0
100 #define DOUBLE_LINE10_DIST LINE_WIDTH_2
102 sal_Int32 MakeBorderLine( sal_Int32 nSprmValue, table::BorderLine& rToFill )
104 //TODO: Lines are always solid
105 //Border
106 //borders are defined as:
107 // 0x XX XX XX XX
108 // || || || ||
109 // || || || ---- Line width in 1/8 pt
110 // || || ||
111 // || || ------- Line type: 0 - none 1 - single ... 25 - engrave 3D and 64 - 230 page borders
112 // || ||
113 // || ---------- Line color
114 // ||
115 // ------------- seven bits line space
116 // -------------- first bit: with shading
117 sal_Int16 nLineThicknessTwip = (sal_Int16)((nSprmValue & 0xff) * 20)/8L ;
118 sal_Int32 nLineType = ((nSprmValue & 0xff00) >> 8);
119 sal_Int32 nLineColor = (nSprmValue & 0xff0000)>>16;
120 sal_Int32 nLineDistance = (((nSprmValue & 0x3f000000)>>24) * 2540 + 36)/72L;
121 sal_Int32 nLineThickness = TWIP_TO_MM100(nLineThicknessTwip);
122 MakeBorderLine( nLineThickness, nLineType, nLineColor, rToFill, false);
123 return nLineDistance;
125 void MakeBorderLine( sal_Int32 nLineThickness, sal_Int32 nLineType,
126 sal_Int32 nLineColor,
127 table::BorderLine& rToFill, bool bIsOOXML )
129 static const sal_Int32 aBorderDefColor[] =
131 COL_AUTO, COL_BLACK, COL_LIGHTBLUE, COL_LIGHTCYAN, COL_LIGHTGREEN,
132 COL_LIGHTMAGENTA, COL_LIGHTRED, COL_YELLOW, COL_WHITE, COL_BLUE,
133 COL_CYAN, COL_GREEN, COL_MAGENTA, COL_RED, COL_BROWN, COL_GRAY,
134 COL_LIGHTGRAY
136 //no auto color for borders
137 if(!nLineColor)
138 ++nLineColor;
139 if(!bIsOOXML && sal::static_int_cast<sal_uInt32>(nLineColor) <
140 sizeof(aBorderDefColor) / sizeof(nLineColor))
141 nLineColor = aBorderDefColor[nLineColor];
143 enum eBorderCode
145 single0, single1, single2, single3, single4, single5,
146 double0, double1, double2, double3, double4, double5, double6,
147 double7, double8, double9, double10,
148 none
149 } eCodeIdx = none;
151 // Map to our border types, we should use of one equal line
152 // thickness, or one of smaller thickness. If too small we
153 // can make the defecit up in additional white space or
154 // object size
155 switch(nLineType)
157 // First the single lines
158 case 1: break;
159 case 2:
160 case 5:
161 // and the unsupported special cases which we map to a single line
162 case 6:
163 case 7:
164 case 8:
165 case 9:
166 case 22:
167 // or if in necessary by a double line
168 case 24:
169 case 25:
170 if( nLineThickness < 10)
171 eCodeIdx = single0;// 1 Twip for us
172 else if( nLineThickness < 20)
173 eCodeIdx = single5;// 10 Twips for us
174 else if (nLineThickness < 50)
175 eCodeIdx = single1;// 20 Twips
176 else if (nLineThickness < 80)
177 eCodeIdx = single2;// 50
178 else if (nLineThickness < 100)
179 eCodeIdx = single3;// 80
180 else if (nLineThickness < 150)
181 eCodeIdx = single4;// 100
182 // Hack: for the quite thick lines we must paint double lines,
183 // because our singles lines don't come thicker than 5 points.
184 else if (nLineThickness < 180)
185 eCodeIdx = double2;// 150
186 else
187 eCodeIdx = double5;// 180
188 break;
189 // then the shading beams which we represent by a double line
190 case 23:
191 eCodeIdx = double1;
192 break;
193 // then the double lines, for which we have good matches
194 case 3:
195 case 10: //Don't have tripple so use double
196 if (nLineThickness < 60)
197 eCodeIdx = double0;// 22 Twips for us
198 else if (nLineThickness < 135)
199 eCodeIdx = double7;// some more space
200 else if (nLineThickness < 180)
201 eCodeIdx = double1;// 60
202 else
203 eCodeIdx = double2;// 150
204 break;
205 case 11:
206 eCodeIdx = double4;// 90 Twips for us
207 break;
208 case 12:
209 case 13: //Don't have thin thick thin, so use thick thin
210 if (nLineThickness < 87)
211 eCodeIdx = double8;// 71 Twips for us
212 else if (nLineThickness < 117)
213 eCodeIdx = double9;// 101
214 else if (nLineThickness < 166)
215 eCodeIdx = double10;// 131
216 else
217 eCodeIdx = double5;// 180
218 break;
219 case 14:
220 if (nLineThickness < 46)
221 eCodeIdx = double0;// 22 Twips for us
222 else if (nLineThickness < 76)
223 eCodeIdx = double1;// 60
224 else if (nLineThickness < 121)
225 eCodeIdx = double4;// 90
226 else if (nLineThickness < 166)
227 eCodeIdx = double2;// 150
228 else
229 eCodeIdx = double6;// 180
230 break;
231 case 15:
232 case 16: //Don't have thin thick thin, so use thick thin
233 if (nLineThickness < 46)
234 eCodeIdx = double0;// 22 Twips for us
235 else if (nLineThickness < 76)
236 eCodeIdx = double1;// 60
237 else if (nLineThickness < 121)
238 eCodeIdx = double3;// 90
239 else if (nLineThickness < 166)
240 eCodeIdx = double2;// 150
241 else
242 eCodeIdx = double5;// 180
243 break;
244 case 17:
245 if (nLineThickness < 46)
246 eCodeIdx = double0;// 22 Twips for us
247 else if (nLineThickness < 72)
248 eCodeIdx = double7;// 52
249 else if (nLineThickness < 137)
250 eCodeIdx = double4;// 90
251 else
252 eCodeIdx = double6;// 180
253 break;
254 case 18:
255 case 19: //Don't have thin thick thin, so use thick thin
256 if (nLineThickness < 46)
257 eCodeIdx = double0;// 22 Twips for us
258 else if (nLineThickness < 62)
259 eCodeIdx = double7;// 52
260 else if (nLineThickness < 87)
261 eCodeIdx = double8;// 71
262 else if (nLineThickness < 117)
263 eCodeIdx = double9;// 101
264 else if (nLineThickness < 156)
265 eCodeIdx = double10;// 131
266 else
267 eCodeIdx = double5;// 180
268 break;
269 case 20:
270 if (nLineThickness < 46)
271 eCodeIdx = single1; // 20 Twips for us
272 else
273 eCodeIdx = double1;// 60
274 break;
275 case 21:
276 eCodeIdx = double1;// 60 Twips for us
277 break;
278 default:
279 eCodeIdx = single0;
280 break;
282 struct BorderDefinition
284 sal_Int16 nOut;
285 sal_Int16 nIn;
286 sal_Int16 nDist;
290 static const BorderDefinition aLineTab[] =
292 /* 0*/ { LINE_WIDTH_0, 0, 0 },
293 /* 1*/ { LINE_WIDTH_1, 0, 0 },
294 /* 2*/ { LINE_WIDTH_2, 0, 0 },
295 /* 3*/ { LINE_WIDTH_3, 0, 0 },
296 /* 4*/ { LINE_WIDTH_4, 0, 0 },
297 /* 5*/ { LINE_WIDTH_5, 0, 0 },
298 /* 6*/ { DOUBLE_LINE0_OUT, DOUBLE_LINE0_IN, DOUBLE_LINE0_DIST },
299 /* 7*/ { DOUBLE_LINE1_OUT, DOUBLE_LINE1_IN, DOUBLE_LINE1_DIST },
300 /* 8*/ { DOUBLE_LINE2_OUT, DOUBLE_LINE2_IN, DOUBLE_LINE2_DIST },
301 /* 9*/ { DOUBLE_LINE3_OUT, DOUBLE_LINE3_IN, DOUBLE_LINE3_DIST },
302 /*10*/ { DOUBLE_LINE4_OUT, DOUBLE_LINE4_IN, DOUBLE_LINE4_DIST },
303 /*11*/ { DOUBLE_LINE5_OUT, DOUBLE_LINE5_IN, DOUBLE_LINE5_DIST },
304 /*12*/ { DOUBLE_LINE6_OUT, DOUBLE_LINE6_IN, DOUBLE_LINE6_DIST },
305 /*13*/ { DOUBLE_LINE7_OUT, DOUBLE_LINE7_IN, DOUBLE_LINE7_DIST },
306 /*14*/ { DOUBLE_LINE8_OUT, DOUBLE_LINE8_IN, DOUBLE_LINE8_DIST },
307 /*15*/ { DOUBLE_LINE9_OUT, DOUBLE_LINE9_IN, DOUBLE_LINE9_DIST },
308 /*16*/ { DOUBLE_LINE10_OUT,DOUBLE_LINE10_IN,DOUBLE_LINE10_DIST}
311 rToFill.Color = nLineColor;
312 if( nLineType == 1)
314 rToFill.InnerLineWidth = 0;
315 rToFill.OuterLineWidth = sal_Int16(nLineThickness);
316 rToFill.LineDistance = 0;
319 else
321 rToFill.InnerLineWidth = aLineTab[eCodeIdx].nIn;
322 rToFill.OuterLineWidth = aLineTab[eCodeIdx].nOut;
323 rToFill.LineDistance = aLineTab[eCodeIdx].nDist;
327 void lcl_SwapQuotesInField(::rtl::OUString &rFmt)
329 //Swap unescaped " and ' with ' and "
330 sal_Int32 nLen = rFmt.getLength();
331 ::rtl::OUStringBuffer aBuffer( rFmt.getStr() );
332 const sal_Unicode* pFmt = rFmt.getStr();
333 for (sal_Int32 nI = 0; nI < nLen; ++nI)
335 if ((pFmt[nI] == '\"') && (!nI || pFmt[nI-1] != '\\'))
336 aBuffer.setCharAt(nI, '\'');
337 else if ((pFmt[nI] == '\'') && (!nI || pFmt[nI-1] != '\\'))
338 aBuffer.setCharAt(nI, '\"');
340 rFmt = aBuffer.makeStringAndClear();
342 bool lcl_IsNotAM(::rtl::OUString& rFmt, sal_Int32 nPos)
344 return (
345 (nPos == rFmt.getLength() - 1) ||
347 (rFmt.getStr()[nPos+1] != 'M') &&
348 (rFmt.getStr()[nPos+1] != 'm')
353 ::rtl::OUString ConvertMSFormatStringToSO(
354 const ::rtl::OUString& rFormat, lang::Locale& rLocale, bool bHijri)
356 ::rtl::OUString sFormat(rFormat);
357 lcl_SwapQuotesInField(sFormat);
359 //#102782#, #102815#, #108341# & #111944# have to work at the same time :-)
360 bool bForceJapanese(false);
361 bool bForceNatNum(false);
362 sal_Int32 nLen = sFormat.getLength();
363 sal_Int32 nI = 0;
364 // const sal_Unicode* pFormat = sFormat.getStr();
365 ::rtl::OUStringBuffer aNewFormat( sFormat.getStr() );
366 while (nI < nLen)
368 if (aNewFormat.charAt(nI) == '\\')
369 nI++;
370 else if (aNewFormat.charAt(nI) == '\"')
372 ++nI;
373 //While not at the end and not at an unescaped end quote
374 while ((nI < nLen) && (!(aNewFormat.charAt(nI) == '\"') && (aNewFormat.charAt(nI-1) != '\\')))
375 ++nI;
377 else //normal unquoted section
379 sal_Unicode nChar = aNewFormat.charAt(nI);
380 if (nChar == 'O')
382 aNewFormat.setCharAt(nI, 'M');
383 bForceNatNum = true;
385 else if (nChar == 'o')
387 aNewFormat.setCharAt(nI, 'm');
388 bForceNatNum = true;
390 else if ((nChar == 'A') && lcl_IsNotAM(sFormat, nI))
392 aNewFormat.setCharAt(nI, 'D');
393 bForceNatNum = true;
395 else if ((nChar == 'g') || (nChar == 'G'))
396 bForceJapanese = true;
397 else if ((nChar == 'a') && lcl_IsNotAM(sFormat, nI))
398 bForceJapanese = true;
399 else if (nChar == 'E')
401 if ((nI != nLen-1) && (aNewFormat.charAt(nI+1) == 'E'))
403 //todo: this cannot be the right way to replace a part of the string!
404 aNewFormat.setCharAt( nI, 'Y' );
405 aNewFormat.setCharAt( nI + 1, 'Y' );
406 aNewFormat.insert(nI + 2, ::rtl::OUString::createFromAscii("YY"));
407 nLen+=2;
408 nI+=3;
410 bForceJapanese = true;
412 else if (nChar == 'e')
414 if ((nI != nLen-1) && (aNewFormat.charAt(nI+1) == 'e'))
416 //todo: this cannot be the right way to replace a part of the string!
417 aNewFormat.setCharAt( nI, 'y' );
418 aNewFormat.setCharAt( nI + 1, 'y' );
419 aNewFormat.insert(nI + 2, ::rtl::OUString::createFromAscii("yy"));
420 nLen+=2;
421 nI+=3;
423 bForceJapanese = true;
425 else if (nChar == '/')
427 // MM We have to escape '/' in case it's used as a char
428 //todo: this cannot be the right way to replace a part of the string!
429 aNewFormat.setCharAt( nI, '\\' );
430 aNewFormat.insert(nI + 1, ::rtl::OUString::createFromAscii("/"));
431 nI++;
432 nLen++;
435 ++nI;
438 if (bForceNatNum)
439 bForceJapanese = true;
441 if (bForceJapanese)
443 rLocale.Language = ::rtl::OUString::createFromAscii("ja");
444 rLocale.Country = ::rtl::OUString::createFromAscii("JP");
447 if (bForceNatNum)
449 aNewFormat.insert( 0, ::rtl::OUString::createFromAscii("[NatNum1][$-411]"));
452 if (bHijri)
454 aNewFormat.insert( 0, ::rtl::OUString::createFromAscii("[~hijri]"));
456 return aNewFormat.makeStringAndClear();
459 /*-------------------------------------------------------------------------
461 -----------------------------------------------------------------------*/
462 sal_Int32 convertTwipToMM100(sal_Int32 _t)
464 return TWIP_TO_MM100( _t );
466 /*-- 09.08.2007 09:34:44---------------------------------------------------
468 -----------------------------------------------------------------------*/
469 sal_Int32 convertEMUToMM100(sal_Int32 _t)
471 return _t / 360;
474 /*-- 21.11.2006 08:47:12---------------------------------------------------
475 contains a color from 0xTTRRGGBB to 0xTTRRGGBB
476 -----------------------------------------------------------------------*/
477 sal_Int32 ConvertColor(sal_Int32 nWordColor)
479 sal_uInt8
480 r(static_cast<sal_uInt8>(nWordColor&0xFF)),
481 g(static_cast<sal_uInt8>(((nWordColor)>>8)&0xFF)),
482 b(static_cast<sal_uInt8>((nWordColor>>16)&0xFF)),
483 t(static_cast<sal_uInt8>((nWordColor>>24)&0xFF));
484 sal_Int32 nRet = (t<<24) + (r<<16) + (g<<8) + b;
485 return nRet;
487 /*-- 27.06.2007 13:42:32---------------------------------------------------
489 -----------------------------------------------------------------------*/
490 sal_Int16 convertTableJustification( sal_Int32 nIntValue )
492 sal_Int16 nOrient = text::HoriOrientation::LEFT_AND_WIDTH;
493 switch( nIntValue )
495 case 1 : nOrient = text::HoriOrientation::CENTER; break;
496 case 2 : nOrient = text::HoriOrientation::RIGHT; break;
497 case 0 :
498 //no break
499 default:;
502 return nOrient;
504 /*-- 06.08.2007 15:27:30---------------------------------------------------
505 conversion form xsd::DateTime
506 [-]CCYY-MM-DDThh:mm:ss[Z|(+|-)hh:mm]
507 -----------------------------------------------------------------------*/
508 com::sun::star::util::DateTime convertDateTime( const ::rtl::OUString& rDateTimeString )
510 util::DateTime aRet( 0, 0, 0, 0, 1, 1, 1901 );
512 sal_Int32 nIndex = 0;
513 ::rtl::OUString sDate( rDateTimeString.getToken( 0, 'T', nIndex ));
514 sal_Int32 nDateIndex = 0;
515 aRet.Year = (sal_uInt16)sDate.getToken( 0, '-', nDateIndex ).toInt32();
516 if( nDateIndex > 0)
517 aRet.Month = (sal_uInt16)sDate.getToken( 0, '-', nDateIndex ).toInt32();
518 if( nDateIndex > 0)
519 aRet.Day = (sal_uInt16)sDate.getToken( 0, '-', nDateIndex ).toInt32();
520 ::rtl::OUString sTime;
521 if(nIndex > 0)
523 sTime = ( rDateTimeString.getToken( 0, 'Z', nIndex ));
524 sal_Int32 nTimeIndex = 0;
525 aRet.Hours = (sal_uInt16)sTime.getToken( 0, ':', nTimeIndex ).toInt32();
526 if( nTimeIndex > 0)
527 aRet.Minutes = (sal_uInt16)sTime.getToken( 0, ':', nTimeIndex ).toInt32();
528 if( nTimeIndex > 0)
530 ::rtl::OUString sSeconds = sTime.getToken( 0, ':', nTimeIndex );
531 nTimeIndex = 0;
532 aRet.Seconds = (sal_uInt16)sSeconds.getToken( 0, '.', nTimeIndex ).toInt32();
533 aRet.HundredthSeconds = (sal_uInt16)sSeconds.getToken( 0, '.', nTimeIndex ).toInt32();
536 // todo: ignore time offset for a while - there's no time zone available
537 // nIndex = 0;
538 // ::rtl::OUString sOffset( rDateTimeString.getToken( 1, 'Z', nIndex ));
539 // if( sOffset.getLength() )
540 // {
541 // add hour and minute offset and increase/decrease date if necessary
542 // }
544 return aRet;
546 /*-- 05.03.2008 09:10:13---------------------------------------------------
548 -----------------------------------------------------------------------*/
549 sal_Int16 ConvertNumberingType(sal_Int32 nNFC)
551 sal_Int16 nRet;
552 switch(nNFC)
554 case NS_ooxml::LN_Value_ST_NumberFormat_decimal:
555 case 0: nRet = style::NumberingType::ARABIC; break;
556 case NS_ooxml::LN_Value_ST_NumberFormat_upperRoman:
557 case 1: nRet = style::NumberingType::ROMAN_UPPER; break;
558 case NS_ooxml::LN_Value_ST_NumberFormat_lowerRoman:
559 case 2: nRet = style::NumberingType::ROMAN_LOWER; break;
560 case 3: nRet = style::NumberingType::CHARS_UPPER_LETTER_N; break;
561 case 4: nRet = style::NumberingType::CHARS_LOWER_LETTER_N; break;
562 case 5: nRet = style::NumberingType::ARABIC; break;//ORDINAL
563 case NS_ooxml::LN_Value_ST_NumberFormat_bullet:
564 case 23:
565 case 25:
566 nRet = style::NumberingType::CHAR_SPECIAL;
567 break;
568 case 255: nRet = style::NumberingType::NUMBER_NONE; break;
569 case NS_ooxml::LN_Value_ST_NumberFormat_upperLetter:
570 nRet = style::NumberingType::CHARS_UPPER_LETTER;
571 break;
572 case NS_ooxml::LN_Value_ST_NumberFormat_lowerLetter:
573 nRet = style::NumberingType::CHARS_LOWER_LETTER;
574 break;
575 default: nRet = style::NumberingType::ARABIC;
577 /* TODO: Lots of additional values are available - some are supported in the I18 framework
578 NS_ooxml::LN_Value_ST_NumberFormat_ordinal = 91682;
579 NS_ooxml::LN_Value_ST_NumberFormat_cardinalText = 91683;
580 NS_ooxml::LN_Value_ST_NumberFormat_ordinalText = 91684;
581 NS_ooxml::LN_Value_ST_NumberFormat_hex = 91685;
582 NS_ooxml::LN_Value_ST_NumberFormat_chicago = 91686;
583 NS_ooxml::LN_Value_ST_NumberFormat_ideographDigital = 91687;
584 NS_ooxml::LN_Value_ST_NumberFormat_japaneseCounting = 91688;
585 NS_ooxml::LN_Value_ST_NumberFormat_aiueo = 91689;
586 NS_ooxml::LN_Value_ST_NumberFormat_iroha = 91690;
587 NS_ooxml::LN_Value_ST_NumberFormat_decimalFullWidth = 91691;
588 NS_ooxml::LN_Value_ST_NumberFormat_decimalHalfWidth = 91692;
589 NS_ooxml::LN_Value_ST_NumberFormat_japaneseLegal = 91693;
590 NS_ooxml::LN_Value_ST_NumberFormat_japaneseDigitalTenThousand = 91694;
591 NS_ooxml::LN_Value_ST_NumberFormat_decimalEnclosedCircle = 91695;
592 NS_ooxml::LN_Value_ST_NumberFormat_decimalFullWidth2 = 91696;
593 NS_ooxml::LN_Value_ST_NumberFormat_aiueoFullWidth = 91697;
594 NS_ooxml::LN_Value_ST_NumberFormat_irohaFullWidth = 91698;
595 NS_ooxml::LN_Value_ST_NumberFormat_decimalZero = 91699;
596 NS_ooxml::LN_Value_ST_NumberFormat_ganada = 91701;
597 NS_ooxml::LN_Value_ST_NumberFormat_chosung = 91702;
598 NS_ooxml::LN_Value_ST_NumberFormat_decimalEnclosedFullstop = 91703;
599 NS_ooxml::LN_Value_ST_NumberFormat_decimalEnclosedParen = 91704;
600 NS_ooxml::LN_Value_ST_NumberFormat_decimalEnclosedCircleChinese = 91705;
601 NS_ooxml::LN_Value_ST_NumberFormat_ideographEnclosedCircle = 91706;
602 NS_ooxml::LN_Value_ST_NumberFormat_ideographTraditional = 91707;
603 NS_ooxml::LN_Value_ST_NumberFormat_ideographZodiac = 91708;
604 NS_ooxml::LN_Value_ST_NumberFormat_ideographZodiacTraditional = 91709;
605 NS_ooxml::LN_Value_ST_NumberFormat_taiwaneseCounting = 91710;
606 NS_ooxml::LN_Value_ST_NumberFormat_ideographLegalTraditional = 91711;
607 NS_ooxml::LN_Value_ST_NumberFormat_taiwaneseCountingThousand = 91712;
608 NS_ooxml::LN_Value_ST_NumberFormat_taiwaneseDigital = 91713;
609 NS_ooxml::LN_Value_ST_NumberFormat_chineseCounting = 91714;
610 NS_ooxml::LN_Value_ST_NumberFormat_chineseLegalSimplified = 91715;
611 NS_ooxml::LN_Value_ST_NumberFormat_chineseCountingThousand = 91716;
612 NS_ooxml::LN_Value_ST_NumberFormat_koreanDigital = 91717;
613 NS_ooxml::LN_Value_ST_NumberFormat_koreanCounting = 91718;
614 NS_ooxml::LN_Value_ST_NumberFormat_koreanLegal = 91719;
615 NS_ooxml::LN_Value_ST_NumberFormat_koreanDigital2 = 91720;
616 NS_ooxml::LN_Value_ST_NumberFormat_vietnameseCounting = 91721;
617 NS_ooxml::LN_Value_ST_NumberFormat_russianLower = 91722;
618 NS_ooxml::LN_Value_ST_NumberFormat_russianUpper = 91723;
619 NS_ooxml::LN_Value_ST_NumberFormat_none = 91724;
620 NS_ooxml::LN_Value_ST_NumberFormat_numberInDash = 91725;
621 NS_ooxml::LN_Value_ST_NumberFormat_hebrew1 = 91726;
622 NS_ooxml::LN_Value_ST_NumberFormat_hebrew2 = 91727;
623 NS_ooxml::LN_Value_ST_NumberFormat_arabicAlpha = 91728;
624 NS_ooxml::LN_Value_ST_NumberFormat_arabicAbjad = 91729;
625 NS_ooxml::LN_Value_ST_NumberFormat_hindiVowels = 91730;
626 NS_ooxml::LN_Value_ST_NumberFormat_hindiConsonants = 91731;
627 NS_ooxml::LN_Value_ST_NumberFormat_hindiNumbers = 91732;
628 NS_ooxml::LN_Value_ST_NumberFormat_hindiCounting = 91733;
629 NS_ooxml::LN_Value_ST_NumberFormat_thaiLetters = 91734;
630 NS_ooxml::LN_Value_ST_NumberFormat_thaiNumbers = 91735;
631 NS_ooxml::LN_Value_ST_NumberFormat_thaiCounting = 91736;*/
632 return nRet;
636 } // namespace ConversionHelper
637 } //namespace dmapper
638 } //namespace writerfilter