module Locomotive::Steam::Liquid::Tags::Concerns::Section

Private Instance Methods

_render(context, template) click to toggle source
# File lib/locomotive/steam/liquid/tags/concerns/section.rb, line 27
def _render(context, template)
  if context.registers[:live_editing]
    editor_settings_lookup(template.root)
  end

  html = template.render(context)

  # by default, Steam will wrap the section HTML to make sure it has all the
  # DOM attributes the live editing editor needs.
  if context['is_section_locomotive_attributes_displayed']
    html
  else
    wrap_html(html, context)
  end
end
current_inherited_block_name() click to toggle source
# File lib/locomotive/steam/liquid/tags/concerns/section.rb, line 125
def current_inherited_block_name
  options[:inherited_blocks].try(:[], :nested).try(:last).try(:name)
end
editor_settings_lookup(root) click to toggle source

in order to enable string/text synchronization with the editor:

  • find variables like {{ section.settings.<id> }} or {{ block.settings.<id> }}

  • once found, get the closest tag

  • add custom data attributes to it

# File lib/locomotive/steam/liquid/tags/concerns/section.rb, line 62
def editor_settings_lookup(root)
  return if root.nodelist.blank?

  previous_node = nil
  new_nodelist  = []

  root.nodelist.each_with_index do |node, index|
    if node.is_a?(::Liquid::Variable) && previous_node.is_a?(String)
      matches = node.raw.match(Locomotive::Steam::SECTIONS_SETTINGS_VARIABLE_REGEXP)

      # is a section setting variable?
      if matches && matches[:id] && wrapped_around_tag?(index, root.nodelist)
        # open the closest HTML tag
        previous_node.gsub!(/>(\s*)\z/, '\1')

        # here we go, add a liquid variable!
        new_nodelist.push(::Liquid::Variable.new(
          "section.editor_setting_data.#{matches[:id]}",
          node.parse_context)
        )

        # close the tag
        new_nodelist.push('>') #::Liquid::Tokenizer.new('>', previous_node.line_number))
      end
    elsif node.respond_to?(:nodelist)
      editor_settings_lookup(node)
    end

    new_nodelist.push(node)

    previous_node = node
  end

  (root.instance_variable_get(:@body) || root).instance_variable_set(:@nodelist, new_nodelist)
end
notify_on_parsing(type, source: :page, is_dropzone: false, key: nil, id: nil, label: nil, placement: nil) click to toggle source
# File lib/locomotive/steam/liquid/tags/concerns/section.rb, line 109
def notify_on_parsing(type, source: :page, is_dropzone: false, key: nil, id: nil, label: nil, placement: nil)
  ActiveSupport::Notifications.instrument('steam.parse.section', {
    attributes: {
      type:         type,
      source:       source,
      id:           id,
      key:          key,
      is_dropzone:  is_dropzone,
      label:        label,
      placement:    placement
    },
    page:   options[:page],
    block:  current_inherited_block_name
  })
end
render_section(context, template, section, content) click to toggle source
# File lib/locomotive/steam/liquid/tags/concerns/section.rb, line 7
def render_section(context, template, section, content)
  context.stack do
    # build a drop from the content and add it to the new context
    context['section'] = Locomotive::Steam::Liquid::Drops::Section.new(
      section,
      content
    )

    # assign an id if specified in the context
    context['section'].id ||= context['section_id'] if context['section_id'].present?

    begin
      _render(context, template)
    rescue Locomotive::Steam::TemplateError => e
      e.template_name = "sections--#{section.name}"
      raise e
    end
  end
end
wrap_html(html, context) click to toggle source
# File lib/locomotive/steam/liquid/tags/concerns/section.rb, line 43
def wrap_html(html, context)
  section     = context['section']
  css_class   = context['section_css_class']

  # we need the section_css_class once
  # context.scopes.last.delete('section_css_class')

  anchor_id = %(id="#{section.anchor_id}")
  tag_id    = %(id="locomotive-section-#{section.id}")
  tag_class = %(class="#{['locomotive-section', section.css_class, css_class].compact.join(' ')}")
  tag_data  = %(data-locomotive-section-type="#{section.type}")

  %(<div #{tag_id} #{tag_class} #{tag_data}><span #{anchor_id}></span>#{html}</div>)
end
wrapped_around_tag?(index, nodelist) click to toggle source
# File lib/locomotive/steam/liquid/tags/concerns/section.rb, line 98
def wrapped_around_tag?(index, nodelist)
  return false if index + 1 >= nodelist.size

  previous_node = nodelist[index - 1]
  next_node     = nodelist[index + 1]

  return false unless next_node.is_a?(String)

  (previous_node =~ /\>\s*\z/).present? && (next_node =~ /\A\s*\</).present?
end