class Jekyll::Spaceship::ElementProcessor

Public Class Methods

config() click to toggle source
# File lib/jekyll-spaceship/processors/element-processor.rb, line 9
def self.config
  { 'css' => [] }
end

Public Instance Methods

create_children(data) click to toggle source
# File lib/jekyll-spaceship/processors/element-processor.rb, line 56
def create_children(data)
  doc = data[:doc]
  data = data[:data]
  root = Nokogiri::HTML.fragment("")

  data = [data] unless data.kind_of? Array
  data.each do |child_data|
    node = self.create_element({
      :doc => doc,
      :data => child_data
    })
    next if node.nil?
    unless child_data['children'].nil?
      node.children = self.create_children({
        :doc => doc,
        :data => child_data['children']
      })
    end
    root.add_child node
  end
  root.children
end
create_element(data) click to toggle source
# File lib/jekyll-spaceship/processors/element-processor.rb, line 118
def create_element(data)
  doc = data[:doc]
  data = data[:data]

  return if data.nil?
  return Nokogiri::HTML.fragment(data) if data.kind_of? String
  return if data['name'].nil?

  # create node
  node = doc.create_element(data['name'])

  # set props
  data['props']&.each do |prop, val|
    if val.kind_of? Hash
      result = []
      val.each { |k, v| result.push "#{k}: #{v}" }
      val = result.join(";")
    end
    node.set_attribute(prop, val)
  end
  node
end
handle_css_pattern(data) click to toggle source
# File lib/jekyll-spaceship/processors/element-processor.rb, line 40
def handle_css_pattern(data)
  doc = data[:doc]
  element = data[:element]
  data = data[:data]

  if data.kind_of? String
    element.replace Nokogiri::HTML.fragment(data)
  elsif data.kind_of? Hash
    handle_hash_element({
      :doc => doc,
      :element => element,
      :data => data,
    })
  end
end
handle_element_placement(data) click to toggle source
# File lib/jekyll-spaceship/processors/element-processor.rb, line 141
def handle_element_placement(data)
  element = data[:element]
  children = data[:children]
  data = data[:data]

  # replace whole inner html
  unless data['children'].kind_of? Array
    return element.inner_html = children
  end

  if element.children.size.zero?
    return element.inner_html = children
  end

  index = data['children'].index(nil)
  rindex = data['children'].rindex { |item| !item.nil? }

  if index.nil?
    element.inner_html = children
  elsif index == 0 # insert to the end of children
    element.children.last.after(children)
  elsif index == rindex + 1 # insert to the begin of children
      element.children.first.before children
  else # wrap the children
    element.children.first.before children[0..index]
    element.children.last.after children[index..children.size]
  end
end
handle_hash_element(data) click to toggle source
# File lib/jekyll-spaceship/processors/element-processor.rb, line 79
def handle_hash_element(data)
  doc = data[:doc]
  element = data[:element]
  data = data[:data]

  # set name
  element.name = data['name'] unless data['name'].nil?

  # set props
  data['props']&.each do |prop, val|
    next element.remove_attribute if val.nil?
    if val.kind_of? Array
      next if val.size != 2
      v = element[prop]
      v = '' if v.nil?
      val = v.sub(/#{val[0]}/, val[1])
    elsif val.kind_of? Hash
      result = []
      val.each { |k, v| result.push "#{k}: #{v}" }
      val = result.join(";")
    end
    element.set_attribute(prop, val)
  end

  # processing children
  return unless data.has_key?('children')
  return element.inner_html = "" if data['children'].nil?
  children = self.create_children({
    :doc => doc,
    :data => data['children']
  })

  handle_element_placement({
    :data => data,
    :element => element,
    :children => children,
  })
end
on_handle_html(content) click to toggle source
# File lib/jekyll-spaceship/processors/element-processor.rb, line 13
def on_handle_html(content)
  return content if config['css'].size.zero?

  # use nokogiri to parse html content
  doc = Nokogiri::HTML(content)

  # handle each css pattern
  config['css'].each do |data|
    data.each do |key, val|
      key = [key] if key.kind_of? String
      key.each do |pattern|
        nodes = doc.css(pattern)
        nodes.each do |element|
          handle_css_pattern({
            :doc => doc,
            :element => element,
            :data => val
          })
        end
        self.handled = true
      end
    end
  end

  doc.to_html
end