{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/how-to-use-japanese-tag-in-middleman/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"363d5c02-10ad-5a8e-8866-3dd9f7c84943","excerpt":"こんにちは。 Middlemanで日本語のタグを使ったときに、そのタグのURLが空になってしまうことがあります。 このブログでは日本語のタグも使えるようにしてありますが、一手間加える必要がありました。 なぜそうなるのかと、どうすれば治るのかを残しておこうと思います。 はじめに 使用しているgem…","html":"<p>こんにちは。<br>\nMiddlemanで日本語のタグを使ったときに、そのタグのURLが空になってしまうことがあります。<br>\nこのブログでは日本語のタグも使えるようにしてありますが、一手間加える必要がありました。<br>\nなぜそうなるのかと、どうすれば治るのかを残しておこうと思います。</p>\n<!--more-->\n<h2 id=\"はじめに\" style=\"position:relative;\"><a href=\"#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\" aria-label=\"はじめに permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>はじめに</h2>\n<p>使用しているgemとそのバージョンです</p>\n<table>\n<thead>\n<tr>\n<th>gem</th>\n<th>Version</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>middleman</td>\n<td>4.2.1</td>\n</tr>\n<tr>\n<td>middleman-blog</td>\n<td>4.0.2</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"原因\" style=\"position:relative;\"><a href=\"#%E5%8E%9F%E5%9B%A0\" aria-label=\"原因 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>原因</h2>\n<div class=\"gatsby-highlight\" data-language=\"ruby\"><pre class=\"language-ruby\"><code class=\"language-ruby\">      <span class=\"token comment\">##</span>\n      <span class=\"token comment\"># Get a path to the given tag, based on the :taglink setting.</span>\n      <span class=\"token comment\">#</span>\n      <span class=\"token comment\"># @param  tag [String] Tag name</span>\n      <span class=\"token comment\"># @return     [String] Safe Tag URL</span>\n      <span class=\"token comment\">##</span>\n      <span class=\"token keyword\">def</span> <span class=\"token method-definition\"><span class=\"token function\">link</span></span><span class=\"token punctuation\">(</span> tag <span class=\"token punctuation\">)</span>\n        apply_uri_template <span class=\"token variable\">@tag_link_template</span><span class=\"token punctuation\">,</span> tag<span class=\"token punctuation\">:</span> safe_parameterize<span class=\"token punctuation\">(</span> tag <span class=\"token punctuation\">)</span>\n      <span class=\"token keyword\">end</span></code></pre></div>\n<p><code>middleman-blog</code>gemの中の<code>lib/middleman-blog/tag_pages.rb</code>にあります。<br>\n<code>safe_parameterize</code>された結果がURLになるのですが、これが日本語が弾かれて空文字になります。</p>\n<div class=\"gatsby-highlight\" data-language=\"ruby\"><pre class=\"language-ruby\"><code class=\"language-ruby\">      <span class=\"token comment\">##</span>\n      <span class=\"token comment\"># Parametrize a string preserving any multi-byte characters</span>\n      <span class=\"token comment\"># Reimplementation of this, preserves un-transliterate-able multibyte chars.</span>\n      <span class=\"token comment\">#</span>\n      <span class=\"token comment\"># @see http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize</span>\n      <span class=\"token comment\">##</span>\n      <span class=\"token keyword\">def</span> <span class=\"token method-definition\"><span class=\"token function\">safe_parameterize</span></span><span class=\"token punctuation\">(</span>str<span class=\"token punctuation\">)</span>\n        parameterized_string <span class=\"token operator\">=</span> <span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token constant\">ActiveSupport</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token constant\">Inflector</span><span class=\"token punctuation\">.</span>transliterate<span class=\"token punctuation\">(</span>str<span class=\"token punctuation\">.</span>to_s<span class=\"token punctuation\">)</span>\n        parameterized_string<span class=\"token punctuation\">.</span>parameterize\n      <span class=\"token keyword\">end</span></code></pre></div>\n<p><code>lib/middleman-blog/uri_templates.rb</code>に定義があります。<br>\nActiveSupport::Inflector#parameterizeの説明は<a href=\"https://apidock.com/rails/v4.2.7/ActiveSupport/Inflector/parameterize\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">こちら</a>を読むと良いと思います。</p>\n<p>これらの処理が日本語というかマルチバイト文字を弾いてしまい、日本語のタグのURLが空になります。</p>\n<h2 id=\"対処法\" style=\"position:relative;\"><a href=\"#%E5%AF%BE%E5%87%A6%E6%B3%95\" aria-label=\"対処法 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>対処法</h2>\n<p><code>ActiveSupport::Inflector</code>に設定を渡したりして回避はできるそうなのですが、わざわざ日本語と英語のマッピング作るよりも、汎用的に％エンコードすればいいのでは？<br>\nと思い、そんな感じで対処しました。<br>\n結論としては<a href=\"https://github.com/Leko/WEB-EGG/blob/master/config.rb#L7\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">こちら</a>の設定ファイルのような対処をとりました。</p>\n<p><code>after_configuration</code>フックで無理やりモンキーパッチ当ててますが、影響箇所わかってるしブログのビルドツールなのでこれくらいの対処でいいだろうと判断してます。</p>\n<p>対処した内容としては、</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">    def link( tag )\n      safe_tag = safe_parameterize(tag)\n      safe_tag = URI.encode(tag) if safe_tag == ''\n      apply_uri_template @tag_link_template, tag: safe_tag\n    end</code></pre></div>\n<p>です。<br>\n一度公開してしまってから問題に気づいたので、もともと<code>safe_parameterize</code>でうまくいっていた箇所はそのままに、空文字になってしまうものは％エンコードという対処をとりました。<br>\nもし最初から気付いていれば全て％エンコードでもよかったと思います。</p>\n<h2 id=\"さいごに\" style=\"position:relative;\"><a href=\"#%E3%81%95%E3%81%84%E3%81%94%E3%81%AB\" aria-label=\"さいごに permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>さいごに</h2>\n<p>英語圏のツールは枯れててもマルチバイトに弱いことが多いので、ローカルで気をつけて動作確認しておくべきでした…<br>\n同じ悩みを抱えている方がいらっしゃったら解決手段になれば幸いです。</p>","timeToRead":3,"frontmatter":{"title":"middleman-blogで日本語のタグのURLが空になる問題を解消する方法","tags":["Middleman"],"date":"August 29, 2017","featuredImage":null}}},"pageContext":{"slug":"/how-to-use-japanese-tag-in-middleman/","previous":{"fields":{"slug":"/how-to-build-and-deploy-to-deploygate-in-cli/"},"frontmatter":{"title":"CLIだけでReact NativeアプリをビルドしてDeployGateにデプロイする方法","tags":["iOS","Android","React Native","DeployGate"]}},"next":{"fields":{"slug":"/why-i-need-redux-with-react-new-context/"},"frontmatter":{"title":"ReactのNew Context APIは便利だけどreduxを使うのはやめないと思った","tags":["JavaScript","React","Redux","React Native"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}