class Roadie::UrlRewriter

Class that rewrites URLs in the DOM.
@api private

def generate_url(*args) @generator.generate_url(*args) end

def generate_url(*args) @generator.generate_url(*args) end

def initialize(generator)

Parameters:
  • generator (UrlGenerator) --
def initialize(generator)
  @generator = generator
end

def transform_css(css)

Returns:
  • (String) - copy of css that is mutated

Parameters:
  • css (String) -- the css to mutate
def transform_css(css)
  css.gsub(CSS_URL_REGEXP) do
    matches = Regexp.last_match
    "url(#{matches[:quote]}#{generate_url(matches[:url])}#{matches[:quote]})"
  end
end

def transform_dom(dom)

Returns:
  • (nil) - DOM tree is mutated

Parameters:
  • dom (Nokogiri::HTML::Document) --
def transform_dom(dom)
  # Use only a single loop to do this
  dom.css(
    "a[href]:not([data-roadie-ignore]), " \
      "img[src]:not([data-roadie-ignore]), " \
      "*[style]:not([data-roadie-ignore])",
  ).each do |element|
    transform_element_style element if element.has_attribute?('style')
    transform_element element
  end
  nil
end

def transform_element(element)

def transform_element(element)
  case element.name
  when "a" then element["href"] = generate_url element["href"]
  when "img" then element["src"] = generate_url element["src"]
  end
end

def transform_element_style(element)

def transform_element_style(element)
  # We need to use a setter for Nokogiri to detect the string mutation.
  # If nokogiri used "dumber" data structures, this would all be redundant.
  css = element["style"]
  element["style"] = transform_css(css)
end