icu 0.9.1 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.travis.yml +11 -0
- data/Gemfile +3 -0
- data/LICENSE +20 -0
- data/README.md +69 -0
- data/Rakefile +38 -0
- data/benchmark/normalization.rb +106 -0
- data/benchmark/normalization_phrases.txt +1031 -0
- data/benchmark/normalization_result.txt +45 -0
- data/benchmark/normalization_wikip.txt +2838 -0
- data/ext/icu/extconf.rb +242 -0
- data/ext/icu/icu.c +18 -0
- data/ext/icu/icu.h +78 -0
- data/ext/icu/icu_charset_detector.c +192 -0
- data/ext/icu/icu_collator.c +138 -0
- data/ext/icu/icu_locale.c +852 -0
- data/ext/icu/icu_normalizer.c +122 -0
- data/ext/icu/icu_number_format.c +0 -0
- data/ext/icu/icu_spoof_checker.c +194 -0
- data/ext/icu/icu_transliterator.c +159 -0
- data/ext/icu/internal_encoding.c +38 -0
- data/ext/icu/internal_ustring.c +304 -0
- data/ext/icu/internal_utils.c +50 -0
- data/ext/icu/rb_errors.c +14 -0
- data/icu.gemspec +22 -0
- data/lib/icu.rb +6 -18
- data/lib/icu/charset_detector.rb +5 -0
- data/lib/icu/collator.rb +24 -0
- data/lib/icu/locale.rb +19 -0
- data/lib/icu/transliterator.rb +8 -0
- data/lib/icu/version.rb +3 -0
- data/spec/charset_detector_spec.rb +47 -0
- data/spec/collator_spec.rb +73 -0
- data/spec/locale_spec.rb +312 -0
- data/spec/normalizer_spec.rb +35 -0
- data/spec/spec_helper.rb +8 -0
- data/spec/spoof_checker_spec.rb +56 -0
- data/spec/transliterator_spec.rb +41 -0
- metadata +132 -55
- data/COPYING +0 -674
- data/COPYING.LESSER +0 -165
- data/README +0 -81
- data/ext/extconf.rb +0 -31
- data/ext/icu.c +0 -128
- data/ext/icu.h +0 -34
- data/ext/icu_locale.c +0 -330
- data/ext/icu_locale_country.c +0 -99
- data/ext/icu_locale_language.c +0 -99
- data/ext/icu_numeric.c +0 -161
- data/ext/icu_time.c +0 -391
- data/test/test_locale.rb +0 -73
- data/test/test_numeric.rb +0 -78
- data/test/test_time.rb +0 -75
@@ -0,0 +1,38 @@
|
|
1
|
+
#include "icu.h"
|
2
|
+
|
3
|
+
static rb_encoding* ascii_enc;
|
4
|
+
static rb_encoding* utf8_enc;
|
5
|
+
static ID ID_to_s;
|
6
|
+
|
7
|
+
int icu_is_rb_enc_idx_as_utf_8(int enc_idx)
|
8
|
+
{
|
9
|
+
return enc_idx == rb_ascii8bit_encindex() ||
|
10
|
+
enc_idx == rb_usascii_encindex() ||
|
11
|
+
enc_idx == rb_utf8_encindex();
|
12
|
+
}
|
13
|
+
|
14
|
+
int icu_is_rb_str_as_utf_8(VALUE str)
|
15
|
+
{
|
16
|
+
return icu_is_rb_enc_idx_as_utf_8(ENCODING_GET(str));
|
17
|
+
}
|
18
|
+
|
19
|
+
int icu_rb_str_enc_idx(VALUE str)
|
20
|
+
{
|
21
|
+
return ENCODING_GET(str);
|
22
|
+
}
|
23
|
+
|
24
|
+
VALUE rb_str_enc_to_ascii_as_utf8(VALUE str)
|
25
|
+
{
|
26
|
+
str = rb_funcall(str, ID_to_s, 0);
|
27
|
+
// sanitize, will raise Encoding::UndefinedConversionError if anything wrong
|
28
|
+
str = rb_str_encode(str, rb_enc_from_encoding(ascii_enc), 0, Qnil);
|
29
|
+
rb_enc_associate(str, utf8_enc);
|
30
|
+
return str;
|
31
|
+
}
|
32
|
+
|
33
|
+
void init_internal_encoding(void)
|
34
|
+
{
|
35
|
+
ascii_enc = rb_ascii8bit_encoding();
|
36
|
+
utf8_enc = rb_utf8_encoding();
|
37
|
+
ID_to_s = rb_intern("to_s");
|
38
|
+
}
|
@@ -0,0 +1,304 @@
|
|
1
|
+
#include "icu.h"
|
2
|
+
#include "unicode/ucnv.h"
|
3
|
+
|
4
|
+
// #define ICU_USTRING_DEBUG 1
|
5
|
+
|
6
|
+
#define GET_STRING(_data) icu_ustring_data* _data; \
|
7
|
+
TypedData_Get_Struct(self, icu_ustring_data, &icu_ustring_type, _data)
|
8
|
+
#define GET_STRING_VAL(_val, _data) icu_ustring_data* _data; \
|
9
|
+
TypedData_Get_Struct(_val, icu_ustring_data, &icu_ustring_type, _data)
|
10
|
+
|
11
|
+
VALUE rb_cICU_UString;
|
12
|
+
|
13
|
+
/* Data types */
|
14
|
+
typedef struct {
|
15
|
+
int32_t len;
|
16
|
+
int32_t capa;
|
17
|
+
int rb_enc_idx;
|
18
|
+
UConverter* converter;
|
19
|
+
UChar* ptr;
|
20
|
+
} icu_ustring_data;
|
21
|
+
|
22
|
+
static void icu_ustring_free(void* _this)
|
23
|
+
{
|
24
|
+
icu_ustring_data* this = _this;
|
25
|
+
ucnv_close(this->converter);
|
26
|
+
if (this->ptr != NULL) {
|
27
|
+
ruby_xfree(this->ptr);
|
28
|
+
}
|
29
|
+
}
|
30
|
+
|
31
|
+
static size_t icu_ustring_memsize(const void* data)
|
32
|
+
{
|
33
|
+
icu_ustring_data* this = (icu_ustring_data*)data;
|
34
|
+
size_t size = sizeof(UChar) * this->capa;
|
35
|
+
return size + sizeof(icu_ustring_data);
|
36
|
+
}
|
37
|
+
|
38
|
+
static const rb_data_type_t icu_ustring_type = {
|
39
|
+
"icu/ustring",
|
40
|
+
{NULL, icu_ustring_free, icu_ustring_memsize,},
|
41
|
+
0, 0,
|
42
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
43
|
+
};
|
44
|
+
|
45
|
+
// avoid name conflicts
|
46
|
+
#include "ruby/encoding.h"
|
47
|
+
|
48
|
+
/* Always allocate the internal string in a C function where you modify it
|
49
|
+
* as Ruby GC scans the C stacks and registers to find out GC root
|
50
|
+
*/
|
51
|
+
VALUE icu_ustring_alloc(VALUE self)
|
52
|
+
{
|
53
|
+
icu_ustring_data* this;
|
54
|
+
return TypedData_Make_Struct(self, icu_ustring_data, &icu_ustring_type, this);
|
55
|
+
}
|
56
|
+
|
57
|
+
void icu_ustring_resize(VALUE self, int32_t capa)
|
58
|
+
{
|
59
|
+
GET_STRING(this);
|
60
|
+
REALLOC_N(this->ptr, UChar, capa);
|
61
|
+
this->capa = capa;
|
62
|
+
}
|
63
|
+
|
64
|
+
// some ICU gives a pointer to buffer, used for releasing ptr since we don't manage it
|
65
|
+
void icu_ustring_clear_ptr(VALUE self)
|
66
|
+
{
|
67
|
+
GET_STRING(this);
|
68
|
+
this->ptr = NULL;
|
69
|
+
}
|
70
|
+
|
71
|
+
/*
|
72
|
+
Initialize the internal object. Used to convert string to ICU string.
|
73
|
+
See also:
|
74
|
+
- icu_ustring_init_with_capa_enc
|
75
|
+
- icu_ustring_from_uchar_str
|
76
|
+
*/
|
77
|
+
VALUE icu_ustring_from_rb_str(VALUE rb_str)
|
78
|
+
{
|
79
|
+
StringValue(rb_str);
|
80
|
+
VALUE u_str = icu_ustring_alloc(rb_cICU_UString);
|
81
|
+
GET_STRING_VAL(u_str, this);
|
82
|
+
UErrorCode status = U_ZERO_ERROR;
|
83
|
+
|
84
|
+
this->rb_enc_idx = icu_rb_str_enc_idx(rb_str);
|
85
|
+
// take UTF-8 code path
|
86
|
+
if (icu_is_rb_enc_idx_as_utf_8(this->rb_enc_idx)) {
|
87
|
+
this->converter = NULL;
|
88
|
+
} else {
|
89
|
+
this->converter = ucnv_open(ICU_RB_STRING_ENC_NAME_IDX(this->rb_enc_idx), &status);
|
90
|
+
if (U_FAILURE(status)) {
|
91
|
+
icu_rb_raise_icu_error(status);
|
92
|
+
}
|
93
|
+
}
|
94
|
+
|
95
|
+
this->capa = RSTRING_LENINT(rb_str) + RUBY_C_STRING_TERMINATOR_SIZE;
|
96
|
+
this->ptr = ALLOC_N(UChar, this->capa);
|
97
|
+
|
98
|
+
#ifdef ICU_USTRING_DEBUG
|
99
|
+
printf("icu_ustring_from_rb_str: %p %p %p %p %ld\n", u_str, this->ptr, rb_str, StringValuePtr(rb_str), RSTRING_LENINT(rb_str));
|
100
|
+
#endif
|
101
|
+
|
102
|
+
status = U_ZERO_ERROR;
|
103
|
+
int retried = FALSE;
|
104
|
+
int32_t len;
|
105
|
+
do {
|
106
|
+
if (this->converter == NULL) {
|
107
|
+
u_strFromUTF8(this->ptr, this->capa, &len,
|
108
|
+
RSTRING_PTR(rb_str), RSTRING_LENINT(rb_str),
|
109
|
+
&status);
|
110
|
+
} else {
|
111
|
+
len = ucnv_toUChars(this->converter, this->ptr, this->capa,
|
112
|
+
RSTRING_PTR(rb_str), RSTRING_LENINT(rb_str),
|
113
|
+
&status);
|
114
|
+
}
|
115
|
+
if (!retried && status == U_BUFFER_OVERFLOW_ERROR) {
|
116
|
+
retried = TRUE;
|
117
|
+
this->capa = len + RUBY_C_STRING_TERMINATOR_SIZE;
|
118
|
+
REALLOC_N(this->ptr, UChar, this->capa);
|
119
|
+
status = U_ZERO_ERROR;
|
120
|
+
} else if (U_FAILURE(status)) {
|
121
|
+
icu_rb_raise_icu_error(status);
|
122
|
+
} else { // retried == true && U_SUCCESS(status)
|
123
|
+
break;
|
124
|
+
}
|
125
|
+
} while (retried);
|
126
|
+
this->len = len;
|
127
|
+
|
128
|
+
return u_str;
|
129
|
+
}
|
130
|
+
|
131
|
+
/*
|
132
|
+
Initialize the internal object. Used to convert string to Ruby string.
|
133
|
+
If the pointer points to a memory space managed by ICU, releasing it before the EOL of our object.
|
134
|
+
See also:
|
135
|
+
- icu_ustring_init_with_capa_enc
|
136
|
+
- icu_ustring_from_uchar_str
|
137
|
+
- icu_ustring_clear_ptr
|
138
|
+
*/
|
139
|
+
VALUE icu_ustring_from_uchar_str(const UChar* str, int32_t len)
|
140
|
+
{
|
141
|
+
if (len <= 0) {
|
142
|
+
len = u_strlen(str);
|
143
|
+
}
|
144
|
+
VALUE u_str = icu_ustring_init_with_capa_enc(len + RUBY_C_STRING_TERMINATOR_SIZE, ICU_RUBY_ENCODING_INDEX);
|
145
|
+
GET_STRING_VAL(u_str, this);
|
146
|
+
this->ptr = (UChar*)str;
|
147
|
+
this->len = len;
|
148
|
+
return u_str;
|
149
|
+
}
|
150
|
+
|
151
|
+
/*
|
152
|
+
Initialize the internal object. Usually used as a buffer.
|
153
|
+
See also:
|
154
|
+
- icu_ustring_from_rb_str
|
155
|
+
- icu_ustring_from_uchar_str
|
156
|
+
*/
|
157
|
+
VALUE icu_ustring_init_with_capa_enc(int32_t capa, int enc_idx)
|
158
|
+
{
|
159
|
+
VALUE buf = icu_ustring_alloc(rb_cICU_UString);
|
160
|
+
GET_STRING_VAL(buf, this);
|
161
|
+
icu_ustring_set_enc(buf, enc_idx);
|
162
|
+
this->capa = capa;
|
163
|
+
this->ptr = ALLOC_N(UChar, capa);
|
164
|
+
return buf;
|
165
|
+
}
|
166
|
+
|
167
|
+
void icu_ustring_set_enc(VALUE self, int enc_idx)
|
168
|
+
{
|
169
|
+
GET_STRING(this);
|
170
|
+
if (this->converter != NULL) {
|
171
|
+
ucnv_close(this->converter);
|
172
|
+
}
|
173
|
+
|
174
|
+
this->rb_enc_idx = enc_idx;
|
175
|
+
// take UTF-8 code path
|
176
|
+
if (icu_is_rb_enc_idx_as_utf_8(enc_idx)) {
|
177
|
+
this->converter = NULL;
|
178
|
+
} else {
|
179
|
+
UErrorCode status = U_ZERO_ERROR;
|
180
|
+
this->converter = ucnv_open(ICU_RB_STRING_ENC_NAME_IDX(this->rb_enc_idx), &status);
|
181
|
+
if (U_FAILURE(status)) {
|
182
|
+
icu_rb_raise_icu_error(status);
|
183
|
+
}
|
184
|
+
}
|
185
|
+
}
|
186
|
+
|
187
|
+
VALUE icu_ustring_to_rb_enc_str_with_len(VALUE self, int32_t len)
|
188
|
+
{
|
189
|
+
GET_STRING(this);
|
190
|
+
|
191
|
+
#ifdef ICU_USTRING_DEBUG
|
192
|
+
printf("icu_ustring_to_rb_enc_str_with_len: %p %ld\n", self, len);
|
193
|
+
#endif
|
194
|
+
|
195
|
+
this->len = len;
|
196
|
+
return icu_ustring_to_rb_enc_str(self);
|
197
|
+
}
|
198
|
+
|
199
|
+
VALUE icu_ustring_to_rb_enc_str(VALUE self)
|
200
|
+
{
|
201
|
+
GET_STRING(this);
|
202
|
+
if (this->len < 0) {
|
203
|
+
this->len = 0;
|
204
|
+
}
|
205
|
+
|
206
|
+
#ifdef ICU_USTRING_DEBUG
|
207
|
+
printf("icu_ustring_to_rb_enc_str: %p %d %d\n", self, this->len, this->capa);
|
208
|
+
#endif
|
209
|
+
|
210
|
+
int32_t dest_len;
|
211
|
+
int32_t dest_capa = this->len + RUBY_C_STRING_TERMINATOR_SIZE;
|
212
|
+
char* dest = ALLOC_N(char, dest_capa);
|
213
|
+
int retried = FALSE;
|
214
|
+
UErrorCode status = U_ZERO_ERROR;
|
215
|
+
do {
|
216
|
+
if (this->converter == NULL) {
|
217
|
+
u_strToUTF8(dest, dest_capa, &dest_len, this->ptr, this->len, &status);
|
218
|
+
} else {
|
219
|
+
dest_len = ucnv_fromUChars(this->converter, dest, dest_capa,
|
220
|
+
this->ptr, this->len,
|
221
|
+
&status);
|
222
|
+
}
|
223
|
+
if (!retried && status == U_BUFFER_OVERFLOW_ERROR) {
|
224
|
+
retried = TRUE;
|
225
|
+
dest_capa = dest_len + RUBY_C_STRING_TERMINATOR_SIZE;
|
226
|
+
REALLOC_N(dest, char, dest_capa);
|
227
|
+
status = U_ZERO_ERROR;
|
228
|
+
} else if (U_FAILURE(status)) {
|
229
|
+
ruby_xfree(dest);
|
230
|
+
icu_rb_raise_icu_error(status);
|
231
|
+
} else { // retried == true && U_SUCCESS(status)
|
232
|
+
break;
|
233
|
+
}
|
234
|
+
} while (retried);
|
235
|
+
|
236
|
+
#ifdef ICU_USTRING_DEBUG
|
237
|
+
printf("icu_ustring_to_rb_enc_str (before creating rb str): %p %d %d %d\n", (void *)self, this->len, this->capa, this->rb_enc_idx);
|
238
|
+
printf("icu_ustring_to_rb_enc_str (pointers): %p %p %d\n", (void *)self, dest, dest_len);
|
239
|
+
#endif
|
240
|
+
|
241
|
+
VALUE rb_str = rb_enc_str_new(dest, dest_len, rb_enc_from_index(this->rb_enc_idx));
|
242
|
+
ruby_xfree(dest);
|
243
|
+
OBJ_TAINT(rb_str);
|
244
|
+
return rb_str;
|
245
|
+
}
|
246
|
+
|
247
|
+
|
248
|
+
inline UChar* icu_ustring_ptr_internal(const icu_ustring_data *this)
|
249
|
+
{
|
250
|
+
return this->ptr;
|
251
|
+
}
|
252
|
+
|
253
|
+
inline UChar* icu_ustring_ptr(VALUE self)
|
254
|
+
{
|
255
|
+
GET_STRING(this);
|
256
|
+
return icu_ustring_ptr_internal(this);
|
257
|
+
}
|
258
|
+
|
259
|
+
inline int32_t icu_ustring_len_internal(const icu_ustring_data *this)
|
260
|
+
{
|
261
|
+
return this->len;
|
262
|
+
}
|
263
|
+
|
264
|
+
inline int32_t icu_ustring_len(VALUE self)
|
265
|
+
{
|
266
|
+
GET_STRING(this);
|
267
|
+
return icu_ustring_len_internal(this);
|
268
|
+
}
|
269
|
+
|
270
|
+
inline int32_t icu_ustring_capa_internal(const icu_ustring_data *this)
|
271
|
+
{
|
272
|
+
return this->capa;
|
273
|
+
}
|
274
|
+
|
275
|
+
inline int32_t icu_ustring_capa(VALUE self)
|
276
|
+
{
|
277
|
+
GET_STRING(this);
|
278
|
+
return icu_ustring_capa_internal(this);
|
279
|
+
}
|
280
|
+
|
281
|
+
inline VALUE char_buffer_to_rb_str(const char* buffer)
|
282
|
+
{
|
283
|
+
VALUE str = rb_str_new_cstr(buffer);
|
284
|
+
return rb_str_export_to_enc(str, rb_enc_from_index(ICU_RUBY_ENCODING_INDEX));
|
285
|
+
}
|
286
|
+
|
287
|
+
inline char* char_buffer_new(int32_t buf_size)
|
288
|
+
{
|
289
|
+
char* buffer = ALLOC_N(char, buf_size);
|
290
|
+
return buffer;
|
291
|
+
}
|
292
|
+
|
293
|
+
inline void char_buffer_resize(const char* buffer, int32_t buf_size)
|
294
|
+
{
|
295
|
+
REALLOC_N(buffer, char, buf_size);
|
296
|
+
}
|
297
|
+
|
298
|
+
inline void char_buffer_free(const char* buffer)
|
299
|
+
{
|
300
|
+
ruby_xfree((void*)buffer);
|
301
|
+
}
|
302
|
+
|
303
|
+
#undef GET_STRING
|
304
|
+
#undef GET_STRING_VAL
|
@@ -0,0 +1,50 @@
|
|
1
|
+
#include "icu.h"
|
2
|
+
|
3
|
+
VALUE icu_enum_to_rb_ary(UEnumeration* icu_enum, UErrorCode status, long pre_allocated)
|
4
|
+
{
|
5
|
+
if (U_FAILURE(status)) {
|
6
|
+
uenum_close(icu_enum);
|
7
|
+
icu_rb_raise_icu_error(status);
|
8
|
+
}
|
9
|
+
VALUE result = rb_ary_new2(pre_allocated);
|
10
|
+
const UChar* ptr = NULL;
|
11
|
+
int32_t len = 0;
|
12
|
+
status = U_ZERO_ERROR;
|
13
|
+
while ((ptr = uenum_unext(icu_enum, &len, &status)) != NULL) {
|
14
|
+
if (U_FAILURE(status)) {
|
15
|
+
uenum_close(icu_enum);
|
16
|
+
icu_rb_raise_icu_error(status);
|
17
|
+
}
|
18
|
+
VALUE s = icu_ustring_from_uchar_str(ptr, len);
|
19
|
+
rb_ary_push(result, icu_ustring_to_rb_enc_str(s));
|
20
|
+
icu_ustring_clear_ptr(s);
|
21
|
+
status = U_ZERO_ERROR;
|
22
|
+
}
|
23
|
+
uenum_close(icu_enum);
|
24
|
+
return result;
|
25
|
+
}
|
26
|
+
|
27
|
+
extern inline void icu_rb_raise_icu_error(UErrorCode status)
|
28
|
+
{
|
29
|
+
rb_raise(rb_eICU_Error, "ICU Error Code: %d, %s.", status, u_errorName(status));
|
30
|
+
}
|
31
|
+
|
32
|
+
|
33
|
+
extern inline void
|
34
|
+
icu_rb_raise_icu_invalid_parameter(const char* parameter,
|
35
|
+
const char* error_message)
|
36
|
+
{
|
37
|
+
rb_raise(rb_eICU_InvalidParameterError,
|
38
|
+
"ICU Invalid parameter: %s, %s.",
|
39
|
+
parameter,
|
40
|
+
error_message);
|
41
|
+
}
|
42
|
+
|
43
|
+
|
44
|
+
extern inline void icu_rb_raise_icu_parse_error(const UParseError* error)
|
45
|
+
{
|
46
|
+
rb_raise(rb_eICU_InvalidParameterError,
|
47
|
+
"ICU Parse Error: Line %d, offset %d.",
|
48
|
+
error->line,
|
49
|
+
error->offset);
|
50
|
+
}
|
data/ext/icu/rb_errors.c
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#include "icu.h"
|
2
|
+
|
3
|
+
VALUE rb_eICU_Error;
|
4
|
+
VALUE rb_eICU_InvalidParameterError;
|
5
|
+
|
6
|
+
void init_rb_errors(void)
|
7
|
+
{
|
8
|
+
rb_eICU_Error = rb_define_class_under(rb_mICU, "Error", rb_eStandardError);
|
9
|
+
rb_define_alias(rb_eICU_Error, "error", "message");
|
10
|
+
rb_eICU_InvalidParameterError = rb_define_class_under(rb_mICU, "InvalidParameterError", rb_eStandardError);
|
11
|
+
rb_define_alias(rb_eICU_InvalidParameterError, "error", "message");
|
12
|
+
}
|
13
|
+
|
14
|
+
/* vim: set expandtab sws=4 sw=4: */
|
data/icu.gemspec
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.expand_path('../lib/icu/version', __FILE__)
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "icu"
|
5
|
+
s.version = ICU::VERSION
|
6
|
+
s.authors = ["Erick Guan"]
|
7
|
+
s.email = ["fantasticfears@gmail.com"]
|
8
|
+
s.license = "MIT"
|
9
|
+
s.homepage = "https://github.com/fantasticfears/icu4r"
|
10
|
+
s.summary = %q{A Unicode processing functions ruby gem, binding to ICU}
|
11
|
+
s.required_ruby_version = '>= 2.2.7'
|
12
|
+
|
13
|
+
s.extensions = ["ext/icu/extconf.rb"]
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.add_development_dependency 'rake-compiler', ">= 0.7.5"
|
19
|
+
s.add_development_dependency 'rspec'
|
20
|
+
s.add_development_dependency 'pry'
|
21
|
+
s.add_development_dependency 'mini_portile2', '~> 2.2.0'
|
22
|
+
end
|
data/lib/icu.rb
CHANGED
@@ -1,18 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
# the Free Software Foundation, either version 3 of the License, or
|
8
|
-
# (at your option) any later version.
|
9
|
-
#
|
10
|
-
# ICU is distributed in the hope that it will be useful,
|
11
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
-
# GNU Lesser General Public License for more details.
|
14
|
-
#
|
15
|
-
# You should have received a copy of the GNU Lesser General Public License
|
16
|
-
# along with ICU. If not, see <http://www.gnu.org/licenses/>.
|
17
|
-
|
18
|
-
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'icu.so'))
|
1
|
+
require 'icu/icu'
|
2
|
+
require 'icu/version'
|
3
|
+
require 'icu/collator'
|
4
|
+
require 'icu/transliterator'
|
5
|
+
require 'icu/charset_detector'
|
6
|
+
require 'icu/locale'
|