Webby の url_for を相対パスにする
webbyで静的ウェブサイトを作成する を読んで早速使ってみたところ、 前から作りたかったツールにほぼ近かったので非常に満足しています。
ただ、不満は無い訳ではなくて、
例えば webby のページ内で別のページにリンクする時にurl_for
とかいうヘルパメソッドを使うのですが、
これが絶対パスを返してくる。
p url_for( another_page ) # => '/another/page/url'
これだとローカルのhtmlを確認したい時や、 アップしたいウェブサイトのURLがサブディレクトリ内だった場合困る訳です。
というわけで、url_for がそのページからの相対パスを返すようなヘルパを作ってみました。
# relative_path
class Webby::Renderer
alias :_rp_old_initialize :initialize
def initialize( page )
_rp_old_initialize( page )
if @@stack.size == 0
if @page.dir == ''
@@rp_base_dir = '.'
else
dots_path = []
@page.dir.split('/').size.times do |i|
dots_path << '..'
end
@@rp_base_dir = dots_path.join('/')
end
end
end
def self.rp_base_dir
@@rp_base_dir
end
end
module RelativePathHelper
def relative_path(path)
return Webby::Renderer.rp_base_dir + path
end
alias :rp :relative_path
end
module Webby::Helpers::UrlHelper
alias :old_url_for :url_for
def url_for( *args )
self.relative_path(self.old_url_for( *args ))
end
end
Webby::Helpers.register(RelativePathHelper)
これを適当な名前。(例えば relative_path.rb) とかで lib フォルダ以下に保存すると、url_for が相対パスを返すようになります。
とりあえず、webby 0.9.2 で動作確認済み。
内部のクラス変数に無理にアクセスしているため、後々動かなくなる可能性もあります。