Practice of Programming

プログラム とか Linuxとかの話題

Nanocで絵文字を表示する

前回の続きでNanocの話です。

honkitでは、:name: という表記で、絵文字を表記できたりしますが、Nanocではできません。 これも、自分でフィルターを簡単に書くことができます。

gemojione を使って、絵文字を表示するフィルターを作る

lib/nanoc/filters/gemojione.rb とか適当にファイルを作ればOKです。

module Nanoc::Filters
  class ChangeCodeBlock < Nanoc::Filter
    identifier :gemojione

    require 'gemojione'

    def run(content, params = {})
      index = Gemojione::Index.new
      content = content.gsub(/:([a-z0-9 _-]+?):/) {|s|
        emoji = index.find_by_name($1) || index.find_by_shortname(":" + $1 + ":")
        moji = s
        if (emoji != nil)
          moji = emoji['moji']
        end
        moji
      }

      content
    end
  end
end

Rulesで、下記のように使うだけです。

filter :gemojione

余談

しかし、gemojioneなんですが、こんな感じになっていて、

        emoji_hash["description"] = emoji_hash["name"]
        emoji_hash["name"] = key
        @emoji_by_name[key] = emoji_hash if key

なぜか、@emoji_by_name なのに、key をキーとしていて、定義上、実質、keyshortnameが同じなので、

  • find_by_name
  • find_by_shortname

にほぼ違いがないんですよね。謎い。絵文字はこんな感じで定義されています。

※ masterは調べてませんが、v3.3.0に関しては、key と shortnameは一致してそうでした。

{
  "100": {
    "unicode": "1F4AF",
    "unicode_alternates": [

    ],
    "name": "hundred points symbol",
    "shortname": ":100:",
    "category": "symbols",
    "aliases": [

    ],
    "aliases_ascii": [

    ],
    "keywords": [
      "numbers",
      "perfect",
      "score",
      "100",
      "percent",
      "a",
      "plus",
      "school",
      "quiz",
      "test",
      "exam",
      "symbol",
      "wow",
      "win",
      "parties"
    ],
    "moji": "💯"
  },
  // ...
}