0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

updated for version 7.2.348

Problem:    Unicode double-width characters are not up-to date.
Solution:   Produce the double-width table like the others.
This commit is contained in:
Bram Moolenaar
2010-01-27 18:29:26 +01:00
parent 0dbf720d86
commit da4d7a92d5
3 changed files with 72 additions and 30 deletions

View File

@@ -187,16 +187,27 @@ func! BuildCombiningTable()
wincmd p
endfunc
" Build the ambiguous table in a new buffer.
" Build the double width or ambiguous width table in a new buffer.
" Uses s:widthprops and s:dataprops.
func! BuildAmbiguousTable()
func! BuildWidthTable(pattern, tableName)
let start = -1
let end = -1
let ranges = []
let dataidx = 0
for p in s:widthprops
if p[1][0] == 'A'
let n = ('0x' . p[0]) + 0
if p[1][0] =~ a:pattern
if p[0] =~ '\.\.'
" It is a range. we don't check for composing char then.
let rng = split(p[0], '\.\.')
if len(rng) != 2
echoerr "Cannot parse range: '" . p[0] . "' in width table"
endif
let n = ('0x' . rng[0]) + 0
let n_last = ('0x' . rng[1]) + 0
else
let n = ('0x' . p[0]) + 0
let n_last = n
endif
" Find this char in the data table.
while 1
let dn = ('0x' . s:dataprops[dataidx][0]) + 0
@@ -205,27 +216,23 @@ func! BuildAmbiguousTable()
endif
let dataidx += 1
endwhile
if dn != n
if dn != n && n_last == n
echoerr "Cannot find character " . n . " in data table"
endif
" Only use the char when it's not a composing char.
" But use all chars from a range.
let dp = s:dataprops[dataidx]
if dp[2] != 'Mn' && dp[2] != 'Mc' && dp[2] != 'Me'
if n_last > n || (dp[2] != 'Mn' && dp[2] != 'Mc' && dp[2] != 'Me')
if start >= 0 && end + 1 == n
" continue with same range.
let end = n
else
if start >= 0
" produce previous range
call add(ranges, printf("\t{0x%04x, 0x%04x},", start, end))
endif
let start = n
if p[0] =~ '\.\.'
let end = ('0x' . substitute(p[0], '.*\.\.', '', '')) + 0
else
let end = n
endif
endif
let end = n_last
endif
endif
endfor
@@ -235,8 +242,8 @@ func! BuildAmbiguousTable()
" New buffer to put the result in.
new
file ambiguous
call setline(1, " static struct interval ambiguous[] =")
exe "file " . a:tableName
call setline(1, " static struct interval " . a:tableName . "[] =")
call setline(2, " {")
call append('$', ranges)
call setline('$', getline('$')[:-2]) " remove last comma
@@ -276,5 +283,8 @@ edit http://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt
" Parse each line, create a list of lists.
call ParseWidthProps()
" Build the ambiguous table.
call BuildAmbiguousTable()
" Build the double width table.
call BuildWidthTable('[WF]', 'doublewidth')
" Build the ambiguous width table.
call BuildWidthTable('A', 'ambiguous')