「半角カタカナ」は半角の幅
前ページで書いた「半角カタカナ」の発見で、「カギ括弧」の幅を改善するツールを刷新出来ました。
半角の幅の文字を使える事は大きな意味を持ちます。 例えば「メイリオ」は等幅フォントで、約物(記述記号)も 1文字の幅で表示されます。 句読点の "、" "。" などはちょうど良いのですが、カギ括弧の "「"と"」"は、どうにも幅が開き過ぎです。
もう少し詰めたいなら "[ ]" や "( )" は英数半角で代用できます。 しかしカギ括弧の "「 」" を代用する英数半角はありません。 この理由で「Elements Palette」では、文字幅やインデントでカギ括弧の余白を狭くする工夫をしていました。 しかし「半角カタカナ」の発見で、これが全く不要になったのです。
別文字への置き換えで「カギ括弧」を「幅の狭いカギ括弧」に変更できるのですから、HTMLを汚す事もなく、また編集によって壊される心配もありません。
コードは上記の様に「選択文字列に置換える」だけのシンプルなものに出来ます。 この半角カギ括弧に (1/4)m幅の空白、半角空白 などを追加すれば、そのまま自在にカギ括弧の間隔を調節できます。
比較のためにデフォルトのカギ括弧の行を上下に置きましたが、半角空白を足した場合も、デフォルトより少し狭い幅になります。 HTML編集で「 」などの文字をコード入力して狭幅空白を記入すれば、自在の間隔を指定できます。 いずれも修飾用のタグが不要で大変な進歩です。
「Elements Palette」は、最終的に下の「半角カギ括弧 + (1/6)m幅の空白 」に変換するコードとしました。 狭すぎず適当な間隔で、 (1/6)m幅空白は普通の文字と同様に削除したり半角空白に書き換える事も可能で、様々な場合に使えると思います。
このツールの使用上で注意ですが、HTML上で均質な条件の範囲を指定しないと、ツールが無効になります。
上の記事で詳しく書いていますが、下の例では、太字指定の<b>タグと通常文字の2種の領域にまたがった範囲では、このツールは働きません。
均質な文字列の範囲なら、複数の "「 」" が有っても、一度に変更が出来ます。
「Elements Palette」ver. 2.5
「Elements Palette」は、最新版エディタの「通常表示」で、ブログの構成に必要な各種パーツを自動記入するツールです。 入力される要素のデザインは、ユーザーの必要に合わせてカスタマイズが可能です。
(カスタマイズについては各ツール制作記事を参照ください)
●「Elements Palette」は、以下のショートカットで入力するパーツを選択します。
「Pause」→「F1」: 「Font Awesome」のリンクアイコン自動記入
「Pause」→「F2」: デザインされた「h2タグ」の自動記入
「Pause」→「F3」: デザインされた「h3タグ」の自動記入
「Pause」→「F4」: 装飾線のインライン指定の自動記入
「Pause」→「F5」: ( F5 はショートカット無効が推奨)
「Pause」→「F6」: 「囲み枠」の自動記入
「Pause」→「F7」: コード掲載用「pre」枠の自動記入
「Pause」→「F8」: コード掲載用「pre」枠(縦スクロールタイプ)自動記入
「Pause」→「F9」: 文書末尾に空白行を自動記入
「Pause」→「F10」: リブログカードを縮小アレンジするツール
「Pause」→「F11」: 選択範囲の「カギ括弧」を詰めるツール
▪ 各ツールの詳細は、上のリストのリンク先のブログ記事を参照ください。
▪「Font Awesome」の表示は、ブログページに「@import」指定が必要です。
▪「Pause + F12」などの設定で、ツールのバリエーションを追加出来ます。
▪ 各ツールのコードの先頭に、各要素のデザイン指定を纏めています。 その部分を書き換えることで、ツールの配色・サイズ等の内容を変更できます。
▪ 各ツールは記事本文フォントがメイリオである事を前提にデザインされています。 使用フォントが異なり、表示要素のpadding値などの細かなレイアウトを修正したい場合は、各コードの先頭部分を修正してください。
● 以下は今回の更新をしたコードです。コードを「Tampermonkey」にコピー&ペーストする事で、このツールを利用出来ます。 動作は Chrome版 / Firefox版 で確認していますが、Edge版でも「リブログカードアレンジ」以外は動作します。
〔コピー方法〕 軽量シンプルなツール「PreBox Button 」を使うと
コード枠内を「Ctrl+左Click」➔「Copy code 」を「左Click」
の操作で、掲載コードのコピーが可能になります。
〔 Elements Palette 〕ver. 2.5
// ==UserScript== // @name Elements Palette // @namespace http://tampermonkey.net/ // @version 2.5 // @description 編集枠に各種要素を自動記入するツール // @author Ameba Blog User // @match https://blog.ameba.jp/ucs/entry/srventry* // @grant none // ==/UserScript== window.addEventListener('load', function(){ 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 editor_iframe=document.querySelector('.cke_wysiwyg_frame'); if(editor_iframe){ // iframe読込みが実行条件 let iframe_doc=editor_iframe.contentWindow.document; iframe_doc.addEventListener("keydown", check_key); let gate; function check_key(event){ let send=-1; if(event.keyCode==19){ gate=1; } if(event.keyCode==112){ if(gate==1){ event.preventDefault(); send=112; }} if(event.keyCode==113){ if(gate==1){ event.preventDefault(); send=113; }} if(event.keyCode==114){ if(gate==1){ event.preventDefault(); send=114; }} if(event.keyCode==115){ if(gate==1){ event.preventDefault(); send=115; }} if(event.keyCode==116){ if(gate==1){ event.preventDefault(); send=116; }} if(event.keyCode==117){ if(gate==1){ event.preventDefault(); send=117; }} if(event.keyCode==118){ if(gate==1){ event.preventDefault(); send=118; }} if(event.keyCode==119){ if(gate==1){ event.preventDefault(); send=119; }} if(event.keyCode==120){ if(gate==1){ event.preventDefault(); send=120; }} if(event.keyCode==121){ if(gate==1){ event.preventDefault(); send=121; }} if(event.keyCode==122){ if(gate==1){ event.preventDefault(); send=122; }} if(event.keyCode !=19){ gate=-1; } if(send !=-1){ event.stopImmediatePropagation(); set_mark(send); } } // check_key }} // catch_key function set_mark(sender){ let editor_iframe; let iframe_doc; let iframe_html; let iframe_body; let selection; let range; let ac_node; let insert_node; editor_iframe=document.querySelector('.cke_wysiwyg_frame'); iframe_doc=editor_iframe.contentWindow.document; iframe_html=iframe_doc.querySelector('html'); iframe_body=iframe_doc.querySelector('body.cke_editable'); selection=iframe_doc.getSelection(); range=selection.getRangeAt(0); ac_node=selection.anchorNode; if(sender==112){ // F1 Font Awesomeアイコンの自動記入 let insert_node_z; insert_node=iframe_doc.createElement('i'); insert_node.appendChild(iframe_doc.createTextNode('\u00A0')); insert_node.setAttribute('class', 'fas fa-external-link-alt fa-sm'); insert_node.setAttribute('style', 'margin-left: .5em'); range.insertNode(insert_node); insert_node_z=iframe_doc.createTextNode('\u200A'); insert_node.parentNode.insertBefore(insert_node_z, insert_node.nextSibling); range.setEnd(insert_node_z.nextSibling, 0); range.collapse(); // フォーカスを失わないでrangeを閉じる } if(sender==113){ // F2 h2 見出しの自動記入 let style_text='background: #b0e0e6; padding: .32em 1em .2em'; // h2のデザイン let font_size='font-size: 1em'; // h2のフォントサイズ let insert_node_h; insert_node_h=iframe_doc.createElement('h2'); insert_node_h.setAttribute('style', font_size); insert_node_h.appendChild(iframe_doc.createElement('span')); insert_node_h.lastChild.setAttribute('style', style_text); insert_node_h.lastChild.appendChild(iframe_doc.createTextNode('\u200A')); if(ac_node.nodeType==3 && ac_node.parentNode.tagName=='P' && ac_node.parentNode.parentNode.tagName=='BODY'){ ac_node.parentNode.parentNode.insertBefore(insert_node_h, ac_node.parentNode); h_before_after(); when_end(); } // h要素生成の条件 通常のP要素のテキストノードから作成 if(ac_node.tagName=='P' && ac_node.firstChild.tagName=="BR" && ac_node.parentNode.tagName=='BODY'){ ac_node.parentNode.insertBefore(insert_node_h, ac_node); h_before_after(); when_end(); } // h要素生成の条件 空白行から作成 function h_before_after(){ if(insert_node_h.previousElementSibling !=null && insert_node_h.previousElementSibling.firstChild.tagName !='BR'){ insert_node_h.insertAdjacentHTML('beforebegin', '<p>\u00A0</p>');} if(insert_node_h.nextElementSibling.firstChild.tagName !='BR'){ insert_node_h.insertAdjacentHTML('afterend', '<p>\u00A0</p>');} range.setEnd(insert_node_h.lastChild, 0);} // 生成したh要素の前後の空白行処理 function when_end(){ if(insert_node_h.nextElementSibling==insert_node_h.parentNode.lastChild){ insert_node_h.insertAdjacentHTML('afterend', '<p>\u00A0</p>'); iframe_html.scrollTop=iframe_html.scrollHeight;}} // 文末処理 } if(sender==114){ // F3 h3 見出しの自動記入 let style_text='background: #ddd; padding: .32em 1em .2em'; // h3のデザイン let font_size='font-size: 1em'; // h3のフォントサイズ let insert_node_h; insert_node_h=iframe_doc.createElement('h3'); insert_node_h.setAttribute('style', font_size); insert_node_h.appendChild(iframe_doc.createElement('span')); insert_node_h.lastChild.setAttribute('style', style_text); insert_node_h.lastChild.appendChild(iframe_doc.createTextNode('\u200A')); if(ac_node.nodeType==3 && ac_node.parentNode.tagName=='P' && ac_node.parentNode.parentNode.tagName=='BODY'){ ac_node.parentNode.parentNode.insertBefore(insert_node_h, ac_node.parentNode); h_before_after(); when_end(); } // h要素生成の条件 通常のP要素のテキストノードから作成 if(ac_node.tagName=='P' && ac_node.firstChild.tagName=='BR' && ac_node.parentNode.tagName=='BODY'){ ac_node.parentNode.insertBefore(insert_node_h, ac_node); h_before_after(); when_end(); } // h要素生成の条件 空白行から作成 function h_before_after(){ if(insert_node_h.previousElementSibling !=null && insert_node_h.previousElementSibling.firstChild.tagName !='BR'){ insert_node_h.insertAdjacentHTML('beforebegin', '<p>\u00A0</p>');} if(insert_node_h.nextElementSibling.firstChild.tagName !='BR'){ insert_node_h.insertAdjacentHTML('afterend', '<p>\u00A0</p>');} range.setEnd(insert_node_h.lastChild, 0);} // 生成したh要素の前後の空白行処理 function when_end(){ if(insert_node_h.nextElementSibling==insert_node_h.parentNode.lastChild){ insert_node_h.insertAdjacentHTML('afterend', '<p>\u00A0</p>'); iframe_html.scrollTop=iframe_html.scrollHeight;}} // 文末処理 } if(sender==115){ // F4 修飾線の自動記入 // 文字アンダーライン・マーカー線のデザイン let style_text='linear-gradient(transparent 1.22em, #27d 0, #27d calc(1.22em + 1px), transparent 0)'; insert_node=document.createElement('span'); insert_node.style.background=style_text; try{ range.surroundContents(insert_node); } catch(e){;} } if(sender==116){ // F5 alert('【 F5 】 はショートカット無効です \n⛔ページリロードに注意してください'); } if(sender==117){ // F6 囲み枠の自動生成 // 囲み枠のデザイン let style_text='background: #f2faf8; border: 1px solid #aaa; border-radius: 4px; '+ 'padding: .62em 2em .5em; max-width: 660px;'; let insert_node_d; insert_node_d=iframe_doc.createElement('div'); insert_node_d.setAttribute('style', style_text); insert_node_d.appendChild(iframe_doc.createElement('br')); if(ac_node.nodeType==3 && ac_node.parentNode.tagName=='P' && ac_node.parentNode.parentNode.tagName=='BODY'){ ac_node.parentNode.parentNode.insertBefore(insert_node_d, ac_node.parentNode.nextSibling); d_before_after(); when_end(); } // d要素生成の条件 通常のP要素のテキストノードから作成 if(ac_node.tagName=='P' && ac_node.firstChild.tagName=='BR' && ac_node.parentNode.tagName=='BODY'){ ac_node.parentNode.insertBefore(insert_node_d, ac_node); d_before_after(); when_end(); } // div要素生成の条件 空白行から作成 function d_before_after(){ 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.setEnd(insert_node_d, 0); range.collapse();} // 生成したdiv要素の前後の空白行処理 function when_end(){ if(insert_node_d.nextElementSibling==insert_node_d.parentNode.lastChild){ insert_node_d.insertAdjacentHTML('afterend', '<p>\u00A0</p>'); iframe_html.scrollTop=iframe_html.scrollHeight;}} // 文末処理 } if(sender==118){ // F7 PRE枠の自動生成 // PRE枠のデザイン 縦スクロールしないタイプ let style_text_div=' max-width: 620px;overflow-y: hidden; margin: 0 auto; '+ 'background: #fafafa; border: 1px solid #aaa;'; let style_text_pre='white-space: pre; display: inline-block; padding: 0 2em;'; let insert_node_d; insert_node_d=iframe_doc.createElement('div'); insert_node_d.setAttribute('style', style_text_div); insert_node_d.appendChild(iframe_doc.createElement('pre')); insert_node_d.lastChild.setAttribute('style', style_text_pre); insert_node_d.lastChild.appendChild(iframe_doc.createElement('br')); if(ac_node.nodeType==3 && ac_node.parentNode.tagName=='P' && ac_node.parentNode.parentNode.tagName=='BODY'){ ac_node.parentNode.parentNode.insertBefore(insert_node_d, ac_node.parentNode.nextSibling); d_before_after(); when_end(); } // div要素生成の条件 通常のP要素のテキストノードから作成 if(ac_node.tagName=='P' && ac_node.firstChild.tagName=='BR' && ac_node.parentNode.tagName=='BODY'){ ac_node.parentNode.insertBefore(insert_node_d, ac_node); d_before_after(); when_end(); } // div要素生成の条件 空白行から作成 function d_before_after(){ 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.setEnd(insert_node_d.lastChild, 0); range.collapse();} // 生成したdiv要素の前後の空白行処理 function when_end(){ if(insert_node_d.nextElementSibling==insert_node_d.parentNode.lastChild){ insert_node_d.insertAdjacentHTML('afterend', '<p>\u00A0</p>'); iframe_html.scrollTop=iframe_html.scrollHeight;}} // 文末処理 } if(sender==119){ // F8 PRE枠の自動生成 // PRE枠のデザイン 縦スクロールするタイプ let style_text_div=' max-width: 620px; overflow: auto; height: 50vh; margin: 0 auto; '+ 'background: #fafafa; border: 1px solid #aaa;'; let style_text_pre='white-space: pre; display: inline-block; padding: 0 2em;'; let insert_node_d; insert_node_d=iframe_doc.createElement('div'); insert_node_d.setAttribute('style', style_text_div); insert_node_d.appendChild(iframe_doc.createElement('pre')); insert_node_d.lastChild.setAttribute('style', style_text_pre); insert_node_d.lastChild.appendChild(iframe_doc.createElement('br')); if(ac_node.nodeType==3 && ac_node.parentNode.tagName=='P' && ac_node.parentNode.parentNode.tagName=='BODY'){ ac_node.parentNode.parentNode.insertBefore(insert_node_d, ac_node.parentNode.nextSibling); d_before_after(); when_end(); } // div要素生成の条件 通常のP要素のテキストノードから作成 if(ac_node.tagName=='P' && ac_node.firstChild.tagName=='BR' && ac_node.parentNode.tagName=='BODY'){ ac_node.parentNode.insertBefore(insert_node_d, ac_node); d_before_after(); when_end(); } // div要素生成の条件 空白行から作成 function d_before_after(){ 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.setEnd(insert_node_d.lastChild, 0); range.collapse();} // 生成したdiv要素の前後の空白行処理 function when_end(){ if(insert_node_d.nextElementSibling==insert_node_d.parentNode.lastChild){ insert_node_d.insertAdjacentHTML('afterend', '<p>\u00A0</p>'); iframe_html.scrollTop=iframe_html.scrollHeight;}} // 文末処理 } if(sender==120){ // F9 文書末尾に空白行を追加 if(iframe_body.lastChild.tagName !='P' && iframe_body.lastChild.tagName !='STYLE'){ add_nextline(); add_nextline(); } else if(iframe_body.lastChild.tagName=='P'){ if(iframe_body.lastChild.style.textAlign=='center' || iframe_body.lastChild.style.textAlign=='right'){ add_nextline(); add_nextline(); }} else if(iframe_body.lastChild.tagName=='STYLE'){ if(iframe_body.lastChild.className=='asa'){ add_preline(); add_preline(); }} range.collapse(); // rangeを始点で閉じる iframe_html.scrollTop=iframe_html.scrollHeight; function add_nextline(){ insert_node=iframe_doc.createElement('p'); insert_node.appendChild(iframe_doc.createTextNode('\u00A0')); iframe_body.appendChild(insert_node); range.setEnd(insert_node.lastChild, 0); } // 追加した空白行にrange終点を移動 function add_preline(){ insert_node=iframe_doc.createElement('p'); insert_node.appendChild(iframe_doc.createTextNode('\u00A0')); iframe_body.insertBefore(insert_node, iframe_body.lastChild); range.setEnd(insert_node.lastChild, 0); } // 追加した空白行にrange終点を移動 } if(sender==121){ // F10 リブログカードをデザイン // リブログカードのデザイン let style_dtext='max-width: 500px; height: 140px; margin: 0 auto; border: 1px solid #009688; '+ 'border-radius: 4px; overflow: hidden; transition: .5s;'; let style_itext='max-width: unset; width: calc(100% + 30px); '+ 'margin: -45px -15px 0; background: #f0f7fb;'; let rebrog; let insert_node_d; rebrog=iframe_doc.querySelector('.reblogCard'); insert_node_d=iframe_doc.createElement('div'); if(rebrog.parentNode.tagName=='P'){ iframe_body.insertBefore(insert_node_d, rebrog.parentNode); insert_node_d.appendChild(rebrog); } if(rebrog.parentNode.tagName=='DIV'){ rebrog.parentNode.setAttribute('style', style_dtext); rebrog.parentNode.setAttribute('class', 'rlink'); rebrog.setAttribute('style', style_itext); } if(rebrog.parentNode.previousElementSibling==null){ //ページ最上部なら上に余白行追加 insert_node_d.insertAdjacentHTML('beforebegin', '<p>\u00A0</p><p>\u00A0</p>');} if(rebrog.parentNode.nextElementSibling==rebrog.parentNode.parentNode.lastChild){ rebrog.parentNode.insertAdjacentHTML('afterend', '<p>\u00A0</p>');} //文末処理 } if(sender==122){ // F11 選択範囲のカギ括弧を詰める // '「' (\uFF62) '」' (\uFF63) の文字へ置換え let r_text=range.toString(); if(r_text.match( /[「」]/ ) !=null && selection.anchorNode==selection.focusNode){ r_text=r_text.replace(/「/g, '\u2006「').replace(/」/g, '」\u2006'); let insert_node=document.createTextNode(r_text); try{ range.surroundContents(insert_node); } catch(e){;}} } } // set_mark })
「Elements Palette ⭐」最新版について
旧いバージョンの JavaScriptツールは、アメーバのページ構成の変更で動作しない場合があり、導入する場合は最新バージョンをお勧めします。
●「Elements Palette ⭐」の最新バージョンへのリンクは、以下のページのリンクリストから探せます。