class SlateSerializer::Plain

Text de- and serializer

Public Class Methods

deserializer(text) click to toggle source

Convert text to a Slate document

@param text format [String] the text return [Hash] Slate document

# File lib/slate_serializer/plain.rb, line 9
def deserializer(text)
  text = '' if text.nil?

  lines = split_text_into_lines(text)
  {
    document: {
      object: 'document',
      nodes: convert_lines_into_nodes(lines)
    }
  }
end
serializer(value, options = {}) click to toggle source

Convert a Slate Document to plain text

@param value format [Hash] the Slate document @param options format [Hash] options for the serializer, delimitter defaults to ā€œnā€ @return [String] plain text version of the Slate documnent

# File lib/slate_serializer/plain.rb, line 26
def serializer(value, options = {})
  return '' unless value.key?(:document)

  options[:delimiter] = "\n" unless options.key?(:delimiter)
  serialize_node(value[:document], options)
end

Private Class Methods

convert_lines_into_nodes(lines) click to toggle source
# File lib/slate_serializer/plain.rb, line 53
def convert_lines_into_nodes(lines)
  lines.map do |line|
    {
      object: 'block',
      type: 'paragraph',
      data: {},
      nodes: [
        object: 'text',
        text: line,
        marks: []
      ]
    }
  end
end
serialize_node(node, options) click to toggle source
# File lib/slate_serializer/plain.rb, line 68
def serialize_node(node, options)
  if node[:object] == 'document' || node[:object] == 'block'
    node[:nodes].map { |n| serialize_node(n, options) }.join(options[:delimiter])
  else
    node[:text]
  end
end
split_text_into_lines(text) click to toggle source
# File lib/slate_serializer/plain.rb, line 35
def split_text_into_lines(text)
  lines = text.strip.split("\n").map(&:strip)
  blocks = []

  loop do
    index = lines.find_index('')
    if index.nil?
      blocks << lines.join("\n")
      break
    end

    blocks << lines[0...index].join("\n")
    lines.shift(index + 1)
  end

  blocks.length == 1 ? blocks : blocks.reject { |block| block == '' }
end