Edited at

Gollum で commit せずにファイルの内容を直接表示する

More than 1 year has passed since last update.

内部ドキュメント管理に Gollum を使用していると、編集については clone したリポジトリを Atom で Markdown Preview を使いながら行うのが便利ですが、実際に local の gollum でプレビューしたいことがあります。


mathjax を有効にしていたり、mermaid 等を追加で組み込んでいたり等


gollum は基本的に commit しないとページが反映されないため、add -> amend を繰り返すことになります。

これはあまりにも面倒なので、なんとか working directory の内容を直接表示できないかとあれこれ試行錯誤したところ、比較的簡単なコードの overwrite で対応できました。

gollum の本来の目的から外れていますが、あくまで local での暫定確認用ということで。


config.ru へのコード追加

rackup 用の設定ファイル config.ru に、以下の module を追加します。


config.ru の設定方法は、Gollum via Rack を参照ください。



config.ru

module Gollum

class DirectPage < Gollum::Page
include Pagination

def find(name, version, dir = nil, exact = false)
unless exact
arr = ::Dir.glob("#{@wiki.path}/**/#{name}.md")
raise Gollum::Git::NoSuchShaFound if arr.size == 0
file = arr.first
dir = ::File.dirname(arr.first).split(@wiki.path)[1]
else
file = "#{@wiki.path}/#{dir}/#{name}.md"
raise Gollum::Git::NoSuchShaFound unless ::File.exist?(file)
end

blob = ::OpenStruct.new
blob.data = ::File.readlines(file).join()
blob.name = "#{name}.md"
page = DirectPage.new(@wiki).populate(blob, dir)
page.version = @wiki.commit_for(version)
page.historical = true
page
rescue Gollum::Git::NoSuchShaFound
end
end
end


あとは、:wiki_options:page_class を追加します。


ドキュメントには記載がありませんが、コードを読むと、ページ生成時に用いるクラスを option で変更できるようになっていることがわかります。

カスタマイズしたクラスを指定することで、git repo から取得せずに working directory からファイルを読み込むように挙動を変更しています。



config.ru

...

Precious::App.set(:wiki_options, {
...
:page_class => Gollum::DirectPage,
...
})
run Precious::App

書き換えが完了したら、rackup して確認してみましょう。

% bundle exec rackup

直接ファイルを書き換えた後、ブラウザをリロードしてページが反映されていれば成功です。

これでローカル環境でのドキュメント記述がより一層はかどります。


注意

無理やり page_class を差し替えて対応しているので、当然 gollum 上での編集や rename 等は想定していませんし、どんな挙動をするかも未確認です。

これをやる場合は、基本的に編集作業はテキストエディタで行い git を使う前提ですので、想定外の事故を防ぐためにも、config.ru の :wiki_options:allow_editing => false をつけておくほうがいいかもしれません。


2017-01-04: gollum-lib 4.2.2 に対応。