アイキャッチ画像

Sphinx(ablog)の後処理をする

Sphinx(ablog)で出力したHTMLのドキュメントファイルに対して、bashとPythonを使って後処理をしました。具体的には、タグの属性の書き換えです。

目次

  1. どうしてこんなことをするのか
  2. どういう手順で実行するのか
  3. 作ったスクリプト

どうしてこんなことをするのか

Twitterカードを表示するためにMETAタグの中にTwitter社指定のタグを書かなければならないのですが、その指定のタグの書式にコロンが使われています。

reStructuredTextでMETAタグを出力させる場合はmetaディレクティブを使用するのですが、name属性にコロンの指定ができません。(ご存じの方がいらっしゃいましたら、教えてください。)

仕方がないので、Twitterカード用のタグのところには代替のテキストを入れておいて、HTML出力後にタグを書き換えることにします。

どういう手順で実行するのか

PythonのBeautifulSoupというモジュールを使って、タグを書き換えることにしました。

単純に正規表現による置換だけで書き換えても良いのですが、せっかくの構造化テキスト(HTMLのこと)なのでそれっぽく書き換えたいと思います。

Pythonで1つのファイルの置換処理をするスクリプトを作って、bashにそのスクリプトを連続実行させます。

作ったスクリプト

まずは、Pythonのスクリプトです。 ファイル名は、mypostprocess.pyです。

from bs4 import BeautifulSoup
import re
import sys

# 引数の読み込み
fn = sys.argv[1]

# ファイル読み込み
with open(fn, mode='rt', encoding='utf-8') as fi:
    source_text = fi.read()
    soup = BeautifulSoup(source_text, 'html.parser')

# 置換の要否判定
if len(soup.head.find_all('meta', attrs={'name': 'twitter_card'})) < 1:
    print('Checked. :' + fn)
    sys.exit()

# 置換実行
soup.head.find('meta', attrs={'name': 'twitter_card'})['name'] = 'twitter:card'
soup.head.find('meta', attrs={'name': 'twitter_title'})['name'] = 'twitter:title'
soup.head.find('meta', attrs={'name': 'twitter_description'})['name'] = 'twitter:description'
image_link = soup.head.find('meta', attrs={'name': 'twitter_image'})['content']
correct_link = re.sub(r'^../../', 'https://water2litter.net/rum/', image_link)
soup.head.find('meta', attrs={'name': 'twitter_image'})['content'] = correct_link
soup.head.find('meta', attrs={'name': 'twitter_image'})['name'] = 'twitter:image'

# ファイル書き込み
with open(fn, mode='wt', encoding='utf-8') as fo:
    fo.write(str(soup))

print('Modified. :' + fn)

まあ、コメントに書いてあるとおりの処理をしてます。

BeautifulSoupのオブジェクトは、文字列に変換しないと出力できないので注意です。

続いて、シェルスクリプトの方です。

#!/bin/bash
set -Ceu
rm -v ./_website/all_post/index.html
ablog build
for file in `find ./_website/ -name '*.html'`; do
    python mypostprocess.py $file
done

後処理を実行しているのは、for文以降の箇所です。

findでhtmlファイルを探して、それをpythonに処理させています。 いちいちPhthonを呼び出しているからか、MacBook Air 2017ではちょっと時間がかかります。まあ、ちょっと待ってれば終わるので気にすることはありません。

広告

作ってみたカテゴリの投稿