scrapboxにおける単語単位のcursor移動
scrapboxでは、以下の函数splitWord()を単語単位のcursor移動に使っている
assets/index.jsを関連する文字列で検索して色々たどって特定したtakker.icon
正規表現
スペースとハイフン: /^[\s-]+$/
英数字: /^[0-9a-zA-Z\u00C0-\u024F_]+$/
[\u00C0-\u024F]は以下の文字集合
ラテン1補助http://www.asahi-net.or.jp/~ax2s-kmtn/ref/unicode/u0080.html
ラテン文字拡張A
ラテン文字拡張B
code:js
const chars = [];
for (let i = 0x00c0; i <= 0x024f; i++) {
chars.push(String.fromCodePoint(i));
}
alert(JSON.stringify(chars));
キリル文字: /^[\u0400-\u04F0\u0500-\u052F\u2DE0-\u2DFF\uA640-\uA690]+$/
キリル文字
拡張キリル文字の一部とニヴフ語用追加は何故か除かれている
キリル文字補助
キリル文字拡張A (古代教会スラブ合成可能文字)
キリル文字拡張B
正規表現の部分だけ、ここから拝借させていただくか。
Unicode property escapesで指定した方が短く書けそう
code:js
function charType(n) {
for (var [i,
s]of Object.entries({
space: /^\s-+$/,
alphabet_number: /^0-9a-zA-Z\u00C0-\u024F_+$/,
cyril: /^\u0400-\u04F0\u0500-\u052F\u2DE0-\u2DFF\uA640-\uA690+$/,
ascii: /^\u0021-\u007E+$/,
zenkaku_kigou: /^\u3001-\u303F+$/,
hiragana: /^\u3040-\u309F+$/,
katanaka: /^\u30A0-\u30FF+$/,
zenkaku_ascii: /^\uFF01-\uFF60+$/,
hankaku_kana: /^\uFF65-\uFF9F+$/
})) if (s.test(n)) return i;
return 'other'
}
function splitWord(n) {
var i,
s = [
],
_ = n.split(''),
w = '';
for (var P of _) {
var j = charType(P);
i && i !== j && (s.push({
str: w,
type: i
}), w = ''),
i = j,
w += P
}
return '' !== w && s.push({
str: w,
type: i
}),
s
}
#2022-01-08 18:34:08