sphinxのliteralincludeが絶対パスを表示するのが嫌だった

sphinxのliteralincludeが絶対パスを表示するのが嫌だった。 以下の様なmonkey patchをあてるextensionを作ってあげると無理矢理変更できる(わるい)

def setup(app):
    # monkey patch
    import os.path
    from difflib import unified_diff
    from sphinx.directives.code import LiteralIncludeReader

    def show_diff(self, location=None):
        new_lines = self.read_file(self.filename)
        old_filename = self.options.get('diff')
        old_lines = self.read_file(old_filename)
        diff = unified_diff(old_lines, new_lines, os.path.basename(old_filename), os.path.basename(self.filename))
        return list(diff)

    LiteralIncludeReader.show_diff = show_diff

    return {"version": "0.0"}

使いたかった場所

本当はdictknifeのドキュメントで使いたかったのだけれど。readthedocsが使っているsphinxのversionが古かったようでLiteralIncludeReaderが存在しなかったっぽい。古いsphinx用にコードを書き換えるのが面倒なので今は使っていない。

使うなら readthedocsの 高度なオプションInstall Project をonにしてあげて、conf.pyに以下のような変更をすれば有効になる。

# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.

# extensions = ['sphinx.ext.viewcode']
extensions = ['sphinx.ext.viewcode', 'dictknife._sphinx']

dictknifeというrepositoryを使っているので dictknife._sphinx だけれど。そのあたりはお好みで。