2016-06-16 23:09:34 +05:30
|
|
|
module Banzai
|
|
|
|
module Filter
|
|
|
|
class WikiLinkFilter < HTML::Pipeline::Filter
|
|
|
|
class Rewriter
|
|
|
|
def initialize(link_string, wiki:, slug:)
|
|
|
|
@uri = Addressable::URI.parse(link_string)
|
|
|
|
@wiki_base_path = wiki && wiki.wiki_base_path
|
|
|
|
@slug = slug
|
|
|
|
end
|
|
|
|
|
|
|
|
def apply_rules
|
|
|
|
apply_file_link_rules!
|
|
|
|
apply_hierarchical_link_rules!
|
|
|
|
apply_relative_link_rules!
|
|
|
|
@uri.to_s
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
# Of the form 'file.md'
|
|
|
|
def apply_file_link_rules!
|
|
|
|
@uri = Addressable::URI.join(@slug, @uri) if @uri.extname.present?
|
|
|
|
end
|
|
|
|
|
|
|
|
# Of the form `./link`, `../link`, or similar
|
|
|
|
def apply_hierarchical_link_rules!
|
|
|
|
@uri = Addressable::URI.join(@slug, @uri) if @uri.to_s[0] == '.'
|
|
|
|
end
|
|
|
|
|
|
|
|
# Any link _not_ of the form `http://example.com/`
|
|
|
|
def apply_relative_link_rules!
|
|
|
|
if @uri.relative? && @uri.path.present?
|
|
|
|
link = ::File.join(@wiki_base_path, @uri.path)
|
2016-09-29 09:46:39 +05:30
|
|
|
link = "#{link}##{@uri.fragment}" if @uri.fragment
|
2016-06-16 23:09:34 +05:30
|
|
|
@uri = Addressable::URI.parse(link)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|