Win10のタッチキーボードで入力出来ない「異体字」の絵文字

アメブロの記事を見て歩いていたら、警告マークの「⚠️」を使っている方がいました。 私は「エッ!」と思ったのですが、Win10タッチキーボードで入力すると文字に色が無い「⚠」が表示され、これまで何度も使うのを諦めていたからです。

 

画像を使ったアメブロ絵文字の場合も有り得るので DevToolsで調べると、これは真正の「絵文字」(フォント)でした。 アメブロの「編集画面」にコピーすると、ちゃんとこの記事の通りにカラーで表示されます。

 

   Unicode文字ツール 

 

のページに持ち込んで調べると、この絵文字の正体が判って来ました。

 

 

文字の基本コードは両方「\u26A0」ですが、カラー絵文字の方は「\uFE0F」という「異字体セレクタ」が付いて、これが「1文字」として扱われています。

 

Win10で表示される「異字体」で、絵文字のものを私が確認したのは、これが3個目です。 他の2個は男女のバスケ選手の絵文字で、以下のページに載せています。

 

  「Both-WH」絵文字対策の修正 5 

 

「異字体」の絵文字は他にも有るかも知れませんが、Win10の環境では直接入力が出来ず、簡単に表示させるにはコピー&ペーストするしかありません。 これを使っていた方は、Macなどのユーザーでしょうか。「⚠️」の絵文字はIMEに辞書登録できるので、私は登録しておきました。

 

HTMLに文字コードを書き込んで「異体字」を表示

HTML編集画面で文字コードを入力する事で「異体字」も表示可能でした。 上記の「Unicode文字ツール」でエンコードの種類に「HTML数値文字参照(16進数表記)」を選択すると

 

   ⚠️ ➔ 「 ⚠️ 」

 

という16進数表記が得られ、これをHTML編集枠にペーストすると、「異体字」のこの絵文字も表示させる事が出来ました。 面白いのは「通常表示」から「HTML表示」に戻ると、16進数表記は無くなり絵文字に入れ替わっています。 素粒子みたい。

 

 

「Both-WH」の絵文字フィルターを修正しました

そもそも「異体字」の文字を知ったのは、編集ツール「Both-WH」の制作が契機です。 Win10絵文字の一部の文字が行内にあると、スクリプトが「通常表示」「HTML表示」を繋ぐマーク文字の位置を誤ります。 このため、特殊な一部の絵文字が含まれていると警告する仕組みです。 この特殊絵文字フィルターに「⚠️」を追加しました。

 

「Both-WH」は、「通常表示」で編集中のカーソル位置から、「HTML表示」の編集位置へジャンプを可能にするツールです。 HTML編集を頻繁に使う場合には大変に便利なツールで、パワーユーザーにはお勧めです。 

 

 

この機会に「Both-WH」を改めて紹介しておきます。

 

 

「Both-WH」について

●「Both-WH」は Chrome版またはFirefox版の「Tampermonkey」に登録することで、利用が可能な編集ツールです。

 

● アメブロの「最新版エディタ」で動作します。 アメブロデフォルトデザインの編集画面でも、Stylus等でアレンジした編集画面でも動作します。

 

●「通常表示」のカーソル位置で「Ctrl + F8」を押すと、「HTML表示」を開いて、編集していた箇所にカーソルを自動的に表示します。

 

●「HTML表示」で「Ctrl + F8」を押すと、ショートカットで最後に離れた「通常表示」の位置を表示します。 但し、戻った通常表示枠にはカーソルを入れません。 これは、ショートカット連打によるミスを防ぐためです。

 

● 通常の記事では、HTMLへ1sec以内に移動出来ます。 ただし、アフィリエイト等のリンクを多く配置したページでは、文字数が見た目より異常に多く、HTML表示を開くのに数秒必要な場合があります。 また、記事が長く、移動場所が文書の最後に近いほど「HTML表示」を開くタイミングが遅くなりますが、これは仕様です。

 

● 移動元の行中(正確にはp段落)に一部のWin10絵文字が使われている場合は、移動前に「マーク文字を手作業で消してください」と表示されます。 移動後のHTML編集枠で、全角黒のマーク文字を削除してください。

 

● 特殊な構造のブロック等から移動した場合は、正常に移動出来ない場合があります。 その場合は全角黒のマーク文字が残り、周辺の1文字が不本意に削除されます。 重要な文書でのトラブルは、自己責任とお考えください。

 

 

スクリプトのコード

以下のコードを「Tampermonkey」の編集画面にコピー&ペーストしてください。

 

〔 Both-WH 〕 ver. 0.3

// ==UserScript==
// @name         Both-WH
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  絵文字フィルター更新版
// @author       Ameba Blog User
// @match        https://blog.ameba.jp/ucs/entry/srventry*
// @grant        none
// ==/UserScript==


( window.onload = function() {
    'use strict';

var native_line; // 通常表示のスクロール位置

var target = document.getElementById('cke_1_contents'); // 監視 target は3箇所で共用される
var monitor1 = new MutationObserver( catch_key );
monitor1.observe(target, {childList: true}); // ショートカット待受け開始

catch_key();

function catch_key() {

if( document.querySelector('.cke_wysiwyg_frame') != null ){
var editor_iframe = document.querySelector('.cke_wysiwyg_frame');
var iframe_doc = editor_iframe.contentWindow.document;

iframe_doc.addEventListener("keydown", check_key);
function check_key(event){
    if (event.which == 17 || event.ctrlKey == true ) {
    if (event.which == 119 || event.keyCode == 119) { set_mark(); }}}

var set_mark = function() {

var selection = iframe_doc.getSelection();
var range = selection.getRangeAt(0);
var insert_node = iframe_doc.createTextNode("█"); // U+2588 Full Glock
range.insertNode( insert_node ); // カーソル位置にマーク文字を書き込む

var wysiwyg = iframe_doc.querySelector('html');
native_line = wysiwyg.scrollTop; // 通常表示のスクロール位置を記録

document.querySelector('button[data-mode="source"]').click( in_CodeMirror() ); // HTML表示に移動

function in_CodeMirror() {
    var monitor2 = new MutationObserver( task_CodeMirror );
    monitor2.observe(target, {childList: true});

function task_CodeMirror() {

function key_in( key_Code ) {
    var keyEvent = new KeyboardEvent("keydown", { keyCode: key_Code });
    document.querySelector('.CodeMirror textarea').dispatchEvent( keyEvent ); }

var activeline;
var mark_regex = RegExp( "█" );

var line_count=0;
for( var j=0; j<3000; j++ ) {
    activeline = document.querySelector('.CodeMirror-activeline pre');
    if( mark_regex.test( activeline.textContent ) != true ){ line_count +=1; key_in(40); }
    else { break; }} // アクティブ行を下方へ移動

var zero_pattern = [
    '\uD83C\uDFC3','\uD83C\uDFC4','\uD83C\uDFCA','\uD83C\uDFCB',
    '\uD83C\uDFCC','\uD83C\uDFF3','\uD83D\uDC31','\uD83D\uDC41',
    '\uD83D\uDC68','\uD83D\uDC69','\uD83D\uDC6E','\uD83D\uDC6F',
    '\uD83D\uDC71','\uD83D\uDC73','\uD83D\uDC81','\uD83D\uDC86',
    '\uD83D\uDC87','\uD83D\uDE45','\uD83D\uDE46','\uD83D\uDE47',
    '\uD83D\uDE4B','\uD83D\uDE4D','\uD83D\uDE4E','\uD83D\uDEA3',
    '\uD83D\uDEB4','\uD83D\uDEB5','\uD83D\uDEB6','\uD83E\uDD26',
    '\uD83E\uDD37','\uD83E\uDD38','\uD83E\uDD39','\uD83E\uDD3C',
    '\uD83E\uDD3D','\uD83E\uDD3E','\uD83E[\uDDD6-\uDDDF]',
    '\u0023\uFE0F\u20E3',
    '[\u002A]\uFE0F\u20E3',
    '[\u0030-\u0039]\uFE0F\u20E3',
    '\u26F9\uFE0F','\u26A0\uFE0F'
    ].join('|');

var zero_regex = RegExp( zero_pattern );
var zero_stop=0;
if( zero_regex.test( activeline.textContent ) == true ){
    alert("記入されたマーク文字 █ を手作業で削除してください");
    zero_stop=1; }

var real = activeline.textContent.match(/./ug);
var real_result =0;
for( var k=0; k <=real.length; k++) {
   if( real[k] !="█" ){ real_result += 1; }
   else if( real[k] =="█" ){ break;} }

real_result -= 3*( activeline.getElementsByClassName('cm-tab').length ); // タブ文字補正

for( var i=0; i <= real_result; i++) { key_in(39); } // アクティブ行内で右方へ移動

if( zero_stop ==1 ){ key_in(37); }
else{ key_in(8); }


var codemirror_scroll = document.querySelector('.CodeMirror-scroll');
var win_height = codemirror_scroll.clientHeight;
var styles = getComputedStyle( document.querySelector('.cm-bracket') );
var line_height = parseFloat( styles.lineHeight );
var scroll =0;
if( line_count*line_height >= 0.4*win_height ){
    if( line_count*line_height >= win_height ){ scroll = 0.6*win_height; }
    else { scroll = line_count*line_height - 0.4*win_height; } }
codemirror_scroll.scrollTop += scroll;

document.querySelector('.CodeMirror textarea').focus(); // 入力窓にカーソルを入れる

monitor2.disconnect(); } // task_CodeMirrorの終了で監視ループを抜ける
} // in_CodeMirror
} // set_mark
} // WYSIWYG表示での場合


else if( document.querySelector('.CodeMirror') != null ) {

document.querySelector('.CodeMirror').addEventListener("keydown", function (event) {
    if (event.which == 17 || event.ctrlKey == true ) {
    if (event.which == 119 || event.keyCode == 119) { to_native_line(); }}} );

var to_native_line = function() {

document.querySelector('button[data-mode="wysiwyg"]').click( in_wysiwyg() ); // 通常表示に移動

function in_wysiwyg() {
    var monitor3 = new MutationObserver( task_wysiwyg );
    monitor3.observe( target, { childList: true });

task_wysiwyg();

function task_wysiwyg() {

if( document.querySelector('.cke_wysiwyg_frame') !=null ) {
    editor_iframe = document.querySelector('.cke_wysiwyg_frame');
    iframe_doc = editor_iframe.contentWindow.document;
    var wysiwyg = iframe_doc.querySelector('html');

wysiwyg.scrollTop = native_line; // 記録された通常表示のスクロール位置に移動

if( wysiwyg.scrollTop ==native_line ) {
    monitor3.disconnect(); }} } // task_wysiwyg の終了で監視ループを抜ける

} // in_wysiwyg
} // to_native_line
} // HTML表示での場合

} // catch_key

})();

 

 

上記のコードは、ショートカットキーに「Ctrl + F8」を利用しています。

コード中の「2ヵ所の太字部」のコードを書き換える事で、ショートカットキーを変更出来ます。

 

 

 

「Both-WH ⭐」最新版について 

旧いバージョンの JavaScriptツールは、アメーバのページ構成の変更で動作しない場合があり、導入する場合は最新バージョンをお勧めします。

 

●「Both-WH ⭐」の最新バージョンへのリンクは、以下のページのリンクリストから探せます。