ソースコードを貼り付けるボックスを作成 (1)
ソースコード貼り付け用ボックス作成
プログラミングのブログを書こうと思うと、どうしてもブログの中にソースコードを記述する必要が出てきます。しかし、単純に記述したのでは、それがソースコードだということが判りにくくなります。
はてなブログでは、はてな記法モードでソースコードを簡単に張り付けて色付けまでしてくれる機能があるので、それを使うのが一番だとは思います。しかし、見たままモードで編集していたものをはてな記法モードに変更しようとすると、「編集画面をリセットするため、作成中の本文は消去されます。この操作は元に戻せません。」といわれてしまいます。だったら最初からはてな記法モードで編集しろよ、ということではあるのですが。。。(-_-;)
そこで、そのままモードで編集してブログの中にソースコードを記述するために、自分なりのソースコードの貼り付け用ボックスを作ってみました。
単純なボックス
まずは、以前のブログ JavaScript①でも使用した、単純なボックスを作成しました。
JavaScript①:ブログの目次を表示/非表示にしたらセキュリティに引っ掛かりました - プログラマ・アゲイン blog
どこかのブログを参考にさせていただいたのですが、改めて検索すると見つけられません。m_ _m
<!DOCTYPE html> <html><body><h1 id="title">タイトル</h1> <p>これは<b>パラグラフ</b>です</p> </body></html>
「all select」のボタンや左上にソースタイプを表示するボックスが出ていますが、これは次の拡張でJavaScriptを追加したせいで出てきてますので、今は無視してください。
このボックスは、以下の<pre>...</pre>タグで記述しています。
<pre class="code" style="margin: 0px 0px 10px; padding: 20px; border: 1px solid #eceef1; overflow: auto; font-family: Monaco, Consolas, 'Courier New', Courier, monospace, sans-serif; font-size: 1em; white-space: pre;" data-unlink="" data-lang=""> ここにソースコードを記述 </pre>
当然、ソースコードはエスケープシーケンスで記述する必要があるので、以下のサイトなどで文字変換をしたものを貼り付けます。
ところが、HTML編集で<pre>...</pre>タグを作成しておき、見たまま編集でソースコードをそのままボックスの中に張り付けると、自動的にエスケープシーケンスしてくれています。はてなブログの方でやってくれるようです。
行番号&背景&全選択
もう少し、かっこよくソースコードを表示したいので、以下のブログを参考にさせていただきました。
kurokinomizuiwa.hatenablog.com
Scriptを「デザイン」→「カスタマイズ」→「フッタ」に、CSSを「デザイン」→「カスタマイズ」→「CSS」にコピー&ペーストするだけです。
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>JavaScriptプログラミング</title> </head> <body> <h1 id="title"> タイトル </h1> <p> これは<b>パラグラフ</b>です </p> </body> </html>
ただ、これでも良いのですが、以下の点をカスタマイズしたいと思いました。
- ソースコードの行間を詰めたい
- ソースタイプのブロックをソースコードのブロックより少し上に出したい
- ソースコードのブロックとコンソールのブロックは明確にスタイルを分けたい
- 「all select」の表示をソースコードのブロックだけにしたい
- ソースコードのブロックから外れたら「all select」を消したい
- etc.
そこで、単純にコピー&ペーストしたScriptとCSSの内容を変更したものを、新規に作成することにしました。
ScriptとCSSのカスタマイズ
まずはカスタマイズの概要です。
それまでのScriptとCSS
まず、それまでのScriptとCSSの内容を確認することから始めました。
コピー&ペーストしたScriptとCSSは、ちょっと長いですが以下のものです。
<script> //ソースコードの行をdivタブで囲む var codeBlocks = document.getElementsByClassName('code'); [].forEach.call(codeBlocks, function(e) { if (!/lang/.test(e.className)) { return; } var lines = e.innerHTML.split(/\n/); var codeBlock = ""; lines.forEach(function(line){ if(line != ""){ codeBlock += '<div class="code-line">' + line + '</div>' } }) e.innerHTML = codeBlock; }); </script> <script defer> //ソースコードを全選択するボタンの処理 (function(d){ if(!window.getSelection){ return } var btn = d.createElement("button") btn.id = "selectPre" btn.textContent = "all select" btn.addEventListener("click", selectPre, false) function selectPre(){ var sel = window.getSelection() var pre = this.parentNode sel.selectAllChildren(pre) sel.extend(pre, pre.childNodes.length-1) } var pres = d.getElementsByTagName("pre") for(var i=pres.length; i--;){ pres[i].addEventListener("mouseover", addBtn, false) } function addBtn(e){ if(this === addBtn.ele) return // not to addBtn if already this.appendChild(btn) return addBtn.ele = this } })(document) </script>
/* ソースコード・ブロック位置は相対 */ pre { position: relative; border-radius: 10px; } /*code-lineクラスの数でカウント*/ .code-line { counter-increment: linenumber; } /*偶数行のみ背景色を適用*/ .code-line:nth-child(even){ background-color: #eee; } /*行番号を擬似要素として表示*/ .code-line::before { content: counter(linenumber); display: inline-block; color: #ccc; text-align: right; width: 35px; padding-right: 15px; } pre.code { padding: 30px 0 15px 0; border: 2px solid #ccc; /*追加:コード表示部分の枠設定*/ background: #f8f8f8; /*追加:コード表示部分の背景色*/ position: relative; /*追加*/ } /*コードブロックに言語名を表示*/ pre.code:before { content: attr(data-lang); display: inline-block; background: #ccc; /*カラーコード変更*/ color: #666; padding: 3px 5px; position: absolute; margin-top: -30px; /*表示位置を調整*/ border-radius: 6px; } /* ソースコード全コピー用のボタン表示 #selectPre{ position: absolute; top: 0; right: 0; border: none; margin: 0px 0px 10px 20px; padding: 2px 3px; font-family: consolas }
JavaScriptの1行目~17行目とCSSの6行目~39行目の部分がソースコードのブロック用であり、JavaScriptの18行目~44行目とCSSの40行目~49行目の部分が全選択のボタン用です。
なお、ソースコードを全選択するボタンの処理(Script)部分は、新しいものに書き換えたので、現時点でのScriptは上記と変わっています。したがって、動きも変わっています。
目標とするボックス
このScriptとCSSを書き換えて、以下のような単純なコンソール・コマンド貼り付け用と、ソースコード貼り付け用ボックスを作成しました。小さくコンパクトな感じになりました。
コンソール・コマンド用
$ npm install --global @js-primer/local-server
ソースコード用
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>JavaScriptプログラミング</title>
</head>
<body>
<h1 id="title">
タイトル
</h1>
<p>
これは<b>パラグラフ</b>です
</p>
</body>
</html>
すみません。このページは長くなったので、この辺で一休みしようと思います。
どのようなScriptとCSSを作成したかについては、次のブログで書きたいと思います。m(__)m
[次のブログへ続く]