MeCabで良い感じタイトル改行する

こんにちはnasustです。

以下のように日本語の文章では1文字単位で自動改行されてしまう為に、読み辛い場合があります。

「タイトル」の途中で改行されてしまいます。

MeCabで単語単位で改行するようにする

MeCab: Yet Another Part-of-Speech and Morphological Analyzer

MeCabは形態素解析エンジンです。これを使用して単語を抜き出し改行を良い感じにします。

Node.jsでAPIサーバーを作成する

Hugoは、テンプレート関数getJSONでAPIサーバーからJSONを取得することが出来ます。 この関数を利用してHugoの機能を拡張します。

see also: Data Templates | Hugo

expressとmecab-asyncで実装しました。

import * as express from 'express';
const MeCab = require('mecab-async');

const app = express();
const mecab = new MeCab();

app.get("/mecab", (expressRequest, expressResponse, expressNext) => {
    const text = expressRequest.query.text

    mecab.parse(text, (err: any, result: any) => {
        if (err) {
            expressNext(err);
            return;
        }

        expressResponse.json({
            mecab: result
        });
    });
})

app.listen(6060, () => console.log('Listening on port 6060'));
typescript

result変数の中身

[
  [
    'Mecab', '名詞',
    '一般',    '*',
    '*',     '*',
    '*',     '*'
  ],
  [
    'で',  '助詞', '格助詞',
    '一般', '*',  '*',
    '*',  'で',  'デ',
    'デ'
  ],
  [
    '良い',  '形容詞',
    '自立',  '*',
    '*',   '形容詞・アウオ段',
    '基本形', '良い',
    'ヨイ',  'ヨイ'
  ],
  [
    '感じ',  '名詞', '一般',
    '*',   '*',  '*',
    '*',   '感じ', 'カンジ',
    'カンジ'
  ],
  [
    'に',  '助詞', '格助詞',
    '一般', '*',  '*',
    '*',  'に',  'ニ',
    'ニ'
  ],
  [
    'タイトル', '名詞',   '一般',
    '*',    '*',    '*',
    '*',    'タイトル', 'タイトル',
    'タイトル'
  ],
  [
    'を',  '助詞', '格助詞',
    '一般', '*',  '*',
    '*',  'を',  'ヲ',
    'ヲ'
  ],
  [
    '改行',    '名詞',
    'サ変接続',  '*',
    '*',     '*',
    '*',     '改行',
    'カイギョウ', 'カイギョー'
  ],
  [
    'する',  '動詞',
    '自立',  '*',
    '*',   'サ変・スル',
    '基本形', 'する',
    'スル',  'スル'
  ]
]
javascript

Hugoのテンプレート

getJSONを実行するテンプレート

<!-- function/mecab.html -->
{{ $text := . }}
{{ $entrypoint := "http://localhost:6060/" }}
{{ $endpoint := printf "%s%s" $entrypoint "mecab?" }}
{{ $url := printf "%s%s" $endpoint (querify "text" $text ) }}

{{ $json := getJSON $url }}

{{ return $json.mecab }}
html

getJSONの結果をレンダリングするテンプレート

{{ $text := . }}
{{ $text := replace $text " " "👻" }}
{{- $mecab := partial "function/mecab" $text -}}
{{- range $mecab -}}
    {{- $word := index . 0 -}}
    {{- if eq "👻" $word -}}
        {{- $word = " " -}}
    {{- end -}}
    {{- $lexical := index . 1 -}}
    {{- if eq $lexical "名詞" "動詞" -}}
        <span class="a-m">{{ $word }}</span>
    {{- else -}}
        {{ $word }}
    {{- end -}}
{{- end -}}
html

助詞と動詞だけ単語単位で改行するようにしました。 半角スペースはMecabでフォーマット指定より、別の文字に置き換えて実行した方が綺麗にしやすかったので、"👻"に置き換えて実行しました。

良い感じに改行した結果

タイトルの途中で改行されなくなって、読みやすくなりました。

prev