2017年12月30日土曜日

Bloggerの改造方法

このブログの筆者が行っているBloggerの改造方法をご紹介します。 筆者はBloggerを改造するために、Bloggerレイアウト用HTMLをテキストエディタで編集しています。 編集後、Bloggerへ保存してからBloggerテーマデザイナーでカスタムCSSを追加しています。 これらの方法についてご説明します。

Bloggerレイアウト用HTMLは、Blogger設定画面の[テーマ]の編集画面を表示して、[HTMLの編集]ボタンを押下すると表示される画面のテキストボックス内のHTMLです。

Bloggerレイアウト用HTML

Bloggerレイアウト用HTMLを編集する前にバックアップを取っておくことを強くお勧めします。

Bloggerを改造するための前提知識

Bloggerを改造するためには下記の知識が必要です。 どれも中級程度の習熟度で構いません。 下記の知識は本を買って読むか、ネット上のWebページを読めば習得できます。

HTML(XHTML)

書き方、タグ、属性の意味を一通り知っていれば十分です。名前空間についての知識もあると良いでしょう。

CSS

書き方、属性とその値を一通り知っていれば十分です。

JavaScript

書き方を知っていれば十分です。外部ライブラリの使い方の知識は必要ありません。

Document Object Model(DOM)

概念と利用の仕方を知っていれば十分です。

Bloggerを改造するための道具

Bloggerを改造するために必要な道具は下記のとおりです。 どれも無料で揃えられます。

Google Chrome

パソコン版のChromeです。ChromeのDevToolsを使います。 DevToolsはChromeメニューから[その他のツール]ー[デベロッパー ツール Ctrl+Shift+I F12]で表示できます。 詳しい説明は下記をご参照ください。
Chrome DevTools

Visual Studio Code

マイクロソフトの高機能テキストエディタです。HTML、CSS、JavaScriptの編集で使います。 構文規則に従った文字列整形、色分け表示、入力補助、正規表現を使った検索置換等ができます。

Bloggerを改造するための前準備

Bloggerレイアウト用HTMLをテキストエディタで編集する前に、Bloggerテーマデザイナーで設定を最終確定してしまいます。 最終確定したら、今後はBloggerテーマデザイナーは触らないようにして、Bloggerレイアウト用HTMLをテキストエディタでのみ編集するようにします。

なぜ、Bloggerテーマデザイナーを触らないようにするのか説明します。 Bloggerテーマデザイナーで設定したブログの色とフォントの設定内容はBloggerレイアウト用HTMLに書き込まれてしまいます。 Bloggerテーマデザイナーで設定を最終確定して今後は触らないようにすることで、BloggerテーマデザイナーとテキストエディタのどちらからBloggerレイアウト用HTMLを変更したのか混乱してしまうことを避けます。

BloggerテーマデザイナーはBlogger設定画面で、

  1. [テーマ]の編集画面を表示

    Blogger設定画面
  2. [カスタマイズ]ボタンを押下

  3. Blogger テーマ デザイナーを表示

    Bloggerテーマデザイナー
  4. [上級者向け]を表示して、[CSSを追加]以外の項目の設定を最終確定する

Bloggerテーマデザイナーで色を設定するときは次の4種類の色を決めておくと追加するカスタムCSSの設定に流用できて便利です。 Bloggerテーマデザイナーでは色を透明にもできますので、必要のない背景色や枠線の色は透明にしておきます。

  • 背景色
  • 前景色
  • リンクの色
  • カーソルを合わせたときの色

Bloggerレイアウト用HTMLをVisual Studio Codeで編集する

Bloggerレイアウト用HTMLをVisual Studio Codeで編集します。

BloggerからBloggerレイアウト用HTMLをコピーする

Blogger設定画面で、

  1. [テーマ]の編集画面を表示

    Blogger設定画面
  2. [HTMLの編集]ボタンを押下

    Bloggerレイアウト用HTML
  3. テキストボックス中のHTML(Bloggerレイアウト用HTML)をすべて選択してコピーして、Visual Studio Codeにペーストする

Visual Studio Codeで編集する

Bloggerレイアウト用HTMLをVisual Studio Codeにペーストしたら、右下の[プレーンテキスト]をクリックします。

VisualStudioCode言語モードプレーンテキスト

言語モードを選択できるので「HTML」と入力して言語モードをHTMLにします。

VisualStudioCode言語モードHTML

言語モードをHTMLにするとHTMLの構文規則に応じて色分け表示されます。 さらに、右クリックで表示されるコンテキストメニューから[ドキュメントのフォーマット Alt+Shift+F]を選択して、文字列をHTMLの構文規則に従って整形します。

VisualStudioCodeHTMLフォーマット

ここで注意したいのは「data:△post」(△=半角空白)と整形されてしまい、このままBloggerに保存するとエラーになってしまう点です。 エラーを避けるために検索置換で「data:△post」を「data:post」と修正しておきます。

上記の作業が終わったら、拡張子をhtmlにして保存します。

ここで、以降の編集作業の前に、保存したBloggerレイアウト用HTMLのバックアップを取っておきます。

Bloggerレイアウト用HTMLの編集作業

ここからは、Bloggerレイアウト用HTMLの編集作業について説明します。

Bloggerレイアウト用HTMLの全体像

Bloggerレイアウト用HTMLは下記のような構成になっています。

<html>
<head>
    [Bloggerの変数定義]
    [BloggerのCSS]
    [カスタムCSS(Blogger利用者が追加したCSS)]
    [BloggerのCSS]
</head>

<body>
    [ガジェットごとのHTML(モバイル版とPC版)]
    <script>
    </script>
</body>

[Bloggerのマクロ]
[ガジェットごとのHTML]

</html>

ガジェットとはBlogger設定画面の[レイアウト]の編集画面に表示される、NavbarやヘッダーやCross-ColumnのようなBloggerの構成部品です。

Bloggerレイアウト用HTML内のカスタムCSSを削除する

Bloggerレイアウト用HTMLにはBlogger利用者が追加したカスタムCSSが含まれています。 Bloggerレイアウト用HTMLに含まれるカスタムCSSはstyleタグで括られていないので、Visual Studio CodeはこのカスタムCSSをCSSとして色分け表示や入力補助をしてくれません。 これではVisual Studio Codeで扱いづらいので、別途カスタムCSS用のファイルを作って、そちらでVisual Studio Codeを使って編集します。

今後の編集作業の混乱を避けるために、Bloggerレイアウト用HTML内のカスタムCSSは削除します。 カスタムCSSは別ファイルで編集して、Bloggerテーマデザイナーで追加するようにします。

BloggerテーマデザイナーCSSを追加

Bloggerレイアウト用HTMLの600行目付近からカスタムCSSが始まりますので削除します。 Bloggerレイアウト用HTMLのどこからどこまでがカスタムCSSか分からない場合は、カスタムCSSの始まりと終わりにカスタムCSSを示すコメントを書いておきBloggerテーマデザイナーで追加します。 これでBloggerレイアウト用HTMLにカスタムCSSの始まりと終わりのコメントが入りますので、その間のCSSを削除します。

Bloggerレイアウト用HTMLからカスタムCSSを削除した後は、Bloggerレイアウト用HTMLをBloggerに保存したら、必ずBloggerテーマデザイナーでカスタムCSSを追加するようにします。

Bloggerレイアウト用のタグ

Bloggerレイアウト用HTMLではBlogger独自のタグが使われています。 Blogger独自のタグは「b:」で始まっていて、この独自のタグの意味が分からないとBloggerレイアウト用HTMLの内容は理解できません。 Bloggerレイアウト用HTMLのすべてを理解する必要はありませんが、手を入れる箇所の周辺の記述は理解しておいたほうが良いでしょう。 Blogger独自のタグの説明は下記をご参照ください。
レイアウト用のウィジェット タグ

編集する箇所を探す

Bloggerで改造したい箇所があればBloggerレイアウト用HTMLを編集して改造します。 Bloggerレイアウト用HTMLのどこを編集すべきかはChrome DevToolsを使って探します。

Chrome DevToolsを起動すると現在見ているWebページのソースを表示できます。 ここで注意したいのはChromeの右クリックのコンテキストメニュー[ページのソースを表示 Ctrl+U]で表示できるWebページのソースと、Chrome DevToolsで表示できる現在のWebページのソースは違うということです。 Chrome DevToolsで表示できるWebページのソースにはJavaScriptなどで動的に生成されたHTMLが含まれます。

Chrome DevToolsの詳しい使い方は下記をご参照ください。
Chrome DevTools

ChromeDevTools

Chrome DevToolsのElementsパネルでHTMLのタグを選択するとそれに該当するWebページの要素が反転表示されます。 また、Webページで右クリックのコンテキストメニュー[検証]を選ぶと、右クリックした箇所のHTMLタグがChrome DevToolsのElementsパネルに表示されます。 このように、Chrome DevToolsを使ってBloggerレイアウト用HTMLで改造したい箇所を探します。

Chrome DevTools使うとCSSの設定も探せます。 Chrome DevToolsのElementsパネルで選択したHTMLタグに適用されているCSSの設定がElementsパネルの右側のStyles領域に表示されます。 また、Computed領域にはHTMLタグに適用されているCSSの設定が継承されているものも含めてすべて表示されます。

Chrome DevToolsを使って、Bloggerレイアウト用HTMLとCSSの編集個所を特定してVisual Studio Codeで改造します。

JavaScriptの追加箇所

Bloggerレイアウト用HTMLにJavaScriptを追加したい場合は、bodyタグの終了タグの直前にscriptタグで括られた箇所がありますので、そこにJavaScriptを追加するのが良いでしょう。 Bloggerレイアウト用HTML内のJavaScriptは文字列の括りにシングルクォートを使い、字下げは半角空白2文字になっていますので、それに倣うのが良いでしょう。

Bloggerへの反映作業

Bloggerレイアウト用HTMLを編集し終わったら、編集したBloggerレイアウト用HTMLをBloggerに保存します。

Blogger設定画面で、

  1. [テーマ]の編集画面を表示

    Blogger設定画面
  2. [HTMLの編集]ボタンを押下

    Bloggerレイアウト用HTML
  3. テキストボックス内の文字列をすべて削除して、Visual Studio Codeで編集したBloggerレイアウト用HTMLをテキストボックスへコピー&ペーストする

  4. [テーマを保存]ボタンを押下して、Bloggerレイアウト用HTMLをBloggerに保存する

Bloggerレイアウト用HTMLをBloggerに保存したら、カスタムCSSをBloggerへ追加します。

Blogger設定画面で、

  1. [テーマ]の編集画面を表示

    Blogger設定画面
  2. [カスタマイズ]ボタンを押下

  3. Bloggerテーマデザイナーで[上級者向け]ー[CSSを追加]を選択

    BloggerテーマデザイナーCSSを追加
  4. テキストボックス内の文字列をすべて削除して、Visual Studio Codeで編集したカスタムCSSをテキストボックスへコピー&ペーストする

  5. 画面右上の[ブログに適用]ボタンを押下して、カスタムCSSをBloggerに追加する

以上でBloggerの改造作業は完了です。

記事終わり

2017年12月11日月曜日

Google code-prettifyのBloggerへの導入方法

このブログではプログラムのソースコードを色分け表示するためにGoogle code-prettifyを使用しています。 code-prettifyを使うとソースコードを構文に従い、判り易く色分け表示してくれます。

Bloggerでcode-prettifyを使用する方法をご紹介します。

code-prettify導入手順

code-prettifyはGitHubで公開されています。
Google code-prettify

code-prettify公式の導入手順も公開されています。
code-prettify/docs/getting_started.md

code-prettifyの詳細はGitHubのcode-prettifyのページを参照してください。 ここではBloggerへの導入に絞ってご説明します。

Bloggerでcode-prettifyを導入する手順は下記の3つです。

  1. Bloggerへcode-prettifyのJavaScriptを読み込ませる
  2. ソースコードをpreタグで括る
  3. Bloggerへソースコードの見た目を設定するCSSを追加する

これらの手順についてご説明します。

Bloggerへcode-prettifyのJavaScriptを読み込ませる

code-prettifyはJavaScriptとCSSで出来ています。 まずは、code-prettifyのJavaScriptをBloggerへ読み込ませます。

そのために下記の手順を踏みます。

Bloggerの設定画面で、

  1. [テーマ]の編集画面を表示
  2. [HTMLの編集]ボタンを押下

Bloggerのレイアウト用HTMLがテキストボックスに表示されますので、head終了タグ(</head>)の直前に下記のscriptタグを挿入して、code-prettifyのJavaScriptをBloggerに読み込ませます。

<script src='https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js' type='text/javascript' />

これで、下記の拡張子のプログラミング言語は色分け表示できます。
"bsh", "c", "cc", "cpp", "cs", "csh", "cyc", "cv", "htm", "html", "java", "js", "m", "mxml", "perl", "pl", "pm", "py", "rb", "sh", "xhtml", "xml", "xsl".

上記以外のプログラミング言語を色分け表示したいのであれば、scriptタグのsrc属性値のrun_prettify.jsの後に「?lang=」と付け加えて、code-prettifyに色分け表示させたいプログラミング言語を指定します。

例えばExcel VBAとCSSを色分け表示させたければ下記のようにします。

  ...
  <script src='https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?lang=vb&lang=css' type='text/javascript' />
</head>
...

lang=xxxのxxxにはプログラミング言語を示す文字列を指定します。指定可能な文字列は下記Webページをご参照ください。
index of language handlers

これでcode-prettifyのJavaScriptをBloggerへ読み込ませる手順は完了です。

ソースコードをpreタグで括る

code-prettifyでソースコードを色分け表示するためには、下記のようにソースコードをpreタグで括り、class属性値にprettyprintを指定します。

<pre class="prettyprint lang-xxx linenums">
ソースコード
</pre>

HTMLの文書構造の構成を意味させるためにソースコードをcodeタグで括りたいという方は、下記のようにpreタグの内側にcodeタグを設置してもcode-prettifyで色分け表示できます。
このcodeタグは表示されず、見た目に影響を与えません。

<pre class="prettyprint lang-xxx linenums">
<code>
ソースコード
</code>
</pre>
preタグのclass属性値
<pre class="prettyprint lang-xxx linenums">
prettyprint

preタグのclass属性値にprettyprintがあることで、preタグで括られたソースコードはcode-prettifyにより色分け表示されます。

lang-xxx

lang-xxxのxxxには下記のプログラミング言語の拡張子を示す文字列を指定します。
"bsh", "c", "cc", "cpp", "cs", "csh", "cyc", "cv", "htm", "html", "java", "js", "m", "mxml", "perl", "pl", "pm", "py", "rb", "sh", "xhtml", "xml", "xsl".

上記以外の指定可能な文字列は下記Webページをご参照ください。
index of language handlers

HTMLならlang-html、CSSならlang-css、JavaScriptならlang-jsとなります。

色分け表示させたいプログラミング言語が上記の一覧にない場合、プログラミング言語の構文規則が近いものを指定します。 例えば、Excel VBAは上記の一覧に存在しないので、構文規則の近いVisual Basicを指定します(lang-vb)。

linenums

linenumsを指定すると行番号を表示できます。 行番号は1から始まりますが、下記のように番号を指定するとその番号から始まるようになります。
linenums:10
上記のように書くと行番号は10から始まります。

code-prettifyが生成するHTML

code-prettifyはprettyprintをclass属性値に持つpreタグ内のソースコードを読み込んでHTMLを生成します。 preタグとその中のソースコードはそのHTMLで置き換えられます。

code-prettifyは下記のpreタグで括られたソースコードを読み込みます。

<pre class="prettyprint lang-js linenums">
function testFunction()
{
    const testMessage = "TEST";
    alert(testMessage);
    return;
}
</pre>

そして、code-prettifyは読み込んだソースコードから下記のHTMLを生成して置き換えます。

<pre class="prettyprint lang-js linenums prettyprinted" style="">
    <ol class="linenums">
        <li class="L0">
            <span class="kwd">function</span>
            <span class="pln"> testFunction</span>
            <span class="pun">()</span>
        </li>
        <li class="L1">
            <span class="pun">{</span>
        </li>
        <li class="L2">
            <span class="pln">    </span>
            <span class="kwd">const</span>
            <span class="pln"> testMessage </span>
            <span class="pun">=</span>
            <span class="pln"> </span>
            <span class="str">"TEST"</span>
            <span class="pun">;</span>
        </li>
        <li class="L3">
            <span class="pln">    alert</span>
            <span class="pun">(</span>
            <span class="pln">testMessage</span>
            <span class="pun">);</span>
        </li>
        <li class="L4">
            <span class="pln">    </span>
            <span class="kwd">return</span>
            <span class="pun">;</span>
        </li>
        <li class="L5">
            <span class="pun">}</span>
        </li>
    </ol>
</pre>

上記のcode-prettifyが出力したHTMLを念頭に置きながら、追加するCSSの説明をお読みください。

Bloggerへソースコードの見た目を設定するCSSを追加する

code-prettifyはソースコードの色分け表示などの見た目に関する設定をCSSで行っています。 CSSの設定方法には2通りあり、テーマと呼ばれる既存設定を読み込む方法と独自のCSSで指定する方法があります。

Bloggerへcode-prettifyのテーマを読み込ませる

code-prettifyには見た目の設定をまとめたテーマがあらかじめ何種類かあり、scriptタグのJavaScriptの読み込み箇所で指定できます。
あらかじめ用意されているテーマは下記をご参照ください。
Gallery of themes for code prettify

scriptタグで上記のテーマを読み込むには下記のように「skin=」を追加します。

<script src='https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?lang=vb&lang=css&skin=desert' type='text/javascript' />

「skin=」に続くテーマの名前はすべて小文字で指定してください。

code-prettifyのCSS

このブログでは既存のテーマは一切使わずに必要なものは独自のCSSで指定しています。
CSSで指定する方法をご紹介します。

CSSの内容

code-prettifyの見た目を設定するCSSは下記になります。
下記のCSSはcode-prettifyのDefaultテーマのCSSを改造したものです。

/*
Google code-prettify
*/
pre.prettyprint
{
    border: 1px solid #cccccc !important;
    line-height: 1.5em;
    overflow: auto;
    padding: 2em !important;
}

pre.prettyprint > ol.linenums
{
    padding-left: 2em;
}

pre.prettyprint > ol.linenums > li
{
    border-left: 1px solid #cccccc;
    margin-bottom: 0;
}

pre.prettyprint > ol.linenums > li.L0,
pre.prettyprint > ol.linenums > li.L1,
pre.prettyprint > ol.linenums > li.L2,
pre.prettyprint > ol.linenums > li.L3,
pre.prettyprint > ol.linenums > li.L4,
pre.prettyprint > ol.linenums > li.L5,
pre.prettyprint > ol.linenums > li.L6,
pre.prettyprint > ol.linenums > li.L7,
pre.prettyprint > ol.linenums > li.L8,
pre.prettyprint > ol.linenums > li.L9 
{
    list-style-type: decimal;
}

pre.prettyprint > ol.linenums > li.L1,
pre.prettyprint > ol.linenums > li.L3,
pre.prettyprint > ol.linenums > li.L5,
pre.prettyprint > ol.linenums > li.L7,
pre.prettyprint > ol.linenums > li.L9 
{
    background-color: transparent;
}

pre.prettyprint > ol.linenums > li span:first-child
{
    padding-left: 1em;
}

pre.prettyprint > ol.linenums > li span:last-child
{
    padding-right: 1em;
}

/* plain text */
pre.prettyprint .pln { color: #cccccc; }

/* string content */
pre.prettyprint .str { color: #cccc33; }
/* a keyword */
pre.prettyprint .kwd { color: #00cc00; }
/* a comment */
pre.prettyprint .com { color: #cc3366; }
/* a type name */
pre.prettyprint .typ { color: #00cc00; }
/* a literal value */
pre.prettyprint .lit { color: #3399cc; }
/* punctuation, lisp open bracket, lisp close bracket */
pre.prettyprint .pun,
pre.prettyprint .opn,
pre.prettyprint .clo
{ color: #cccccc; }
/* a markup tag name */
pre.prettyprint .tag { color: #3399cc; }
/* a markup attribute name */
pre.prettyprint .atn { color: #00cc00; }
/* a markup attribute value */
pre.prettyprint .atv { color: #cccc33; }
/* a declaration; a variable name */
pre.prettyprint .dec,
pre.prettyprint .var
{ color: #00cc00; }
/* a function name */
pre.prettyprint .fun { color: #cc66cc; }
pre.prettyprint
pre.prettyprint
{
    border: 1px solid #cccccc !important;
    line-height: 1.5em;
    overflow: auto;
    padding: 2em !important;
}

code-prettifyでソースコードを色分け表示するには、ソースコードをpreタグで括り、そのpreタグのclass属性値にprettyprintを指定します。

code-prettifyはscriptタグのskinでテーマを指定しなくても初期設定のCSSを読み込んでいます。 上記の!importantの設定はcode-prettifyの初期設定を上書きするために必要です。 code-prettifyの初期設定で設定されていない項目は、!importantの指定がなくてもCSSの設定が反映されます。

このCSSは、prettyprintを属性値に持つpreタグに枠線を引いて、行の高さを1.5emにして、画面からはみ出したらブラウザで自動処理して、パディングを2emにするように設定しています。

pre.prettyprint > ol.linenums
pre.prettyprint > ol.linenums
{
    padding-left: 2em;
}

code-prettifyでは行番号の表示ができます。 code-prettifyで行番号を表示するにはpreタグのclass属性値にlinenumsを指定します。

上記は、linenumsを属性値に持つolタグの左側に2emのパディングを入れるように設定しています。 この設定がないとolタグの標準的な左側のパディングが入ってしまい、隙間が空きすぎる見た目になってしまいます。

code-prettifyが行番号を表示する場合に生成するHTMLは、preタグの内側にolタグのリストを入れる形式となります。

<pre class="prettyprint lang-js linenums prettyprinted" style="">
    <ol class="linenums">
        ...
    </ol>
</pre>
pre.prettyprint > ol.linenums > li
pre.prettyprint > ol.linenums > li
{
    border-left: 1px solid #cccccc;
    margin-bottom: 0;
}

行番号を表示する際に、行番号とソースコードの間に縦線を引いています。

margin-bottom: 0は、Bloggerの初期設定CSSのmargin-bottom: 0.25emを無効にするために指定しています。 margin-bottom: 0を指定しないと行番号とソースコードの間の縦線が点線のようになってしまいます。

pre.prettyprint > ol.linenums > li.L0

preタグに行番号を表示する指定(linenums)をするとcode-prettifyは下記のようなHTMLを出力します。

<pre class="prettyprint lang-js linenums prettyprinted" style="">
    <ol class="linenums">
        <li class="L0">...</li>
        <li class="L1">...</li>
        ...
        <li class="L9">...</li>
        <li class="L0">...</li>
        ...
    </ol>
</pre>

ソースコードの1行を1つのliタグで括っています。 liタグのclass属性値はL0~L9となっていて、ソースコードの行数分だけ繰り返しています。

code-prettifyがこのようなHTMLを出力することを踏まえて以下の説明をお読みください。

pre.prettyprint > ol.linenums > li.L0,
pre.prettyprint > ol.linenums > li.L1,
pre.prettyprint > ol.linenums > li.L2,
pre.prettyprint > ol.linenums > li.L3,
pre.prettyprint > ol.linenums > li.L4,
pre.prettyprint > ol.linenums > li.L5,
pre.prettyprint > ol.linenums > li.L6,
pre.prettyprint > ol.linenums > li.L7,
pre.prettyprint > ol.linenums > li.L8,
pre.prettyprint > ol.linenums > li.L9 
{
    list-style-type: decimal;
}

このCSS設定をしないと、5行ごとに行番号が表示されるようになります。 すべての行に行番号を表示するためにli.L0~li.L9にlist-style-type: decimalを設定しています。

pre.prettyprint > ol.linenums > li.L1,
pre.prettyprint > ol.linenums > li.L3,
pre.prettyprint > ol.linenums > li.L5,
pre.prettyprint > ol.linenums > li.L7,
pre.prettyprint > ol.linenums > li.L9 
{
    background-color: transparent;
}

行番号を表示する際にcode-prettifyは初期設定CSSで、奇数行の背景色を#eeeeeeという淡い灰色にしてしまいます。 これを無効にするためにbackground-color: transparentを設定しています。

pre.prettyprint > ol.linenums > li span
pre.prettyprint > ol.linenums > li span:first-child
{
    padding-left: 1em;
}

pre.prettyprint > ol.linenums > li span:last-child
{
    padding-right: 1em;
}

行番号を表示する際に、ソースコードの左と右に1emのパディングを入れています。 これを入れないとソースコードと枠線の間に余白がなくなり、窮屈な見た目になってしまいます。

liタグとspanタグの間のCSSセレクタ指定を子セレクタ(>)ではなく子孫セレクタ(空白)にしているのは、preタグの内側にcodeタグを指定した場合を考慮してのことです。

ソースコードを表示する際にpreタグのみで括った場合は、

<pre class="prettyprint lang-xxx linenums">
function testFunction()
...
</pre>

code-prettifyは下記のHTMLを出力します。

<pre class="prettyprint lang-js linenums prettyprinted" style="">
    <ol class="linenums">
        <li class="L0">
            <span class="kwd">function</span>
            <span class="pln"> testFunction</span>
            <span class="pun">()</span>
        </li>
        ...
    </ol>
</pre>

ソースコードを表示する際にpreタグの内側にcodeタグを指定した場合は、

<pre class="prettyprint lang-xxx linenums">
<code>
function testFunction()
...
</code>
</pre>

code-prettifyは下記のHTMLを出力します。

<pre class="prettyprint lang-js linenums prettyprinted" style="">
    <ol class="linenums">
        <li class="L0">
            <code>
                <span class="kwd">function</span>
                <span class="pln"> testFunction</span>
                <span class="pun">()</span>
            </code>
        </li>
        ...
    </ol>
</pre>

preタグのみで括った場合とpreタグとcodeタグで括った場合の両方に対応するために、liタグとspanタグは子孫セレクタで設定しています。

これらのCSSにより、上記の2通りのHTMLで<span class="kwd">function</span>の左側に1emのパディングを入れて、<span class="pun">()</span>の右側に1emのパディングを入れています。
li span:first-childは、liタグの子孫の最初のspanタグという意味です。
li span:last-childは、liタグの子孫の最後のspanタグという意味です。
liの子孫にspanタグが1つしかない場合は、最初と最後のspanタグがその1つしかないspanタグになるので、その1つしかないspanタグの左右に1emのパディングが入るようになります。

pre.prettyprint .xxx

code-prettifyは下記のソースコードをプログラミング言語の構文に従って字句に分解して、その字句ごとにspanタグで括ります。

function testFunction()
{
    ...
}
<pre class="prettyprint lang-js linenums prettyprinted" style="">
    <ol class="linenums">
        <li class="L0">
            <span class="kwd">function</span>
            <span class="pln"> testFunction</span>
            <span class="pun">()</span>
        </li>
        ...
    </ol>
</pre>

このspanタグにはプログラミング言語の構文規則に基づいた字句の種別を示すclass属性値が設定されているので、そのclass属性値に応じて色分け表示のCSSを設定していきます。

その色分け表示のCSSの設定が下記のCSSです。

/* plain text */
pre.prettyprint .pln { color: #cccccc; }

/* string content */
pre.prettyprint .str { color: #cccc33; }
/* a keyword */
pre.prettyprint .kwd { color: #00cc00; }
/* a comment */
pre.prettyprint .com { color: #cc3366; }
/* a type name */
pre.prettyprint .typ { color: #00cc00; }
/* a literal value */
pre.prettyprint .lit { color: #3399cc; }
/* punctuation, lisp open bracket, lisp close bracket */
pre.prettyprint .pun,
pre.prettyprint .opn,
pre.prettyprint .clo
{ color: #cccccc; }
/* a markup tag name */
pre.prettyprint .tag { color: #3399cc; }
/* a markup attribute name */
pre.prettyprint .atn { color: #00cc00; }
/* a markup attribute value */
pre.prettyprint .atv { color: #cccc33; }
/* a declaration; a variable name */
pre.prettyprint .dec,
pre.prettyprint .var
{ color: #00cc00; }
/* a function name */
pre.prettyprint .fun { color: #cc66cc; }

.plnは通常の文字列、.strは引用符で括られた文字列、.comはコメントなどとなっています。

colorしか設定していませんが、font-weight: boldを指定すれば太字にすることもできますし、そのほかの設定もできます。

BloggerへのCSS追加手順

Bloggerへcode-prettifyの見た目を設定するCSSを追加するには下記の手順で行います。

Bloggerの設定画面で、

  1. [テーマ]の編集画面を表示
  2. [カスタマイズ]ボタンを押下
  3. Blogger テーマ デザイナーを表示
  4. [上級者向け]ー[CSSを追加]ー[カスタム CSS を追加]のテキストボックスにCSSを追加
  5. [ブログに適用]ボタンを押下

他の選択肢

Bloggerでソースコードの色分け表示を行えるのは、code-prettifyだけではありません。

他の有力な選択肢としては、SyntaxHighlighterがあります。
SyntaxHighlighter

SyntaxHighlighterにはcode-prettifyにはない、行の強調表示の機能などがあります。

記事終わり

2017年10月28日土曜日

HTMLの見出しタグに連番を振るCSSの書き方

このブログで行っているHTMLの見出しタグ<h4>、<h5>、<h6>に連番を振るCSSの書き方をご紹介します。

このブログの見出しタグ周りのCSS

このブログのHTMLは、下記のように<h4>、<h5>、<h6>タグにクラス名を付与しています。

<h4 class="foacs-chapter">
<h5 class="foacs-section">
<h6 class="foacs-paragraph">

このブログの見出しタグ周りのCSSは下記のとおりです。

/*
見出し設定
class="foacs-chapter"
class="foacs-section"
class="foacs-paragraph"
*/
.foacs-chapter
{
    border-left: 0.5em solid var(--foacs-link-color);
    border-bottom: 1px solid var(--foacs-link-color);
    font-size: x-large;
    margin-top: 4em;
    margin-bottom: 1em;
    padding: 0.5em;
    counter-increment: --foacs-chapter-counter;
    counter-reset: --foacs-section-counter;
}

.foacs-chapter::before
{
    content: counter(--foacs-chapter-counter) ".";
    padding-right: 0.5em;
}

.foacs-section
{
    border-left: 0.5em solid var(--foacs-link-color);
    border-bottom: 1px solid var(--foacs-link-color);
    font-size: large;
    margin-top: 4em;
    margin-bottom: 1em;
    padding: 0.5em;
    counter-increment: --foacs-section-counter;
    counter-reset: --foacs-paragraph-counter;
}

.foacs-section::before
{
    content: counter(--foacs-chapter-counter) "." counter(--foacs-section-counter) ".";
    padding-right: 0.5em;
}

.foacs-paragraph
{
    border-left: 0.5em solid var(--foacs-link-color);
    border-bottom: 1px solid var(--foacs-link-color);
    font-size: medium;
    margin-top: 4em;
    margin-bottom: 1em;
    padding: 0.5em;
    counter-increment: --foacs-paragraph-counter;
}

.foacs-paragraph::before
{
    content: counter(--foacs-chapter-counter) "." counter(--foacs-section-counter) "." counter(--foacs-paragraph-counter) ".";
    padding-right: 0.5em;
}

このブログのCSSの説明

見出しタグに連番を振るための手順は下記のとおりです。

  1. HTMLの見出しタグ<h4>、<h5>、<h6>にCSSで連番を振るためのクラス名を付与する
  2. CSSの変数を作り、現在の見出しのCSS変数の値を1増やして、下位の見出しのCSS変数を0にする
  3. CSSの変数から値を取り出して、HTMLの見出しの前に表示する

これらの手順について説明します。

HTMLのクラス名

このブログではHTMLの見出しタグ<h4>、<h5>、<h6>に下記のようにクラス名を付与しています。

<h4 class="foacs-chapter">
<h5 class="foacs-section">
<h6 class="foacs-paragraph">

「foacs」はこのブログの英語名の単語の頭文字をつなげたもので、Bloggerで元から使用されている他のクラス名と重複しないように使用している接頭辞です。

クラス名 foacs-chapter、foacs-section、foacs-paragraphを付与したHTMLの見出しタグ<h4>、<h5>、<h6>にCSSの機能で連番を振っています。

CSS変数

HTMLの見出しタグに連番を振るためにCSSの変数を使用しています。 どのように変数を使って連番を振っているのか、<h4>タグの場合に絞ってご説明します。

連番の準備

<h4>タグに付与するクラスfoacs-chapterの装飾を指定している個所をご覧ください。

.foacs-chapter
{
    border-left: 0.5em solid var(--foacs-link-color);
    border-bottom: 1px solid var(--foacs-link-color);
    font-size: x-large;
    margin-top: 4em;
    margin-bottom: 1em;
    padding: 0.5em;
    counter-increment: --foacs-chapter-counter;
    counter-reset: --foacs-section-counter;
}

counter-incrementでCSS変数--foacs-chapter-counterを1増やしています。
counter-resetで--foacs-section-counterを0にしています。
CSS変数の初期値は0ですので、<h4 class="foacs-chapter">タグが最初に出現した時点で、変数--foacs-chapter-counterは1に、--foacs-section-counterは0になります。

CSS変数は宣言なし、型指定なしでいきなり使えます。 変数の最初の2つのハイフン「--」は、CSSでは変数名を2つのハイフンで始めましょうというお約束になっているので、それに従っています。 変数名として分かりにくいとか違和感があるというのであれば、最初の2つのハイフンはなくても問題ありません。

このブログのCSSでは下記の3種類の変数を使用して、HTMLの見出しタグに連番を振っています。

--foacs-chapter-counter
--foacs-section-counter
--foacs-paragraph-counter
連番の表示

CSS変数の値の準備ができたので、次にその値を表示します。 値の表示はクラスfoacs-chapterの擬似要素beforeを指定している個所をご覧ください。

.foacs-chapter::before
{
    content: counter(--foacs-chapter-counter) ".";
    padding-right: 0.5em;
}

<h4 class="foacs-chapter">タグの前にCSS変数の値を表示するために、擬似要素beforeを使用しています。

CSS変数の値は関数counterで取り出します。関数counterで取り出した値の後ろに文字列「. 」を追加しています。 CSSでこのように指定することで下記のHTMLは「1. 見出し」と表示されます。

<h4 class="foacs-chapter">見出し</h4>

クラスfoacs-chapterで<h4>タグに連番を振ったように、クラスfoacs-sectionで<h5>タグ、クラスfoacs-paragraphで<h6>タグに連番を振っています。

ちなみに、クラス名と疑似要素の間のコロン「:」が2つになっているのは、CSS3の規則に従っているからです。 CSS3では疑似クラスと区別するために疑似要素につけるコロンが2つになっています。

CSS変数の注意点

CSS変数を使用する際に注意したい点を説明します。

擬似要素before内ではcounter-incrementとcounter-resetは動作しない

擬似要素beforeを指定したセレクタ内では、counter-incrementとcounter-resetは動作しません。 下記の記述は動作しませんので注意してください。

/*
動作しない。
*/
.foacs-chapter::before
{
    counter-increment: --foacs-chapter-counter;
    counter-reset: --foacs-section-counter;
    content: counter(--foacs-chapter-counter) ". ";
    padding-right: 0.5em;
}
1つのセレクタ内で複数のcounter-incrementとcounter-resetは動作しない

1つのセレクタ内に複数のcounter-incrementを書いても最後のcounter-incrementしか動作しません。 counter-resetも同様です。

このブログでは下記のようなCSSは使っていませんが、ご参考までにご留意ください。 下記の記述では、counter-increment: --foacs-counter03のみが動作します。

/*
counter-increment: --foacs-counter01とcounter-increment: --foacs-counter02は動作しない。
counter-increment: --foacs-counter03のみが動作する。
*/
.foacs-li
{
    counter-increment: --foacs-counter01;
    counter-increment: --foacs-counter02;
    counter-increment: --foacs-counter03;
}

上記のように1つのセレクタ内で複数の変数を動作させたい場合は下記のように記述します。

/*
動作する。
変数は空白で区切る。
*/
.foacs-li
{
    counter-increment: --foacs-counter01 --foacs-counter02 --foacs-counter03;
}

変数は空白で区切ります。カンマ「,」では区切らないので注意してください。

BloggerへのCSSの追加

自分で作成したCSSをBloggerの自分のブログに適用するためには以下のようにします。

  1. [テーマ]の編集画面を表示
  2. [カスタマイズ]ボタンを押下
  3. Blogger テーマ デザイナーを表示
  4. [上級者向け]ー[CSSを追加]ー[カスタム CSS を追加]のテキストボックスにCSSをコピー&ペースト
  5. [ブログに適用]ボタンを押下

記事終わり

2017年10月19日木曜日

WindowsのExcel VBAから.NET Frameworkの暗号サービスを呼び出す方法

WindowsのExcel VBAから.NET FrameworkのSystem.Security.Cryptography名前空間に属するクラスのプロパティ、メソッドを呼び指す方法をご紹介します。 これにより、WindowsのExcel VBAからHMAC-SHA1、HMAC-SHA256などの処理が簡単に出来るようになります。

Windowsに.NET Framework 3.5をインストールする

WindowsのExcel VBAから呼び出せる.NET Frameworkはバージョン3.5までのようですので、Windows 10の場合、[Windowsの機能の有効化または無効化]を呼び出して.NET Framework 3.5をインストールする必要があります。

[Windowsスタートボタン]-[Windowsの設定]-[アプリ]-[プログラムと機能]-[Windowsの機能の有効化または無効化]

上の画面で「.NET Framework 3.5(.NET 2.0 および 3.0 を含む)」のチェックボックスを■の状態(上記画面の状態)にします。

これで、WindowsのExcel VBAから.NET Framework 3.5の暗号サービスを呼び出せるようになります。

Excel VBAのプログラム

実際に使用する例としてTwitter APIとAmazon Product Advertising APIのHTTPリクエストで使用する署名作成プログラムをご紹介します。

ご紹介する例では、Excel VBAのCreateObject関数を使って.NET FrameworkのSystem.Security.Cryptography名前空間のクラスのオブジェクトを生成しています。

Twitter APIの署名作成プログラム

Twitter APIの署名作成プログラムは下記のとおりです。

' 署名の元となる文字列。使用している値についてはTwitter APIの下記文書を参照。
' https://developer.twitter.com/en/docs/basics/authentication/guides/creating-a-signature
' Developer - Documentation - Basics - Authentication - Guides - Creating a signature 参照
Dim strSourceOfSignature As String
strSourceOfSignature = "POST" _
                        & "&https%3A%2F%2Fapi.twitter.com%2F1.1%2Fstatuses%2Fupdate.json&include_entities%3Dtrue" _
                        & "%26oauth_consumer_key%3Dxvz1evFS4wEEPTGEFPHBog" _
                        & "%26oauth_nonce%3DkYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg" _
                        & "%26oauth_signature_method%3DHMAC-SHA1" _
                        & "%26oauth_timestamp%3D1318622958" _
                        & "%26oauth_token%3D370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb" _
                        & "%26oauth_version%3D1.0" _
                        & "%26status%3DHello%2520Ladies%2520%252B%2520Gentlemen%252C%2520a%2520signed%2520OAuth%2520request%2521"
                        
' HMAC-SHA1を使って署名を算出。
Dim objHMACSHA1 As Object
Set objHMACSHA1 = CreateObject("System.Security.Cryptography.HMACSHA1")
Dim byteKeys() As Byte
' Signing key: kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE
byteKeys = StrConv("kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE", vbFromUnicode)
objHMACSHA1.Key = byteKeys
Dim byteTexts() As Byte
byteTexts = StrConv(strSourceOfSignature, vbFromUnicode)
Dim byteHMACSHA1s() As Byte
byteHMACSHA1s = objHMACSHA1.ComputeHash_2(byteTexts)

' 算出した署名をBase64エンコードする。
Dim objDOMDocument As Object
Set objDOMDocument = CreateObject("MSXML2.DOMDocument")
Dim objIXMLDOMElement As Object
Set objIXMLDOMElement = objDOMDocument.createElement("b64")
objIXMLDOMElement.DataType = "bin.base64"
objIXMLDOMElement.nodeTypedValue = byteHMACSHA1s
Dim strSignature As String
strSignature = objIXMLDOMElement.Text
MsgBox strSignature

Set objHMACSHA1 = Nothing
Set objDOMDocument = Nothing
Set objIXMLDOMElement = Nothing
Amazon Product Advertising APIの署名作成プログラム

Amazon Product Advertising APIの署名作成プログラムは下記のとおりです。

' 署名の元となる文字列。使用している値についてはAmazon Product Advertising APIの下記文書を参照。
' Amazon Product Advertising API Developer Guide (API Version 2013-08-01)
' http://docs.aws.amazon.com/ja_jp/AWSECommerceService/latest/DG/rest-signature.html
' Programming Guide - Requests - Request Authentication - Authenticating REST Requests - Example REST Requests 参照
Dim strSourceOfSignature As String
strSourceOfSignature = "GET" & Chr(10) & "webservices.amazon.com" & Chr(10) & "/onca/xml" & Chr(10) _
                        & "AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE" _
                        & "&AssociateTag=mytag-20" _
                        & "&ItemId=0679722769" _
                        & "&Operation=ItemLookup" _
                        & "&ResponseGroup=Images%2CItemAttributes%2COffers%2CReviews" _
                        & "&Service=AWSECommerceService" _
                        & "&Timestamp=2014-08-18T12%3A00%3A00Z" _
                        & "&Version=2013-08-01"

' HMAC-SHA256を使って署名を算出。
Dim objHMACSHA256 As Object
Set objHMACSHA256 = CreateObject("System.Security.Cryptography.HMACSHA256")
Dim byteKeys() As Byte
' AWS secret key: 1234567890
byteKeys = StrConv("1234567890", vbFromUnicode)
objHMACSHA256.Key = byteKeys
Dim byteTexts() As Byte
byteTexts = StrConv(strSourceOfSignature, vbFromUnicode)
Dim byteHMACSHA256s() As Byte
byteHMACSHA256s = objHMACSHA256.ComputeHash_2(byteTexts)

' 算出した署名をBase64エンコードする。
Dim objDOMDocument As Object
Set objDOMDocument = CreateObject("MSXML2.DOMDocument")
Dim objIXMLDOMElement As Object
Set objIXMLDOMElement = objDOMDocument.createElement("b64")
objIXMLDOMElement.DataType = "bin.base64"
objIXMLDOMElement.nodeTypedValue = byteHMACSHA256s
Dim strSignature As String
strSignature = objIXMLDOMElement.Text
MsgBox strSignature

Set objHMACSHA256 = Nothing
Set objDOMDocument = Nothing
Set objIXMLDOMElement = Nothing

Excel VBAから呼び出せる.NET Frameworkの制限事項

Excel VBAからすべての.NET Frameworkのクラスを呼び出せるわけではありません。 呼び出せる.NET Frameworkのクラスには制限があります。 制限は下記のとおりです。

  1. Excel VBAから使用できる.NET Frameworkのバージョンは3.5まで
  2. クラスに引数を取らないコンストラクター(既定のコンストラクター)が必要
  3. クラスのPrivate、Protected、Static(Shared)なプロパティ、メソッドは呼び出せない
  4. オーバーロードされているメソッドは「メソッド名_1」「メソッド名_2」のように、メソッド名にアンダーバー「_」と数字を付け加えて呼び出す

上記の制限事項については下記のサイトに詳しく説明が載っています。
Microsoft Office と .NET の相互運用性
.NETFrameworkの使用

記事終わり