かなり根本的な改善
前ページは、クリックした「pre枠」の取得がオーソドックスな手法でした。 本文中の全ての「pre枠」を先ず取得し、「for」ループでそれぞれの「pre枠」に対してボタンを表示しています。
この手法は、本文の全ての「pre枠」を取得しないとボタンが表示出来ないので、ページ読込み時に1~2sec待機して処理を開始する必要がありました。 それでもボタンが表示出来ない時があり、最後は「MutationObserver」を使う修正をしています。
この修正中に、「アレ」をつかわなあかんと思ったのです。 それは、遅延読込みされるimg要素の取得に大変有効な方法の応用です。
「PreBox Button」ver.0.2 43行~
このコードは、目的要素の取得が非常に確実に出来る優れた手法です。
「elementFromPoint()」のメソッドで、クリックした場所の要素を取得し、その要素が「pre要素」であるかどうかで、処理をして行きます。
「pre枠」をクリックした場合は、それまで隠していた「pbop_sw」(ボタン)をマウスポインタの位置に表示します。 そして、ボタンをクリックしたら「pre枠」のコードをコピーする関数「get_copy()」に処理を渡します。
今回も、これは良い結果になりました。
(注)
ブログスキンの文字サイズの均一化するツール「RemPage For Chrome」は便利ですが、「zoom」プロパティでページ全体を拡大表示するので、少し気難しい側面があります。 ブラウザ拡大は問題が生じないのですが、「zoom」拡大はボタン位置の計算がズレます。 ver.0.2は、実際は上記コードにその補正コードを追加しています。
「pre枠」の指定とコードコピーの様子
下は、新しいデザインのコビーボタンです。 このバージョンでは、「pre枠」をクリックするまでこのボタンは表示されません。 従って、ページ上に複数の「pre枠」があっても、ボタンは1個以上は表示されないわけです。
●「pre枠」の内部を「Ctrl+左Click」すると、青い「Copy code 」ボタンが表示されます。
▪ CSSコード等では、実際の「pre枠」は表示上の枠の左隅に寄っている場合があります。 コードの文字上でクリックするのが確実です。
● ボタンを「左Click」すると「pre枠」内のコードが全てコピーされます。
➔ ボタンの表示が「Copied 」に変わり、1.5secでボタンが消えます。
▪ ボタン以外の場所(枠外でもかまいません)を「左Click」すると、ボタンを消す事ができます。
適用範囲
このツールのコードは、アメーバブログに限らず、一般のウェブページ等でも動作します。 ただし、以下の条件が必要です。
▪「@match」パラメータにユーザーが目的サイトを追加している事。
▪「preタグ」でプログラムコードを表示している事。
(コードを「textarea」「div」などで表示している場合は対応できません)
▪ 特殊なプラグインを使っていない事、ページ自体が特殊な構成でない事。
ver.0.2 は「https://ameblo.jp/*」「https://developer.mozilla.org/*」を「@match」パラメータに指定しています。 下は「mozilla」サイトの例です。
下はこの「mozilla」サイトのページで「PreBox Button」を操作する様子です。
「PreBox Button」を利用するには
このツールは Chrome / Edge / Firefox版の拡張機能「Tampermonkey」上で動作します。 以下に、このツールの導入手順を簡単に説明します。
❶「Tampermonkey」を導入します
◎ 使用しているブラウザに拡張機能「Tampermonkey」を導入する事が必要です。
既に「Tampermonkey」を導入している場合は、この手順 ❶ は不要です。
拡張機能の導入については、以下のページに簡単な説明があるので参照ください。
❷「Tampermonkey」にスクリプトを登録します
◎「Tampermonkey」の「+」マークの「新規スクリプト」タブを開きます。
◎「新規スクリプト」には、最初からテンプレートが記入されています。 これは全て削除して、完全に空白の編集枠に 下のコードをコピー&ペーストします。
〔コピー方法〕 右サイドバーの マークのボタンを1度押してください。
コード枠内の右クリック ➔ コード全体の選択 ➔ コピー操作 が可能になります。
◎ 最後に「ファイル」メニューの「保存」を押すと、ツールが使用可能になります。
〔 PreBox Button 〕 ver. 0.2
// ==UserScript== // @name PreBox Button // @namespace http://tampermonkey.net/ // @version 0.2 // @description ウェブページ掲載の「preタグ」内のコードをコピーする // @author Ameblo User // @match https://ameblo.jp/* // @match https://developer.mozilla.org/* // @icon https://www.google.com/s2/favicons?sz=64&domain=ameblo.jp // @noframes // @grant none // ==/UserScript== menu_set(); function menu_set(){ let SVG_cp= '<svg class="svg_cp" viewBox="0 0 16 16">'+ '<path d="M0 6.8C0 5.8 .8 5 1.8 5h1.5a0.8 .8 0 0 1 0 1.5h-1.5a0.3 .3 0 0 '+ '0-0.3 .3v7.5c0 .138.112.25.25.25h7.5a0.3 .3 0 0 0 0.3-0.3v-1.5a0.8 .8 0 '+ '0 1 1.5 0v1.5A1.8 1.8 0 0 1 9.3 16h-7.5A1.8 1.8 0 0 1 0 14.3Z"></path>'+ '<path d="M5 1.8C5 0.8 5.8 0 6.8 0h7.5C15.2 0 16 0.8 16 1.8v7.5A1.8 1.8 0'+ ' 0 1 14.3 11h-7.5A1.8 1.8 0 0 1 5 9.3Zm1.8-0.3a0.3 .3 0 0 0-0.3 .3v7.5c0'+ ' .138.112.25.25.25h7.5a0.3 .3 0 0 0 0.3-0.3v-7.5a0.3 .3 0 0 0-0.3-0.3Z">'+ '</path></svg>'; let sw= '<div class="pbop_sw"><span>Copy code </span>'+ SVG_cp +'</div>'+ '<style>'+ '.pbop_sw { font: bold 16px Meiryo; position: absolute; display: none; '+ 'padding: 3px 8px 1px; text-align: right; '+ 'border: 1px solid #fff; border-radius: 4px; color: #fff; background: #0288d1; '+ 'box-shadow: 4px 4px 2px -2px rgba(0, 0, 0, 0.5); cursor: pointer; } '+ '.pbop_sw:hover { background: #1565c0; } '+ '.svg_cp { width: 20px; height: 16px; vertical-align: -2px; fill: #fff; }'+ '</style>'; if(!document.querySelector('.pbop_sw')){ document.body.insertAdjacentHTML('beforeend', sw); }} document.addEventListener('click', function(event){ let body=document.body; let zoom_f=window.getComputedStyle(body).getPropertyValue('zoom'); if(!zoom_f){ zoom_f=1; } // 拡大ツールがない環境の場合 let pbop_sw=document.querySelector('.pbop_sw'); if(pbop_sw){ let elem=document.elementFromPoint(event.clientX, event.clientY); if(elem && elem.tagName=='PRE'){ if(event.ctrlKey){ pbop_sw.style.display='block'; pbop_sw.style.left=(event.pageX)/zoom_f +"px"; pbop_sw.style.top=((event.pageY)/zoom_f -34) +"px"; pbop_sw.onclick=function(e){ e.stopImmediatePropagation(); get_copy(elem, pbop_sw); }} else{ pbop_sw.style.display='none'; }} else{ pbop_sw.style.display='none'; }} }); function get_copy(preb, sw){ let sw_span=sw.querySelector('span'); if (navigator.clipboard){ navigator.clipboard.writeText(preb.textContent) .then( function(){ sw_span.textContent='Copied '; setTimeout(()=>{ sw.style.display='none'; }, 1500 ); setTimeout(()=>{ sw_span.textContent='Copy code '; }, 1500 ); })}} // get_copy()
〔2024.01.02〕
「@noframes」を追加しました。
「PreBox Button」最新版について
旧いバージョンの JavaScriptツールは、アメーバのページ構成の変更で動作しない場合があり、導入する場合は最新バージョンをお勧めします。
●「PreBox Button」の最新バージョンへのリンクは、以下のページのリンクリストから探せます。