Firfoxに対応しました 

PCでアメブロの編集画面を開いた場合、Chromeでアクセスした場合と Firefoxでアクセスした場合とで、表面上は違いはありません。 しかしブラウザが違うと色々な部分で表示や動作が異なり、ウェブプログラムはその違いを改善しています。

 

「アメブロ最新版エディタ」はその様な対策の結果、Chromeと Firefoxで編集アイコンの「id名」の連番が異なります。 メンテナンスを考えると「まさか」と思わせる違いですが、何か理由があるのでしょう。

 

「Blog Table ⭐」は「文字背景色」のアイコンを利用しているので、この部分は Chrome / Firefox 両対応のコードに改め、Firefoxでも使える様にしました。

 

 

 

Firefoxのinput要素 

Firefoxファンの方に叱られるかもしれませんが、input要素のデザインは Chromeの方が綺麗でサイズ・配置上で扱い易いと思います。

 

 

 

調整をして、入力枠やボタンのデザインをなんとか整えています。 input要素を全て看板と実体に分ければ、統一したデザインにする事が出来ますが、コードがファットになるので、この程度で妥協しています。

 

 

 

カラーコードの入力判定 

「Blog Table ⭐」には、「枠線色」「最上行背景色」「全体背景色」の3個のカラーコードの入力枠があります。 ここに記入した文字列は、以下の「XXXXXXX」の部分に代入されて、各パーツの色に反映します。

 

border: 1px solid XXXXXXX ;  // 枠線色の指定
background-color: XXXXXXX ; // 背景色の指定

 

このコードが正しく機能するためには、「XXXXXXX」はカラーコードの書式に合致している必要があります。 間違った入力はスクリプトエラーにはなりませんが、色指定が無効となり、設定箇所が無色の「table表」が生成されます。

 

前ページのコードは一応は使えますが、間違ったカラーコードの入力をしても、以前の設定色が入力枠右に表示されたままになりました。 このインターフェイスでは、コードの間違いに気付かない可能性があり、今回これを改善しました。

 

 

正しいカラーコードを判定する関数 

ネットを調べると、以下のコードが多数ヒットします。 入力枠の文字列がカラーコードの規則に適合するかを「正規表現検索」でチェックするコードです。

 

function test_color(color){
    return color.match(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/)!==null; }

 

この関数の引数「color」に調べたい文字列を入れると、適合コードなら「true」、不適合なコードなら「false」が戻ります。 従って、上の関数を登録して置けば、以下のコードで適合/不適合を分岐できます。

 

if(test_color(color)){
    ~ colorが適合していたら ~ }
else{
    ~ colorが不適合なら ~ } 

 

 

実装した色指定入力枠のデザイン 

上記の関数の導入して、不適合なカラーコードが入力された場合は、入力枠に黒枠線を表示する様にしました。 また、カラーコードが無効な場合は、入力枠の右隅の色表示は白(色指定なし)になります。

 

以下に実際の入力と判定例を示します。

 

◎ 正しいカラーコードの場合、入力枠の右隅にコードの色を表示します。

 

 

◎ 3桁の簡略書式も、正しいコードなら右隅にコードの色が表示されます。

 

 

◎ 大文字/小文字/その混在が許可され、問題はありません。

 

 

◎ 不適合の文字列の場合、入力枠に黒枠を表示し、右隅の色の表示が無くなります。

下はカラーコードには有り得ない「G」の文字に置換えたものです。

 

 

◎ 下は「#」を忘れた場合で、やはり不適合なコードとして黒枠になります。

 

 

◎ チェックコードは、「#+3桁」「#+6桁」の16進表記のみを正常と判定しますが、実際のスクリプトコードは「red」「black」などの「カラー名」の指定でも動作します。 更に「RGB値」の指定でも問題なく動作します。

 

このため、入力枠に「red」と指定した場合、入力枠が下の様に「黒枠」に変わりますが、生成される「table表」には正しく「赤」が反映します。

 

 

「黒枠」は、あくまで入力ミスの注意喚起の機能で、入力枠の右隅に表示される色が配色の結果になります。

 

 

 

「Blog Table ⭐」 ver. 0.2

このツールは Chrome / 新Edge / Firefox の「Tampermonkey」上で動作します。

 

●「Tampermonkey」の導入手順は、以下のページを参照ください。

 

 

●「Tampermonkey」の新規スクリプトの作成画面を開き、あらかじめ記入されている内容を完全にクリアしてください。 空白になった作成画面に、以下のコードをコピー&ペーストして保存する事で、このツールを利用する事が出来ます。

 

〔コピー方法〕 軽量シンプルなツール「PreBox Button   」を使うと

  コード枠内を「Ctrl+左Click」➔「Copy code 」を「左Click」

  の操作で、掲載コードのコピーが可能になります。

 

 

〔 Blog Table ⭐ 〕  ver. 0.2

 

// ==UserScript==
// @name          Blog Table ⭐
// @namespace    http://tampermonkey.net/
// @version       0.2
// @description  編集画面上にtable表を作成する
// @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; // Chromeの場合のフラグ
    let agent=window.navigator.userAgent.toLowerCase();
    if(agent.indexOf('firefox') > -1){ ua=1; } // Firefoxの場合のフラグ


    let table_width='100%';

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

    catch_key();

    function catch_key(){
        let header_link=document.querySelector('.l-gHeaderLeft__link a');
        if(header_link){ // 起動を「トップページ」アイコンに表示 📛
            header_link.style.boxShadow='inset -14px 0 0 0 #79fbf6'; }


        if(document.querySelector('.cke_wysiwyg_frame') !=null){ //「通常表示」から実行開始
            let editor_iframe=document.querySelector('.cke_wysiwyg_frame');
            let iframe_doc=editor_iframe.contentWindow.document;

            iframe_doc.addEventListener('keydown', check_key);
            function check_key(event){
                let gate=-1;
                if(event.ctrlKey==true){
                    if(event.keyCode==112){
                        event.preventDefault(); gate=1; }
                    if(gate==1){
                        event.stopImmediatePropagation();
                        do_task(); }}}

            function do_task(){
                let t_panel=document.querySelector('#t_panel');
                if(!t_panel){
                    table_panel();
                    excite_icon(1);
                    makeTable(); }
                else if(t_panel){
                    excite_icon(0);
                    t_panel.remove(); }}
        }} // catch_key()


    function table_panel(){
        let panel=document.createElement('div');
        panel.setAttribute('id', 't_panel');

        panel.innerHTML=
            '<span class="t_label">列数</span>'+
            '<input id="col" type="number" min="1" value="1">'+
            '<span class="t_label">行数</span>'+
            '<input id="row" type="number" min="1" value="1">'+
            '<input id="wide" type="submit" value="◁表幅▷">'+
            '<span class="t_label">枠線幅</span>'+
            '<input id="border_width" type="number" min="-1" value="1">'+
            '<span class="t_label">色</span>'+
            '<input id="border_color" type="text"  value="#999">'+
            '<span class="t_label">最上行背景色</span>'+
            '<input id="header_back" type="text" value="#F4F4F4">'+
            '<span class="t_label">全体背景色</span>'+
            '<input id="cell_back" type="text" value="#FFF">'+
            '<span class="t_label">文字サイズ</span>'+
            '<input id="t_font" type="number" min="12" max="32" value="16">'+
            '<input id="set" type="submit" value="表作成">';

        let css=
            '#t_panel { position: fixed; top: 15px; left: calc(50% - 490px); width: 948px; '+
            'padding: 6px 15px; font-size: 14px; border: 1px solid #ccc; '+
            'border-radius: 4px; background: #eff5f6; z-index: 10; }'+
            '#t_panel input { margin-right: 10px; padding-top: 2px; }'+
            '.t_label { margin: 0 3px 0 0; }'+
            '#col, #row, #border_width, #t_font { width: 36px; text-align: center; }'+
            '#border_color, #header_back, #cell_back { width: 66px; padding: 2px 8px 0 2px; '+
            'border: thin solid #aaa; height: 23px; }'+
            'input#border_width { margin-right: 2px; }'+
            'input#set { margin: 0 0 0 -20px; padding: 2px 4px 0; '+
            'box-shadow: inset 0 0 0 20px #fd4; float: right; }';

        if(ua==1){
            css=css +
                '#col, #row, #border_width, #t_font { height: 23px; border: thin solid #aaa; }'+
                'input#set { margin: 1px 0 0 -20px; padding: 3px 4px 1px; '+
                'border: thin solid #aaa; }'; }

        let style=document.createElement('style');
        style.innerHTML=css;
        panel.appendChild(style);

        document.querySelector('.l-body').appendChild(panel); }


    function excite_icon(n){
        if(ua==0){
            let label=document.querySelector('#cke_16_label.cke_button__markercolor_label');
            let button=document.querySelector('#cke_17.cke_button__markercolorgenerator');
            if(n==1){
                label.style.height='17px';
                button.style.width='20px'; }
            else{
                label.style.height='3px';
                button.style.width='11px'; }}
        else if(ua==1){
            let label=document.querySelector('#cke_15_label.cke_button__markercolor_label');
            let button=document.querySelector('#cke_16.cke_button__markercolorgenerator');
            if(n==1){
                label.style.height='17px';
                button.style.width='20px'; }
            else{
                label.style.height='3px';
                button.style.width='11px'; }}}


    function get_color(){
        let set_color;

        if(ua==0){
            let icon=document.querySelector('#cke_16');
            let color_label=document.querySelector('#cke_16_label');
            icon.addEventListener('click', function(){
                set_color=color_label.getAttribute('data-color'); }); }
        else if(ua==1){
            let icon=document.querySelector('#cke_15');
            let color_label=document.querySelector('#cke_15_label');
            icon.addEventListener('click', function(){
                set_color=color_label.getAttribute('data-color'); }); }


        let color_input=document.querySelectorAll('#t_panel input[type="text"]');
        for(let k=0; k<color_input.length; k++){
            copy_color(k); }

        function copy_color(k){
            color_input[k].onclick=function(event){
                if(event.ctrlKey==true){
                    event.preventDefault();
                    color_input[k].value='#'+ set_color;
                    color_input[k].style.boxShadow='inset -8px 0 ' + color_input[k].value; }}

            color_input[k].onkeydown=function(event){
                if(event.keyCode==13){
                    event.preventDefault();
                    if(test_color(color_input[k].value)){
                        color_input[k].style.boxShadow='inset -8px 0 ' + color_input[k].value; }
                    else{
                        if(color_input[k].value==''){
                            color_input[k].style.boxShadow='inset 0 0 0 1px black'; }
                        else{
                            color_input[k].style.boxShadow='inset 0 0 0 1px black';
                            color_input[k].style.boxShadow=
                                'inset 0 0 0 1px black, inset -8px 0 ' + color_input[k].value; }}}}}

        function test_color(color){
            return color.match(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/) !== null; }
    } // get_color()


    function show_color(){
        let color_input=document.querySelectorAll('#t_panel input[type="text"]');
        for(let k=0; k<color_input.length; k++){
            color_input[k].style.boxShadow='inset -8px 0 ' + color_input[k].value; }}


    function table_width_set(){
        let wide=document.querySelector('#wide'); // 横幅の拡張・非拡張の設定
        if(table_width=='100%'){
            wide.value='◁表幅▷'; }
        else{
            wide.value='▷表幅◁'; }
        wide.onclick=function(event){
            event.preventDefault();
            if(table_width=='100%'){
                table_width='auto';
                wide.value='▷表幅◁'; }
            else{
                table_width='100%';
                wide.value='◁表幅▷'; }}}


    function makeTable(){
        table_width_set();
        show_color();
        get_color();

        let set=document.querySelector('#set'); // 作成ボタン
        set.addEventListener('click', set_table);

        function set_table(){
            if(document.querySelector('.cke_wysiwyg_frame') !=null){ //「通常表示」から実行開始
                let editor_iframe=document.querySelector('.cke_wysiwyg_frame');
                let iframe_doc=editor_iframe.contentWindow.document;

                let rows=[];
                let col=document.querySelector('#col'); // 列数の設定
                let row=document.querySelector('#row'); // 行数の設定
                let border_width=document.querySelector('#border_width'); // 枠線幅の設定
                let border_color=document.querySelector('#border_color'); // 枠線色の設定
                let header_back=document.querySelector('#header_back'); // 最上行背景色の設定
                let cell_back=document.querySelector('#cell_back'); // 全体背景色の設定
                let t_font=document.querySelector('#t_font'); // 文字サイズの設定

                let border_para;
                if(border_width.value>0){
                    border_para=border_width.value +'px solid '+ border_color.value; }
                else if(border_width.value==-1){
                    border_para='1px solid '+ border_color.value; }

                let table=iframe_doc.createElement("table");
                for(let i=0; i<row.value; i++){
                    rows.push(table.insertRow(-1)); // 行の追加

                    for(let j=0; j<col.value; j++){
                        let cell=rows[i].insertCell(-1);
                        cell.style.border=border_para;
                        cell.style.padding='.2em .6em 0';
                        cell.style.height='1.5em';
                        cell.appendChild(document.createTextNode("")); // 列の追加
                        if(i==0){
                            cell.style.backgroundColor=header_back.value; } // 最上行背景色の設定
                        else{
                            cell.style.backgroundColor=cell_back.value; }}} // 全体背景色の設定

                if(border_width.value>-1){
                    table.style.borderCollapse='collapse'; }
                else if(border_width.value==-1){
                    table.style.borderCollapse='separate';
                    table.style.border='1px solid ' + border_color.value; }

                table.style.width=table_width;
                table.style.font='normal '+ t_font.value +'px Meiryo';

                let selection=iframe_doc.getSelection();
                let range=selection.getRangeAt(0);
                let ac_node=selection.anchorNode;
                ac_node.parentNode.insertBefore(table, ac_node);

            }}} // makeTable()

} // main()



 

 

 

「Blog Table ⭐」最新版について 

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

 

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