: O. Yuanying

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 で動作確認済み。

内部のクラス変数に無理にアクセスしているため、後々動かなくなる可能性もあります。