Class: Webby::Filters::BasePath
- Inherits:
-
Object
- Object
- Webby::Filters::BasePath
- Defined in:
- lib/webby/filters/basepath.rb
Overview
The BasePath filter is used to rewrite URI paths in HTML documents. This is useful when the server location of the website is not located at the root of the webserver (e.g. my.site.com/foo/bar).
The BasePath filter will adjust the URI paths in a given HTML document by prepending a base path to the URI. This only works for URIs that start with a leading slash “/”. Any other character will exclude the URI from being modified.
Assume the user specifies a new URI base in the Webby.site.base
property:
Webby.site.base = '/foo/bar'
Here is a snippet from some HTML document.
<a href="/some/other/page.html">Page</a>
<img src="fractal.jpg" alt="a fractal" />
When run through the BasePath filter, the resulting snippet would look like this.
<a href="/foo/bar/some/other/page.html">Page</a>
<img src="fractal.jpg" alt="a fractal" />
The href
attribute of the anchor tag is modified because it started with a leading slash. The src
attribute of the image tag is not modified because it lacks the leading slash.
Instance Method Summary collapse
-
#filter ⇒ Object
call-seq: filter => html.
-
#initialize(str, mode) ⇒ BasePath
constructor
call-seq: BasePath.new( html, mode ).
Constructor Details
#initialize(str, mode) ⇒ BasePath
call-seq:
BasePath.new( html, mode )
Creates a new BasePath filter that will operate on the given html string. The mode is either ‘xml’ or ‘html’ and determines how Hpricot will handle the parsing of the input string.
44 45 46 47 |
# File 'lib/webby/filters/basepath.rb', line 44 def initialize( str, mode ) @str = str @mode = mode.downcase.to_sym end |
Instance Method Details
#filter ⇒ Object
call-seq:
filter => html
Process the original html document passed to the filter when it was created. The document will be scanned and the basepath for certain elements will be modified.
For example, if a document contains the following line:
<a href="/link/to/another/page.html">Page</a>
and the user has requested for the base path to be some other directory on the webserver – /some/other/directory
. The result of the BasePath filter would be:
<a href="/some/other/directory/link/to/another/page.html">Page</a>
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/webby/filters/basepath.rb', line 66 def filter doc = @mode == :xml ? Hpricot.XML(@str) : Hpricot(@str) base_path = ::Webby.site.base attr_rgxp = %r/\[@(\w+)\]$/o sub_rgxp = %r/\A(?=\/)/o ::Webby.site.xpaths.each do |xpath| @attr_name = nil doc.search(xpath).each do |element| @attr_name ||= attr_rgxp.match(xpath)[1] a = element.get_attribute(@attr_name) element.set_attribute(@attr_name, a) if a.sub!(sub_rgxp, base_path) end end doc.to_html end |