| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| #include <ConversionHelper.hxx> |
| #include <com/sun/star/table/BorderLine.hpp> |
| #include <com/sun/star/lang/Locale.hpp> |
| #include <com/sun/star/text/HoriOrientation.hpp> |
| #include <com/sun/star/style/NumberingType.hpp> |
| #include <ooxml/resourceids.hxx> |
| #include <tools/color.hxx> |
| #include <rtl/ustrbuf.hxx> |
| #include <algorithm> |
| #include <functional> |
| |
| using namespace com::sun::star; |
| |
| namespace writerfilter { |
| namespace dmapper{ |
| namespace ConversionHelper{ |
| |
| #define TWIP_TO_MM100(TWIP) ((TWIP) >= 0 ? (((TWIP)*127L+36L)/72L) : (((TWIP)*127L-36L)/72L)) |
| |
| //line definitions in 1/100 mm |
| #define LINE_WIDTH_0 2 |
| #define LINE_WIDTH_1 36 |
| #define LINE_WIDTH_2 89 |
| #define LINE_WIDTH_3 142 |
| #define LINE_WIDTH_4 177 |
| #define LINE_WIDTH_5 18 |
| |
| #define DOUBLE_LINE0_OUT LINE_WIDTH_0 |
| #define DOUBLE_LINE0_IN LINE_WIDTH_0 |
| #define DOUBLE_LINE0_DIST LINE_WIDTH_1 |
| |
| #define DOUBLE_LINE1_OUT LINE_WIDTH_1 |
| #define DOUBLE_LINE1_IN LINE_WIDTH_1 |
| #define DOUBLE_LINE1_DIST LINE_WIDTH_1 |
| |
| #define DOUBLE_LINE2_OUT LINE_WIDTH_2 |
| #define DOUBLE_LINE2_IN LINE_WIDTH_2 |
| #define DOUBLE_LINE2_DIST LINE_WIDTH_2 |
| |
| #define DOUBLE_LINE3_OUT LINE_WIDTH_2 |
| #define DOUBLE_LINE3_IN LINE_WIDTH_1 |
| #define DOUBLE_LINE3_DIST LINE_WIDTH_2 |
| |
| #define DOUBLE_LINE4_OUT LINE_WIDTH_1 |
| #define DOUBLE_LINE4_IN LINE_WIDTH_2 |
| #define DOUBLE_LINE4_DIST LINE_WIDTH_1 |
| |
| #define DOUBLE_LINE5_OUT LINE_WIDTH_3 |
| #define DOUBLE_LINE5_IN LINE_WIDTH_2 |
| #define DOUBLE_LINE5_DIST LINE_WIDTH_2 |
| |
| #define DOUBLE_LINE6_OUT LINE_WIDTH_2 |
| #define DOUBLE_LINE6_IN LINE_WIDTH_3 |
| #define DOUBLE_LINE6_DIST LINE_WIDTH_2 |
| |
| #define DOUBLE_LINE7_OUT LINE_WIDTH_0 |
| #define DOUBLE_LINE7_IN LINE_WIDTH_0 |
| #define DOUBLE_LINE7_DIST LINE_WIDTH_2 |
| |
| #define DOUBLE_LINE8_OUT LINE_WIDTH_1 |
| #define DOUBLE_LINE8_IN LINE_WIDTH_0 |
| #define DOUBLE_LINE8_DIST LINE_WIDTH_2 |
| |
| #define DOUBLE_LINE9_OUT LINE_WIDTH_2 |
| #define DOUBLE_LINE9_IN LINE_WIDTH_0 |
| #define DOUBLE_LINE9_DIST LINE_WIDTH_2 |
| |
| #define DOUBLE_LINE10_OUT LINE_WIDTH_3 |
| #define DOUBLE_LINE10_IN LINE_WIDTH_0 |
| #define DOUBLE_LINE10_DIST LINE_WIDTH_2 |
| |
| sal_Int32 MakeBorderLine( sal_Int32 nSprmValue, table::BorderLine& rToFill ) |
| { |
| //TODO: Lines are always solid |
| //Border |
| //borders are defined as: |
| // 0x XX XX XX XX |
| // || || || || |
| // || || || ---- Line width in 1/8 pt |
| // || || || |
| // || || ------- Line type: 0 - none 1 - single ... 25 - engrave 3D and 64 - 230 page borders |
| // || || |
| // || ---------- Line color |
| // || |
| // ------------- seven bits line space |
| // -------------- first bit: with shading |
| sal_Int16 nLineThicknessTwip = (sal_Int16)((nSprmValue & 0xff) * 20)/8L ; |
| sal_Int32 nLineType = ((nSprmValue & 0xff00) >> 8); |
| sal_Int32 nLineColor = (nSprmValue & 0xff0000)>>16; |
| sal_Int32 nLineDistance = (((nSprmValue & 0x3f000000)>>24) * 2540 + 36)/72L; |
| sal_Int32 nLineThickness = TWIP_TO_MM100(nLineThicknessTwip); |
| MakeBorderLine( nLineThickness, nLineType, nLineColor, rToFill, false); |
| return nLineDistance; |
| } |
| void MakeBorderLine( sal_Int32 nLineThickness, sal_Int32 nLineType, |
| sal_Int32 nLineColor, |
| table::BorderLine& rToFill, bool bIsOOXML ) |
| { |
| static const sal_Int32 aBorderDefColor[] = |
| { |
| static_cast<sal_Int32>(COL_AUTO), |
| COL_BLACK, COL_LIGHTBLUE, COL_LIGHTCYAN, COL_LIGHTGREEN, |
| COL_LIGHTMAGENTA, COL_LIGHTRED, COL_YELLOW, COL_WHITE, COL_BLUE, |
| COL_CYAN, COL_GREEN, COL_MAGENTA, COL_RED, COL_BROWN, COL_GRAY, |
| COL_LIGHTGRAY |
| }; |
| //no auto color for borders |
| if(!nLineColor) |
| ++nLineColor; |
| if(!bIsOOXML && sal::static_int_cast<sal_uInt32>(nLineColor) < |
| sizeof(aBorderDefColor) / sizeof(nLineColor)) |
| nLineColor = aBorderDefColor[nLineColor]; |
| |
| enum eBorderCode |
| { |
| single0, single1, single2, single3, single4, single5, |
| double0, double1, double2, double3, double4, double5, double6, |
| double7, double8, double9, double10, |
| none |
| } eCodeIdx = none; |
| |
| // Map to our border types, we should use of one equal line |
| // thickness, or one of smaller thickness. If too small we |
| // can make the defecit up in additional white space or |
| // object size |
| switch(nLineType) |
| { |
| // First the single lines |
| case 1: break; |
| case 2: |
| case 5: |
| // and the unsupported special cases which we map to a single line |
| case 6: |
| case 7: |
| case 8: |
| case 9: |
| case 22: |
| // or if in necessary by a double line |
| case 24: |
| case 25: |
| if( nLineThickness < 10) |
| eCodeIdx = single0;// 1 Twip for us |
| else if( nLineThickness < 20) |
| eCodeIdx = single5;// 10 Twips for us |
| else if (nLineThickness < 50) |
| eCodeIdx = single1;// 20 Twips |
| else if (nLineThickness < 80) |
| eCodeIdx = single2;// 50 |
| else if (nLineThickness < 100) |
| eCodeIdx = single3;// 80 |
| else if (nLineThickness < 150) |
| eCodeIdx = single4;// 100 |
| // Hack: for the quite thick lines we must paint double lines, |
| // because our singles lines don't come thicker than 5 points. |
| else if (nLineThickness < 180) |
| eCodeIdx = double2;// 150 |
| else |
| eCodeIdx = double5;// 180 |
| break; |
| // then the shading beams which we represent by a double line |
| case 23: |
| eCodeIdx = double1; |
| break; |
| // then the double lines, for which we have good matches |
| case 3: |
| case 10: //Don't have tripple so use double |
| if (nLineThickness < 60) |
| eCodeIdx = double0;// 22 Twips for us |
| else if (nLineThickness < 135) |
| eCodeIdx = double7;// some more space |
| else if (nLineThickness < 180) |
| eCodeIdx = double1;// 60 |
| else |
| eCodeIdx = double2;// 150 |
| break; |
| case 11: |
| eCodeIdx = double4;// 90 Twips for us |
| break; |
| case 12: |
| case 13: //Don't have thin thick thin, so use thick thin |
| if (nLineThickness < 87) |
| eCodeIdx = double8;// 71 Twips for us |
| else if (nLineThickness < 117) |
| eCodeIdx = double9;// 101 |
| else if (nLineThickness < 166) |
| eCodeIdx = double10;// 131 |
| else |
| eCodeIdx = double5;// 180 |
| break; |
| case 14: |
| if (nLineThickness < 46) |
| eCodeIdx = double0;// 22 Twips for us |
| else if (nLineThickness < 76) |
| eCodeIdx = double1;// 60 |
| else if (nLineThickness < 121) |
| eCodeIdx = double4;// 90 |
| else if (nLineThickness < 166) |
| eCodeIdx = double2;// 150 |
| else |
| eCodeIdx = double6;// 180 |
| break; |
| case 15: |
| case 16: //Don't have thin thick thin, so use thick thin |
| if (nLineThickness < 46) |
| eCodeIdx = double0;// 22 Twips for us |
| else if (nLineThickness < 76) |
| eCodeIdx = double1;// 60 |
| else if (nLineThickness < 121) |
| eCodeIdx = double3;// 90 |
| else if (nLineThickness < 166) |
| eCodeIdx = double2;// 150 |
| else |
| eCodeIdx = double5;// 180 |
| break; |
| case 17: |
| if (nLineThickness < 46) |
| eCodeIdx = double0;// 22 Twips for us |
| else if (nLineThickness < 72) |
| eCodeIdx = double7;// 52 |
| else if (nLineThickness < 137) |
| eCodeIdx = double4;// 90 |
| else |
| eCodeIdx = double6;// 180 |
| break; |
| case 18: |
| case 19: //Don't have thin thick thin, so use thick thin |
| if (nLineThickness < 46) |
| eCodeIdx = double0;// 22 Twips for us |
| else if (nLineThickness < 62) |
| eCodeIdx = double7;// 52 |
| else if (nLineThickness < 87) |
| eCodeIdx = double8;// 71 |
| else if (nLineThickness < 117) |
| eCodeIdx = double9;// 101 |
| else if (nLineThickness < 156) |
| eCodeIdx = double10;// 131 |
| else |
| eCodeIdx = double5;// 180 |
| break; |
| case 20: |
| if (nLineThickness < 46) |
| eCodeIdx = single1; // 20 Twips for us |
| else |
| eCodeIdx = double1;// 60 |
| break; |
| case 21: |
| eCodeIdx = double1;// 60 Twips for us |
| break; |
| case 0: |
| case 255: |
| eCodeIdx = none; |
| break; |
| default: |
| eCodeIdx = single0; |
| break; |
| } |
| struct BorderDefinition |
| { |
| sal_Int16 nOut; |
| sal_Int16 nIn; |
| sal_Int16 nDist; |
| }; |
| |
| |
| static const BorderDefinition aLineTab[] = |
| { |
| /* 0*/ { LINE_WIDTH_0, 0, 0 }, |
| /* 1*/ { LINE_WIDTH_1, 0, 0 }, |
| /* 2*/ { LINE_WIDTH_2, 0, 0 }, |
| /* 3*/ { LINE_WIDTH_3, 0, 0 }, |
| /* 4*/ { LINE_WIDTH_4, 0, 0 }, |
| /* 5*/ { LINE_WIDTH_5, 0, 0 }, |
| /* 6*/ { DOUBLE_LINE0_OUT, DOUBLE_LINE0_IN, DOUBLE_LINE0_DIST }, |
| /* 7*/ { DOUBLE_LINE1_OUT, DOUBLE_LINE1_IN, DOUBLE_LINE1_DIST }, |
| /* 8*/ { DOUBLE_LINE2_OUT, DOUBLE_LINE2_IN, DOUBLE_LINE2_DIST }, |
| /* 9*/ { DOUBLE_LINE3_OUT, DOUBLE_LINE3_IN, DOUBLE_LINE3_DIST }, |
| /*10*/ { DOUBLE_LINE4_OUT, DOUBLE_LINE4_IN, DOUBLE_LINE4_DIST }, |
| /*11*/ { DOUBLE_LINE5_OUT, DOUBLE_LINE5_IN, DOUBLE_LINE5_DIST }, |
| /*12*/ { DOUBLE_LINE6_OUT, DOUBLE_LINE6_IN, DOUBLE_LINE6_DIST }, |
| /*13*/ { DOUBLE_LINE7_OUT, DOUBLE_LINE7_IN, DOUBLE_LINE7_DIST }, |
| /*14*/ { DOUBLE_LINE8_OUT, DOUBLE_LINE8_IN, DOUBLE_LINE8_DIST }, |
| /*15*/ { DOUBLE_LINE9_OUT, DOUBLE_LINE9_IN, DOUBLE_LINE9_DIST }, |
| /*16*/ { DOUBLE_LINE10_OUT,DOUBLE_LINE10_IN,DOUBLE_LINE10_DIST}, |
| /*17*/ { 0, 0, 0 } |
| }; |
| |
| rToFill.Color = nLineColor; |
| if( nLineType == 1) |
| { |
| rToFill.InnerLineWidth = 0; |
| rToFill.OuterLineWidth = sal_Int16(nLineThickness); |
| rToFill.LineDistance = 0; |
| |
| } |
| else |
| { |
| rToFill.InnerLineWidth = aLineTab[eCodeIdx].nIn; |
| rToFill.OuterLineWidth = aLineTab[eCodeIdx].nOut; |
| rToFill.LineDistance = aLineTab[eCodeIdx].nDist; |
| } |
| } |
| |
| void lcl_SwapQuotesInField(::rtl::OUString &rFmt) |
| { |
| //Swap unescaped " and ' with ' and " |
| sal_Int32 nLen = rFmt.getLength(); |
| ::rtl::OUStringBuffer aBuffer( rFmt.getStr() ); |
| const sal_Unicode* pFmt = rFmt.getStr(); |
| for (sal_Int32 nI = 0; nI < nLen; ++nI) |
| { |
| if ((pFmt[nI] == '\"') && (!nI || pFmt[nI-1] != '\\')) |
| aBuffer.setCharAt(nI, '\''); |
| else if ((pFmt[nI] == '\'') && (!nI || pFmt[nI-1] != '\\')) |
| aBuffer.setCharAt(nI, '\"'); |
| } |
| rFmt = aBuffer.makeStringAndClear(); |
| } |
| bool lcl_IsNotAM(::rtl::OUString& rFmt, sal_Int32 nPos) |
| { |
| return ( |
| (nPos == rFmt.getLength() - 1) || |
| ( |
| (rFmt.getStr()[nPos+1] != 'M') && |
| (rFmt.getStr()[nPos+1] != 'm') |
| ) |
| ); |
| } |
| |
| ::rtl::OUString ConvertMSFormatStringToSO( |
| const ::rtl::OUString& rFormat, lang::Locale& rLocale, bool bHijri) |
| { |
| ::rtl::OUString sFormat(rFormat); |
| lcl_SwapQuotesInField(sFormat); |
| |
| //#102782#, #102815#, #108341# & #111944# have to work at the same time :-) |
| bool bForceJapanese(false); |
| bool bForceNatNum(false); |
| sal_Int32 nLen = sFormat.getLength(); |
| sal_Int32 nI = 0; |
| // const sal_Unicode* pFormat = sFormat.getStr(); |
| ::rtl::OUStringBuffer aNewFormat( sFormat.getStr() ); |
| while (nI < nLen) |
| { |
| if (aNewFormat.charAt(nI) == '\\') |
| nI++; |
| else if (aNewFormat.charAt(nI) == '\"') |
| { |
| ++nI; |
| //While not at the end and not at an unescaped end quote |
| while ((nI < nLen) && (!(aNewFormat.charAt(nI) == '\"') && (aNewFormat.charAt(nI-1) != '\\'))) |
| ++nI; |
| } |
| else //normal unquoted section |
| { |
| sal_Unicode nChar = aNewFormat.charAt(nI); |
| if (nChar == 'O') |
| { |
| aNewFormat.setCharAt(nI, 'M'); |
| bForceNatNum = true; |
| } |
| else if (nChar == 'o') |
| { |
| aNewFormat.setCharAt(nI, 'm'); |
| bForceNatNum = true; |
| } |
| else if ((nChar == 'A') && lcl_IsNotAM(sFormat, nI)) |
| { |
| aNewFormat.setCharAt(nI, 'D'); |
| bForceNatNum = true; |
| } |
| else if ((nChar == 'g') || (nChar == 'G')) |
| bForceJapanese = true; |
| else if ((nChar == 'a') && lcl_IsNotAM(sFormat, nI)) |
| bForceJapanese = true; |
| else if (nChar == 'E') |
| { |
| if ((nI != nLen-1) && (aNewFormat.charAt(nI+1) == 'E')) |
| { |
| //todo: this cannot be the right way to replace a part of the string! |
| aNewFormat.setCharAt( nI, 'Y' ); |
| aNewFormat.setCharAt( nI + 1, 'Y' ); |
| aNewFormat.insert(nI + 2, ::rtl::OUString::createFromAscii("YY")); |
| nLen+=2; |
| nI+=3; |
| } |
| bForceJapanese = true; |
| } |
| else if (nChar == 'e') |
| { |
| if ((nI != nLen-1) && (aNewFormat.charAt(nI+1) == 'e')) |
| { |
| //todo: this cannot be the right way to replace a part of the string! |
| aNewFormat.setCharAt( nI, 'y' ); |
| aNewFormat.setCharAt( nI + 1, 'y' ); |
| aNewFormat.insert(nI + 2, ::rtl::OUString::createFromAscii("yy")); |
| nLen+=2; |
| nI+=3; |
| } |
| bForceJapanese = true; |
| } |
| else if (nChar == '/') |
| { |
| // MM We have to escape '/' in case it's used as a char |
| //todo: this cannot be the right way to replace a part of the string! |
| aNewFormat.setCharAt( nI, '\\' ); |
| aNewFormat.insert(nI + 1, ::rtl::OUString::createFromAscii("/")); |
| nI++; |
| nLen++; |
| } |
| } |
| ++nI; |
| } |
| |
| if (bForceNatNum) |
| bForceJapanese = true; |
| |
| if (bForceJapanese) |
| { |
| rLocale.Language = ::rtl::OUString::createFromAscii("ja"); |
| rLocale.Country = ::rtl::OUString::createFromAscii("JP"); |
| } |
| |
| if (bForceNatNum) |
| { |
| aNewFormat.insert( 0, ::rtl::OUString::createFromAscii("[NatNum1][$-411]")); |
| } |
| |
| if (bHijri) |
| { |
| aNewFormat.insert( 0, ::rtl::OUString::createFromAscii("[~hijri]")); |
| } |
| return aNewFormat.makeStringAndClear(); |
| |
| } |
| /*------------------------------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| sal_Int32 convertTwipToMM100(sal_Int32 _t) |
| { |
| return TWIP_TO_MM100( _t ); |
| } |
| /*-- 09.08.2007 09:34:44--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| sal_Int32 convertEMUToMM100(sal_Int32 _t) |
| { |
| return _t / 360; |
| } |
| |
| /*-- 21.11.2006 08:47:12--------------------------------------------------- |
| contains a color from 0xTTRRGGBB to 0xTTRRGGBB |
| -----------------------------------------------------------------------*/ |
| sal_Int32 ConvertColor(sal_Int32 nWordColor) |
| { |
| sal_uInt8 |
| r(static_cast<sal_uInt8>(nWordColor&0xFF)), |
| g(static_cast<sal_uInt8>(((nWordColor)>>8)&0xFF)), |
| b(static_cast<sal_uInt8>((nWordColor>>16)&0xFF)), |
| t(static_cast<sal_uInt8>((nWordColor>>24)&0xFF)); |
| sal_Int32 nRet = (t<<24) + (r<<16) + (g<<8) + b; |
| return nRet; |
| } |
| /*-- 27.06.2007 13:42:32--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| sal_Int16 convertTableJustification( sal_Int32 nIntValue ) |
| { |
| sal_Int16 nOrient = text::HoriOrientation::LEFT_AND_WIDTH; |
| switch( nIntValue ) |
| { |
| case 1 : nOrient = text::HoriOrientation::CENTER; break; |
| case 2 : nOrient = text::HoriOrientation::RIGHT; break; |
| case 0 : |
| //no break |
| default:; |
| |
| } |
| return nOrient; |
| } |
| /*-- 06.08.2007 15:27:30--------------------------------------------------- |
| conversion form xsd::DateTime |
| [-]CCYY-MM-DDThh:mm:ss[Z|(+|-)hh:mm] |
| -----------------------------------------------------------------------*/ |
| com::sun::star::util::DateTime convertDateTime( const ::rtl::OUString& rDateTimeString ) |
| { |
| util::DateTime aRet( 0, 0, 0, 0, 1, 1, 1901 ); |
| // |
| sal_Int32 nIndex = 0; |
| ::rtl::OUString sDate( rDateTimeString.getToken( 0, 'T', nIndex )); |
| sal_Int32 nDateIndex = 0; |
| aRet.Year = (sal_uInt16)sDate.getToken( 0, '-', nDateIndex ).toInt32(); |
| if( nDateIndex > 0) |
| aRet.Month = (sal_uInt16)sDate.getToken( 0, '-', nDateIndex ).toInt32(); |
| if( nDateIndex > 0) |
| aRet.Day = (sal_uInt16)sDate.getToken( 0, '-', nDateIndex ).toInt32(); |
| ::rtl::OUString sTime; |
| if(nIndex > 0) |
| { |
| sTime = ( rDateTimeString.getToken( 0, 'Z', nIndex )); |
| sal_Int32 nTimeIndex = 0; |
| aRet.Hours = (sal_uInt16)sTime.getToken( 0, ':', nTimeIndex ).toInt32(); |
| if( nTimeIndex > 0) |
| aRet.Minutes = (sal_uInt16)sTime.getToken( 0, ':', nTimeIndex ).toInt32(); |
| if( nTimeIndex > 0) |
| { |
| ::rtl::OUString sSeconds = sTime.getToken( 0, ':', nTimeIndex ); |
| nTimeIndex = 0; |
| aRet.Seconds = (sal_uInt16)sSeconds.getToken( 0, '.', nTimeIndex ).toInt32(); |
| aRet.HundredthSeconds = (sal_uInt16)sSeconds.getToken( 0, '.', nTimeIndex ).toInt32(); |
| } |
| |
| // todo: ignore time offset for a while - there's no time zone available |
| // nIndex = 0; |
| // ::rtl::OUString sOffset( rDateTimeString.getToken( 1, 'Z', nIndex )); |
| // if( sOffset.getLength() ) |
| // { |
| // add hour and minute offset and increase/decrease date if necessary |
| // } |
| } |
| return aRet; |
| } |
| /*-- 05.03.2008 09:10:13--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| sal_Int16 ConvertNumberingType(sal_Int32 nNFC) |
| { |
| sal_Int16 nRet; |
| switch(nNFC) |
| { |
| case NS_ooxml::LN_Value_ST_NumberFormat_decimal: |
| case 0: |
| nRet = style::NumberingType::ARABIC; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_upperRoman: |
| case 1: |
| nRet = style::NumberingType::ROMAN_UPPER; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_lowerRoman: |
| case 2: |
| nRet = style::NumberingType::ROMAN_LOWER; |
| break; |
| case 3: |
| nRet = style::NumberingType::CHARS_UPPER_LETTER_N; |
| break; |
| case 4: |
| nRet = style::NumberingType::CHARS_LOWER_LETTER_N; |
| break; |
| case 5: |
| nRet = style::NumberingType::ARABIC; |
| break;//ORDINAL |
| case NS_ooxml::LN_Value_ST_NumberFormat_bullet: |
| case 23: |
| case 25: |
| nRet = style::NumberingType::CHAR_SPECIAL; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_none: |
| case 255: |
| nRet = style::NumberingType::NUMBER_NONE; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_upperLetter: |
| nRet = style::NumberingType::CHARS_UPPER_LETTER; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_lowerLetter: |
| nRet = style::NumberingType::CHARS_LOWER_LETTER; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_iroha: |
| nRet = style::NumberingType::IROHA_HALFWIDTH_JA; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_irohaFullWidth: |
| nRet = style::NumberingType::IROHA_FULLWIDTH_JA; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_aiueo: |
| nRet = style::NumberingType::AIU_HALFWIDTH_JA; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_aiueoFullWidth: |
| nRet = style::NumberingType::AIU_FULLWIDTH_JA; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_hebrew2: |
| nRet = style::NumberingType::CHARS_HEBREW; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_thaiLetters: |
| nRet = style::NumberingType::CHARS_THAI; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_russianLower: |
| nRet = style::NumberingType::CHARS_CYRILLIC_LOWER_LETTER_RU; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_russianUpper: |
| nRet = style::NumberingType::CHARS_CYRILLIC_UPPER_LETTER_RU; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_decimalEnclosedCircleChinese: |
| case NS_ooxml::LN_Value_ST_NumberFormat_ideographEnclosedCircle: |
| nRet = style::NumberingType::CIRCLE_NUMBER; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_ideographTraditional: |
| nRet = style::NumberingType::TIAN_GAN_ZH; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_ideographZodiac: |
| nRet = style::NumberingType::DI_ZI_ZH; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_ganada: |
| nRet = style::NumberingType::HANGUL_SYLLABLE_KO; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_chosung: |
| nRet = style::NumberingType::HANGUL_JAMO_KO; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_koreanDigital: |
| case NS_ooxml::LN_Value_ST_NumberFormat_koreanCounting: |
| case NS_ooxml::LN_Value_ST_NumberFormat_koreanDigital2: |
| nRet = style::NumberingType::NUMBER_HANGUL_KO; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_ideographLegalTraditional: |
| nRet = style::NumberingType::NUMBER_UPPER_ZH_TW; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_arabicAlpha: |
| nRet = style::NumberingType::CHARS_ARABIC; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_hindiVowels: |
| nRet = style::NumberingType::CHARS_NEPALI; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_japaneseLegal: |
| nRet = style::NumberingType::NUMBER_TRADITIONAL_JA; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_chineseCounting: |
| case NS_ooxml::LN_Value_ST_NumberFormat_japaneseCounting: |
| case NS_ooxml::LN_Value_ST_NumberFormat_taiwaneseCounting: |
| case NS_ooxml::LN_Value_ST_NumberFormat_ideographDigital: |
| case NS_ooxml::LN_Value_ST_NumberFormat_chineseCountingThousand: |
| nRet = style::NumberingType::NUMBER_LOWER_ZH; |
| break; |
| case NS_ooxml::LN_Value_ST_NumberFormat_chineseLegalSimplified: |
| nRet = style::NumberingType::NUMBER_UPPER_ZH; |
| break; |
| default: nRet = style::NumberingType::ARABIC; |
| } |
| /* TODO: Lots of additional values are available - some are supported in the I18 framework |
| NS_ooxml::LN_Value_ST_NumberFormat_ordinal = 91682; |
| NS_ooxml::LN_Value_ST_NumberFormat_cardinalText = 91683; |
| NS_ooxml::LN_Value_ST_NumberFormat_ordinalText = 91684; |
| NS_ooxml::LN_Value_ST_NumberFormat_hex = 91685; |
| NS_ooxml::LN_Value_ST_NumberFormat_chicago = 91686; |
| NS_ooxml::LN_Value_ST_NumberFormat_decimalFullWidth = 91691; |
| NS_ooxml::LN_Value_ST_NumberFormat_decimalHalfWidth = 91692; |
| NS_ooxml::LN_Value_ST_NumberFormat_japaneseDigitalTenThousand = 91694; |
| NS_ooxml::LN_Value_ST_NumberFormat_decimalEnclosedCircle = 91695; |
| NS_ooxml::LN_Value_ST_NumberFormat_decimalFullWidth2 = 91696; |
| NS_ooxml::LN_Value_ST_NumberFormat_decimalZero = 91699; |
| NS_ooxml::LN_Value_ST_NumberFormat_decimalEnclosedFullstop = 91703; |
| NS_ooxml::LN_Value_ST_NumberFormat_decimalEnclosedParen = 91704; |
| NS_ooxml::LN_Value_ST_NumberFormat_ideographZodiacTraditional = 91709; |
| NS_ooxml::LN_Value_ST_NumberFormat_taiwaneseCountingThousand = 91712; |
| NS_ooxml::LN_Value_ST_NumberFormat_taiwaneseDigital = 91713; |
| NS_ooxml::LN_Value_ST_NumberFormat_chineseLegalSimplified = 91715; |
| NS_ooxml::LN_Value_ST_NumberFormat_chineseCountingThousand = 91716; |
| NS_ooxml::LN_Value_ST_NumberFormat_koreanLegal = 91719; |
| NS_ooxml::LN_Value_ST_NumberFormat_vietnameseCounting = 91721; |
| NS_ooxml::LN_Value_ST_NumberFormat_numberInDash = 91725; |
| NS_ooxml::LN_Value_ST_NumberFormat_arabicAbjad: |
| NS_ooxml::LN_Value_ST_NumberFormat_hebrew1 = 91726; |
| NS_ooxml::LN_Value_ST_NumberFormat_hindiConsonants = 91731; |
| NS_ooxml::LN_Value_ST_NumberFormat_hindiNumbers = 91732; |
| NS_ooxml::LN_Value_ST_NumberFormat_hindiCounting = 91733; |
| NS_ooxml::LN_Value_ST_NumberFormat_thaiNumbers = 91735; |
| NS_ooxml::LN_Value_ST_NumberFormat_thaiCounting = 91736;*/ |
| return nRet; |
| } |
| |
| |
| } // namespace ConversionHelper |
| } //namespace dmapper |
| } //namespace writerfilter |