Skip to content

Commit e190e30

Browse files
authored
Merge pull request #130 from vim-jp/fix-js-len
Fix len() for js
2 parents a74da5d + 0f668c9 commit e190e30

File tree

6 files changed

+24
-4
lines changed

6 files changed

+24
-4
lines changed

Diff for: js/vimlfunc.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,12 @@ function viml_keys(obj) {
155155

156156
function viml_len(obj) {
157157
if (typeof obj === 'string') {
158-
return encodeURIComponent(obj).replace(/%../g, ' ').length;
158+
var len = 0;
159+
for (var i = 0; i < obj.length; i++) {
160+
var c = obj.charCodeAt(i);
161+
len += c < 128 ? 1 : ((c > 127) && (c < 2048)) ? 2 : 3;
162+
}
163+
return len;
159164
}
160165
return obj.length;
161166
}

Diff for: js/vimlparser.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,12 @@ function viml_keys(obj) {
155155

156156
function viml_len(obj) {
157157
if (typeof obj === 'string') {
158-
return encodeURIComponent(obj).replace(/%../g, ' ').length;
158+
var len = 0;
159+
for (var i = 0; i < obj.length; i++) {
160+
var c = obj.charCodeAt(i);
161+
len += c < 128 ? 1 : ((c > 127) && (c < 2048)) ? 2 : 3;
162+
}
163+
return len;
159164
}
160165
return obj.length;
161166
}

Diff for: py/vimlfunc.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,11 @@ def viml_keys(obj):
132132

133133
def viml_len(obj):
134134
if type(obj) is str:
135-
return len(obj.encode('utf-8'))
135+
if sys.version_info < (3, 0):
136+
b = bytes(obj)
137+
else:
138+
b = bytes(obj, 'utf8')
139+
return len(b)
136140
return len(obj)
137141

138142
def viml_printf(*args):

Diff for: py/vimlparser.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,11 @@ def viml_keys(obj):
132132

133133
def viml_len(obj):
134134
if type(obj) is str:
135-
return len(obj.encode('utf-8'))
135+
if sys.version_info < (3, 0):
136+
b = bytes(obj)
137+
else:
138+
b = bytes(obj, 'utf8')
139+
return len(b)
136140
return len(obj)
137141

138142
def viml_printf(*args):

Diff for: test/test1.ok

+1
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,4 @@
5353
(let %= a 5)
5454
(let ..= a 'foo')
5555
(echo (concat (concat 'foo' 'bar') 'baz'))
56+
(let = a '🐥')

Diff for: test/test1.vim

+1
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,4 @@ let a /= 4
5858
let a %= 5
5959
let a ..= 'foo'
6060
echo ('foo' .. 'bar')..'baz'
61+
let a = '🐥'

0 commit comments

Comments
 (0)