Sha256: 6142109e25897f6cff690b78b3b33a329011f71e1dfa1b97e90d16f34d04276b

Contents?: true

Size: 1.95 KB

Versions: 209

Compression:

Stored size: 1.95 KB

Contents

# frozen_string_literal: true

require_relative "../conversion_error"

module ERBLint
  module Linters
    module ArgumentMappers
      module Helpers
        # provides helpers to identify and deal with ERB blocks.
        class ErbBlock
          INTERPOLATION_REGEX = /^<%=(?<rb>.*)%>$/.freeze

          def raise_if_erb_block(attribute)
            raise_error(attribute) if any?(attribute)
          end

          def convert(attribute)
            raise_error(attribute) unless interpolation?(attribute)

            if any?(attribute)
              convert_interpolation(attribute)
            else
              attribute.value.to_json
            end
          end

          private

          def interpolation?(attribute)
            erb_blocks(attribute).all? do |erb|
              # If the blocks does not have an indicator, it's not an interpolation.
              erb.children.to_a.compact.any? { |node| node.type == :indicator }
            end
          end

          def raise_error(attribute)
            raise ERBLint::Linters::ArgumentMappers::ConversionError, "Cannot convert attribute \"#{attribute.name}\" because its value contains an erb block"
          end

          def any?(attribute)
            erb_blocks(attribute).any?
          end

          def basic?(attribute)
            return false if erb_blocks(attribute).size != 1

            attribute.value.match?(INTERPOLATION_REGEX)
          end

          def erb_blocks(attribute)
            (attribute.value_node&.children || []).select { |n| n.try(:type) == :erb }
          end

          def convert_interpolation(attribute)
            if basic?(attribute)
              m = attribute.value.match(INTERPOLATION_REGEX)
              return m[:rb].strip
            end

            # we use `source` instead of `value` because it does not convert encoded HTML entities.
            attribute.value_node.loc.source.gsub("<%=", '#{').gsub("%>", "}")
          end
        end
      end
    end
  end
end

Version data entries

209 entries across 209 versions & 2 rubygems

Version Path
primer_view_components-0.36.5 lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb
openproject-primer_view_components-0.52.2 lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb
primer_view_components-0.36.4 lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb
openproject-primer_view_components-0.52.1 lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb
openproject-primer_view_components-0.52.0 lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb
primer_view_components-0.36.3 lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb
openproject-primer_view_components-0.51.0 lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb
primer_view_components-0.36.2 lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb
openproject-primer_view_components-0.50.1 lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb
openproject-primer_view_components-0.50.0 lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb
primer_view_components-0.36.1 lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb
primer_view_components-0.36.0 lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb
openproject-primer_view_components-0.49.2 lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb
primer_view_components-0.35.2 lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb
openproject-primer_view_components-0.49.1 lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb
openproject-primer_view_components-0.49.0 lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb
primer_view_components-0.35.1 lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb
primer_view_components-0.35.0 lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb
openproject-primer_view_components-0.48.2 lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb
openproject-primer_view_components-0.48.1 lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb