multibyte 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.git/COMMIT_EDITMSG +57 -0
- data/.git/HEAD +1 -0
- data/.git/config +8 -0
- data/.git/description +1 -0
- data/.git/hooks/applypatch-msg +15 -0
- data/.git/hooks/commit-msg +21 -0
- data/.git/hooks/post-commit +8 -0
- data/.git/hooks/post-receive +16 -0
- data/.git/hooks/post-update +8 -0
- data/.git/hooks/pre-applypatch +14 -0
- data/.git/hooks/pre-commit +70 -0
- data/.git/hooks/pre-rebase +150 -0
- data/.git/hooks/update +107 -0
- data/.git/index +0 -0
- data/.git/info/exclude +6 -0
- data/.git/logs/HEAD +4 -0
- data/.git/logs/refs/heads/master +4 -0
- data/.git/logs/refs/remotes/origin/master +3 -0
- data/.git/objects/02/e9a792fa31b00f0f06012e0b5e3ef327c40f64 +0 -0
- data/.git/objects/10/0b93820ade4c16225673b4ca62bb3ade63c313 +0 -0
- data/.git/objects/10/aab6490174970a2349d1050882c644f8d07006 +7 -0
- data/.git/objects/11/cda2eaac1ae103a13bf835456de05f53b0c8ad +0 -0
- data/.git/objects/1d/61c71cd5cf0f4dae6305b007a6177e1cecd7ea +0 -0
- data/.git/objects/2c/84cd00c156ba3b46e733c7e34dd9aea0c4fa75 +0 -0
- data/.git/objects/2f/3a16e4a756ec7a2d32c4bd8386b855f41cae61 +0 -0
- data/.git/objects/2f/437425b2c085bb529379e409d6b4bc7f9f9fba +0 -0
- data/.git/objects/3f/9afe5eaf00ad4d2ffa2e9315b96f530b0e85d4 +2 -0
- data/.git/objects/42/4a5f37c6fe3a7cac54b0f85688c1cce7da9cdf +0 -0
- data/.git/objects/47/26f03dc598a372cb959e3cbe33334de70802fd +0 -0
- data/.git/objects/55/37e6b2a449fe6d6c800803d0f72ffbcf44c297 +0 -0
- data/.git/objects/64/334b80d5fcead16f13cb8b7a45120ea460747b +0 -0
- data/.git/objects/69/1ed3b65603a0d0dabfb66720e7163664be78f5 +0 -0
- data/.git/objects/72/141584a5836168fe912ebce5b4537bd0eafc09 +1 -0
- data/.git/objects/7c/e872bc55ff766e542d2fbbe00e9dde70baaa92 +2 -0
- data/.git/objects/93/e03faa6906892434fa9f2ad230c4ececc64055 +0 -0
- data/.git/objects/9d/c9a787700bafb70e1833a760b73dec26a6a56e +0 -0
- data/.git/objects/9f/672edccfaaa00b6584f599c3e68560e6a5bedf +0 -0
- data/.git/objects/ab/1cd78b02ec268ce7d2faf4b1692f4bed9273fe +0 -0
- data/.git/objects/ad/8866bd33ae1afe9278cf5ee833d71977af561c +0 -0
- data/.git/objects/af/c3ea327fa220ee42a5ebecfcc7d218be4ea1d9 +0 -0
- data/.git/objects/b2/56d1cf3a9ba99f308daf1b4cd0dd08f11448e0 +1 -0
- data/.git/objects/bc/184b885eca1bed875171bd3990433055dda3af +0 -0
- data/.git/objects/c2/7f6559350f7adb19d43742b55b2f91d07b6550 +0 -0
- data/.git/objects/c3/e7364c6e90fb80e979779cd822bc8cdc8a3790 +0 -0
- data/.git/objects/c9/5128ff8f94e949d796afa128f2f341ba69989c +0 -0
- data/.git/objects/ce/e1f5b453e86a5aa913c626641608839bb79eef +1 -0
- data/.git/objects/cf/6add7ea568d3d90d6a1f8afb0898b0119b14ff +0 -0
- data/.git/objects/d5/e18b1fd7b189fdc75dd3bc4d208323cbc01aa8 +0 -0
- data/.git/objects/de/6e40dc4d92c1a889f8581718a48f2fcd219442 +0 -0
- data/.git/objects/df/42782d610e8c714f78cf0a018c600667da795e +0 -0
- data/.git/objects/e0/65ff01f0883142d4901a371be8dc60998fbe04 +4 -0
- data/.git/objects/e1/ad06969c3d3982b06ebd7da3777a0926501e7c +0 -0
- data/.git/objects/e4/69154c2ae4c3c596870a5e920f197b7b5be179 +2 -0
- data/.git/objects/e4/8464df56bf487e96e21ea99487330266dae3c9 +0 -0
- data/.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 +0 -0
- data/.git/objects/e8/517350dbaadcb01282282218638c6022a20091 +0 -0
- data/.git/objects/eb/1bffe6adda4dc202d219cb35fe142a5e42b46b +0 -0
- data/.git/objects/eb/5d1c06d3a469df91dff68022b3b179e30cd127 +0 -0
- data/.git/objects/ec/f2f7e20cd14b0d4b5c0b7d0450aafc8c4f7066 +0 -0
- data/.git/objects/f1/ca0626d3e5dfcf88df23c9720d6f770fcbef73 +0 -0
- data/.git/objects/f2/3c73e1110a2fec82d37a1a399b9f274d30f0fe +0 -0
- data/.git/objects/f2/aec2820bf2f1c87c031d4abe262560392ac4b9 +0 -0
- data/.git/objects/f8/73dae66e0208669dbf74718181b3866647f426 +0 -0
- data/.git/refs/heads/master +1 -0
- data/.git/refs/remotes/origin/master +1 -0
- data/History.txt +4 -0
- data/License.txt +20 -0
- data/Manifest.txt +97 -0
- data/README.txt +19 -0
- data/Rakefile +4 -0
- data/config/hoe.rb +70 -0
- data/config/requirements.rb +17 -0
- data/lib/multibyte/chars.rb +135 -0
- data/lib/multibyte/generators/generate_tables.rb +145 -0
- data/lib/multibyte/handlers/passthru_handler.rb +9 -0
- data/lib/multibyte/handlers/utf8_handler.rb +564 -0
- data/lib/multibyte/handlers/utf8_handler_proc.rb +43 -0
- data/lib/multibyte/version.rb +9 -0
- data/lib/multibyte.rb +15 -0
- data/lib/unicode.rb +66 -0
- data/log/debug.log +0 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +74 -0
- data/setup.rb +1585 -0
- data/spec/multibyte_spec.rb +11 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +7 -0
- data/tasks/deployment.rake +34 -0
- data/tasks/environment.rake +7 -0
- data/tasks/rspec.rake +21 -0
- data/tasks/website.rake +17 -0
- data/website/index.html +11 -0
- data/website/index.txt +39 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +138 -0
- data/website/template.rhtml +48 -0
- data.tar.gz.sig +3 -0
- metadata +176 -0
- metadata.gz.sig +0 -0
data/.git/index
ADDED
Binary file
|
data/.git/info/exclude
ADDED
data/.git/logs/HEAD
ADDED
@@ -0,0 +1,4 @@
|
|
1
|
+
0000000000000000000000000000000000000000 e1ad06969c3d3982b06ebd7da3777a0926501e7c Matt Aimonetti <mattaimonetti@gmail.com> 1211959957 -0700 commit (initial): first commit
|
2
|
+
e1ad06969c3d3982b06ebd7da3777a0926501e7c d98f6f6626e3b2adfe405f696d2b805a843f110a Matt Aimonetti <mattaimonetti@gmail.com> 1211962430 -0700 commit: added unicode.rb and setup $KCODE= 'u'
|
3
|
+
d98f6f6626e3b2adfe405f696d2b805a843f110a 49b70db84e27b4600c96df53010a13f99d86c418 Matt Aimonetti <mattaimonetti@gmail.com> 1212013709 -0700 commit: first working version
|
4
|
+
49b70db84e27b4600c96df53010a13f99d86c418 34eb733bebc3ef62abf7bae465fd7db5a6bd5b0f Matt Aimonetti <mattaimonetti@gmail.com> 1212014068 -0700 commit: added readme + github gemspec
|
@@ -0,0 +1,4 @@
|
|
1
|
+
0000000000000000000000000000000000000000 e1ad06969c3d3982b06ebd7da3777a0926501e7c Matt Aimonetti <mattaimonetti@gmail.com> 1211959957 -0700 commit (initial): first commit
|
2
|
+
e1ad06969c3d3982b06ebd7da3777a0926501e7c d98f6f6626e3b2adfe405f696d2b805a843f110a Matt Aimonetti <mattaimonetti@gmail.com> 1211962430 -0700 commit: added unicode.rb and setup $KCODE= 'u'
|
3
|
+
d98f6f6626e3b2adfe405f696d2b805a843f110a 49b70db84e27b4600c96df53010a13f99d86c418 Matt Aimonetti <mattaimonetti@gmail.com> 1212013709 -0700 commit: first working version
|
4
|
+
49b70db84e27b4600c96df53010a13f99d86c418 34eb733bebc3ef62abf7bae465fd7db5a6bd5b0f Matt Aimonetti <mattaimonetti@gmail.com> 1212014068 -0700 commit: added readme + github gemspec
|
@@ -0,0 +1,3 @@
|
|
1
|
+
0000000000000000000000000000000000000000 e1ad06969c3d3982b06ebd7da3777a0926501e7c Matt Aimonetti <matta@matta.(none)> 1211959959 -0700 update by push
|
2
|
+
e1ad06969c3d3982b06ebd7da3777a0926501e7c d98f6f6626e3b2adfe405f696d2b805a843f110a Matt Aimonetti <matta@matta.(none)> 1211962460 -0700 update by push
|
3
|
+
d98f6f6626e3b2adfe405f696d2b805a843f110a 34eb733bebc3ef62abf7bae465fd7db5a6bd5b0f Matt Aimonetti <matta@matta.(none)> 1212014088 -0700 update by push
|
Binary file
|
Binary file
|
@@ -0,0 +1,7 @@
|
|
1
|
+
x]R[k�0�!O-����[i���J�<�"��,y��~G�et0��w=�S÷�/_s����w��<����X��
|
2
|
+
nOp֮7��IY7��s�8�s�=ܞ}�WX�|������hZ���
|
3
|
+
�Ns=h��Q�=u=;����Q�Ga��f��7d��;d��.̠J�ݠ����{���s����%�t��,(�V��,�yg���1J���y��(��T��
|
4
|
+
Y.��C��`����+�^��R�b����͵u�x�ݟ�������k
|
5
|
+
e��;"(�
|
6
|
+
������ %�1�\�[ 8!�{�W@�~1��}/-K��M�1���x�mS�_a�8�K�؆I$�9x�+��[E*�52�%˘������s���@A�d�6#��(�|�3��B7��'TE)�ox�rM�,H�-��_�{�^��y�R�\�(cd�ы�J2�61�dC^�;9��n���
|
7
|
+
���ra'IΥ�c�)��Cw��1�J_�J�H��D��{�_up}���¶��%�$C.\�4��t�S
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
x+)JMU05e040031Q(�/�KIM�O�/�K-*���,I���K��*fX��Q�"�wNK_��s���>��7�}
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
xm��j�0D{�W��
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
xMOAj�0�ٯ�(�4l��B�z�]X�$^P,g%���������̺���'�}%�X{ѡ�������n�;l�4��=�H��m�j�O�9��s�'�ʦ�y|m]�Nn�D��.��<S���ڎ��4�JI�����{I�ڐ�KDv9����$�6�üi*��`�*���U~�/�~{R�
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
34eb733bebc3ef62abf7bae465fd7db5a6bd5b0f
|
@@ -0,0 +1 @@
|
|
1
|
+
34eb733bebc3ef62abf7bae465fd7db5a6bd5b0f
|
data/History.txt
ADDED
data/License.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2005-2008 David Heinemeier Hansson
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Manifest.txt
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
.git/COMMIT_EDITMSG
|
2
|
+
.git/HEAD
|
3
|
+
.git/config
|
4
|
+
.git/description
|
5
|
+
.git/hooks/applypatch-msg
|
6
|
+
.git/hooks/commit-msg
|
7
|
+
.git/hooks/post-commit
|
8
|
+
.git/hooks/post-receive
|
9
|
+
.git/hooks/post-update
|
10
|
+
.git/hooks/pre-applypatch
|
11
|
+
.git/hooks/pre-commit
|
12
|
+
.git/hooks/pre-rebase
|
13
|
+
.git/hooks/update
|
14
|
+
.git/index
|
15
|
+
.git/info/exclude
|
16
|
+
.git/logs/HEAD
|
17
|
+
.git/logs/refs/heads/master
|
18
|
+
.git/logs/refs/remotes/origin/master
|
19
|
+
.git/objects/02/e9a792fa31b00f0f06012e0b5e3ef327c40f64
|
20
|
+
.git/objects/10/0b93820ade4c16225673b4ca62bb3ade63c313
|
21
|
+
.git/objects/10/aab6490174970a2349d1050882c644f8d07006
|
22
|
+
.git/objects/11/cda2eaac1ae103a13bf835456de05f53b0c8ad
|
23
|
+
.git/objects/1d/61c71cd5cf0f4dae6305b007a6177e1cecd7ea
|
24
|
+
.git/objects/2c/84cd00c156ba3b46e733c7e34dd9aea0c4fa75
|
25
|
+
.git/objects/2f/3a16e4a756ec7a2d32c4bd8386b855f41cae61
|
26
|
+
.git/objects/2f/437425b2c085bb529379e409d6b4bc7f9f9fba
|
27
|
+
.git/objects/3f/9afe5eaf00ad4d2ffa2e9315b96f530b0e85d4
|
28
|
+
.git/objects/42/4a5f37c6fe3a7cac54b0f85688c1cce7da9cdf
|
29
|
+
.git/objects/47/26f03dc598a372cb959e3cbe33334de70802fd
|
30
|
+
.git/objects/55/37e6b2a449fe6d6c800803d0f72ffbcf44c297
|
31
|
+
.git/objects/64/334b80d5fcead16f13cb8b7a45120ea460747b
|
32
|
+
.git/objects/69/1ed3b65603a0d0dabfb66720e7163664be78f5
|
33
|
+
.git/objects/72/141584a5836168fe912ebce5b4537bd0eafc09
|
34
|
+
.git/objects/7c/e872bc55ff766e542d2fbbe00e9dde70baaa92
|
35
|
+
.git/objects/93/e03faa6906892434fa9f2ad230c4ececc64055
|
36
|
+
.git/objects/9d/c9a787700bafb70e1833a760b73dec26a6a56e
|
37
|
+
.git/objects/9f/672edccfaaa00b6584f599c3e68560e6a5bedf
|
38
|
+
.git/objects/ab/1cd78b02ec268ce7d2faf4b1692f4bed9273fe
|
39
|
+
.git/objects/ad/8866bd33ae1afe9278cf5ee833d71977af561c
|
40
|
+
.git/objects/af/c3ea327fa220ee42a5ebecfcc7d218be4ea1d9
|
41
|
+
.git/objects/b2/56d1cf3a9ba99f308daf1b4cd0dd08f11448e0
|
42
|
+
.git/objects/bc/184b885eca1bed875171bd3990433055dda3af
|
43
|
+
.git/objects/c2/7f6559350f7adb19d43742b55b2f91d07b6550
|
44
|
+
.git/objects/c3/e7364c6e90fb80e979779cd822bc8cdc8a3790
|
45
|
+
.git/objects/c9/5128ff8f94e949d796afa128f2f341ba69989c
|
46
|
+
.git/objects/ce/e1f5b453e86a5aa913c626641608839bb79eef
|
47
|
+
.git/objects/cf/6add7ea568d3d90d6a1f8afb0898b0119b14ff
|
48
|
+
.git/objects/d5/e18b1fd7b189fdc75dd3bc4d208323cbc01aa8
|
49
|
+
.git/objects/de/6e40dc4d92c1a889f8581718a48f2fcd219442
|
50
|
+
.git/objects/df/42782d610e8c714f78cf0a018c600667da795e
|
51
|
+
.git/objects/e0/65ff01f0883142d4901a371be8dc60998fbe04
|
52
|
+
.git/objects/e1/ad06969c3d3982b06ebd7da3777a0926501e7c
|
53
|
+
.git/objects/e4/69154c2ae4c3c596870a5e920f197b7b5be179
|
54
|
+
.git/objects/e4/8464df56bf487e96e21ea99487330266dae3c9
|
55
|
+
.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391
|
56
|
+
.git/objects/e8/517350dbaadcb01282282218638c6022a20091
|
57
|
+
.git/objects/eb/1bffe6adda4dc202d219cb35fe142a5e42b46b
|
58
|
+
.git/objects/eb/5d1c06d3a469df91dff68022b3b179e30cd127
|
59
|
+
.git/objects/ec/f2f7e20cd14b0d4b5c0b7d0450aafc8c4f7066
|
60
|
+
.git/objects/f1/ca0626d3e5dfcf88df23c9720d6f770fcbef73
|
61
|
+
.git/objects/f2/3c73e1110a2fec82d37a1a399b9f274d30f0fe
|
62
|
+
.git/objects/f2/aec2820bf2f1c87c031d4abe262560392ac4b9
|
63
|
+
.git/objects/f8/73dae66e0208669dbf74718181b3866647f426
|
64
|
+
.git/refs/heads/master
|
65
|
+
.git/refs/remotes/origin/master
|
66
|
+
History.txt
|
67
|
+
License.txt
|
68
|
+
Manifest.txt
|
69
|
+
README.txt
|
70
|
+
Rakefile
|
71
|
+
config/hoe.rb
|
72
|
+
config/requirements.rb
|
73
|
+
lib/multibyte.rb
|
74
|
+
lib/multibyte/chars.rb
|
75
|
+
lib/multibyte/generators/generate_tables.rb
|
76
|
+
lib/multibyte/handlers/passthru_handler.rb
|
77
|
+
lib/multibyte/handlers/utf8_handler.rb
|
78
|
+
lib/multibyte/handlers/utf8_handler_proc.rb
|
79
|
+
lib/multibyte/version.rb
|
80
|
+
lib/unicode.rb
|
81
|
+
log/debug.log
|
82
|
+
script/destroy
|
83
|
+
script/generate
|
84
|
+
script/txt2html
|
85
|
+
setup.rb
|
86
|
+
spec/multibyte_spec.rb
|
87
|
+
spec/spec.opts
|
88
|
+
spec/spec_helper.rb
|
89
|
+
tasks/deployment.rake
|
90
|
+
tasks/environment.rake
|
91
|
+
tasks/rspec.rake
|
92
|
+
tasks/website.rake
|
93
|
+
website/index.html
|
94
|
+
website/index.txt
|
95
|
+
website/javascripts/rounded_corners_lite.inc.js
|
96
|
+
website/stylesheets/screen.css
|
97
|
+
website/template.rhtml
|
data/README.txt
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Multibyte
|
2
|
+
==========
|
3
|
+
|
4
|
+
Multibyte is extracted directly from Rails's ActiveSupport and offers Multibyte safety to Ruby.
|
5
|
+
|
6
|
+
Usage
|
7
|
+
=====
|
8
|
+
|
9
|
+
>> require 'multibyte'
|
10
|
+
=> true
|
11
|
+
>> "新通訊錄".chars[0..1]
|
12
|
+
=> #<Multibyte::Chars:0x127e3d0 @string="新通">
|
13
|
+
>> "新通訊錄".chars[0..1].to_s
|
14
|
+
=> "新通"
|
15
|
+
|
16
|
+
Installation:
|
17
|
+
=============
|
18
|
+
|
19
|
+
$ sudo gem install matta-multibyte --source=http://gems.github.com
|
data/Rakefile
ADDED
data/config/hoe.rb
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'multibyte/version'
|
2
|
+
|
3
|
+
AUTHOR = 'FIXME full name' # can also be an array of Authors
|
4
|
+
EMAIL = "FIXME email"
|
5
|
+
DESCRIPTION = "description of gem"
|
6
|
+
GEM_NAME = 'multibyte' # what ppl will type to install your gem
|
7
|
+
RUBYFORGE_PROJECT = 'multibyte' # The unix name for your project
|
8
|
+
HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
|
9
|
+
DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
|
10
|
+
|
11
|
+
@config_file = "~/.rubyforge/user-config.yml"
|
12
|
+
@config = nil
|
13
|
+
RUBYFORGE_USERNAME = "unknown"
|
14
|
+
def rubyforge_username
|
15
|
+
unless @config
|
16
|
+
begin
|
17
|
+
@config = YAML.load(File.read(File.expand_path(@config_file)))
|
18
|
+
rescue
|
19
|
+
puts <<-EOS
|
20
|
+
ERROR: No rubyforge config file found: #{@config_file}
|
21
|
+
Run 'rubyforge setup' to prepare your env for access to Rubyforge
|
22
|
+
- See http://newgem.rubyforge.org/rubyforge.html for more details
|
23
|
+
EOS
|
24
|
+
exit
|
25
|
+
end
|
26
|
+
end
|
27
|
+
RUBYFORGE_USERNAME.replace @config["username"]
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
REV = nil
|
32
|
+
# UNCOMMENT IF REQUIRED:
|
33
|
+
# REV = `svn info`.each {|line| if line =~ /^Revision:/ then k,v = line.split(': '); break v.chomp; else next; end} rescue nil
|
34
|
+
VERS = Multibyte::VERSION::STRING + (REV ? ".#{REV}" : "")
|
35
|
+
RDOC_OPTS = ['--quiet', '--title', 'multibyte documentation',
|
36
|
+
"--opname", "index.html",
|
37
|
+
"--line-numbers",
|
38
|
+
"--main", "README",
|
39
|
+
"--inline-source"]
|
40
|
+
|
41
|
+
class Hoe
|
42
|
+
def extra_deps
|
43
|
+
@extra_deps.reject! { |x| Array(x).first == 'hoe' }
|
44
|
+
@extra_deps
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Generate all the Rake tasks
|
49
|
+
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
50
|
+
hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
51
|
+
p.developer(AUTHOR, EMAIL)
|
52
|
+
p.description = DESCRIPTION
|
53
|
+
p.summary = DESCRIPTION
|
54
|
+
p.url = HOMEPATH
|
55
|
+
p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
|
56
|
+
p.test_globs = ["test/**/test_*.rb"]
|
57
|
+
p.clean_globs |= ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store'] #An array of file patterns to delete on clean.
|
58
|
+
|
59
|
+
# == Optional
|
60
|
+
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
61
|
+
#p.extra_deps = [] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
|
62
|
+
|
63
|
+
#p.spec_extras = {} # A hash of extra values to set in the gemspec.
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
CHANGES = hoe.paragraphs_of('History.txt', 0..1).join("\\n\\n")
|
68
|
+
PATH = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
|
69
|
+
hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc')
|
70
|
+
hoe.rsync_args = '-av --delete --ignore-errors'
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
include FileUtils
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
%w[rake hoe newgem rubigen].each do |req_gem|
|
6
|
+
begin
|
7
|
+
require req_gem
|
8
|
+
rescue LoadError
|
9
|
+
puts "This Rakefile requires the '#{req_gem}' RubyGem."
|
10
|
+
puts "Installation: gem install #{req_gem} -y"
|
11
|
+
exit
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
$:.unshift(File.join(File.dirname(__FILE__), %w[.. lib]))
|
16
|
+
|
17
|
+
require 'multibyte'
|
@@ -0,0 +1,135 @@
|
|
1
|
+
require 'multibyte/handlers/utf8_handler'
|
2
|
+
require 'multibyte/handlers/passthru_handler'
|
3
|
+
|
4
|
+
# Encapsulates all the functionality related to the Chars proxy.
|
5
|
+
module Multibyte #:nodoc:
|
6
|
+
# Chars enables you to work transparently with multibyte encodings in the Ruby String class without having extensive
|
7
|
+
# knowledge about the encoding. A Chars object accepts a string upon initialization and proxies String methods in an
|
8
|
+
# encoding safe manner. All the normal String methods are also implemented on the proxy.
|
9
|
+
#
|
10
|
+
# String methods are proxied through the Chars object, and can be accessed through the +chars+ method. Methods
|
11
|
+
# which would normally return a String object now return a Chars object so methods can be chained.
|
12
|
+
#
|
13
|
+
# "The Perfect String ".chars.downcase.strip.normalize # => "the perfect string"
|
14
|
+
#
|
15
|
+
# Chars objects are perfectly interchangeable with String objects as long as no explicit class checks are made.
|
16
|
+
# If certain methods do explicitly check the class, call +to_s+ before you pass chars objects to them.
|
17
|
+
#
|
18
|
+
# bad.explicit_checking_method "T".chars.downcase.to_s
|
19
|
+
#
|
20
|
+
# The actual operations on the string are delegated to handlers. Theoretically handlers can be implemented for
|
21
|
+
# any encoding, but the default handler handles UTF-8. This handler is set during initialization, if you want to
|
22
|
+
# use you own handler, you can set it on the Chars class. Look at the UTF8Handler source for an example how to
|
23
|
+
# implement your own handler. If you your own handler to work on anything but UTF-8 you probably also
|
24
|
+
# want to override Chars#handler.
|
25
|
+
#
|
26
|
+
# ActiveSupport::Multibyte::Chars.handler = MyHandler
|
27
|
+
#
|
28
|
+
# Note that a few methods are defined on Chars instead of the handler because they are defined on Object or Kernel
|
29
|
+
# and method_missing can't catch them.
|
30
|
+
class Chars
|
31
|
+
|
32
|
+
attr_reader :string # The contained string
|
33
|
+
alias_method :to_s, :string
|
34
|
+
|
35
|
+
include Comparable
|
36
|
+
|
37
|
+
# The magic method to make String and Chars comparable
|
38
|
+
def to_str
|
39
|
+
# Using any other ways of overriding the String itself will lead you all the way from infinite loops to
|
40
|
+
# core dumps. Don't go there.
|
41
|
+
@string
|
42
|
+
end
|
43
|
+
|
44
|
+
# Make duck-typing with String possible
|
45
|
+
def respond_to?(method)
|
46
|
+
super || @string.respond_to?(method) || handler.respond_to?(method) ||
|
47
|
+
(method.to_s =~ /(.*)!/ && handler.respond_to?($1)) || false
|
48
|
+
end
|
49
|
+
|
50
|
+
# Create a new Chars instance.
|
51
|
+
def initialize(str)
|
52
|
+
@string = str.respond_to?(:string) ? str.string : str
|
53
|
+
end
|
54
|
+
|
55
|
+
# Returns -1, 0 or +1 depending on whether the Chars object is to be sorted before, equal or after the
|
56
|
+
# object on the right side of the operation. It accepts any object that implements +to_s+. See String.<=>
|
57
|
+
# for more details.
|
58
|
+
def <=>(other); @string <=> other.to_s; end
|
59
|
+
|
60
|
+
# Works just like String#split, with the exception that the items in the resulting list are Chars
|
61
|
+
# instances instead of String. This makes chaining methods easier.
|
62
|
+
def split(*args)
|
63
|
+
@string.split(*args).map { |i| i.chars }
|
64
|
+
end
|
65
|
+
|
66
|
+
# Gsub works exactly the same as gsub on a normal string.
|
67
|
+
def gsub(*a, &b); @string.gsub(*a, &b).chars; end
|
68
|
+
|
69
|
+
# Like String.=~ only it returns the character offset (in codepoints) instead of the byte offset.
|
70
|
+
def =~(other)
|
71
|
+
handler.translate_offset(@string, @string =~ other)
|
72
|
+
end
|
73
|
+
|
74
|
+
# Try to forward all undefined methods to the handler, when a method is not defined on the handler, send it to
|
75
|
+
# the contained string. Method_missing is also responsible for making the bang! methods destructive.
|
76
|
+
def method_missing(m, *a, &b)
|
77
|
+
begin
|
78
|
+
# Simulate methods with a ! at the end because we can't touch the enclosed string from the handlers.
|
79
|
+
if m.to_s =~ /^(.*)\!$/ && handler.respond_to?($1)
|
80
|
+
result = handler.send($1, @string, *a, &b)
|
81
|
+
if result == @string
|
82
|
+
result = nil
|
83
|
+
else
|
84
|
+
@string.replace result
|
85
|
+
end
|
86
|
+
elsif handler.respond_to?(m)
|
87
|
+
result = handler.send(m, @string, *a, &b)
|
88
|
+
else
|
89
|
+
result = @string.send(m, *a, &b)
|
90
|
+
end
|
91
|
+
rescue Handlers::EncodingError
|
92
|
+
@string.replace handler.tidy_bytes(@string)
|
93
|
+
retry
|
94
|
+
end
|
95
|
+
|
96
|
+
if result.kind_of?(String)
|
97
|
+
result.chars
|
98
|
+
else
|
99
|
+
result
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
# Set the handler class for the Char objects.
|
104
|
+
def self.handler=(klass)
|
105
|
+
@@handler = klass
|
106
|
+
end
|
107
|
+
|
108
|
+
# Returns the proper handler for the contained string depending on $KCODE and the encoding of the string. This
|
109
|
+
# method is used internally to always redirect messages to the proper classes depending on the context.
|
110
|
+
def handler
|
111
|
+
if utf8_pragma?
|
112
|
+
@@handler
|
113
|
+
else
|
114
|
+
Multibyte::Handlers::PassthruHandler
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
private
|
119
|
+
|
120
|
+
# +utf8_pragma+ checks if it can send this string to the handlers. It makes sure @string isn't nil and $KCODE is
|
121
|
+
# set to 'UTF8'.
|
122
|
+
def utf8_pragma?
|
123
|
+
!@string.nil? && ($KCODE == 'UTF8')
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
# When we can load the utf8proc library, override normalization with the faster methods
|
129
|
+
begin
|
130
|
+
require 'utf8proc_native'
|
131
|
+
require 'multibyte/handlers/utf8_handler_proc'
|
132
|
+
Multibyte::Chars.handler = Multibyte::Handlers::UTF8HandlerProc
|
133
|
+
rescue LoadError
|
134
|
+
Multibyte::Chars.handler = Multibyte::Handlers::UTF8Handler
|
135
|
+
end
|