Sha256: 6f396153d9f2432e9bd6b2c01429d601adc30beff885d262830dbd70efd7ffd8

Contents?: true

Size: 1.8 KB

Versions: 19

Compression:

Stored size: 1.8 KB

Contents

# frozen-string-literal: true

require 'erubis'

class Roda
  module RodaPlugins
    # The _erubis_escaping plugin handles escaping of <tt><%= %></tt> inside
    # ERB templates.  It is an internal plugin that should not be loaded
    # directlyn by user code.
    module ErubisEscaping
      # Escaper which escapes by default, but does not escape instances of
      # classes marked as safe.
      class UnsafeClassEscaper
        # Default escaper if the string needs to be escaped.
        Escaper = Erubis::XmlHelper

        # Record the classes to consider safe.
        def initialize(safe_classes)
          @safe_classes = Array(safe_classes).freeze
          freeze
        end

        # If the string given is not an instance of one of the safe
        # classes, escape it, otherwise return it verbatim.  If the
        # given object is not already a string, convert it to a string first.
        def escape_xml(string)
          unless string.is_a?(String)
            string = string.to_s
          end

          if @safe_classes.any?{|c| string.is_a?(c)}
            string
          else
            Escaper.escape_xml(string)
          end
        end
      end

      # Subclass that works with specified escaper, also handling
      # postfix conditionals inside <tt><%= %></tt> tags.
      class Eruby < Erubis::EscapedEruby
        # Set escaping object to a local variable
        def convert_input(codebuf, input)
          codebuf << '_erubis_escaper = render_opts[:escaper];'
          super
        end

        # Use escaping object to escape the code, and handle postfix conditionals.
        def add_expr_escaped(src, code)
          src << " " << @bufvar << " << _erubis_escaper.escape_xml((" <<  code << "));"
        end
      end
    end

    register_plugin(:_erubis_escaping, ErubisEscaping)
  end
end

Version data entries

19 entries across 19 versions & 1 rubygems

Version Path
roda-2.28.0 lib/roda/plugins/_erubis_escaping.rb
roda-2.27.0 lib/roda/plugins/_erubis_escaping.rb
roda-2.26.0 lib/roda/plugins/_erubis_escaping.rb
roda-2.25.0 lib/roda/plugins/_erubis_escaping.rb
roda-2.24.0 lib/roda/plugins/_erubis_escaping.rb
roda-2.23.0 lib/roda/plugins/_erubis_escaping.rb
roda-2.22.0 lib/roda/plugins/_erubis_escaping.rb
roda-2.21.0 lib/roda/plugins/_erubis_escaping.rb
roda-2.20.0 lib/roda/plugins/_erubis_escaping.rb
roda-2.19.0 lib/roda/plugins/_erubis_escaping.rb
roda-2.18.0 lib/roda/plugins/_erubis_escaping.rb
roda-2.17.0 lib/roda/plugins/_erubis_escaping.rb
roda-2.16.0 lib/roda/plugins/_erubis_escaping.rb
roda-2.15.0 lib/roda/plugins/_erubis_escaping.rb
roda-2.14.0 lib/roda/plugins/_erubis_escaping.rb
roda-2.13.0 lib/roda/plugins/_erubis_escaping.rb
roda-2.12.0 lib/roda/plugins/_erubis_escaping.rb
roda-2.11.0 lib/roda/plugins/_erubis_escaping.rb
roda-2.10.0 lib/roda/plugins/_erubis_escaping.rb