Coverage Report

Created: 2026-02-14 09:37

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libreoffice/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx
Line
Count
Source
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
/*
3
 * This file is part of the LibreOffice project.
4
 *
5
 * This Source Code Form is subject to the terms of the Mozilla Public
6
 * License, v. 2.0. If a copy of the MPL was not distributed with this
7
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8
 *
9
 * This file incorporates work covered by the following license notice:
10
 *
11
 *   Licensed to the Apache Software Foundation (ASF) under one or more
12
 *   contributor license agreements. See the NOTICE file distributed
13
 *   with this work for additional information regarding copyright
14
 *   ownership. The ASF licenses this file to you under the Apache
15
 *   License, Version 2.0 (the "License"); you may not use this file
16
 *   except in compliance with the License. You may obtain a copy of
17
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18
 */
19
20
#include <defaultnumberingprovider.hxx>
21
#include <transliterationImpl.hxx>
22
#include <com/sun/star/i18n/NativeNumberMode.hpp>
23
#include <com/sun/star/lang/IllegalArgumentException.hpp>
24
#include <com/sun/star/style/NumberingType.hpp>
25
#include <com/sun/star/beans/PropertyValue.hpp>
26
#include <com/sun/star/configuration/theDefaultProvider.hpp>
27
#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
28
#include <osl/diagnose.h>
29
#include <rtl/ref.hxx>
30
#include <localedata.hxx>
31
#include <nativenumbersupplier.hxx>
32
#include <string.h>
33
#include <comphelper/propertysequence.hxx>
34
#include <cppuhelper/supportsservice.hxx>
35
#include <officecfg/Office/Common.hxx>
36
37
// Cyrillic upper case
38
#define C_CYR_A "\xD0\x90"
39
#define C_CYR_B "\xD0\x91"
40
// Cyrillic lower case
41
#define S_CYR_A "\xD0\xB0"
42
#define S_CYR_B "\xD0\xB1"
43
44
//Greek upper case
45
#define C_GR_A "\xCE\x91"
46
#define C_GR_B "\xCE\x92"
47
//Greek lower case
48
#define S_GR_A "\xCE\xB1"
49
#define S_GR_B "\xCE\xB2"
50
51
//Hebrew
52
#define S_HE_ALEPH "\xD7\x90"
53
#define S_HE_YOD "\xD7\x99"
54
#define S_HE_QOF "\xD7\xA7"
55
56
//Arabic-Indic
57
#define S_AR_ONE "\xd9\xa1"
58
#define S_AR_TWO "\xd9\xa2"
59
#define S_AR_THREE "\xd9\xa3"
60
61
// East Arabic-Indic
62
#define S_FA_ONE "\xDB\xB1"
63
#define S_FA_TWO "\xDB\xB2"
64
#define S_FA_THREE "\xDB\xB3"
65
66
// Indic Devanagari
67
#define S_HI_ONE "\xE0\xA5\xA7"
68
#define S_HI_TWO "\xE0\xA5\xA8"
69
#define S_HI_THREE "\xE0\xA5\xA9"
70
71
// Chicago footnote symbols
72
#define S_DAGGER "\xE2\x80\xA0"
73
#define S_DBL_DAGGER "\xE2\x80\xA1"
74
#define S_SECTION "\xC2\xA7"
75
76
#include <sal/macros.h>
77
#include <rtl/ustring.hxx>
78
#include <rtl/ustrbuf.hxx>
79
80
#include <bullet.h>
81
82
using namespace com::sun::star;
83
using namespace com::sun::star::uno;
84
using namespace ::com::sun::star::i18n;
85
using namespace com::sun::star::lang;
86
87
namespace i18npool {
88
89
constexpr sal_Unicode table_Alphabet_ar[] = {
90
    0x0623, 0x0628, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E,
91
    0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635,
92
    0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0641, 0x0642,
93
    0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649
94
};
95
96
constexpr sal_Unicode table_Alphabet_ar_abjad[] = {
97
    0x0627, 0x0628, 0x062c, 0x062f, 0x0647, 0x0648, 0x0632, 0x062d,
98
    0x0637, 0x064a, 0x0643, 0x0644, 0x0645, 0x0646, 0x0633, 0x0639,
99
    0x0641, 0x0635, 0x0642, 0x0631, 0x0634, 0x062a, 0x062b, 0x062e,
100
    0x0630, 0x0636, 0x0638, 0x063a
101
};
102
103
constexpr sal_Unicode table_Alphabet_th[] = {
104
    0x0E01, 0x0E02, 0x0E04, 0x0E07,
105
    0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F,
106
    0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17,
107
    0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F,
108
    0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27,
109
    0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E
110
};
111
112
constexpr sal_Unicode table_Alphabet_he[] = {
113
    0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7,
114
    0x05D8, 0x05D9, 0x05DB, 0x05DC, 0x05DE, 0x05E0, 0x05E1, 0x05E2,
115
    0x05E4, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA
116
};
117
118
constexpr sal_Unicode table_Alphabet_ne[] = {
119
    0x0915, 0x0916, 0x0917, 0x0918, 0x0919, 0x091A, 0x091B, 0x091C,
120
    0x091D, 0x091E, 0x091F, 0x0920, 0x0921, 0x0922, 0x0923, 0x0924,
121
    0x0925, 0x0926, 0x0927, 0x0928, 0x092A, 0x092B, 0x092C, 0x092D,
122
    0x092E, 0x092F, 0x0930, 0x0932, 0x0935, 0x0936, 0x0937, 0x0938,
123
    0x0939
124
};
125
126
constexpr sal_Unicode table_Alphabet_km[] = {
127
    0x1780, 0x1781, 0x1782, 0x1783, 0x1784, 0x1785, 0x1786, 0x1787,
128
    0x1788, 0x1789, 0x178A, 0x178B, 0x178C, 0x178D, 0x178E, 0x178F,
129
    0x1790, 0x1791, 0x1792, 0x1793, 0x1794, 0x1795, 0x1796, 0x1797,
130
    0x1798, 0x1799, 0x179A, 0x179B, 0x179C, 0x179F,
131
    0x17A0, 0x17A1, 0x17A2
132
};
133
134
constexpr sal_Unicode table_Alphabet_lo[] = {
135
    0x0E81, 0x0E82, 0x0E84, 0x0E87, 0x0E88, 0x0E8A, 0x0E8D, 0x0E94,
136
    0x0E95, 0x0E96, 0x0E97, 0x0E99, 0x0E9A, 0x0E9B, 0x0E9C,
137
    0x0E9D, 0x0E9E, 0x0E9F, 0x0EA1, 0x0EA2, 0x0EA3, 0x0EA5, 0x0EA7,
138
    0x0EAA, 0x0EAB, 0x0EAD, 0x0EAE, 0x0EAF, 0x0EAE, 0x0EDC, 0x0EDD
139
};
140
141
constexpr sal_Unicode table_Alphabet_dz[] = {
142
    0x0F40, 0x0F41, 0x0F42, 0x0F44, 0x0F45, 0x0F46, 0x0F47, 0x0F49,
143
    0x0F4F, 0x0F50, 0x0F51, 0x0F53, 0x0F54, 0x0F55, 0x0F56, 0x0F58,
144
    0x0F59, 0x0F5A, 0x0F5B, 0x0F5D, 0x0F5E, 0x0F5F, 0x0F60, 0x0F61,
145
    0x0F62, 0x0F63, 0x0F64, 0x0F66, 0x0F67, 0x0F68
146
};
147
148
constexpr sal_Unicode table_Alphabet_my[] = {
149
    0x1000, 0x1001, 0x1002, 0x1003, 0x1004, 0x1005, 0x1006, 0x1007,
150
    0x1008,/*0x1009,*/0x100A, 0x100B, 0x100C, 0x100D, 0x100E, 0x100F,
151
    0x1010, 0x1011, 0x1012, 0x1013, 0x1014, 0x1015, 0x1016, 0x1017,
152
    0x1018, 0x1019, 0x101A, 0x101B, 0x101C, 0x101D, 0x101E, 0x101F,
153
    0x1020, 0x1021
154
};
155
156
// Bulgarian Cyrillic upper case letters
157
constexpr sal_Unicode table_CyrillicUpperLetter_bg[] = {
158
    0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418,
159
    0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422,
160
    0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042E,
161
    0x042F
162
};
163
164
// Bulgarian cyrillic lower case letters
165
constexpr sal_Unicode table_CyrillicLowerLetter_bg[] = {
166
    0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438,
167
    0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442,
168
    0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044E,
169
    0x044F
170
};
171
172
// Russian Cyrillic upper letters
173
constexpr sal_Unicode table_CyrillicUpperLetter_ru[] = {
174
    0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
175
    0x0418, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420,
176
    0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428,
177
    0x0429, 0x042B, 0x042D, 0x042E, 0x042F
178
};
179
180
// Russian cyrillic lower letters
181
constexpr sal_Unicode table_CyrillicLowerLetter_ru[] = {
182
    0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
183
    0x0438, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440,
184
    0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448,
185
    0x0449, 0x044B, 0x044D, 0x044E, 0x044F
186
};
187
188
// Serbian Cyrillic upper letters
189
constexpr sal_Unicode table_CyrillicUpperLetter_sr[] = {
190
    0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0402, 0x0415, 0x0416,
191
    0x0417, 0x0418, 0x0408, 0x041A, 0x041B, 0x0409, 0x041C, 0x041D,
192
    0x040A, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x040B, 0x0423,
193
    0x0424, 0x0425, 0x0426, 0x0427, 0x040F, 0x0428
194
};
195
196
// Serbian cyrillic lower letters
197
constexpr sal_Unicode table_CyrillicLowerLetter_sr[] = {
198
    0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0452, 0x0435, 0x0436,
199
    0x0437, 0x0438, 0x0458, 0x043A, 0x043B, 0x0459, 0x043C, 0x043D,
200
    0x045A, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x045B, 0x0443,
201
    0x0444, 0x0445, 0x0446, 0x0447, 0x045F, 0x0448
202
};
203
204
// Ukrainian Cyrillic upper letters
205
constexpr sal_Unicode table_CyrillicUpperLetter_uk[] = {
206
    0x0410, 0x0411, 0x0412, 0x0413, 0x0490, 0x0414, 0x0415, 0x0404,
207
    0x0416, 0x0417, 0x0418, 0x0406, 0x0407, 0x0419, 0x041A, 0x041B,
208
    0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423,
209
    0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042C, 0x042E,
210
    0x042F
211
};
212
213
// Ukrainian cyrillic lower letters
214
constexpr sal_Unicode table_CyrillicLowerLetter_uk[] = {
215
    0x0430, 0x0431, 0x0432, 0x0433, 0x0491, 0x0434, 0x0435, 0x0454,
216
    0x0436, 0x0437, 0x0438, 0x0456, 0x0457, 0x0439, 0x043A, 0x043B,
217
    0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443,
218
    0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044C, 0x044E,
219
    0x044F
220
};
221
222
constexpr sal_Unicode table_GreekUpperLetter[] = {
223
    0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x03DB, 0x0396, 0x0397, 0x0398,
224
    0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03DF,
225
    0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03E0
226
};
227
228
constexpr sal_Unicode table_GreekLowerLetter[] = {
229
    0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03DB, 0x03B6, 0x03B7, 0x03B8,
230
    0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03DF,
231
    0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03E1
232
};
233
234
constexpr sal_Unicode table_Alphabet_fa[] = {
235
    0x0622, 0x0628, 0x067E, 0x062A, 0x062B, 0x062C, 0x0686, 0x062D,
236
    0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0698, 0x0633, 0x0634,
237
    0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x0640, 0x0641, 0x0642,
238
    0x06A9, 0x06AF, 0x0644, 0x0645, 0x0646, 0x0648, 0x0647, 0x06CC
239
};
240
241
constexpr sal_Unicode upperLetter[] = {
242
    0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
243
    0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52,
244
    0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A
245
};
246
247
constexpr sal_Unicode lowerLetter[] = {
248
    0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
249
    0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72,
250
    0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A
251
};
252
253
constexpr sal_Unicode table_Chicago[] = {
254
    0x002a, 0x2020, 0x2021, 0x00a7
255
};
256
257
// Tables used for numbering in persian words
258
constexpr sal_Unicode table_PersianWord_decade1[][7]={
259
    {0},                                                 // 0
260
    {0x06cc, 0x06a9, 0},                                 // 1
261
    {0x062f, 0x0648, 0},                                 // 2
262
    {0x0633, 0x0647, 0},                                 // 3
263
    {0x0686, 0x0647, 0x0627, 0x0631, 0},                 // 4
264
    {0x067e, 0x0646, 0x062c, 0},                         // 5
265
    {0x0634, 0x0634, 0},                                 // 6
266
    {0x0647, 0x0641, 0x062a, 0},                         // 7
267
    {0x0647, 0x0634, 0x062a, 0},                         // 8
268
    {0x0646, 0x0647, 0},                                 // 9
269
    {0x062f, 0x0647, 0},                                 // 10
270
    {0x06cc, 0x0627, 0x0632, 0x062f, 0x0647, 0},         // 11
271
    {0x062f, 0x0648, 0x0627, 0x0632, 0x062f, 0x0647, 0}, // 12
272
    {0x0633, 0x06cc, 0x0632, 0x062f, 0x0647, 0},         // 13
273
    {0x0686, 0x0647, 0x0627, 0x0631, 0x062f, 0x0647, 0}, // 14
274
    {0x067e, 0x0627, 0x0646, 0x0632, 0x062f, 0x0647, 0}, // 15
275
    {0x0634, 0x0627, 0x0646, 0x0632, 0x062f, 0x0647, 0}, // 16
276
    {0x0647, 0x0641, 0x062f, 0x0647, 0},                 // 17
277
    {0x0647, 0x062c, 0x062f, 0x0647, 0},                 // 18
278
    {0x0646, 0x0648, 0x0632, 0x062f, 0x0647, 0}          // 19
279
};
280
281
constexpr sal_Unicode table_PersianWord_decade2[][6]={
282
    {0x0628, 0x06cc, 0x0633, 0x062a, 0},                 // 20
283
    {0x0633, 0x06cc, 0},                                 // 30
284
    {0x0686, 0x0647, 0x0644, 0},                         // 40
285
    {0x067e, 0x0646, 0x062c, 0x0627, 0x0647, 0},         // 50
286
    {0x0634, 0x0635, 0x062a, 0},                         // 60
287
    {0x0647, 0x0641, 0x062a, 0x0627, 0x062f, 0},         // 70
288
    {0x0647, 0x0634, 0x062a, 0x0627, 0x062f, 0},         // 80
289
    {0x0646, 0x0648, 0x062f, 0}                          // 90
290
};
291
292
constexpr sal_Unicode table_PersianWord_decade3[][7]={
293
    {0x0635, 0x062f, 0},                                 // 100
294
    {0x062f, 0x0648, 0x06cc, 0x0633, 0x062a, 0},         // 200
295
    {0x0633, 0x06cc, 0x0635, 0x062f, 0},                 // 300
296
    {0x0686, 0x0647, 0x0627, 0x0631, 0x0635, 0x062f, 0}, // 400
297
    {0x067e, 0x0627, 0x0646, 0x0635, 0x062f, 0},         // 500
298
    {0x0634, 0x0635, 0x062f, 0},                         // 600
299
    {0x0647, 0x0641, 0x062a, 0x0635, 0x062f, 0},         // 700
300
    {0x0647, 0x0634, 0x062a, 0x0635, 0x062f, 0},         // 800
301
    {0x0646, 0x0647, 0x0635, 0x062f, 0}                  // 900
302
};
303
304
constexpr sal_Unicode table_PersianWord_decadeX[][8]={
305
    {0x0647, 0x0632, 0x0627, 0x0631, 0},                        // 1000
306
    {0x0645, 0x06cc, 0x0644, 0x06cc, 0x0648, 0x0646, 0},        // 1000000
307
    {0x0645, 0x06cc, 0x0644, 0x06cc, 0x0627, 0x0631, 0x062f, 0} // 1000000000
308
};
309
310
constexpr sal_Unicode table_KoreanLegalWord_decade1[][3] = {
311
    {0xd558, 0xb098, 0}, // 1
312
    {0xb458, 0},         // 2
313
    {0xc14b, 0},         // 3
314
    {0xb137, 0},         // 4
315
    {0xb2e4, 0xc12f, 0}, // 5
316
    {0xc5ec, 0xc12f, 0}, // 6
317
    {0xc77c, 0xacf1, 0}, // 7
318
    {0xc5ec, 0xb35f, 0}, // 8
319
    {0xc544, 0xd649, 0}  // 9
320
};
321
322
constexpr sal_Unicode table_KoreanLegalWord_decade2[][3] = {
323
    {0xc5f4, 0},          // 10
324
    {0xc2a4, 0xbb3c, 0},  // 20
325
    {0xc11c, 0xb978, 0},  // 30
326
    {0xb9c8, 0xd754, 0},  // 40
327
    {0xc270, 0},          // 50
328
    {0xc608, 0xc21c, 0},  // 60
329
    {0xc77c, 0xd754, 0},  // 70
330
    {0xc5ec, 0xb4e0, 0},  // 80
331
    {0xc544, 0xd754, 0}   // 90
332
};
333
334
203
DefaultNumberingProvider::DefaultNumberingProvider( const Reference < XComponentContext >& rxContext ) : m_xContext(rxContext)
335
203
{
336
337
203
}
338
339
DefaultNumberingProvider::~DefaultNumberingProvider()
340
198
{
341
198
}
342
343
Sequence< Reference<container::XIndexAccess> >
344
DefaultNumberingProvider::getDefaultOutlineNumberings(const Locale& rLocale )
345
0
{
346
0
     return LocaleDataImpl::get()->getOutlineNumberingLevels( rLocale );
347
0
}
348
349
Sequence< Sequence<beans::PropertyValue> >
350
DefaultNumberingProvider::getDefaultContinuousNumberingLevels( const Locale& rLocale )
351
0
{
352
0
     return LocaleDataImpl::get()->getContinuousNumberingLevels( rLocale );
353
0
}
354
355
static OUString toRoman( sal_Int32 n )
356
2.28k
{
357
358
//              i, ii, iii, iv, v, vi, vii, vii, viii, ix
359
//                                                      (Dummy),1000,500,100,50,10,5,1
360
2.28k
    static const char coRomanArr[] = "MDCLXVI--";       // +2 Dummy entries !!
361
2.28k
    const char* cRomanStr = coRomanArr;
362
2.28k
    sal_uInt16 nMask = 1000;
363
2.28k
    sal_uInt32 nOver1000 = n / nMask;
364
2.28k
    n -= ( nOver1000 * nMask );
365
366
2.28k
    OUStringBuffer sTmp;
367
2.28k
    while(nOver1000--)
368
0
        sTmp.append(*coRomanArr);
369
370
11.4k
    while( nMask )
371
9.15k
    {
372
9.15k
        sal_uInt8 nNumber = sal_uInt8( n / nMask );
373
9.15k
        sal_uInt8 nDiff = 1;
374
9.15k
        n %= nMask;
375
376
9.15k
        if( 5 < nNumber )
377
0
        {
378
0
            if( nNumber < 9 )
379
0
                sTmp.append(*(cRomanStr-1));
380
0
            ++nDiff;
381
0
            nNumber -= 5;
382
0
        }
383
9.15k
        switch( nNumber )
384
9.15k
        {
385
80
            case 3: sTmp.append(*cRomanStr);           [[fallthrough]];
386
264
            case 2: sTmp.append(*cRomanStr);           [[fallthrough]];
387
1.89k
            case 1: sTmp.append(*cRomanStr);           break;
388
312
            case 4: sTmp.append(OUStringChar(*cRomanStr) + OUStringChar(*(cRomanStr-nDiff))); break;
389
80
            case 5: sTmp.append(*(cRomanStr-nDiff));   break;
390
9.15k
        }
391
392
9.15k
        nMask /= 10;                    // to the next decade
393
9.15k
        cRomanStr += 2;
394
9.15k
    }
395
2.28k
    return sTmp.makeStringAndClear();
396
2.28k
}
397
398
// not used:
399
400
static
401
void lcl_formatChars( const sal_Unicode table[], int tableSize, int n, OUString& s )
402
59.1k
{
403
     // string representation of n is appended to s.
404
     // if A=='A' then 0=>A, 1=>B, ..., 25=>Z, 26=>AA, 27=>AB, ...
405
     // if A=='a' then 0=>a, 1=>b, ..., 25=>z, 26=>aa, 27=>ab, ...
406
407
59.1k
     if( n>=tableSize ) lcl_formatChars( table, tableSize, (n-tableSize)/tableSize, s );
408
409
59.1k
     s += OUStringChar( table[ n % tableSize ] );
410
59.1k
}
411
412
static
413
void lcl_formatChars1( const sal_Unicode table[], int tableSize, int n, OUString& s )
414
0
{
415
     // string representation of n is appended to s.
416
     // if A=='A' then 0=>A, 1=>B, ..., 25=>Z, 26=>AA, 27=>BB, ...
417
     // if A=='a' then 0=>a, 1=>b, ..., 25=>z, 26=>aa, 27=>bb, ...
418
419
0
     int repeat_count = n / tableSize + 1;
420
421
0
     for( int i=0; i<repeat_count; i++ )
422
0
         s += OUStringChar( table[ n%tableSize ] );
423
0
}
424
425
static
426
void lcl_formatChars2( const sal_Unicode table_capital[], const sal_Unicode table_small[], int tableSize, int n, OUString& s )
427
0
{
428
     // string representation of n is appended to s.
429
     // if A=='A' then 0=>A, 1=>B, ..., 25=>Z, 26=>Aa, 27=>Ab, ...
430
431
0
     if( n>=tableSize )
432
0
     {
433
0
          lcl_formatChars2( table_capital, table_small, tableSize, (n-tableSize)/tableSize, s );
434
0
          s += OUStringChar( table_small[ n % tableSize ] );
435
0
     } else
436
0
          s += OUStringChar( table_capital[ n % tableSize ] );
437
0
}
438
439
static
440
void lcl_formatChars3( const sal_Unicode table_capital[], const sal_Unicode table_small[], int tableSize, int n, OUString& s )
441
0
{
442
     // string representation of n is appended to s.
443
     // if A=='A' then 0=>A, 1=>B, ..., 25=>Z, 26=>Aa, 27=>Bb, ...
444
445
0
     int repeat_count = n / tableSize + 1;
446
0
     s += OUStringChar( table_capital[ n%tableSize ] );
447
448
0
     for( int i=1; i<repeat_count; i++ )
449
0
         s += OUStringChar( table_small[ n%tableSize ] );
450
0
}
451
452
453
/** Returns number's representation in persian words up to 999999999999
454
    respectively limited by sal_Int32 >=0.
455
    The caller assures that nNumber is not negative.
456
457
    @throws IllegalArgumentException
458
    @throws RuntimeException
459
 */
460
static
461
void lcl_formatPersianWord( sal_Int32 nNumber, OUString& rsResult )
462
5.66k
{
463
5.66k
    OUStringBuffer aTemp(64);
464
5.66k
    OUString asPersianWord_conjunction = u" \u0648 "_ustr;
465
5.66k
    unsigned char nSection = 0;
466
467
11.3k
    while (int nPart = nNumber % 1000)
468
5.66k
    {
469
5.66k
        if (nSection)
470
0
        {
471
0
            if (nSection > std::size( table_PersianWord_decadeX))
472
0
                throw IllegalArgumentException();   // does not happen with sal_Int32
473
0
            aTemp.insert( 0, table_PersianWord_decadeX[nSection-1] + asPersianWord_conjunction );
474
0
        }
475
476
5.66k
        unsigned int nDigit;
477
5.66k
        if ((nDigit = nPart % 100) < 20)
478
5.66k
        {
479
5.66k
            if (!aTemp.isEmpty())
480
0
                aTemp.insert( 0, u' ');
481
5.66k
            aTemp.insert( 0, table_PersianWord_decade1[nDigit]);
482
5.66k
        }
483
0
        else
484
0
        {
485
0
            if ((nDigit = nPart % 10) != 0)
486
0
            {
487
0
                if (!aTemp.isEmpty())
488
0
                    aTemp.insert( 0, asPersianWord_conjunction);
489
0
                aTemp.insert( 0, table_PersianWord_decade1[nDigit]);
490
0
            }
491
0
            if ((nDigit = (nPart / 10) % 10) != 0)
492
0
            {
493
0
                if (!aTemp.isEmpty())
494
0
                    aTemp.insert( 0, asPersianWord_conjunction);
495
0
                aTemp.insert( 0, table_PersianWord_decade2[nDigit-2]);
496
0
            }
497
0
        }
498
499
5.66k
        if ((nDigit = nPart / 100) != 0)
500
0
        {
501
0
            if (!aTemp.isEmpty())
502
0
                aTemp.insert( 0, asPersianWord_conjunction);
503
0
            aTemp.insert( 0, table_PersianWord_decade3[nDigit-1]);
504
0
        }
505
506
5.66k
        nNumber /= 1000;
507
5.66k
        nSection++;
508
5.66k
    }
509
5.66k
    rsResult += aTemp;
510
5.66k
}
511
512
5.66k
static void lcl_formatKoreanLegalWord(sal_Int32 nNumber, OUString& rsResult) {
513
5.66k
    OUStringBuffer aTemp(64);
514
5.66k
    int digit1 = nNumber % 10;
515
5.66k
    int digit2 = nNumber / 10;
516
5.66k
    if (digit1 > 0)
517
5.66k
        aTemp.insert(0, (table_KoreanLegalWord_decade1[digit1 - 1]));
518
5.66k
    if (digit2 > 0)
519
0
        aTemp.insert(0, (table_KoreanLegalWord_decade2[digit2 - 1]));
520
5.66k
    rsResult += aTemp;
521
5.66k
}
522
523
// Greek Letter Numbering
524
525
// KERAIA separates numerals from other text
526
0
#define STIGMA        u'\x03DB'
527
0
#define LEFT_KERAIA   u'\x0375'
528
0
#define MYRIAD_SYM    u'\x039C'
529
0
#define DOT_SYM       u'.'
530
0
#define SIGMA_OFFSET  19
531
0
#define TAU_OFFSET    20
532
0
#define MYRIAD        10000
533
534
/*
535
* Return the 1-999999 number's representation in the Greek numbering system.
536
* Adding a "left keraia" to represent numbers in the range 10000 ... 999999 is
537
* not orthodox, so it's better to use the myriad notation and call this method
538
* only for numbers up to 9999.
539
*/
540
static
541
OUString gr_smallNum(const sal_Unicode table[], int n)
542
0
{
543
0
    if (n > 9999)
544
0
        throw IllegalArgumentException();
545
546
0
    int i = 0;
547
0
    OUStringBuffer sb;
548
0
    for (int v = n; v > 0; v /= 10, i++) {
549
0
        int digit = v % 10;
550
0
        if (digit == 0)
551
0
            continue;
552
553
0
        sal_Unicode sign = table[(digit - 1) + 9 * (i % 3)];
554
0
        if (sign == STIGMA) {
555
0
            sb.insert(0, table[TAU_OFFSET]);
556
0
            sb.insert(0, table[SIGMA_OFFSET]);
557
0
        } else {
558
0
            sb.insert(0, sign);
559
0
        }
560
561
0
        if (i > 2)
562
0
            sb.insert(0, LEFT_KERAIA);
563
0
    }
564
565
0
    return sb.makeStringAndClear();
566
0
}
567
568
static
569
void lcl_formatCharsGR(const sal_Unicode table[], int n, OUString& s )
570
0
{
571
0
    OUStringBuffer sb;
572
0
    int myriadPower = 2;
573
574
0
    for (int divisor = MYRIAD * MYRIAD; divisor > 1; divisor /= MYRIAD, myriadPower--) {
575
0
        if (n > divisor - 1) {
576
            /*
577
             * Follow the Diophantus representation of:
578
             *   A myriad sign, M(10000) as many times as the power
579
             *   followed by the multiplier for the myriad
580
             *   followed by a dot
581
             *   followed by the rest
582
             *   This is enough for 32-bit integers
583
             */
584
0
            for (int i = 0; i < myriadPower; i++)
585
0
                sb.append(MYRIAD_SYM);
586
587
0
            sb.append(gr_smallNum(table, n/divisor));
588
0
            n %= divisor;
589
590
0
            if (n > 0)
591
0
                sb.append(DOT_SYM);
592
0
        }
593
0
    }
594
0
    sb.append(gr_smallNum(table,n));
595
596
0
    s += sb;
597
0
}
598
599
static
600
bool should_ignore( std::u16string_view s )
601
371k
{
602
        // return true if blank or null
603
371k
        return s == u" " || (!s.empty() && s[0]==0);
604
371k
}
605
606
/**
607
 * Turn nNumber into a string and pad the result to nLimit by inserting zero characters at the
608
 * start.
609
 */
610
static OUString lcl_formatArabicZero(sal_Int32 nNumber, sal_Int32 nLimit)
611
0
{
612
0
    OUString aRet = OUString::number(nNumber);
613
0
    sal_Int32 nDiff = nLimit - aRet.getLength();
614
615
0
    if (nDiff <= 0)
616
0
    {
617
0
        return aRet;
618
0
    }
619
620
0
    OUStringBuffer aBuffer;
621
0
    aBuffer.setLength(nDiff);
622
0
    for (sal_Int32 i = 0; i < nDiff; ++i)
623
0
    {
624
0
        aBuffer[i] = '0';
625
0
    }
626
0
    aBuffer.append(aRet);
627
0
    return aBuffer.makeStringAndClear();
628
0
}
629
630
static
631
Any getPropertyByName( const Sequence<beans::PropertyValue>& aProperties,
632
                                                const char* name )
633
0
{
634
0
        auto pProp = std::find_if(aProperties.begin(), aProperties.end(),
635
0
            [&name](const beans::PropertyValue& rProp) { return rProp.Name.equalsAscii(name); });
636
0
        if (pProp != aProperties.end())
637
0
            return pProp->Value;
638
0
        throw IllegalArgumentException();
639
0
}
640
641
//XNumberingFormatter
642
OUString
643
DefaultNumberingProvider::makeNumberingString( const Sequence<beans::PropertyValue>& aProperties,
644
                                               const Locale& aLocale )
645
186k
{
646
     // the Sequence of PropertyValues is expected to have at least 4 elements:
647
     // elt Name              Type             purpose
648
649
650
     // 0.  "Prefix"          OUString
651
     // 1.  "NumberingType"   sal_Int16        type of formatting from style::NumberingType (roman, arabic, etc)
652
     // 2.  "Suffix"          OUString
653
     // ... ...               ...
654
     // n.  "Value"           sal_Int32        the number to be formatted
655
     // example:
656
     // given the Sequence { '(', NumberingType::ROMAN_UPPER, ')', ..., 7 }
657
     // makeNumberingString() returns the string "(VII)".
658
659
     // Q: why is the type of numType sal_Int16 instead of style::NumberingType?
660
     // A: an Any can't hold a style::NumberingType for some reason.
661
        //      add.: style::NumberingType holds constants of type sal_Int16, it's not an enum type
662
663
186k
     sal_Int16 natNum = 0;
664
186k
     sal_Int16 tableSize = 0;
665
186k
     const sal_Unicode *table = nullptr;     // initialize to avoid compiler warning
666
186k
     bool bRecycleSymbol = false;
667
186k
     OUString sNatNumParams;
668
186k
     Locale locale;
669
670
186k
     OUString  prefix;
671
186k
     sal_Int16        numType = -1; // type of formatting from style::NumberingType (roman, arabic, etc)
672
186k
     OUString  suffix;
673
186k
     sal_Int32        number = -1; // the number that needs to be formatted.
674
675
//     int nProperties = aProperties.getLength();
676
//     int last        = nProperties-1;
677
678
186k
     for (auto const & prop : aProperties)
679
373k
     {
680
373k
         if (prop.Name == "Prefix")
681
0
             prop.Value >>= prefix;
682
373k
         else if (prop.Name == "Suffix")
683
0
             prop.Value >>= suffix;
684
373k
         else if (prop.Name == "NumberingType")
685
186k
             prop.Value >>= numType;
686
186k
         else if (prop.Name == "Value")
687
186k
             prop.Value >>= number;
688
373k
     }
689
690
186k
     if( number <= 0 )
691
215
          throw IllegalArgumentException();
692
693
     // start empty
694
186k
     OUString result;
695
696
     // append prefix
697
186k
     if( !should_ignore(prefix) ) result += prefix;
698
699
     // append formatted number
700
186k
     using namespace style::NumberingType;
701
186k
     switch( numType )
702
186k
     {
703
1.14k
          case CHARS_UPPER_LETTER:
704
1.14k
               lcl_formatChars( upperLetter, 26, number-1, result ); // 1=>A, 2=>B, ..., 26=>Z, 27=>AA, 28=>AB, ...
705
1.14k
               break;
706
1.38k
          case CHARS_LOWER_LETTER:
707
1.38k
               lcl_formatChars( lowerLetter, 26, number-1, result );
708
1.38k
               break;
709
0
          case TEXT_NUMBER: // ordinal indicators (1st, 2nd, 3rd, ...)
710
0
               natNum = NativeNumberMode::NATNUM12;
711
0
               sNatNumParams = "capitalize ordinal-number";
712
0
               locale = aLocale;
713
0
               break;
714
0
          case TEXT_CARDINAL: // cardinal number names (One, Two, Three, ...)
715
0
               natNum = NativeNumberMode::NATNUM12;
716
0
               sNatNumParams = "capitalize";
717
0
               locale = aLocale;
718
0
               break;
719
0
          case TEXT_ORDINAL: // ordinal number names (First, Second, Third, ...)
720
0
               natNum = NativeNumberMode::NATNUM12;
721
0
               sNatNumParams = "capitalize ordinal";
722
0
               locale = aLocale;
723
0
               break;
724
952
          case ROMAN_UPPER:
725
952
               result += toRoman( number );
726
952
               break;
727
1.33k
          case ROMAN_LOWER:
728
1.33k
               result += toRoman( number ).toAsciiLowerCase();
729
1.33k
               break;
730
4.15k
          case ARABIC:
731
4.15k
               result += OUString::number( number );
732
4.15k
               break;
733
0
          case NUMBER_NONE:
734
0
               return OUString(); // ignore prefix and suffix
735
0
          case CHAR_SPECIAL:
736
               // apparently, we're supposed to return an empty string in this case...
737
0
               return OUString(); // ignore prefix and suffix
738
0
          case PAGE_DESCRIPTOR:
739
0
          case BITMAP:
740
0
               OSL_ASSERT(false);
741
0
               throw IllegalArgumentException();
742
0
          case CHARS_UPPER_LETTER_N:
743
0
               lcl_formatChars1( upperLetter, 26, number-1, result ); // 1=>A, 2=>B, ..., 26=>Z, 27=>AA, 28=>BB, ...
744
0
               break;
745
0
          case CHARS_LOWER_LETTER_N:
746
0
               lcl_formatChars1( lowerLetter, 26,  number-1, result ); // 1=>A, 2=>B, ..., 26=>Z, 27=>AA, 28=>BB, ...
747
0
               break;
748
0
          case TRANSLITERATION:
749
0
               try {
750
0
                    const OUString tmp = OUString::number( number );
751
0
                    OUString transliteration;
752
0
                    getPropertyByName(aProperties, "Transliteration") >>= transliteration;
753
0
                    if ( !translit )
754
0
                        translit = new TransliterationImpl(m_xContext);
755
0
                    translit->loadModuleByImplName(transliteration, aLocale);
756
0
                    result += translit->transliterateString2String(tmp, 0, tmp.getLength());
757
0
               } catch (Exception& ) {
758
                    // When transliteration property is missing, return default number (bug #101141#)
759
0
                    result += OUString::number( number );
760
                    // OSL_ASSERT(0);
761
                    // throw IllegalArgumentException();
762
0
               }
763
0
               break;
764
0
          case NATIVE_NUMBERING:
765
0
                natNum = NativeNumberMode::NATNUM1;
766
0
                locale = aLocale;
767
0
                break;
768
5.66k
          case FULLWIDTH_ARABIC:
769
5.66k
                natNum = NativeNumberMode::NATNUM3;
770
5.66k
                locale = aLocale;
771
5.66k
                break;
772
0
          case NUMBER_LOWER_ZH:
773
0
                natNum = NativeNumberMode::NATNUM12;
774
0
                locale.Language = "zh";
775
0
                break;
776
5.66k
          case NUMBER_UPPER_ZH:
777
5.66k
                natNum = NativeNumberMode::NATNUM5;
778
5.66k
                locale.Language = "zh";
779
5.66k
                break;
780
5.66k
          case NUMBER_UPPER_ZH_TW:
781
5.66k
                natNum = NativeNumberMode::NATNUM5;
782
5.66k
                locale.Language = "zh";
783
5.66k
                locale.Country = "TW";
784
5.66k
                break;
785
5.66k
          case NUMBER_TRADITIONAL_JA:
786
5.66k
                natNum = NativeNumberMode::NATNUM8;
787
5.66k
                locale.Language = "ja";
788
5.66k
                break;
789
5.66k
          case NUMBER_UPPER_KO:
790
5.66k
                natNum = NativeNumberMode::NATNUM8;
791
5.66k
                locale.Language = "ko";
792
5.66k
                break;
793
5.66k
          case NUMBER_HANGUL_KO:
794
5.66k
                natNum = NativeNumberMode::NATNUM11;
795
5.66k
                locale.Language = "ko";
796
5.66k
                break;
797
5.66k
          case NUMBER_DIGITAL_KO:
798
5.66k
              natNum = NativeNumberMode::NATNUM9;
799
5.66k
              locale.Language = "ko";
800
5.66k
              break;
801
5.66k
          case NUMBER_DIGITAL2_KO:
802
5.66k
              natNum = NativeNumberMode::NATNUM1;
803
5.66k
              locale.Language = "ko";
804
5.66k
              break;
805
5.66k
          case NUMBER_LEGAL_KO:
806
5.66k
              if (number < 1 || number >= 100)
807
0
              {
808
0
                  natNum = NativeNumberMode::NATNUM11;
809
0
                  locale.Language = "ko";
810
0
              }
811
5.66k
              else
812
5.66k
              {
813
5.66k
                  lcl_formatKoreanLegalWord(number, result);
814
5.66k
              }
815
5.66k
              break;
816
817
5.66k
          case CIRCLE_NUMBER:
818
5.66k
              table = table_CircledNumber;
819
5.66k
              tableSize = std::size(table_CircledNumber);
820
5.66k
              break;
821
5.66k
          case TIAN_GAN_ZH:
822
5.66k
              table = table_TianGan_zh;
823
5.66k
              tableSize = std::size(table_TianGan_zh);
824
5.66k
              break;
825
5.66k
          case DI_ZI_ZH:
826
5.66k
              table = table_DiZi_zh;
827
5.66k
              tableSize = std::size(table_DiZi_zh);
828
5.66k
              break;
829
5.66k
          case AIU_FULLWIDTH_JA:
830
5.66k
              table = table_AIUFullWidth_ja_JP;
831
5.66k
              tableSize = std::size(table_AIUFullWidth_ja_JP);
832
5.66k
              bRecycleSymbol = true;
833
5.66k
              break;
834
5.66k
          case AIU_HALFWIDTH_JA:
835
5.66k
              table = table_AIUHalfWidth_ja_JP;
836
5.66k
              tableSize = std::size(table_AIUHalfWidth_ja_JP);
837
5.66k
              bRecycleSymbol = true;
838
5.66k
              break;
839
5.66k
          case IROHA_FULLWIDTH_JA:
840
5.66k
              table = table_IROHAFullWidth_ja_JP;
841
5.66k
              tableSize = std::size(table_IROHAFullWidth_ja_JP);
842
5.66k
              bRecycleSymbol = true;
843
5.66k
              break;
844
5.66k
          case IROHA_HALFWIDTH_JA:
845
5.66k
              table = table_IROHAHalfWidth_ja_JP;
846
5.66k
              tableSize = std::size(table_IROHAHalfWidth_ja_JP);
847
5.66k
              bRecycleSymbol = true;
848
5.66k
              break;
849
5.66k
          case HANGUL_JAMO_KO:
850
5.66k
              table = table_HangulJamo_ko;
851
5.66k
              tableSize = std::size(table_HangulJamo_ko);
852
5.66k
              bRecycleSymbol = true;
853
5.66k
              break;
854
5.66k
          case HANGUL_SYLLABLE_KO:
855
5.66k
              table = table_HangulSyllable_ko;
856
5.66k
              tableSize = std::size(table_HangulSyllable_ko);
857
5.66k
              bRecycleSymbol = true;
858
5.66k
              break;
859
5.66k
          case HANGUL_CIRCLED_JAMO_KO:
860
5.66k
              table = table_HangulCircledJamo_ko;
861
5.66k
              tableSize = std::size(table_HangulCircledJamo_ko);
862
5.66k
              bRecycleSymbol = true;
863
5.66k
              break;
864
5.66k
          case HANGUL_CIRCLED_SYLLABLE_KO:
865
5.66k
              table = table_HangulCircledSyllable_ko;
866
5.66k
              tableSize = std::size(table_HangulCircledSyllable_ko);
867
5.66k
              bRecycleSymbol = true;
868
5.66k
              break;
869
5.66k
          case CHARS_ARABIC:
870
5.66k
              lcl_formatChars(table_Alphabet_ar, std::size(table_Alphabet_ar), number - 1, result);
871
5.66k
              break;
872
5.66k
          case CHARS_ARABIC_ABJAD:
873
5.66k
              lcl_formatChars(table_Alphabet_ar_abjad, std::size(table_Alphabet_ar_abjad), number - 1, result);
874
5.66k
              break;
875
0
          case NUMBER_ARABIC_INDIC:
876
0
              natNum = NativeNumberMode::NATNUM1;
877
0
              locale.Language = "ar";
878
0
              break;
879
0
          case NUMBER_EAST_ARABIC_INDIC:
880
0
              natNum = NativeNumberMode::NATNUM1;
881
0
              locale.Language = "fa";
882
0
              break;
883
0
          case NUMBER_INDIC_DEVANAGARI:
884
0
              natNum = NativeNumberMode::NATNUM1;
885
0
              locale.Language = "hi";
886
0
              break;
887
5.66k
          case CHARS_THAI:
888
5.66k
              lcl_formatChars(table_Alphabet_th, std::size(table_Alphabet_th), number - 1, result);
889
5.66k
              break;
890
5.66k
          case CHARS_HEBREW:
891
5.66k
              lcl_formatChars(table_Alphabet_he, std::size(table_Alphabet_he), number - 1, result);
892
5.66k
              break;
893
0
          case NUMBER_HEBREW:
894
0
              natNum = NativeNumberMode::NATNUM1;
895
0
              locale.Language = "he";
896
0
              break;
897
5.66k
          case CHARS_NEPALI:
898
5.66k
              lcl_formatChars(table_Alphabet_ne, std::size(table_Alphabet_ne), number - 1, result);
899
5.66k
              break;
900
5.66k
          case CHARS_KHMER:
901
5.66k
              lcl_formatChars(table_Alphabet_km, std::size(table_Alphabet_km), number - 1, result);
902
5.66k
              break;
903
5.66k
          case CHARS_LAO:
904
5.66k
              lcl_formatChars(table_Alphabet_lo, std::size(table_Alphabet_lo), number - 1, result);
905
5.66k
              break;
906
5.66k
          case CHARS_MYANMAR:
907
5.66k
              lcl_formatChars(table_Alphabet_my, std::size(table_Alphabet_my), number - 1, result);
908
5.66k
              break;
909
5.66k
         case CHARS_TIBETAN:
910
5.66k
              lcl_formatChars(table_Alphabet_dz, std::size(table_Alphabet_dz), number - 1, result);
911
5.66k
              break;
912
0
         case CHARS_CYRILLIC_UPPER_LETTER_BG:
913
0
              lcl_formatChars2( table_CyrillicUpperLetter_bg,
914
0
                      table_CyrillicLowerLetter_bg,
915
0
                      std::size(table_CyrillicLowerLetter_bg), number-1,
916
0
                      result); // 1=>a, 2=>b, ..., 28=>z, 29=>Aa, 30=>Ab, ...
917
0
              break;
918
0
         case CHARS_CYRILLIC_LOWER_LETTER_BG:
919
0
              lcl_formatChars( table_CyrillicLowerLetter_bg,
920
0
                      std::size(table_CyrillicLowerLetter_bg), number-1,
921
0
                      result); // 1=>a, 2=>b, ..., 28=>z, 29=>aa, 30=>ab, ...
922
0
              break;
923
0
         case CHARS_CYRILLIC_UPPER_LETTER_N_BG:
924
0
              lcl_formatChars3( table_CyrillicUpperLetter_bg,
925
0
                      table_CyrillicLowerLetter_bg,
926
0
                      std::size(table_CyrillicLowerLetter_bg), number-1,
927
0
                      result); // 1=>a, 2=>b, ..., 28=>z, 29=>Aa, 30=>Bb, ...
928
0
              break;
929
0
         case CHARS_CYRILLIC_LOWER_LETTER_N_BG:
930
0
              lcl_formatChars1( table_CyrillicLowerLetter_bg,
931
0
                      std::size(table_CyrillicLowerLetter_bg), number-1,
932
0
                      result); // 1=>a, 2=>b, ..., 28=>z, 29=>aa, 30=>bb, ...
933
0
              break;
934
0
         case CHARS_CYRILLIC_UPPER_LETTER_RU:
935
0
              lcl_formatChars2( table_CyrillicUpperLetter_ru,
936
0
                      table_CyrillicLowerLetter_ru,
937
0
                      std::size(table_CyrillicLowerLetter_ru), number-1,
938
0
                      result); // 1=>a, 2=>b, ..., 27=>z, 28=>Aa, 29=>Ab, ...
939
0
              break;
940
0
         case CHARS_CYRILLIC_LOWER_LETTER_RU:
941
0
              lcl_formatChars( table_CyrillicLowerLetter_ru,
942
0
                      std::size(table_CyrillicLowerLetter_ru), number-1,
943
0
                      result); // 1=>a, 2=>b, ..., 27=>z, 28=>aa, 29=>ab, ...
944
0
              break;
945
0
         case CHARS_CYRILLIC_UPPER_LETTER_N_RU:
946
0
              lcl_formatChars3( table_CyrillicUpperLetter_ru,
947
0
                      table_CyrillicLowerLetter_ru,
948
0
                      std::size(table_CyrillicLowerLetter_ru), number-1,
949
0
                      result); // 1=>a, 2=>b, ..., 27=>z, 28=>Aa, 29=>Bb, ...
950
0
              break;
951
0
         case CHARS_CYRILLIC_LOWER_LETTER_N_RU:
952
0
              lcl_formatChars1( table_CyrillicLowerLetter_ru,
953
0
                      std::size(table_CyrillicLowerLetter_ru), number-1,
954
0
                      result); // 1=>a, 2=>b, ..., 27=>z, 28=>aa, 29=>bb, ...
955
0
              break;
956
0
         case CHARS_CYRILLIC_UPPER_LETTER_SR:
957
0
              lcl_formatChars2( table_CyrillicUpperLetter_sr,
958
0
                      table_CyrillicLowerLetter_sr,
959
0
                      std::size(table_CyrillicLowerLetter_sr), number-1,
960
0
                      result); // 1=>a, 2=>b, ..., 27=>z, 28=>Aa, 29=>Ab, ...
961
0
              break;
962
0
         case CHARS_CYRILLIC_LOWER_LETTER_SR:
963
0
              lcl_formatChars( table_CyrillicLowerLetter_sr,
964
0
                      std::size(table_CyrillicLowerLetter_sr), number-1,
965
0
                      result); // 1=>a, 2=>b, ..., 27=>z, 28=>aa, 29=>ab, ...
966
0
              break;
967
0
         case CHARS_CYRILLIC_UPPER_LETTER_N_SR:
968
0
              lcl_formatChars3( table_CyrillicUpperLetter_sr,
969
0
                      table_CyrillicLowerLetter_sr,
970
0
                      std::size(table_CyrillicLowerLetter_sr), number-1,
971
0
                      result); // 1=>a, 2=>b, ..., 27=>z, 28=>Aa, 29=>Bb, ...
972
0
              break;
973
0
         case CHARS_CYRILLIC_LOWER_LETTER_N_SR:
974
0
              lcl_formatChars1( table_CyrillicLowerLetter_sr,
975
0
                      std::size(table_CyrillicLowerLetter_sr), number-1,
976
0
                      result); // 1=>a, 2=>b, ..., 27=>z, 28=>aa, 29=>bb, ...
977
0
              break;
978
979
0
         case CHARS_CYRILLIC_UPPER_LETTER_UK:
980
0
              lcl_formatChars2( table_CyrillicUpperLetter_uk,
981
0
                      table_CyrillicLowerLetter_uk,
982
0
                      std::size(table_CyrillicLowerLetter_uk), number-1,
983
0
                      result);
984
0
              break;
985
0
         case CHARS_CYRILLIC_LOWER_LETTER_UK:
986
0
              lcl_formatChars( table_CyrillicLowerLetter_uk,
987
0
                      std::size(table_CyrillicLowerLetter_uk), number-1,
988
0
                      result);
989
0
              break;
990
0
         case CHARS_CYRILLIC_UPPER_LETTER_N_UK:
991
0
              lcl_formatChars3( table_CyrillicUpperLetter_uk,
992
0
                      table_CyrillicLowerLetter_uk,
993
0
                      std::size(table_CyrillicLowerLetter_uk), number-1,
994
0
                      result);
995
0
              break;
996
0
         case CHARS_CYRILLIC_LOWER_LETTER_N_UK:
997
0
              lcl_formatChars1( table_CyrillicLowerLetter_uk,
998
0
                      std::size(table_CyrillicLowerLetter_uk), number-1,
999
0
                      result);
1000
0
              break;
1001
1002
0
          case CHARS_GREEK_LOWER_LETTER:
1003
0
              lcl_formatCharsGR( table_GreekLowerLetter, number, result);
1004
0
              break;
1005
1006
0
          case CHARS_GREEK_UPPER_LETTER:
1007
0
              lcl_formatCharsGR( table_GreekUpperLetter, number, result);
1008
0
              break;
1009
1010
5.66k
          case CHARS_PERSIAN:
1011
5.66k
              lcl_formatChars(table_Alphabet_fa, std::size(table_Alphabet_fa), number - 1, result);
1012
5.66k
              break;
1013
1014
5.66k
          case CHARS_PERSIAN_WORD:
1015
5.66k
              lcl_formatPersianWord(number, result);
1016
5.66k
              break;
1017
1018
0
          case SYMBOL_CHICAGO:
1019
0
             lcl_formatChars1( table_Chicago, 4, number-1, result );  // *, +, |, S, **, ++, ...
1020
0
             break;
1021
1022
0
          case ARABIC_ZERO:
1023
0
               result += lcl_formatArabicZero(number, 2);
1024
0
               break;
1025
1026
0
          case ARABIC_ZERO3:
1027
0
               result += lcl_formatArabicZero(number, 3);
1028
0
               break;
1029
1030
0
          case ARABIC_ZERO4:
1031
0
               result += lcl_formatArabicZero(number, 4);
1032
0
               break;
1033
1034
0
          case ARABIC_ZERO5:
1035
0
               result += lcl_formatArabicZero(number, 5);
1036
0
               break;
1037
1038
1.88k
          case SZEKELY_ROVAS: // Old Hungarian
1039
1.88k
               natNum = NativeNumberMode::NATNUM12;
1040
1.88k
               locale.Language = "hu-Hung";
1041
1.88k
               break;
1042
1043
0
          default:
1044
0
               OSL_ASSERT(false);
1045
0
               throw IllegalArgumentException();
1046
186k
     }
1047
1048
186k
     if (natNum) {
1049
47.2k
            if (!mxNatNum)
1050
195
                mxNatNum.set(new NativeNumberSupplierService);
1051
47.2k
            result += mxNatNum->getNativeNumberStringParams(OUString::number(number), locale,
1052
47.2k
                                                                 natNum, sNatNumParams);
1053
139k
     } else if (tableSize) {
1054
62.3k
            if ( number > tableSize && !bRecycleSymbol)
1055
0
                result += OUString::number( number);
1056
62.3k
            else
1057
62.3k
                result += OUStringChar(table[--number % tableSize]);
1058
62.3k
     }
1059
1060
     // append suffix
1061
186k
     if( !should_ignore(suffix) ) result += suffix;
1062
1063
186k
     return result;
1064
186k
}
1065
1066
0
#define LANG_ALL        (1 << 0)
1067
0
#define LANG_CJK        (1 << 1)
1068
0
#define LANG_CTL        (1 << 2)
1069
1070
struct Supported_NumberingType
1071
{
1072
    const char*  cSymbol;
1073
    sal_Int16    nType;
1074
    sal_Int16    langOption;
1075
    Supported_NumberingType(sal_Int16 nType_, const char* pSymbol, sal_Int16 opt)
1076
2.70k
        : cSymbol(pSymbol), nType(nType_), langOption(opt) {}
1077
};
1078
const Supported_NumberingType aSupportedTypes[] =
1079
{
1080
        {style::NumberingType::CHARS_UPPER_LETTER,      "A", LANG_ALL},
1081
        {style::NumberingType::CHARS_LOWER_LETTER,      "a", LANG_ALL},
1082
        {style::NumberingType::ROMAN_UPPER,                     "I", LANG_ALL},
1083
        {style::NumberingType::ROMAN_LOWER,                     "i", LANG_ALL},
1084
        {style::NumberingType::ARABIC,                          "1", LANG_ALL},
1085
        {style::NumberingType::NUMBER_NONE,                     "''", LANG_ALL},
1086
        {style::NumberingType::CHAR_SPECIAL,                    "Bullet", LANG_ALL},
1087
        {style::NumberingType::PAGE_DESCRIPTOR,                 "Page", LANG_ALL},
1088
        {style::NumberingType::BITMAP,                          "Bitmap", LANG_ALL},
1089
        {style::NumberingType::SYMBOL_CHICAGO,          "*, " S_DAGGER ", " S_DBL_DAGGER ", " S_SECTION ", **, " S_DAGGER S_DAGGER ", ...", LANG_ALL},
1090
        {style::NumberingType::TEXT_NUMBER,             "1st", LANG_ALL},
1091
        {style::NumberingType::TEXT_CARDINAL,           "One", LANG_ALL},
1092
        {style::NumberingType::TEXT_ORDINAL,            "First", LANG_ALL},
1093
        {style::NumberingType::CHARS_UPPER_LETTER_N,    "AAA", LANG_ALL},
1094
        {style::NumberingType::CHARS_LOWER_LETTER_N,    "aaa", LANG_ALL},
1095
        {style::NumberingType::NATIVE_NUMBERING,        "Native Numbering", LANG_CJK|LANG_CTL},
1096
        {style::NumberingType::FULLWIDTH_ARABIC,        nullptr, LANG_CJK},
1097
        {style::NumberingType::CIRCLE_NUMBER,           nullptr, LANG_CJK},
1098
        // The cSymbol is defined here for compatibility with files created by old releases.
1099
        // Otherwise if nullptr, these 3 digits may change as NATNUM12 depends on 3rd-party lib.
1100
        {style::NumberingType::NUMBER_LOWER_ZH,         "一, 二, 三, ...", LANG_CJK},
1101
        {style::NumberingType::NUMBER_UPPER_ZH,         nullptr, LANG_CJK},
1102
        {style::NumberingType::NUMBER_UPPER_ZH_TW,      nullptr, LANG_CJK},
1103
        {style::NumberingType::TIAN_GAN_ZH,             nullptr, LANG_CJK},
1104
        {style::NumberingType::DI_ZI_ZH,                nullptr, LANG_CJK},
1105
        {style::NumberingType::NUMBER_TRADITIONAL_JA,   nullptr, LANG_CJK},
1106
        {style::NumberingType::AIU_FULLWIDTH_JA,        nullptr, LANG_CJK},
1107
        {style::NumberingType::AIU_HALFWIDTH_JA,        nullptr, LANG_CJK},
1108
        {style::NumberingType::IROHA_FULLWIDTH_JA,      nullptr, LANG_CJK},
1109
        {style::NumberingType::IROHA_HALFWIDTH_JA,      nullptr, LANG_CJK},
1110
        {style::NumberingType::NUMBER_UPPER_KO,         nullptr, LANG_CJK},
1111
        {style::NumberingType::NUMBER_HANGUL_KO,        nullptr, LANG_CJK},
1112
        {style::NumberingType::HANGUL_JAMO_KO,          nullptr, LANG_CJK},
1113
        {style::NumberingType::HANGUL_SYLLABLE_KO,      nullptr, LANG_CJK},
1114
        {style::NumberingType::HANGUL_CIRCLED_JAMO_KO,  nullptr, LANG_CJK},
1115
        {style::NumberingType::HANGUL_CIRCLED_SYLLABLE_KO,      nullptr, LANG_CJK},
1116
        {style::NumberingType::NUMBER_LEGAL_KO,         nullptr, LANG_CJK},
1117
        {style::NumberingType::NUMBER_DIGITAL_KO,       nullptr, LANG_CJK},
1118
        {style::NumberingType::NUMBER_DIGITAL2_KO,      nullptr, LANG_CJK},
1119
        {style::NumberingType::CHARS_ARABIC,    nullptr, LANG_CTL},
1120
        {style::NumberingType::CHARS_ARABIC_ABJAD,   nullptr, LANG_CTL},
1121
        {style::NumberingType::NUMBER_ARABIC_INDIC,    S_AR_ONE ", " S_AR_TWO ", " S_AR_THREE ", ...", LANG_CTL},
1122
        {style::NumberingType::NUMBER_EAST_ARABIC_INDIC,    S_FA_ONE ", " S_FA_TWO ", " S_FA_THREE ", ...", LANG_CTL},
1123
        {style::NumberingType::NUMBER_INDIC_DEVANAGARI,    S_HI_ONE ", " S_HI_TWO ", " S_HI_THREE ", ...", LANG_CTL},
1124
        {style::NumberingType::CHARS_THAI,      nullptr, LANG_CTL},
1125
        {style::NumberingType::CHARS_HEBREW,    nullptr, LANG_CTL},
1126
        {style::NumberingType::NUMBER_HEBREW,    S_HE_ALEPH ", " S_HE_YOD ", " S_HE_QOF ", ...", LANG_CTL},
1127
        {style::NumberingType::CHARS_NEPALI,    nullptr, LANG_CTL},
1128
        {style::NumberingType::CHARS_KHMER,     nullptr, LANG_CTL},
1129
        {style::NumberingType::CHARS_LAO,       nullptr, LANG_CTL},
1130
        {style::NumberingType::CHARS_MYANMAR,   nullptr, LANG_CTL},
1131
        {style::NumberingType::CHARS_TIBETAN,   nullptr, LANG_CTL},
1132
        {style::NumberingType::CHARS_CYRILLIC_UPPER_LETTER_BG,   C_CYR_A ", " C_CYR_B ", .., " C_CYR_A S_CYR_A ", " C_CYR_A S_CYR_B ", ... (bg)", LANG_ALL},
1133
        {style::NumberingType::CHARS_CYRILLIC_LOWER_LETTER_BG,   S_CYR_A ", " S_CYR_B ", .., " S_CYR_A S_CYR_A ", " S_CYR_A S_CYR_B ", ... (bg)", LANG_ALL},
1134
        {style::NumberingType::CHARS_CYRILLIC_UPPER_LETTER_N_BG, C_CYR_A ", " C_CYR_B ", .., " C_CYR_A S_CYR_A ", " C_CYR_B S_CYR_B ", ... (bg)", LANG_ALL},
1135
        {style::NumberingType::CHARS_CYRILLIC_LOWER_LETTER_N_BG, S_CYR_A ", " S_CYR_B ", .., " S_CYR_A S_CYR_A ", " S_CYR_B S_CYR_B ", ... (bg)", LANG_ALL},
1136
        {style::NumberingType::CHARS_CYRILLIC_UPPER_LETTER_RU,   C_CYR_A ", " C_CYR_B ", .., " C_CYR_A S_CYR_A ", " C_CYR_A S_CYR_B ", ... (ru)", LANG_ALL},
1137
        {style::NumberingType::CHARS_CYRILLIC_LOWER_LETTER_RU,   S_CYR_A ", " S_CYR_B ", .., " S_CYR_A S_CYR_A ", " S_CYR_A S_CYR_B ", ... (ru)", LANG_ALL},
1138
        {style::NumberingType::CHARS_CYRILLIC_UPPER_LETTER_N_RU, C_CYR_A ", " C_CYR_B ", .., " C_CYR_A S_CYR_A ", " C_CYR_B S_CYR_B ", ... (ru)", LANG_ALL},
1139
        {style::NumberingType::CHARS_CYRILLIC_LOWER_LETTER_N_RU, S_CYR_A ", " S_CYR_B ", .., " S_CYR_A S_CYR_A ", " S_CYR_B S_CYR_B ", ... (ru)", LANG_ALL},
1140
        {style::NumberingType::CHARS_CYRILLIC_UPPER_LETTER_SR,   C_CYR_A ", " C_CYR_B ", .., " C_CYR_A S_CYR_A ", " C_CYR_A S_CYR_B ", ... (sr)", LANG_ALL},
1141
        {style::NumberingType::CHARS_CYRILLIC_LOWER_LETTER_SR,   S_CYR_A ", " S_CYR_B ", .., " S_CYR_A S_CYR_A ", " S_CYR_A S_CYR_B ", ... (sr)", LANG_ALL},
1142
        {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},
1143
        {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},
1144
        {style::NumberingType::CHARS_CYRILLIC_UPPER_LETTER_UK,   C_CYR_A ", " C_CYR_B ", .., " C_CYR_A S_CYR_A ", " C_CYR_A S_CYR_B ", ... (uk)", LANG_ALL},
1145
        {style::NumberingType::CHARS_CYRILLIC_LOWER_LETTER_UK,   S_CYR_A ", " S_CYR_B ", .., " S_CYR_A S_CYR_A ", " S_CYR_A S_CYR_B ", ... (uk)", LANG_ALL},
1146
        {style::NumberingType::CHARS_CYRILLIC_UPPER_LETTER_N_UK, C_CYR_A ", " C_CYR_B ", .., " C_CYR_A S_CYR_A ", " C_CYR_B S_CYR_B ", ... (uk)", LANG_ALL},
1147
        {style::NumberingType::CHARS_CYRILLIC_LOWER_LETTER_N_UK, S_CYR_A ", " S_CYR_B ", .., " S_CYR_A S_CYR_A ", " S_CYR_B S_CYR_B ", ... (uk)", LANG_ALL},
1148
        {style::NumberingType::CHARS_PERSIAN,        nullptr, LANG_CTL},
1149
        {style::NumberingType::CHARS_PERSIAN_WORD,   nullptr, LANG_CTL},
1150
        {style::NumberingType::SZEKELY_ROVAS,        nullptr, LANG_CTL},
1151
        {style::NumberingType::CHARS_GREEK_UPPER_LETTER,   C_GR_A ", " C_GR_B ", ... (gr)", LANG_ALL},
1152
        {style::NumberingType::CHARS_GREEK_LOWER_LETTER,   S_GR_A ", " S_GR_B ", ... (gr)", LANG_ALL},
1153
        {style::NumberingType::ARABIC_ZERO, "01, 02, 03, ...", LANG_ALL},
1154
        {style::NumberingType::ARABIC_ZERO3, "001, 002, 003, ...", LANG_ALL},
1155
        {style::NumberingType::ARABIC_ZERO4, "0001, 0002, 0003, ...", LANG_ALL},
1156
        {style::NumberingType::ARABIC_ZERO5, "00001, 00002, 00003, ...", LANG_ALL},
1157
};
1158
const sal_Int32 nSupported_NumberingTypes = std::size(aSupportedTypes);
1159
1160
OUString DefaultNumberingProvider::makeNumberingIdentifier(sal_Int16 index)
1161
130k
{
1162
130k
    if (index < 0 || index >= nSupported_NumberingTypes)
1163
0
        throw RuntimeException();
1164
1165
130k
    if (aSupportedTypes[index].cSymbol)
1166
69.8k
        return OUString(aSupportedTypes[index].cSymbol, strlen(aSupportedTypes[index].cSymbol), RTL_TEXTENCODING_UTF8);
1167
60.4k
    else {
1168
60.4k
        OUStringBuffer result;
1169
60.4k
        Locale aLocale(u"en"_ustr, OUString(), OUString());
1170
60.4k
        Sequence<beans::PropertyValue> aProperties(2);
1171
60.4k
        auto aPropertiesRange = asNonConstRange(aProperties);
1172
60.4k
        aPropertiesRange[0].Name = "NumberingType";
1173
60.4k
        aPropertiesRange[0].Value <<= aSupportedTypes[index].nType;
1174
60.4k
        aPropertiesRange[1].Name = "Value";
1175
237k
        for (sal_Int32 j = 1; j <= 3; j++) {
1176
177k
            aPropertiesRange[1].Value <<= j;
1177
177k
            result.append( makeNumberingString( aProperties, aLocale ) + ", " );
1178
177k
        }
1179
60.4k
        result.append("...");
1180
        // Make known duplicate generated identifiers unique.
1181
        // Note this alone works only for newly added numberings, if duplicates
1182
        // are in the wild further handling is needed when loading documents
1183
        // and asking for numberings.
1184
60.4k
        switch (aSupportedTypes[index].nType)
1185
60.4k
        {
1186
1.88k
            case css::style::NumberingType::NUMBER_DIGITAL_KO:
1187
                // Duplicate of NUMBER_HANGUL_KO.
1188
1.88k
                result.append(" (ko-x-digital)");
1189
1.88k
            break;
1190
1.88k
            case css::style::NumberingType::NUMBER_DIGITAL2_KO:
1191
                // Duplicate of NUMBER_LOWER_ZH.
1192
1.88k
                result.append(" (ko)");
1193
1.88k
            break;
1194
54.7k
            default:
1195
54.7k
                ; // nothing
1196
60.4k
        }
1197
58.5k
        return result.makeStringAndClear();
1198
60.4k
    }
1199
130k
}
1200
1201
bool
1202
DefaultNumberingProvider::isScriptFlagEnabled(const OUString& aName)
1203
0
{
1204
0
    if (! xHierarchicalNameAccess.is())
1205
0
        xHierarchicalNameAccess = officecfg::Office::Common::I18N::get();
1206
1207
0
    Any aEnabled = xHierarchicalNameAccess->getByHierarchicalName(aName);
1208
1209
0
    bool enabled = false;
1210
1211
0
    aEnabled >>= enabled;
1212
1213
0
    return enabled;
1214
0
}
1215
1216
Sequence< sal_Int16 > DefaultNumberingProvider::getSupportedNumberingTypes(  )
1217
0
{
1218
0
    Sequence< sal_Int16 > aRet(nSupported_NumberingTypes );
1219
0
    sal_Int16* pArray = aRet.getArray();
1220
1221
0
    bool cjkEnabled = isScriptFlagEnabled(u"CJK/CJKFont"_ustr);
1222
0
    bool ctlEnabled = isScriptFlagEnabled(u"CTL/CTLFont"_ustr);
1223
1224
0
    for(sal_Int16 i = 0; i < nSupported_NumberingTypes; i++) {
1225
0
        if ( (aSupportedTypes[i].langOption & LANG_ALL) ||
1226
0
                ((aSupportedTypes[i].langOption & LANG_CJK) && cjkEnabled) ||
1227
0
                ((aSupportedTypes[i].langOption & LANG_CTL) && ctlEnabled) )
1228
0
            pArray[i] = aSupportedTypes[i].nType;
1229
0
    }
1230
0
    return aRet;
1231
0
}
1232
1233
sal_Int16 DefaultNumberingProvider::getNumberingType( const OUString& rNumberingIdentifier )
1234
0
{
1235
0
    auto it = maSupportedTypesCache.find(rNumberingIdentifier);
1236
0
    if (it != maSupportedTypesCache.end())
1237
0
        return it->second->nType;
1238
0
    for(sal_Int16 i = 0; i < nSupported_NumberingTypes; i++)
1239
0
        if(rNumberingIdentifier == makeNumberingIdentifier(i))
1240
0
        {
1241
0
            maSupportedTypesCache.emplace(rNumberingIdentifier, &aSupportedTypes[i]);
1242
0
            return aSupportedTypes[i].nType;
1243
0
        }
1244
0
    throw RuntimeException();
1245
0
}
1246
1247
sal_Bool DefaultNumberingProvider::hasNumberingType( const OUString& rNumberingIdentifier )
1248
1.88k
{
1249
1.88k
    auto it = maSupportedTypesCache.find(rNumberingIdentifier);
1250
1.88k
    if (it != maSupportedTypesCache.end())
1251
0
        return true;
1252
132k
    for(sal_Int16 i = 0; i < nSupported_NumberingTypes; i++)
1253
130k
        if(rNumberingIdentifier == makeNumberingIdentifier(i))
1254
0
        {
1255
0
            maSupportedTypesCache.emplace(rNumberingIdentifier, &aSupportedTypes[i]);
1256
0
            return true;
1257
0
        }
1258
1.88k
    return false;
1259
1.88k
}
1260
1261
OUString DefaultNumberingProvider::getNumberingIdentifier( sal_Int16 nNumberingType )
1262
0
{
1263
0
    for(sal_Int16 i = 0; i < nSupported_NumberingTypes; i++)
1264
0
        if(nNumberingType == aSupportedTypes[i].nType)
1265
0
            return makeNumberingIdentifier(i);
1266
0
    return OUString();
1267
0
}
1268
1269
OUString DefaultNumberingProvider::getImplementationName()
1270
0
{
1271
0
    return u"com.sun.star.text.DefaultNumberingProvider"_ustr;
1272
0
}
1273
1274
sal_Bool DefaultNumberingProvider::supportsService(const OUString& rServiceName)
1275
0
{
1276
0
    return cppu::supportsService(this, rServiceName);
1277
0
}
1278
1279
Sequence< OUString > DefaultNumberingProvider::getSupportedServiceNames()
1280
0
{
1281
0
    Sequence< OUString > aRet { u"com.sun.star.text.DefaultNumberingProvider"_ustr };
1282
0
    return aRet;
1283
0
}
1284
1285
}
1286
1287
extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
1288
com_sun_star_text_DefaultNumberingProvider_get_implementation(
1289
    css::uno::XComponentContext *context,
1290
    css::uno::Sequence<css::uno::Any> const &)
1291
203
{
1292
203
    return cppu::acquire(new i18npool::DefaultNumberingProvider(context));
1293
203
}
1294
1295
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */