class Quill::Builder::HTML

Public Class Methods

new(text) click to toggle source
# File lib/quill/builder/html.rb, line 6
def initialize(text)
  @text = text
end

Public Instance Methods

convert() click to toggle source
# File lib/quill/builder/html.rb, line 10
def convert
  convert_to_lines.map { |block|
    outer_tag = block[:block]
    inner = block[:inlines].inject('') { |memo, inline|
      text = inline[:text].nil? ? '' : inline[:text]
      text = text[0..-2] if text[-1] == "\n"
      text = ' ' if text.empty? && block[:inlines].size == 1
      memo + inline[:attrs].inject(text) { |memo, tag_pair|
        "#{tag_pair.first}#{memo}#{tag_pair.last}"
      }
    }
    case outer_tag
    when Symbol
      "<#{outer_tag}>#{inner}</#{outer_tag}>\n"
    when Array
      outer_tag.inject(inner) { |memo, tag|
        "<#{tag}>#{memo}</#{tag}>"
      } + "\n"
    end
  }.join
end
convert_inline(text, attributes) click to toggle source
# File lib/quill/builder/html.rb, line 73
def convert_inline(text, attributes)
  attrs = []
  if attributes
    attributes.each_pair do |key, value|
      case key
      when 'bold'
        attrs << ['<b>', '</b>']
      when 'italic'
        attrs << ['<i>', '</i>']
      when 'underline'
        attrs << ['<u>', '</u>']
      when 'strike'
        attrs << ['<s>', '</s>']
      when 'background'
        attrs << [%Q|<span style="background-color: #{value}">|, '</span>']
      when 'color'
        attrs << [%Q|<span style="color: #{value}">|, '</span>']
      end
    end
  end
  {
    text: text,
    attrs: attrs
  }
end
convert_to_lines() click to toggle source
# File lib/quill/builder/html.rb, line 32
def convert_to_lines
  json = JSON.parse(@text)
  lines = json['ops'].inject([{ block: :p, inlines: [] }]) do |lines, item|
    if item['attributes']&.keys&.include?('blockquote')
      lines.last[:block] = [ :p, :blockquote ]
      lines << { block: :p, inlines: [] }
    elsif item['attributes']&.keys&.include?('code-block')
      lines.last[:block] = :pre
      lines << { block: :p, inlines: [] }
    else
      unless item['insert'] == "\n"
        converted = convert_inline(item['insert'], item['attributes'])
        partition_item_to_each_lines(lines, converted)
      end
    end
    lines
  end
  lines.pop if lines.last[:inlines].nil? || lines.last[:inlines].empty?
  lines
end
partition_item_to_each_lines(lines, converted) click to toggle source
# File lib/quill/builder/html.rb, line 53
def partition_item_to_each_lines(lines, converted)
  if converted[:text].include?("\n")
    splitted = converted[:text].split(/(?<=\n)/)
    lines.last[:inlines] << {
      text: splitted.shift,
      attrs: converted[:attrs]
    }
    splitted.each do |l|
      lines << { block: :p, inlines: [] }
      lines.last[:inlines] << {
        text: l,
        attrs: converted[:attrs]
      }
    end
    lines << { block: :p, inlines: [] } if converted[:text][-1] == "\n"
  else
    lines.last[:inlines] << converted
  end
end