なるべくHTML編集を避ける 

前ページで、一度「HTML表示」を開くと「LinkCard Editor」がリンクカードを認識できなくなった事例を取り上げました。 問題は改善された様ですが、今回に限らず、編集画面の JavaScriptツールにとって、「通常表示」⇄「HTML表示」の往復は問題が生じ易いところです。

 

で、この問題のきっかけになった「Amazon Item_URL」は「HTMLコード」のペーストが必要で、この操作を「通常表示」から行える様にすれば、ひとつの改善策になるはずです。

 

 

Ameba Pickで Amazon商品を紹介する事は可能ですが、商品に関する記事としては散漫に感じます。「Amazon Item_URL」で生成したリンクカードに「LinkCard Editor」を使えば、記事内容に沿ったリンクカードが編集でき、表示を自由に触れない Ameba Pick よりも有効です。

 

 

 

「Fixed Format Palette」のコードを流用 

「通常表示」からHTMLコードをペーストする操作は、「Fixed Format Palette」で実績があります。 このツールでは、貼り付けるデータは「HTMLコード」として保持していて、ペーストは「通常表示」の編集画面で行う仕様です。

 

「Amazon Item_URL」で「カード型リンク」の選択すると、クリップボードにカードの「HTMLコード」を出力します。

 

 

クリップボードの内容を「通常表示」からペーストできれば、先日の様な問題は回避でき、「HTML編集」よりも直感的な操作が可能です。「Fixed Format Palette」のコードを流用すれば、これが実現できます。

 

 

統合か独立したツールか 

「Amazon Item_URL」に、このHTMLペーストを実行するコードを統合しようかと考えましたが、「HTMLペースト」の操作はリンクカードに限らないので、独立したツールとする事にしました。

 

ツール名は「Paste ClipB ⭐」、ツールが動作する場所はアメーバの編集画面のみで、起動強化コードを使っているので「⭐」を付けています。

 

 

 

「Paste ClipB ⭐」の操作と仕様 

このツールを導入すると、「通常表示」の編集画面でクリップボードの内容をHTMLペーストする事が可能になります。「HTML表示」を開いて貼付け場所を探す手間を省けます。

 

 

基本操作 

操作は単純です。

 

● 通常表示の編集枠にキャレットを入れ「Ctrl+F10」を押すと、クリップボードの内容を「HTML表示」でペーストしたのと同様の結果になります。

 

▪ペーストはキャレットの位置で行われます。

 

▪何かの文字列や要素内にキャレットがある時は、その要素外の後方にペーストします。 これは、ペーストでキャレット位置の要素が壊される事を防ぐためです。

 

▪「Amazon Item_URL」で「カード型リンク」のコピーをした場合は、リンクカードが生成されますが、他の表示要素のHTMLコピーもペーストできます。

 

例としては「YouTube動画」や「ツイッター記事」などです。

 

 

 

こういったサイトで「埋込みコード」をコピーした後、「通常表示」の編集画面から「Ctrl+F10」でコピーして来た内容を貼り付ける事が出来ます。

 

 

 IMEのメニューが表示される場合

IMEがONになっていると、「Ctrl+F10」の押下で下の様なメニューが表示されます。

 

 

これは、環境によって異なるかも知れませんが、「漢字変換(IME)」をOFFにすれば回避できるとはいえ、いちいち手間です。

 

●「Ctrl+Shift+F10」または「Ctrl+Alt+F10」の押下で、このツールの起動を優先させる事が可能です。 これは、覚えておくと便利な方法で、このショートカットをデフォルトとして使うのがお勧めです。

 

 

Firefoxでは使えません 

現在の Firefoxは、クリップボードの内容をペーストする際に使う「Clipboard API」に対応していません。(下の赤枠)

 

 

苦労すれば他の手法が可能かも知れませんが、複雑で困難の様です。 以下に参考文献があります。

 

 

なお、Firefoxで「Paste ClipB ⭐」をインストールして「ON」にした場合は不毛なので、このツールをOFFにする様に「アラート」を表示する様にしました。

 

 

 

「Paste ClipB ⭐」を利用するには

このツールは Chrome / Edge版の拡張機能「Tampermonkey」上で動作します。

残念ですが、Firefoxは JavaScript によるクリップボードのペーストに非対応です。

以下に、このツールの導入手順を簡単に説明します。

 

❶「Tampermonkey」を導入します

◎ 使用しているブラウザに拡張機能「Tampermonkey」を導入する事が必要です。

既に「Tampermonkey」を導入している場合は、この手順 ❶ は不要です。 

拡張機能の導入については、以下のページに簡単な説明があるので参照ください。

 

 

❷「Tampermonkey」にスクリプトを登録します

◎「Tampermonkey」の「」マークの「新規スクリプト」タブを開きます。

 

 

◎「新規スクリプト」には、最初からテンプレートが記入されています。 これは全て削除して、完全に空白の編集枠に 下のコードをコピー&ペーストします。

 

〔コピー方法〕 右サイドバーの   マークのボタンを1度押してください。

 コード枠内の右クリック ➔ コード全体の選択 ➔ コピー操作 が可能になります。

 

◎ 最後に「ファイル」メニューの「保存」を押すと、ツールが使用可能になります。

 

 

〔 Paste ClipB ⭐ 〕 ver.0.1

 

// ==UserScript==
// @name          Paste ClipB ⭐
// @namespace  http://tampermonkey.net/
// @version      0.1
// @description  編集枠(通常表示)でクリップボードのHTMLデータを記入「Ctrl+F10」
// @author       Ameba Blog User
// @match        https://blog.ameba.jp/ucs/entry/srventry*
// @exclude      https://blog.ameba.jp/ucs/entry/srventrylist.do*
// @grant         none
// ==/UserScript==


let retry=0;
let interval=setInterval(wait_target, 100);
function wait_target(){
    retry++;
    if(retry>10){ // リトライ制限 10回 1sec
        clearInterval(interval); }
    let target=document.getElementById('cke_1_contents'); // 監視 target
    if(target){
        clearInterval(interval);
        main(); }}



function main(){
    let ua=0;
    let editor_iframe;
    let iframe_doc;
    let iframe_html;

    check_firefox();

    let target=document.getElementById('cke_1_contents'); // 監視 target
    let monitor=new MutationObserver(catch_key);
    monitor.observe(target, {childList: true}); // ショートカット待受け開始

    catch_key();

    function catch_key(){
        if(ua==0){
            editor_iframe=document.querySelector('.cke_wysiwyg_frame');
            if(editor_iframe){ // iframe がある「通常表示」の場合
                iframe_doc=editor_iframe.contentWindow.document;
                if(iframe_doc){
                    iframe_doc.addEventListener("keyup", check_key); }

                function check_key(event){
                    if(event.ctrlKey && event.keyCode==121){ //「Ctrl+F10」クリップボードを貼付
                        event.preventDefault();
                        setTimeout(()=>{
                            write_in(); }, 20); } } // check_key()
            } //「通常表示」の場合

            else{ //「HTML表示」の場合
                document.addEventListener("keyup", check_key_h);

                function check_key_h(event){
                    if(event.ctrlKey && event.keyCode==121){ // HTML表示で貼付操作をした場合
                        event.preventDefault();
                        event.stopImmediatePropagation();
                        setTimeout(()=>{
                            alert(
                                " ⛔ ペーストは通常編集枠で行ってください\n"+
                                "         == Paste Clipboard =="); }, 20); } }
            } //「HTML表示」の場合

        }} // catch_key



    function write_in(){
        let selection=iframe_doc.getSelection();
        let range;
        if(selection && selection.rangeCount>0){
            range=selection.getRangeAt(0); }
        let ac_node=selection.anchorNode;

        let insert_node_d=iframe_doc.createElement('div');
        insert_node_d.setAttribute('id', 'p_clip');

        if(ac_node && ac_node.parentNode){
            // insert_node_d 生成の条件 親が div要素か BODYの場合
            if(ac_node.parentNode.tagName=='DIV' ||
               ac_node.parentNode.tagName=='BODY'){
                ac_node.parentNode.insertBefore(insert_node_d, ac_node.nextSibling);
                d_before_after(insert_node_d); }
            // insert_node_d 生成の条件 ひとつ外の親が div要素か BODYの場合
            else if(ac_node.parentNode.parentNode.tagName=='DIV' ||
                    ac_node.parentNode.parentNode.tagName=='BODY'){
                ac_node.parentNode.parentNode.insertBefore(
                    insert_node_d, ac_node.parentNode.nextSibling);
                d_before_after(insert_node_d); }}

        let core=iframe_doc.querySelector('#p_clip');
        if(core){
            if(navigator.clipboard){
                navigator.clipboard.readText()
                    .then(function(text){
                    core.outerHTML=text; }); }}


        function d_before_after(insert_node_d){
            if(insert_node_d==insert_node_d.parentNode.firstChild ||
               insert_node_d.previousElementSibling.firstChild.tagName !='BR'){
                insert_node_d.insertAdjacentHTML('beforebegin', '<p>\u00A0</p>'); }
            if(insert_node_d.nextElementSibling==null ||
               insert_node_d.nextElementSibling.firstChild.tagName !='BR'){
                insert_node_d.insertAdjacentHTML('afterend', '<p>\u00A0</p>'); }
            range.collapse(); } // 生成したdiv要素の前後に空白行追加

    } // write_in()



    function check_firefox(){
        let agent=window.navigator.userAgent.toLowerCase();
        if(agent.indexOf('firefox') > -1){
            ua=1;
            alert(
                "⛔  Firefoxではこのツールは利用できません\n"+
                "  Tampermonkey のダッシュボードを開き\n"+
                "  「Pasre ClipB」 をOFFにしてください。");

        }} // Firefoxの場合の警告表示

} // main()


 

 

 

「Paste ClipB ⭐」最新版について 

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

 

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