module Deface::Applicator::ClassMethods

Public Instance Methods

apply(source, details, log=true, syntax=:erb) click to toggle source

applies all applicable overrides to given source

# File lib/deface/applicator.rb, line 6
def apply(source, details, log=true, syntax=:erb)
  overrides = find(details)

  return source if overrides.empty?

  Rails.logger.debug "\e[1;32mDeface:\e[0m #{overrides.size} overrides found for '#{details[:virtual_path]}'" if log

  apply_overrides(
    convert_source(source, syntax: syntax),
    overrides: overrides,
    log: log
  )
end
apply_overrides(source, overrides:, log: true) click to toggle source

applies specified overrides to given source

# File lib/deface/applicator.rb, line 21
def apply_overrides(source, overrides:, log: true)

  doc = Deface::Parser.convert(source)

  overrides.each do |override|
    if override.disabled?
      Rails.logger.debug("\e[1;32mDeface:\e[0m '#{override.name}' is disabled") if log
      next
    end

    override.parsed_document = doc
    matches = override.matcher.matches(doc, log)

    if log
      Rails.logger.send(matches.size == 0 ? :error : :debug, "\e[1;32mDeface:\e[0m '#{override.name}' matched #{matches.size} times with '#{override.selector}'")

      # temporarily check and notify on use of old selector styles.
      #
      if matches.empty? && override.selector.match(/code|erb-loud|erb-silent/)
        Rails.logger.error "\e[1;32mDeface: [WARNING]\e[0m Override '#{override.name}' may be using an invalid selector of '#{override.selector}', <code erb-loud|silent> tags are now <erb loud|silent>"
      end
    end

    if matches.empty?
      override.failure = "failed to match :#{override.action} selector '#{override.selector}'"
    else
      override.failure = nil
      matches.each {|match| override.execute_action match }
    end
  end

  source = doc.to_s

  Deface::Parser.undo_erb_markup!(source)

  source
end
convert_source(source, syntax:) click to toggle source

converts the source to a supported syntax (ERB)

# File lib/deface/applicator.rb, line 60
def convert_source(source, syntax:)
  # convert haml/slim to erb before parsing before
  case syntax
  when :erb
    source
  when :haml
    Deface::HamlConverter.new(source.to_s).result
  when :slim
    Deface::SlimConverter.new(source.to_s).result
  else
    raise "unsupported syntax: #{syntax}"
  end
end