class RailsVueHelpers::VueComponentBuilder

Public Class Methods

new(template, component_name, **props) click to toggle source
# File lib/rails_vue_helpers/vue_component_builder.rb, line 3
def initialize(template, component_name, **props)
  @component_name = component_name
  @props = props
  @template = template
  @raw = @props[:raw]
end

Public Instance Methods

sanitized_component_name() click to toggle source
# File lib/rails_vue_helpers/vue_component_builder.rb, line 18
def sanitized_component_name
  ActiveSupport::Inflector.underscore(@component_name.to_s).tr('_', '-')
end
to_html(&block) click to toggle source
# File lib/rails_vue_helpers/vue_component_builder.rb, line 10
def to_html(&block)
  if block_given?
    ActiveSupport::SafeBuffer.new("<#{sanitized_component_name} #{attributes} #{@raw}>#{capture(&block)}</#{sanitized_component_name}>")
  else
    ActiveSupport::SafeBuffer.new("<#{sanitized_component_name} #{attributes} #{@raw}></#{sanitized_component_name}>")
  end
end

Private Instance Methods

attributes() click to toggle source
# File lib/rails_vue_helpers/vue_component_builder.rb, line 24
def attributes
  [binded_props, event_props, regular_props].flatten.join(' ')
end
binded_props() click to toggle source
# File lib/rails_vue_helpers/vue_component_builder.rb, line 28
def binded_props
  binded_props = @props[:binded] || {}
  binded_props.map { |key, value| transpile_binded_prop(key, value) }
end
event_props() click to toggle source
# File lib/rails_vue_helpers/vue_component_builder.rb, line 33
def event_props
  event_props = @props[:events] || {}
  event_props.map { |key, value| transpile_event_prop(key, value) }
end
regular_props() click to toggle source
# File lib/rails_vue_helpers/vue_component_builder.rb, line 38
def regular_props
  regular_props = @props.reject { |key, value| [:events, :binded, :raw].include?(key) }
  regular_props.map { |key, value| transpile_regular_prop(key, value) }
end
transpile_binded_prop(key, value) click to toggle source
# File lib/rails_vue_helpers/vue_component_builder.rb, line 55
def transpile_binded_prop(key, value)
  normalized_key = ActiveSupport::Inflector.underscore(key.to_s).tr('_', '-')
  normalized_value = value
  unless value.is_a?(String)
    # if there are some single quotes in the text, make them in ASCII
    # so HTML doesn't brake
    normalized_value = value.to_json.gsub("'", "&#39")
  end
  "v-bind:#{normalized_key}='#{normalized_value}'"
end
transpile_event_prop(key, value) click to toggle source
# File lib/rails_vue_helpers/vue_component_builder.rb, line 66
def transpile_event_prop(key, value)
  normalized_key = key.to_s.underscore.tr('_', '-')
  "v-on:#{normalized_key}='#{value}'"
end
transpile_regular_prop(key, value) click to toggle source
# File lib/rails_vue_helpers/vue_component_builder.rb, line 43
def transpile_regular_prop(key, value)
  normalized_key = key.to_s.underscore.tr('_', '-')
  normalized_value = value

  if value.is_a?(Array)
    normalized_value = value.to_s.tr('"', '\'')
  elsif value =~ /"/
    normalized_value = value.tr('"', '\'')
  end
  "#{normalized_key}=\"#{normalized_value}\" "
end