2014年10月24日金曜日

BloggerでSyntaxHighlighterを使用する方法

Syntax Highlighter Scripts Generatorを 使用しろと紹介してあるサイトが多いようだが、2014/10/24現在、リンクが切れてしまっていて良く分からないので、別の方法で BloggerでSyntaxHighlighterを使用する方法を調べてみた。 SyntaxHighlighterの公式ページのInstallationを見ると
<!-- Include required JS files -->
<script type="text/javascript" src="js/shCore.js"></script>

<!--
    At least one brush, here we choose JS. You need to include a brush for every 
    language you want to highlight
-->
<script type="text/javascript" src="css/shBrushJScript.js"></script>

<!-- Include *at least* the core style and default theme -->
<link href="css/shCore.css" rel="stylesheet" type="text/css" />
<link href="css/shThemeDefault.css" rel="stylesheet" type="text/css" />

<!-- Finally, to actually run the highlighter, you need to include this JS on your page -->
<script type="text/javascript">
     SyntaxHighlighter.all()
</script>

<pre class="brush: js">
    /**
     * SyntaxHighlighter
     */
    function foo()
    {
        if (counter <= 10)
            return;
        // it works!
    }
</pre>

<script type="syntaxhighlighter" class="brush: js"><![CDATA[
  /**
   * SyntaxHighlighter
   */
  function foo()
  {
      if (counter <= 10)
          return;
      // it works!
  }
]]></script>
となっている。ここに含まれる導入に必要な手順は次の5つ
  1. コアとなるJavaScriptファイルを読み込む
    <script type="text/javascript" src="js/shCore.js"></script>
  2. ハイライトしたい言語に応じたJavaScriptファイルを読み込む。この例はJavaScriptの場合となる。
    <script type="text/javascript" src="css/shBrushJScript.js"></script>
  3. コアとなるcssファイルとデフォルトテーマのcssを読み込む
    <link href="css/shCore.css" rel="stylesheet" type="text/css" />
    <link href="css/shThemeDefault.css" rel="stylesheet" type="text/css" />
  4. 以下のコードをWebページに記述して、ここまでに読み込みをしたファイルに書かれているSyntaxHighlighterを実行する
    <script type="text/javascript">
    SyntaxHighlighter.all()
    </script>
  5. 投稿する文章の中でハイライトするコードの部分を<pre class="brush: js"></pre>または<script type="syntaxhighlighter" class="brush: js"><![CDATA[]]></script>で囲む(例はハイライトしたい言語がJavaScriptの場合)
これで、記述したコードがハイライトされて表示される。

ただし!!

これは自宅サーバーやファイルのアップロードが可能なレンタルサーバーなどの場合の話。ファイルのアップロードができないBloggerではこの方法は使えない。 なんだ・・・結局、ダメじゃん、とあきらめる事なかれ。公式によって次の方法が用意されている。

Hosting

この方法を使用することにより、ダウンロードしなくてもホスティングされたファイルをリンクすることによって、ダウンロードした場合と同じように機能が利用できる。 先ほどのコードを、このホスティングの場合に置き換えたのがこちら
    <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'/>
    <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'/>
    <link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/> 
    <link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
    <script type='text/javascript'>
        SyntaxHighlighter.all()
    </script>
これを、Bloggerの、テンプレート -> HTMLの編集で表示されるHTMLコードに追加する。
    <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'/>
    <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'/>
    <link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/> 
    <link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
は、WebサイトでCSSファイル、JavaScriptファイルを読み込む時と同じように、上の方にある</head>の直前に追加する。
    <script type='text/javascript'>
        SyntaxHighlighter.all()
    </script>
は、下の方にある</body>の直前に追加する。

これで、<pre class="brush: js"></pre>または<script type="syntaxhighlighter" class="brush: js"><![CDATA[]]></script>で囲ったコードが ハイライトされて表示される。

WordPressの管理画面にメニュー項目を追加する方法

まずは関係するアクションフック

管理画面にメニュー項目を追加するには下記のようにadd_actionメソッドを使用し、'admin_menu'アクションにメニュー追加のために作成したメソッドをフックする。

メニュー追加のための関数add_own_menuを作成する

ここで呼び出すのがadd_menu_pageメソッド。このメソッドを呼ぶことによってトップレベルに自作メニュー項目が追加される。

add_menu_pageメソッド

add_menu_pageメソッドの引数

  1. string $page_title - メニューページタイトル メニュー項目を開いたページで、ここで指定のタイトルが表示される。HTMLのhead内でtitleタグで指定するあれ。
  2. string $menu_title - メニュー名 管理画面にここで指定した名前のメニュー項目が表示される。
  3. mixed $capability - メニューを使用できる権限を指定できる。管理者しか使用しないのであれば10を指定しておけばよいと思われる。
    指定する権限についてはLevelとCapabilityを参照
  4. string $menu_slug - メニューのスラッグを指定する。ここで指定したスラッグが、URLの?page=以降のスラッグとして使用される。
    [WordPress] 管理画面にメニュー項目を追加する | unlinked log>や他のサイトでも、この引数を'コンテンツ表示 PHP ファイル'と説明し__FILE__を指定すると説明しているものが多く見受けられるが特にコンテンツを表示するファイルを指定しなければいけないわけではないようである。そのように説明される背景はCodexによるとVersion 3.0以前においては、この引数はfile (or handle) parameterと呼ばれ、また次のfunction parameterが省略された場合にこの引数がメニューを表示するためのPHP fileとして参照されていたことに由来するようである。
  5. mixed $function - メニュー内のページを表示する関数。
  6. string $icon_url - メニュー横に表示されるアイコンファイルのURL
    WordPress Codex 日本語版 管理メニューの追加によると 「これはWordPress 2.7においてのみ有効です。」とあるので使わない方がよい?

add_object_pageメソッド、add_utility_pageメソッドは、add_menu_pageメソッドの別バージョン。
add_menu_pageメソッドでは作成したメニューがメニューの一番下に追加されるのに対して、add_object_pageメソッドではコメントの下、 add_utility_pageメソッドでは設定の下に追加される。

メニューページを表示する関数

作成したメニュー項目をクリックすると、add_menu_pageメソッドの第5引数で指定した関数が呼ばれ、表示するページが作成される
$_REQUEST['page']にはadd_menu_pageメソッド第4引数で指定したスラッグが渡っているのが分かる。

add_submenu_pageメソッド

トップレベルにメニュー項目を追加する方法としてadd_menu_pageメソッドを説明したが、一方、add_submenu_pageメソッドは、トップレベルのメニューを親として、 その子メニューとなるサブメニューを作成する関数である。


add_submenu_pageメソッドの引数
  1. string $parent_slug - ここで指定したスラッグを持つトップレベルメニューのサブメニューとしてサブメニューが作成される
  2. string $page_title - サブメニューページタイトル
  3. string $menu_title - サブメニュー名
  4. mixed $capability - メニューを使用できる権限
  5. string $menu_slug - サブメニューのスラッグを指定する
  6. mixed $function - サブメニュー内のページを表示する関数。

add_dashboard_pageメソッド、add_posts_pageメソッドは表示位置が最初から決まっているadd_submenu_pageメソッドの別バージョン。
add_menu_pageメソッドで第1引数を指定すればこれらを使う必要はない。

サブメニューページを表示する関数

作成したサブメニュー項目をクリックすると、add_sub_menu_pageメソッドの第6引数で指定した関数が呼ばれ、表示するページが作成される

$_REQUEST['page']にはadd_sub_menu_pageメソッド第5引数で指定したスラッグが渡っているのが分かる。

ソース全体 -Pluginにしてみた-

参考

add_menu_page:WordPress私的マニュアル - elearn.jp

add_submenu_page:WordPress私的マニュアル - elearn.jp

[WordPress] 管理画面にメニュー項目を追加する | unlinked log

管理メニューの追加 - WordPress Codex 日本語版

PHPによるWordPressカスタマイズブック―3.x対応 p.280~あたり