From d1f8c274f739d0847375d6e2aeac683f57f66949 Mon Sep 17 00:00:00 2001 From: Koichi Murase Date: Sat, 30 Jan 2021 21:11:10 +0800 Subject: [PATCH] canvas: update emoji database and support "bleopt emoji_version" --- blerc | 9 ++- make_command.sh | 108 ++++++++++++++++++++++++++++ memo/ChangeLog.md | 1 + note.txt | 17 +++++ src/canvas.emoji.sh | 171 ++++++++++++++++++++++++++++++++++++++++++++ src/canvas.sh | 106 +++++++++++++-------------- 6 files changed, 356 insertions(+), 56 deletions(-) create mode 100644 src/canvas.emoji.sh diff --git a/blerc b/blerc index 994c8e29..c78da215 100644 --- a/blerc +++ b/blerc @@ -271,11 +271,18 @@ #bleopt char_width_mode=auto -## "emoji_width" specifies the width of emoji characters. +## "emoji_width" specifies the width of emoji characters. If an empty value is +## specified, special treatment of emoji is disabled. #bleopt emoji_width=2 +## "emoji_version" specifies the version of Unicode Emoji. Available values +## are 1.0, 2.0, 3.0, 4.0, 5.0, 11.0, 12.0, 12.1, 13.0, and 13.1. + +#bleopt emoji_version=13.1 + + ##----------------------------------------------------------------------------- ## User input settings diff --git a/make_command.sh b/make_command.sh index bd256a9a..73a70fd7 100755 --- a/make_command.sh +++ b/make_command.sh @@ -80,6 +80,114 @@ function sub:ignoreeof-messages { ) >| lib/core-edit.ignoreeof-messages.new } +function sub:update-emoji-database { + local unicode_version=$(wget https://unicode.org/Public/emoji/ -O - | grep -Eo 'href="[0-9]+\.[0-9]+/"' a.html | sed 's,^href=",,;s,/"$,,' | tail -n 1) + local cache=out/data/unicode-emoji-$unicode_version.txt + if [[ ! -s $cache ]]; then + mkd out/data + wget https://unicode.org/Public/emoji/$unicode_version/emoji-test.txt -O "$cache.part" && + mv "$cache.part" "$cache" + fi + + local q=\' + local versions=$(gawk 'match($0, / E([0-9]+\.[0-9]+)/, m) > 0 { print m[1]; }' "$cache" | sort -Vu | tr '\n' ' ') + gawk -v versions="$versions" ' + function join(arr, sep, _, r, i, n) { + r = ""; + n = length(arr); + for (i = 1; i <= n; i++) { + if (i > 1) r = r sep; + r = r arr[i]; + } + return r; + } + + BEGIN { + split(versions, vers); + nvers = length(vers); + } + # 単一絵文字 (sequence でない) のみを登録する。 + # unqualified 絵文字を含めるかどうかは微妙だが、既存の端末は含めている気がする。 + #$3 == "fully-qualified" && match($0, / E([0-9]+\.[0-9]+)/, m) > 0 { + ($3 == "fully-qualified" || $3 == "unqualified") && match($0, / E([0-9]+\.[0-9]+)/, m) > 0 { + char_code = strtonum("0x" $1); + char_emoji_version = m[1]; + + for (i = nvers; i >= 1; i--) { + emoji_version = vers[i]; + data[emoji_version, char_code]++; + data[emoji_version, char_code + 1]++; + if (char_emoji_version == emoji_version) break; + } + + if (char_code <= 0x2000 || 0x2E80 <= char_code && char_code <= 0xA4D0) { + printf("_ble_util_c2w_except[0x%04X]=-2\n", char_code); + } else { + if (char_code < 0x10000) { + if (bmp_min == "" || char_code < bmp_min) bmp_min = char_code; + if (bmp_max == "" || char_code > bmp_max) bmp_max = char_code; + } else { + if (smp_min == "" || char_code < smp_min) smp_min = char_code; + if (smp_max == "" || char_code > smp_max) smp_max = char_code; + } + } + } + + function get_database_name(version, _, m) { + if (match(version, /^0*([0-9]+)\.0*([0-9]+)$/, m) > 0) + return sprintf("_ble_canvas_emoji_database_%04d", m[1] * 100 + m[2]); + else + return ""; + } + + function start_emoji_version(version) { + if (version == g_emoji_version) return 0; + end_emoji_version(); + g_emoji_version = version; + return 1; + } + function end_emoji_version(_, database_name, _list) { + if (g_emoji_version == "") return; + + if ((database_name = get_database_name(g_emoji_version))) { + asorti(g_emoji_list, _list, "@ind_num_asc"); + g_def_wranges[g_emoji_version] = database_name "=(" join(_list, " ") ")"; + } + + g_emoji_version = ""; + delete g_emoji_list; + } + END { + printf("_ble_canvas_emoji_expr_maybe='$q'_ble_util_c2w_except[code]==-2||%d<=code&&code<=%d||%d<=code&&code<=%d'$q'\n", bmp_min, bmp_max, smp_min, smp_max); + # printf("_ble_canvas_emoji_bmp_min=%-6d # U+%04X\n", bmp_min, bmp_min); + # printf("_ble_canvas_emoji_bmp_max=%-6d # U+%04X\n", bmp_max, bmp_max); + # printf("_ble_canvas_emoji_smp_min=%-6d # U+%04X\n", smp_min, smp_min); + # printf("_ble_canvas_emoji_smp_max=%-6d # U+%04X\n", smp_max, smp_max); + + n = asorti(data, boundaries); + emoji_version = ""; + for (i = 1; i <= n; i++) { + if (data[boundaries[i]] % 2 != 1) continue; + split(boundaries[i], fields, SUBSEP); + code = fields[2]; + + start_emoji_version(fields[1]); + g_emoji_list[code]++; + } + end_emoji_version(); + + for (i = 1; i <= nvers; i++) { + emoji_version = vers[i]; + if (emoji_version >= 1.0) + print g_def_wranges[emoji_version]; + } + latest_version = vers[nvers]; + print "bleopt/declare -n emoji_version " latest_version; + print "_ble_canvas_emoji_database=(\"${" get_database_name(latest_version) "[@]}\")"; + } + ' "$cache" | ifold -w 119 --spaces --no-text-justify --indent=.. > src/canvas.emoji.sh +} + #------------------------------------------------------------------------------ # sub:check # sub:check-all diff --git a/memo/ChangeLog.md b/memo/ChangeLog.md index 34fd17bc..ab882ca5 100644 --- a/memo/ChangeLog.md +++ b/memo/ChangeLog.md @@ -11,6 +11,7 @@ - complete: support new options `bleopt complete_limit{,_auto}` (contributed by timjrd) `#D1445` b13f114 5504bbc - edit (kill/copy): combine multiple kills and copies (suggested by 3ximus) `#D1443` 66564e1 - edit (`{kill,copy}-region-or`): fix unconditionally combined kills/copies (reported by 3ximus) `#D1447` 0000000 +- canvas: update emoji database and support `bleopt emoji_version` (motivated by endorfina) `#D1454` 0000000 ## Changes diff --git a/note.txt b/note.txt index d93e27dd..d843ca7f 100644 --- a/note.txt +++ b/note.txt @@ -3719,6 +3719,23 @@ bash_tips Done (実装ログ) ------------------------------------------------------------------------------- +2021-01-30 + + * edit: emoji の表を更新する (reported by endorfina) [#D1455] + https://github.com/akinomyoga/ble.sh/issues/84 + + 更新しようと思ったが現在のコードを確認すると色々工夫して高速化している。 + 少し面倒である。取り敢えずデータのダウンロードだけは行う事にする。 + + https://unicode.org/Public/emoji/ + + 色々考えて現在のコードの構造に近い形で再実装した。実は以前の実装に + はバグがあった。 + + 以前のテーブルは https://github.com/vim-jp/issues/issues/1086 から + 拾ってきた物だったが、これは 2017 年の物だったので報告のあった + flamingo の絵文字 (2018) は含まれていなかったのだ。 + 2021-01-25 * edit: change default behavior of "C-w" and "M-w" to operate on backward words (reported by 3ximus) [#D1448] diff --git a/src/canvas.emoji.sh b/src/canvas.emoji.sh new file mode 100644 index 00000000..43e65c54 --- /dev/null +++ b/src/canvas.emoji.sh @@ -0,0 +1,171 @@ +_ble_util_c2w_except[0x3030]=-2 +_ble_util_c2w_except[0x303D]=-2 +_ble_util_c2w_except[0x00A9]=-2 +_ble_util_c2w_except[0x00AE]=-2 +_ble_util_c2w_except[0x3297]=-2 +_ble_util_c2w_except[0x3299]=-2 +_ble_canvas_emoji_expr_maybe='_ble_util_c2w_except[code]==-2||8252<=code&&code<=11093||126980<=code&&code<=129750' +_ble_canvas_emoji_database_0100=(169 170 174 175 8252 8253 8265 8266 8482 8483 8505 8506 8596 8602 8617 8619 8986 8988 + 9000 9001 9167 9168 9193 9204 9208 9211 9410 9411 9642 9644 9654 9655 9664 9665 9723 9727 9728 9733 9742 9743 9745 + 9746 9748 9750 9752 9753 9757 9758 9760 9761 9762 9764 9766 9767 9770 9771 9774 9776 9784 9787 9800 9812 9824 9825 + 9827 9828 9829 9831 9832 9833 9851 9852 9855 9856 9874 9877 9878 9880 9881 9882 9883 9885 9888 9890 9898 9900 9904 + 9906 9917 9919 9924 9926 9928 9929 9934 9936 9937 9938 9939 9941 9961 9963 9968 9974 9975 9979 9981 9982 9986 9987 + 9989 9990 9992 9998 9999 10000 10002 10003 10004 10005 10006 10007 10013 10014 10017 10018 10024 10025 10035 10037 + 10052 10053 10055 10056 10060 10061 10062 10063 10067 10070 10071 10072 10083 10085 10133 10136 10145 10146 10160 + 10161 10175 10176 10548 10550 11013 11016 11035 11037 11088 11089 11093 11094 12336 12337 12349 12350 12951 12952 + 12953 12954 126980 126981 127183 127184 127344 127346 127358 127360 127374 127375 127377 127387 127489 127491 127514 + 127515 127535 127536 127538 127547 127568 127570 127744 127778 127780 127892 127894 127896 127897 127900 127902 + 127985 127987 127990 127991 127995 128000 128254 128255 128318 128329 128335 128336 128360 128367 128369 128371 + 128378 128391 128392 128394 128398 128400 128401 128405 128407 128421 128422 128424 128425 128433 128435 128444 + 128445 128450 128453 128465 128468 128476 128479 128481 128482 128483 128484 128495 128496 128499 128500 128506 + 128592 128640 128710 128715 128721 128736 128742 128745 128746 128747 128749 128752 128753 128755 128756 129296 + 129305 129408 129413 129472 129473) +_ble_canvas_emoji_database_0200=(169 170 174 175 8252 8253 8265 8266 8482 8483 8505 8506 8596 8602 8617 8619 8986 8988 + 9000 9001 9167 9168 9193 9204 9208 9211 9410 9411 9642 9644 9654 9655 9664 9665 9723 9727 9728 9733 9742 9743 9745 + 9746 9748 9750 9752 9753 9757 9758 9760 9761 9762 9764 9766 9767 9770 9771 9774 9776 9784 9787 9800 9812 9824 9825 + 9827 9828 9829 9831 9832 9833 9851 9852 9855 9856 9874 9877 9878 9880 9881 9882 9883 9885 9888 9890 9898 9900 9904 + 9906 9917 9919 9924 9926 9928 9929 9934 9936 9937 9938 9939 9941 9961 9963 9968 9974 9975 9979 9981 9982 9986 9987 + 9989 9990 9992 9998 9999 10000 10002 10003 10004 10005 10006 10007 10013 10014 10017 10018 10024 10025 10035 10037 + 10052 10053 10055 10056 10060 10061 10062 10063 10067 10070 10071 10072 10083 10085 10133 10136 10145 10146 10160 + 10161 10175 10176 10548 10550 11013 11016 11035 11037 11088 11089 11093 11094 12336 12337 12349 12350 12951 12952 + 12953 12954 126980 126981 127183 127184 127344 127346 127358 127360 127374 127375 127377 127387 127489 127491 127514 + 127515 127535 127536 127538 127547 127568 127570 127744 127778 127780 127892 127894 127896 127897 127900 127902 + 127985 127987 127990 127991 127995 128000 128254 128255 128318 128329 128335 128336 128360 128367 128369 128371 + 128378 128391 128392 128394 128398 128400 128401 128405 128407 128421 128422 128424 128425 128433 128435 128444 + 128445 128450 128453 128465 128468 128476 128479 128481 128482 128483 128484 128488 128489 128495 128496 128499 + 128500 128506 128592 128640 128710 128715 128721 128736 128742 128745 128746 128747 128749 128752 128753 128755 + 128756 129296 129305 129408 129413 129472 129473) +_ble_canvas_emoji_database_0300=(169 170 174 175 8252 8253 8265 8266 8482 8483 8505 8506 8596 8602 8617 8619 8986 8988 + 9000 9001 9167 9168 9193 9204 9208 9211 9410 9411 9642 9644 9654 9655 9664 9665 9723 9727 9728 9733 9742 9743 9745 + 9746 9748 9750 9752 9753 9757 9758 9760 9761 9762 9764 9766 9767 9770 9771 9774 9776 9784 9787 9800 9812 9824 9825 + 9827 9828 9829 9831 9832 9833 9851 9852 9855 9856 9874 9877 9878 9880 9881 9882 9883 9885 9888 9890 9898 9900 9904 + 9906 9917 9919 9924 9926 9928 9929 9934 9936 9937 9938 9939 9941 9961 9963 9968 9974 9975 9979 9981 9982 9986 9987 + 9989 9990 9992 9998 9999 10000 10002 10003 10004 10005 10006 10007 10013 10014 10017 10018 10024 10025 10035 10037 + 10052 10053 10055 10056 10060 10061 10062 10063 10067 10070 10071 10072 10083 10085 10133 10136 10145 10146 10160 + 10161 10175 10176 10548 10550 11013 11016 11035 11037 11088 11089 11093 11094 12336 12337 12349 12350 12951 12952 + 12953 12954 126980 126981 127183 127184 127344 127346 127358 127360 127374 127375 127377 127387 127489 127491 127514 + 127515 127535 127536 127538 127547 127568 127570 127744 127778 127780 127892 127894 127896 127897 127900 127902 + 127985 127987 127990 127991 127995 128000 128254 128255 128318 128329 128335 128336 128360 128367 128369 128371 + 128379 128391 128392 128394 128398 128400 128401 128405 128407 128420 128422 128424 128425 128433 128435 128444 + 128445 128450 128453 128465 128468 128476 128479 128481 128482 128483 128484 128488 128489 128495 128496 128499 + 128500 128506 128592 128640 128710 128715 128723 128736 128742 128745 128746 128747 128749 128752 128753 128755 + 128759 129296 129311 129312 129320 129328 129329 129331 129339 129340 129343 129344 129350 129351 129356 129360 + 129375 129408 129426 129472 129473) +_ble_canvas_emoji_database_0400=(169 170 174 175 8252 8253 8265 8266 8482 8483 8505 8506 8596 8602 8617 8619 8986 8988 + 9000 9001 9167 9168 9193 9204 9208 9211 9410 9411 9642 9644 9654 9655 9664 9665 9723 9727 9728 9733 9742 9743 9745 + 9746 9748 9750 9752 9753 9757 9758 9760 9761 9762 9764 9766 9767 9770 9771 9774 9776 9784 9787 9792 9793 9794 9795 + 9800 9812 9824 9825 9827 9828 9829 9831 9832 9833 9851 9852 9855 9856 9874 9880 9881 9882 9883 9885 9888 9890 9898 + 9900 9904 9906 9917 9919 9924 9926 9928 9929 9934 9936 9937 9938 9939 9941 9961 9963 9968 9974 9975 9979 9981 9982 + 9986 9987 9989 9990 9992 9998 9999 10000 10002 10003 10004 10005 10006 10007 10013 10014 10017 10018 10024 10025 + 10035 10037 10052 10053 10055 10056 10060 10061 10062 10063 10067 10070 10071 10072 10083 10085 10133 10136 10145 + 10146 10160 10161 10175 10176 10548 10550 11013 11016 11035 11037 11088 11089 11093 11094 12336 12337 12349 12350 + 12951 12952 12953 12954 126980 126981 127183 127184 127344 127346 127358 127360 127374 127375 127377 127387 127489 + 127491 127514 127515 127535 127536 127538 127547 127568 127570 127744 127778 127780 127892 127894 127896 127897 + 127900 127902 127985 127987 127990 127991 127995 128000 128254 128255 128318 128329 128335 128336 128360 128367 + 128369 128371 128379 128391 128392 128394 128398 128400 128401 128405 128407 128420 128422 128424 128425 128433 + 128435 128444 128445 128450 128453 128465 128468 128476 128479 128481 128482 128483 128484 128488 128489 128495 + 128496 128499 128500 128506 128592 128640 128710 128715 128723 128736 128742 128745 128746 128747 128749 128752 + 128753 128755 128759 129296 129311 129312 129320 129328 129329 129331 129339 129340 129343 129344 129350 129351 + 129356 129360 129375 129408 129426 129472 129473) +_ble_canvas_emoji_database_0500=(169 170 174 175 8252 8253 8265 8266 8482 8483 8505 8506 8596 8602 8617 8619 8986 8988 + 9000 9001 9167 9168 9193 9204 9208 9211 9410 9411 9642 9644 9654 9655 9664 9665 9723 9727 9728 9733 9742 9743 9745 + 9746 9748 9750 9752 9753 9757 9758 9760 9761 9762 9764 9766 9767 9770 9771 9774 9776 9784 9787 9792 9793 9794 9795 + 9800 9812 9824 9825 9827 9828 9829 9831 9832 9833 9851 9852 9855 9856 9874 9880 9881 9882 9883 9885 9888 9890 9898 + 9900 9904 9906 9917 9919 9924 9926 9928 9929 9934 9936 9937 9938 9939 9941 9961 9963 9968 9974 9975 9979 9981 9982 + 9986 9987 9989 9990 9992 9998 9999 10000 10002 10003 10004 10005 10006 10007 10013 10014 10017 10018 10024 10025 + 10035 10037 10052 10053 10055 10056 10060 10061 10062 10063 10067 10070 10071 10072 10083 10085 10133 10136 10145 + 10146 10160 10161 10175 10176 10548 10550 11013 11016 11035 11037 11088 11089 11093 11094 12336 12337 12349 12350 + 12951 12952 12953 12954 126980 126981 127183 127184 127344 127346 127358 127360 127374 127375 127377 127387 127489 + 127491 127514 127515 127535 127536 127538 127547 127568 127570 127744 127778 127780 127892 127894 127896 127897 + 127900 127902 127985 127987 127990 127991 127995 128000 128254 128255 128318 128329 128335 128336 128360 128367 + 128369 128371 128379 128391 128392 128394 128398 128400 128401 128405 128407 128420 128422 128424 128425 128433 + 128435 128444 128445 128450 128453 128465 128468 128476 128479 128481 128482 128483 128484 128488 128489 128495 + 128496 128499 128500 128506 128592 128640 128710 128715 128723 128736 128742 128745 128746 128747 128749 128752 + 128753 128755 128761 129296 129339 129340 129343 129344 129350 129351 129357 129360 129388 129408 129432 129472 + 129473 129488 129511) +_ble_canvas_emoji_database_1100=(169 170 174 175 8252 8253 8265 8266 8482 8483 8505 8506 8596 8602 8617 8619 8986 8988 + 9000 9001 9167 9168 9193 9204 9208 9211 9410 9411 9642 9644 9654 9655 9664 9665 9723 9727 9728 9733 9742 9743 9745 + 9746 9748 9750 9752 9753 9757 9758 9760 9761 9762 9764 9766 9767 9770 9771 9774 9776 9784 9787 9792 9793 9794 9795 + 9800 9812 9823 9825 9827 9828 9829 9831 9832 9833 9851 9852 9854 9856 9874 9880 9881 9882 9883 9885 9888 9890 9898 + 9900 9904 9906 9917 9919 9924 9926 9928 9929 9934 9936 9937 9938 9939 9941 9961 9963 9968 9974 9975 9979 9981 9982 + 9986 9987 9989 9990 9992 9998 9999 10000 10002 10003 10004 10005 10006 10007 10013 10014 10017 10018 10024 10025 + 10035 10037 10052 10053 10055 10056 10060 10061 10062 10063 10067 10070 10071 10072 10083 10085 10133 10136 10145 + 10146 10160 10161 10175 10176 10548 10550 11013 11016 11035 11037 11088 11089 11093 11094 12336 12337 12349 12350 + 12951 12952 12953 12954 126980 126981 127183 127184 127344 127346 127358 127360 127374 127375 127377 127387 127489 + 127491 127514 127515 127535 127536 127538 127547 127568 127570 127744 127778 127780 127892 127894 127896 127897 + 127900 127902 127985 127987 127990 127991 127995 128000 128254 128255 128318 128329 128335 128336 128360 128367 + 128369 128371 128379 128391 128392 128394 128398 128400 128401 128405 128407 128420 128422 128424 128425 128433 + 128435 128444 128445 128450 128453 128465 128468 128476 128479 128481 128482 128483 128484 128488 128489 128495 + 128496 128499 128500 128506 128592 128640 128710 128715 128723 128736 128742 128745 128746 128747 128749 128752 + 128753 128755 128762 129296 129339 129340 129343 129344 129350 129351 129393 129395 129399 129402 129403 129404 + 129443 129460 129466 129472 129475 129488 129536) +_ble_canvas_emoji_database_1200=(169 170 174 175 8252 8253 8265 8266 8482 8483 8505 8506 8596 8602 8617 8619 8986 8988 + 9000 9001 9167 9168 9193 9204 9208 9211 9410 9411 9642 9644 9654 9655 9664 9665 9723 9727 9728 9733 9742 9743 9745 + 9746 9748 9750 9752 9753 9757 9758 9760 9761 9762 9764 9766 9767 9770 9771 9774 9776 9784 9787 9792 9793 9794 9795 + 9800 9812 9823 9825 9827 9828 9829 9831 9832 9833 9851 9852 9854 9856 9874 9880 9881 9882 9883 9885 9888 9890 9898 + 9900 9904 9906 9917 9919 9924 9926 9928 9929 9934 9936 9937 9938 9939 9941 9961 9963 9968 9974 9975 9979 9981 9982 + 9986 9987 9989 9990 9992 9998 9999 10000 10002 10003 10004 10005 10006 10007 10013 10014 10017 10018 10024 10025 + 10035 10037 10052 10053 10055 10056 10060 10061 10062 10063 10067 10070 10071 10072 10083 10085 10133 10136 10145 + 10146 10160 10161 10175 10176 10548 10550 11013 11016 11035 11037 11088 11089 11093 11094 12336 12337 12349 12350 + 12951 12952 12953 12954 126980 126981 127183 127184 127344 127346 127358 127360 127374 127375 127377 127387 127489 + 127491 127514 127515 127535 127536 127538 127547 127568 127570 127744 127778 127780 127892 127894 127896 127897 + 127900 127902 127985 127987 127990 127991 127995 128000 128254 128255 128318 128329 128335 128336 128360 128367 + 128369 128371 128379 128391 128392 128394 128398 128400 128401 128405 128407 128420 128422 128424 128425 128433 + 128435 128444 128445 128450 128453 128465 128468 128476 128479 128481 128482 128483 128484 128488 128489 128495 + 128496 128499 128500 128506 128592 128640 128710 128715 128723 128725 128726 128736 128742 128745 128746 128747 + 128749 128752 128753 128755 128763 128992 129004 129293 129339 129340 129350 129351 129394 129395 129399 129402 + 129443 129445 129451 129454 129456 129460 129483 129485 129536 129648 129652 129656 129659 129664 129667 129680 + 129686) +_ble_canvas_emoji_database_1201=(169 170 174 175 8252 8253 8265 8266 8482 8483 8505 8506 8596 8602 8617 8619 8986 8988 + 9000 9001 9167 9168 9193 9204 9208 9211 9410 9411 9642 9644 9654 9655 9664 9665 9723 9727 9728 9733 9742 9743 9745 + 9746 9748 9750 9752 9753 9757 9758 9760 9761 9762 9764 9766 9767 9770 9771 9774 9776 9784 9787 9792 9793 9794 9795 + 9800 9812 9823 9825 9827 9828 9829 9831 9832 9833 9851 9852 9854 9856 9874 9880 9881 9882 9883 9885 9888 9890 9898 + 9900 9904 9906 9917 9919 9924 9926 9928 9929 9934 9936 9937 9938 9939 9941 9961 9963 9968 9974 9975 9979 9981 9982 + 9986 9987 9989 9990 9992 9998 9999 10000 10002 10003 10004 10005 10006 10007 10013 10014 10017 10018 10024 10025 + 10035 10037 10052 10053 10055 10056 10060 10061 10062 10063 10067 10070 10071 10072 10083 10085 10133 10136 10145 + 10146 10160 10161 10175 10176 10548 10550 11013 11016 11035 11037 11088 11089 11093 11094 12336 12337 12349 12350 + 12951 12952 12953 12954 126980 126981 127183 127184 127344 127346 127358 127360 127374 127375 127377 127387 127489 + 127491 127514 127515 127535 127536 127538 127547 127568 127570 127744 127778 127780 127892 127894 127896 127897 + 127900 127902 127985 127987 127990 127991 127995 128000 128254 128255 128318 128329 128335 128336 128360 128367 + 128369 128371 128379 128391 128392 128394 128398 128400 128401 128405 128407 128420 128422 128424 128425 128433 + 128435 128444 128445 128450 128453 128465 128468 128476 128479 128481 128482 128483 128484 128488 128489 128495 + 128496 128499 128500 128506 128592 128640 128710 128715 128723 128725 128726 128736 128742 128745 128746 128747 + 128749 128752 128753 128755 128763 128992 129004 129293 129339 129340 129350 129351 129394 129395 129399 129402 + 129443 129445 129451 129454 129456 129460 129483 129485 129536 129648 129652 129656 129659 129664 129667 129680 + 129686) +_ble_canvas_emoji_database_1300=(169 170 174 175 8252 8253 8265 8266 8482 8483 8505 8506 8596 8602 8617 8619 8986 8988 + 9000 9001 9167 9168 9193 9204 9208 9211 9410 9411 9642 9644 9654 9655 9664 9665 9723 9727 9728 9733 9742 9743 9745 + 9746 9748 9750 9752 9753 9757 9758 9760 9761 9762 9764 9766 9767 9770 9771 9774 9776 9784 9787 9792 9793 9794 9795 + 9800 9812 9823 9825 9827 9828 9829 9831 9832 9833 9851 9852 9854 9856 9874 9880 9881 9882 9883 9885 9888 9890 9895 + 9896 9898 9900 9904 9906 9917 9919 9924 9926 9928 9929 9934 9936 9937 9938 9939 9941 9961 9963 9968 9974 9975 9979 + 9981 9982 9986 9987 9989 9990 9992 9998 9999 10000 10002 10003 10004 10005 10006 10007 10013 10014 10017 10018 10024 + 10025 10035 10037 10052 10053 10055 10056 10060 10061 10062 10063 10067 10070 10071 10072 10083 10085 10133 10136 + 10145 10146 10160 10161 10175 10176 10548 10550 11013 11016 11035 11037 11088 11089 11093 11094 12336 12337 12349 + 12350 12951 12952 12953 12954 126980 126981 127183 127184 127344 127346 127358 127360 127374 127375 127377 127387 + 127489 127491 127514 127515 127535 127536 127538 127547 127568 127570 127744 127778 127780 127892 127894 127896 + 127897 127900 127902 127985 127987 127990 127991 127995 128000 128254 128255 128318 128329 128335 128336 128360 + 128367 128369 128371 128379 128391 128392 128394 128398 128400 128401 128405 128407 128420 128422 128424 128425 + 128433 128435 128444 128445 128450 128453 128465 128468 128476 128479 128481 128482 128483 128484 128488 128489 + 128495 128496 128499 128500 128506 128592 128640 128710 128715 128723 128725 128728 128736 128742 128745 128746 + 128747 128749 128752 128753 128755 128765 128992 129004 129292 129339 129340 129350 129351 129401 129402 129456 + 129460 129484 129485 129536 129648 129653 129656 129659 129664 129671 129680 129705 129712 129719 129728 129731 + 129744 129751) +_ble_canvas_emoji_database_1301=(169 170 174 175 8252 8253 8265 8266 8482 8483 8505 8506 8596 8602 8617 8619 8986 8988 + 9000 9001 9167 9168 9193 9204 9208 9211 9410 9411 9642 9644 9654 9655 9664 9665 9723 9727 9728 9733 9742 9743 9745 + 9746 9748 9750 9752 9753 9757 9758 9760 9761 9762 9764 9766 9767 9770 9771 9774 9776 9784 9787 9792 9793 9794 9795 + 9800 9812 9823 9825 9827 9828 9829 9831 9832 9833 9851 9852 9854 9856 9874 9880 9881 9882 9883 9885 9888 9890 9895 + 9896 9898 9900 9904 9906 9917 9919 9924 9926 9928 9929 9934 9936 9937 9938 9939 9941 9961 9963 9968 9974 9975 9979 + 9981 9982 9986 9987 9989 9990 9992 9998 9999 10000 10002 10003 10004 10005 10006 10007 10013 10014 10017 10018 10024 + 10025 10035 10037 10052 10053 10055 10056 10060 10061 10062 10063 10067 10070 10071 10072 10083 10085 10133 10136 + 10145 10146 10160 10161 10175 10176 10548 10550 11013 11016 11035 11037 11088 11089 11093 11094 12336 12337 12349 + 12350 12951 12952 12953 12954 126980 126981 127183 127184 127344 127346 127358 127360 127374 127375 127377 127387 + 127489 127491 127514 127515 127535 127536 127538 127547 127568 127570 127744 127778 127780 127892 127894 127896 + 127897 127900 127902 127985 127987 127990 127991 127995 128000 128254 128255 128318 128329 128335 128336 128360 + 128367 128369 128371 128379 128391 128392 128394 128398 128400 128401 128405 128407 128420 128422 128424 128425 + 128433 128435 128444 128445 128450 128453 128465 128468 128476 128479 128481 128482 128483 128484 128488 128489 + 128495 128496 128499 128500 128506 128592 128640 128710 128715 128723 128725 128728 128736 128742 128745 128746 + 128747 128749 128752 128753 128755 128765 128992 129004 129292 129339 129340 129350 129351 129401 129402 129456 + 129460 129484 129485 129536 129648 129653 129656 129659 129664 129671 129680 129705 129712 129719 129728 129731 + 129744 129751) +bleopt/declare -n emoji_version 13.1 +_ble_canvas_emoji_database=("${_ble_canvas_emoji_database_1301[@]}") diff --git a/src/canvas.sh b/src/canvas.sh index 351526d0..a9cb96fd 100644 --- a/src/canvas.sh +++ b/src/canvas.sh @@ -34,17 +34,16 @@ function ble/arithmetic/sum { ## @bleopt char_width_mode ## 文字の表示幅の計算方法を指定します。 -## bleopt_char_width_mode=east -## Unicode East_Asian_Width=A (Ambiguous) の文字幅を全て 2 とします -## bleopt_char_width_mode=west -## Unicode East_Asian_Width=A (Ambiguous) の文字幅を全て 1 とします -## bleopt_char_width_mode=auto -## east または west を自動判定します。 -## bleopt_char_width_mode=emacs -## emacs で用いられている既定の文字幅の設定です -## 定義 ble/util/c2w+$bleopt_char_width_mode +## bleopt_char_width_mode=east +## Unicode East_Asian_Width=A (Ambiguous) の文字幅を全て 2 とします +## bleopt_char_width_mode=west +## Unicode East_Asian_Width=A (Ambiguous) の文字幅を全て 1 とします +## bleopt_char_width_mode=auto +## east または west を自動判定します。 +## bleopt_char_width_mode=emacs +## emacs で用いられている既定の文字幅の設定です +## 定義 ble/util/c2w+$bleopt_char_width_mode bleopt/declare -n char_width_mode auto -bleopt/declare -n emoji_width 2 function bleopt/check:char_width_mode { if ! ble/is-function "ble/util/c2w+$value"; then @@ -87,9 +86,11 @@ function ble/util/c2w-edit { # ---- 文字種判定 ---- -## @arr _ble_util_c2w_non_zenkaku -## 飛び地になっている全角でない文字 -_ble_util_c2w_non_zenkaku=( +## @arr _ble_util_c2w_except +_ble_util_c2w_zenkaku_min=11904 # 0x2E80 +_ble_util_c2w_zenkaku_max=42192 # 0xA4D0 +_ble_util_c2w_except=( + # 0x2E80..0xA4D0 の範囲内で飛び地になっている全角とは限らない文字 [0x303F]=1 # 半角スペース [0x3030]=-2 [0x303d]=-2 [0x3297]=-2 [0x3299]=-2 # 絵文字 ) @@ -107,7 +108,7 @@ function ble/util/c2w/.determine-unambiguous { # 以下は全角に確定している範囲 if ((code<0xFB00)); then - ((0x2E80<=code&&code<0xA4D0&&!_ble_util_c2w_non_zenkaku[code]|| + ((_ble_util_c2w_zenkaku_min<=code&&code<_ble_util_c2w_zenkaku_max&&!_ble_util_c2w_except[code]|| 0xAC00<=code&&code<0xD7A4|| 0xF900<=code|| 0x1100<=code&&code<0x1160|| @@ -122,55 +123,45 @@ function ble/util/c2w/.determine-unambiguous { fi } -## @arr _ble_util_c2w_emoji_wranges -## -## https://github.com/vim-jp/issues/issues/1086 にある表を -## 以下の関数で加工した。 +## @var _ble_canvas_emoji_expr_maybe +## @arr _ble_canvas_emoji_database +## @arr _ble_canvas_emoji_database_???? +## @bleopt emoji_version ## -## function process { -## local begin=$1 end=$(($2+1)) -## printf ' %s %s' "$begin" "$end" -## } +## ファイル src/canvas.emoji.sh は以下のコマンドで生成する。 +## $ ./make_command.sh update-emoji-database ## -_ble_util_c2w_emoji_wranges=( - 8252 8253 8265 8266 8482 8483 8505 8506 8596 8602 8617 8619 8986 8988 - 9000 9001 9167 9168 9193 9204 9208 9211 9410 9411 9642 9644 9654 9655 - 9664 9665 9723 9727 9728 9733 9742 9743 9745 9746 9748 9750 9752 9753 - 9757 9758 9760 9761 9762 9764 9766 9767 9770 9771 9774 9776 9784 9787 - 9792 9793 9794 9795 9800 9812 9824 9825 9827 9828 9829 9831 9832 9833 - 9851 9852 9855 9856 9874 9880 9881 9882 9883 9885 9888 9890 9898 9900 - 9904 9906 9917 9919 9924 9926 9928 9929 9934 9936 9937 9938 9939 9941 - 9961 9963 9968 9974 9975 9979 9981 9982 9986 9987 9989 9990 9992 9998 - 9999 10000 10002 10003 10004 10005 10006 10007 10013 10014 10017 10018 - 10024 10025 10035 10037 10052 10053 10055 10056 10060 10061 10062 10063 - 10067 10070 10071 10072 10083 10085 10133 10136 10145 10146 10160 10161 - 10175 10176 10548 10550 11013 11016 11035 11037 11088 11089 11093 11094 - # 12336 12337 12349 12350 12951 12952 12953 12954 これらは特別に処理する。 - 126980 126981 - 127183 127184 127344 127346 127358 127360 127374 127375 127377 127387 - 127462 127488 127489 127491 127514 127515 127535 127536 127538 127547 - 127568 127570 127744 127778 127780 127892 127894 127896 127897 127900 - 127902 127985 127987 127990 127991 128254 128255 128318 128329 128335 - 128336 128360 128367 128369 128371 128379 128391 128392 128394 128398 - 128400 128401 128405 128407 128420 128422 128424 128425 128433 128435 - 128444 128445 128450 128453 128465 128468 128476 128479 128481 128482 - 128483 128484 128488 128489 128495 128496 128499 128500 128506 128592 - 128640 128710 128715 128723 128736 128742 128745 128746 128747 128749 - 128752 128753 128755 128761 129296 129339 129340 129343 129344 129350 - 129351 129357 129360 129388 129408 129432 129472 129473 129488 129511) +#%< canvas.emoji.sh + +bleopt/declare -n emoji_width 2 + +function bleopt/check:emoji_version { + local rex='^0*([0-9]+)\.0*([0-9]+)$' + if ! [[ $value =~ $rex ]]; then + ble/util/print "bleopt: Invalid value for emoji_version: '$value'." >&2 + return 1 + fi + + local src + ble/util/sprintf src _ble_canvas_emoji_database_%04d $((BASH_REMATCH[1]*100+BASH_REMATCH[2])) + if ! ble/is-array "$src"; then + ble/util/print "bleopt: Unsupported emoji_version '$value'." >&2 + return 1 + fi + + builtin eval -- "_ble_canvas_emoji_database=(\"\${$src[@]}\")" + return 0 +} ## @fn ble/util/c2w/is-emoji code ## @param[in] code function ble/util/c2w/is-emoji { local code=$1 - ((8252<=code&&code<=0x2b55||0x1f004