長さゼロのユニコード文字を使用して、問題を自分で解決することができました。
3 つの文字\u200B
(ゼロ幅スペース、ZWSP)、\u200C
(ゼロ幅非ジョイナー、ZWNJ)、および\u200D
(ゼロ幅ジョイナー、ZWJ) は、非表示にする必要がある制御文字です。曖昧さを解消するための境界指標として ZWSP を選択し、バイナリとして ZWNJ0
およびバイナリとして ZWJ を選択しまし1
た。PHP では、これはアノテーション ID のエンコードが次の$nr
ように行われることを意味します。
$binnr = decbin($nr);
$annotation = "​";
for($i=0; $i<strlen($binnr); $i++)
$annotation .= 'Ȁ'.($binnr{$i}=="0"?"c":"d").';';
$annotation .= '​';
おそらく、html エンティティの代わりに実際の文字を使用する方がよいでしょう。だから私たちは必要です
return html_entity_decode($annotation, ENT_NOQUOTES, 'UTF-8');
これらの ID に属するメタデータを別の配列に収集し、ページ ヘッドに配置します。次に、ストーリーの JavaScript 側で、DOM ツリーでエンコードされた注釈が検索されます。
function parse_numbers(text)
{
read = false;
nrs = []; nr = 0;
for(var i=0; i<text.length; i++)
{
if(text[i] == "\u200B") {
read = !read;
if(!read) {
nrs.push(nr);
nr = 0;
}
} else if(text[i] == "\u200C") {
nr <<= 1;
} else if(text[i] == "\u200D") {
nr <<= 1; nr++;
}
}
return nrs;
}
function buttons_recursive(node, insert)
{
nrs = [];
switch(node.nodeType)
{
case 1: //ELEMENT_NODE:
for(var i=0; i<node.attributes.length; i++) {
nrs.concat(buttons_recursive(node.attributes[i], false));
}
var new_insert = insert;
if(node.nodeName == "BUTTON" || node.nodeName == "A") {
new_insert = false;
}
for(var i=0; i<node.childNodes.length; i++) {
nrs.concat(buttons_recursive(node.childNodes[i], new_insert));
}
break;
case 2: //ATTRIBUTE_NODE:
nrs = parse_numbers(node.value);
break;
case 3: //TEXT_NODE:
nrs = parse_numbers(node.nodeValue);
break;
default:
return [];
}
if(insert) {
for(var i=nrs.length-1; i>=0; i--) {
node.parentNode.insertBefore(create_inline_button(nrs[i]), node.nextSibling);
}
return [];
} else {
return nrs;
}
}
実行することによって
buttons_recursive(document.body, true);
この関数create_inline_button
は、指定された識別子でテキストの翻訳を開始するコントロール要素を作成する必要があります。