Numbering in localized persian word is useful in some areas, at least
for me it is necessary. Since it is not trivial a function and table
is needed.
From d04ad728a0e4c7376eac28d742046dae9b10d3c3 Mon Sep 17 00:00:00 2001
From: Mohammad Elahi <elahimoham...@gmail.com>
Date: Sat, 27 Aug 2011 03:37:21 +0430
Subject: [PATCH] Add numbering type in persian word.

Numbering in localized persian word is useful in some areas, at least
for me it is necessary. Since it is not trivial a function and table
is needed.
---
 .../defaultnumberingprovider.cxx                   |  110 ++++++++++++++++++++
 1 files changed, 110 insertions(+), 0 deletions(-)

diff --git a/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx b/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx
index e315dad..6ce448a 100644
--- a/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx
+++ b/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx
@@ -208,6 +208,56 @@ static sal_Unicode lowerLetter[] = {
     0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A 
 };
 
+// Tables used for numbering in persian words
+static sal_Unicode *table_PersianWord_decade1[]={
+    (sal_Unicode[]){0}, // 0
+    (sal_Unicode[]){0x06cc, 0x06a9, 0}, // 1
+    (sal_Unicode[]){0x062f,0x0648, 0}, // 2
+    (sal_Unicode[]){0x0633,0x0647, 0}, // 3
+    (sal_Unicode[]){0x0686,0x0647,0x0627,0x0631, 0}, // 4
+    (sal_Unicode[]){0x067e,0x0646,0x062c, 0}, // 5
+    (sal_Unicode[]){0x0634,0x0634, 0}, // 6
+    (sal_Unicode[]){0x0647,0x0641,0x062a, 0}, // 7
+    (sal_Unicode[]){0x0647,0x0634,0x062a, 0}, // 8
+    (sal_Unicode[]){0x0646,0x0647, 0}, // 9
+    (sal_Unicode[]){0x062f, 0x0647, 0}, // 10
+    (sal_Unicode[]){0x06cc, 0x0627, 0x0632, 0x062f, 0x0647, 0}, // 11
+    (sal_Unicode[]){0x062f, 0x0648, 0x0627, 0x0632, 0x062f, 0x0647, 0}, // 12
+    (sal_Unicode[]){0x0633, 0x06cc, 0x0632, 0x062f, 0x0647, 0}, // 13
+    (sal_Unicode[]){0x0686, 0x0647, 0x0627, 0x0631, 0x062f, 0x0647, 0}, // 14
+    (sal_Unicode[]){0x067e, 0x0627, 0x0646, 0x0632, 0x062f, 0x0647, 0}, // 15
+    (sal_Unicode[]){0x0634, 0x0627, 0x0646, 0x0632, 0x062f, 0x0647, 0}, // 16
+    (sal_Unicode[]){0x0647, 0x0641, 0x062f, 0x0647, 0}, // 17
+    (sal_Unicode[]){0x0647, 0x062c, 0x062f, 0x0647, 0}, // 18
+    (sal_Unicode[]){0x0646, 0x0648, 0x0632, 0x062f, 0x0647, 0}}; // 19
+
+static sal_Unicode *table_PersianWord_decade2[]={
+    (sal_Unicode[]){0x0628, 0x06cc, 0x0633, 0x062a, 0}, // 20
+    (sal_Unicode[]){0x0633, 0x06cc, 0}, // 30
+    (sal_Unicode[]){0x0686, 0x0647, 0x0644, 0}, // 40
+    (sal_Unicode[]){0x067e, 0x0646, 0x062c, 0x0627, 0x0647, 0}, // 50
+    (sal_Unicode[]){0x0634, 0x0635, 0x062a, 0}, // 60
+    (sal_Unicode[]){0x0647, 0x0641, 0x062a, 0x0627, 0x062f, 0}, // 70
+    (sal_Unicode[]){0x0647, 0x0634, 0x062a, 0x0627, 0x062f, 0}, // 80
+    (sal_Unicode[]){0x0646, 0x0648, 0x062f, 0}}; // 90
+
+static sal_Unicode *table_PersianWord_decade3[]={
+    (sal_Unicode[]){0x0635, 0x062f, 0}, // 100
+    (sal_Unicode[]){0x062f, 0x0648, 0x06cc, 0x0633, 0x062a, 0}, // 200
+    (sal_Unicode[]){0x0633, 0x06cc, 0x0635, 0x062f, 0}, // 300
+    (sal_Unicode[]){0x0686, 0x0647, 0x0627, 0x0631, 0x0635, 0x062f, 0}, // 400
+    (sal_Unicode[]){0x067e, 0x0627, 0x0646, 0x0635, 0x062f, 0}, // 500
+    (sal_Unicode[]){0x0634, 0x0635, 0x062f, 0}, // 600
+    (sal_Unicode[]){0x0647, 0x0641, 0x062a, 0x0635, 0x062f, 0}, // 700
+    (sal_Unicode[]){0x0647, 0x0634, 0x062a, 0x0635, 0x062f, 0}, // 800
+    (sal_Unicode[]){0x0646, 0x0647, 0x0635, 0x062f, 0}}; // 900
+
+static sal_Unicode *table_PersianWord_decadeX[]={
+    (sal_Unicode[]){0x0647, 0x0632, 0x0627, 0x0631, 0}, // 1000
+    (sal_Unicode[]){0x0645, 0x06cc, 0x0644, 0x06cc, 0x0648, 0x0646, 0}, // 1000000
+    (sal_Unicode[]){0x0645, 0x06cc, 0x0644, 0x06cc, 0x0627, 0x0631, 0x062f, 0}}; // 1000000000
+
+
 DefaultNumberingProvider::DefaultNumberingProvider( const Reference < XMultiServiceFactory >& xMSF ) : xSMgr(xMSF),translit(NULL)
 {
         
@@ -333,6 +383,61 @@ void lcl_formatChars3( sal_Unicode table_capital[], sal_Unicode table_small[], i
          s += OUString::valueOf( table_small[ n%tableSize ] );
 }
 
+/*  Returns number's representation in persian words upto 999999999 */
+static
+void lcl_formatPersianWord(unsigned int aNumber, OUString& rsResult)
+{
+    // Formats numbers in persian word up to 999999999999 which is high enough for showing int
+    OUString asTemp;
+    unsigned char anDigit;
+    OUString asPersianWord_conjunction=OUString((sal_Unicode[]){0x20,0x0648,0x20,0});
+    unsigned char anSection=0;
+
+    //if(n>999999999999)
+    //    return;
+
+    while(int anPart=aNumber%1000)
+    {
+        if(anSection)
+            asTemp=OUString(table_PersianWord_decadeX[anSection-1])+asPersianWord_conjunction+asTemp;
+
+        if((anDigit=anPart%100)<20)
+        {
+            if(!asTemp.isEmpty())
+                asTemp=OUString(0x0020)+asTemp;
+
+            asTemp=OUString(table_PersianWord_decade1[anDigit])+asTemp;
+        }
+        else
+        {
+            if((anDigit=anPart%10))
+            {
+                if(!asTemp.isEmpty())
+                    asTemp=asPersianWord_conjunction+asTemp;
+
+                asTemp=OUString(table_PersianWord_decade1[anDigit])+asTemp;
+            }
+            if((anDigit=(anPart/10)%10))
+            {
+                if(!asTemp.isEmpty())
+                    asTemp=asPersianWord_conjunction+asTemp;
+                asTemp=OUString(table_PersianWord_decade2[anDigit-2])+asTemp;
+            }
+        }
+
+        if((anDigit=anPart/100))
+        {
+            if(!asTemp.isEmpty())
+                asTemp=asPersianWord_conjunction+asTemp;
+            asTemp=OUString(table_PersianWord_decade3[anDigit-1])+asTemp;
+        }
+
+        aNumber/=1000;
+        anSection++;
+    }
+    rsResult+=asTemp;
+}
+
 // Greek Letter Numbering
 
 // KERAIA separates numerals from other text
@@ -730,6 +835,10 @@ DefaultNumberingProvider::makeNumberingString( const Sequence<beans::PropertyVal
               lcl_formatChars(table_Alphabet_fa, sizeof(table_Alphabet_fa) / sizeof(sal_Unicode), number - 1, result);
               break;
 
+          case CHARS_PERSIAN_WORD:
+              lcl_formatPersianWord(number, result);
+              break;
+
           default:
                OSL_ASSERT(0);
                throw IllegalArgumentException();
@@ -814,6 +923,7 @@ static const Supported_NumberingType aSupportedTypes[] =
         {style::NumberingType::CHARS_CYRILLIC_UPPER_LETTER_N_SR, C_CYR_A ", " C_CYR_B ", .., " C_CYR_A S_CYR_A ", " C_CYR_B S_CYR_B ", ... (sr)", LANG_ALL},
         {style::NumberingType::CHARS_CYRILLIC_LOWER_LETTER_N_SR, S_CYR_A ", " S_CYR_B ", .., " S_CYR_A S_CYR_A ", " S_CYR_B S_CYR_B ", ... (sr)", LANG_ALL},
         {style::NumberingType::CHARS_PERSIAN,   NULL, LANG_CTL},
+        {style::NumberingType::CHARS_PERSIAN_WORD,   NULL, LANG_CTL},
         {style::NumberingType::CHARS_GREEK_LOWER_LETTER,   C_GR_A ", " C_GR_B ", ... (gr)", LANG_ALL},
         {style::NumberingType::CHARS_GREEK_UPPER_LETTER,   S_GR_A ", " S_GR_B ", ... (gr)", LANG_ALL},
 };
-- 
1.7.4.1

From 30b390bc90c55cc5c414bdd2bf74e6a5f163f9de Mon Sep 17 00:00:00 2001
From: Mohammad Elahi <elahimoham...@gmail.com>
Date: Sat, 27 Aug 2011 03:40:03 +0430
Subject: [PATCH] Add numbering type in persian word.

Numbering in localized persian word is useful in some areas, at least
for me it is necessary. Since it is not trivial a function and table
is needed.
---
 offapi/com/sun/star/style/NumberingType.idl |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/offapi/com/sun/star/style/NumberingType.idl b/offapi/com/sun/star/style/NumberingType.idl
index 0b4c7ca..8646709 100644
--- a/offapi/com/sun/star/style/NumberingType.idl
+++ b/offapi/com/sun/star/style/NumberingType.idl
@@ -485,6 +485,13 @@ published constants NumberingType
      */
     const short CHARS_GREEK_LOWER_LETTER = 53;
 
+    //-------------------------------------------------------------------------
+    /** Numbering in Persian words
+
+        @since OOo 3.5
+     */
+    const short CHARS_PERSIAN_WORD = 55;
+
 };
 
 //=============================================================================
-- 
1.7.4.1

_______________________________________________
LibreOffice mailing list
LibreOffice@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice

Reply via email to