class Ulysses::Printer

Constants

HIDDEN_ELEMENTS
HIDDEN_TAGS
SHEET_CONTENT_XPATH
SIMPLE_ELEMENTS

Public Class Methods

new(target) click to toggle source
# File lib/ulysses/printer.rb, line 10
def initialize(target)
  @target        = target
  @footnotes     = []
  @annotations   = []
  @html_entities = HTMLEntities.new
end

Public Instance Methods

print() click to toggle source

Private Instance Methods

parse_content(nodes) click to toggle source
# File lib/ulysses/printer.rb, line 82
def parse_content(nodes)
  nodes.map do |node|
    if node.text?
      @html_entities.encode node.content
    else
      send("parse_#{node.name}", node)
    end
  end.join
end
parse_element(node) click to toggle source
# File lib/ulysses/printer.rb, line 114
def parse_element(node)
  kind = node.attributes['kind'].value.to_sym
  return '' if HIDDEN_ELEMENTS.include? kind
  return parse_simple_element(kind, node) if SIMPLE_ELEMENTS.has_key?(kind)

  send("parse_element_#{kind}", node)
end
parse_element_annotation(node) click to toggle source
# File lib/ulysses/printer.rb, line 153
def parse_element_annotation(node)
  attrs = parse_element_attributes(node)
  @annotations << attrs['text']
  '<span class="annotation" data-id="' + @annotations.size.to_s + '">' + @annotations.size.to_s + '</span>'
end
parse_element_attributes(element) click to toggle source
# File lib/ulysses/printer.rb, line 159
def parse_element_attributes(element)
  attributes = element.children.select { |child| child.element? && child.name === 'attribute' }
  attributes.map! do |attr|
    [attr.attributes['identifier'].value, parse_content(attr.children)]
  end
  Hash[attributes]
end
parse_element_footnote(node) click to toggle source
# File lib/ulysses/printer.rb, line 147
def parse_element_footnote(node)
  attrs = parse_element_attributes(node)
  @footnotes << attrs['text']
  '<sup class="footnote-ref"><a href="#fn-' + @footnotes.size.to_s + '">' + @footnotes.size.to_s + '</a></sup>'
end
parse_element_image(node) click to toggle source
# File lib/ulysses/printer.rb, line 137
def parse_element_image(node)
  attrs = parse_element_attributes(node)
  '<img src="' + attrs.fetch('URL', '') + '" alt="' + attrs.fetch('title', '') + '" />'
end
parse_element_video(node) click to toggle source
# File lib/ulysses/printer.rb, line 142
def parse_element_video(node)
  attrs = parse_element_attributes(node)
  '<video><source src="' + attrs['URL'] + '" /></video>'
end
parse_escape(node) click to toggle source
# File lib/ulysses/printer.rb, line 102
def parse_escape(node)
  node.content.gsub /\\(.)/, '\1'
end
parse_line_class(tags) click to toggle source
# File lib/ulysses/printer.rb, line 176
def parse_line_class(tags)
  tabs = tags.count(:tab)
  if tabs > 1
    tags.delete(:tab)
    tags << :"tabs_#{tabs}"
  end
  tags.unshift :line
  tags.uniq.map{ |t| snake_case(t) }.join(' ')
end
parse_p(node) click to toggle source
# File lib/ulysses/printer.rb, line 106
def parse_p(node)
  '<p>' + parse_content(node.children) + '</p>'
end
parse_simple_element(kind, node) click to toggle source
# File lib/ulysses/printer.rb, line 122
def parse_simple_element(kind, node)
  content = parse_content(node.children)
  if (html_tag = SIMPLE_ELEMENTS[kind]) === 'span'
    '<span class="' + snake_case(kind) + '">' + content + '</span>'
  else
    "<#{html_tag}>#{content}</#{html_tag}>"
  end
end
parse_string(node) click to toggle source
# File lib/ulysses/printer.rb, line 110
def parse_string(node)
  parse_content node.children
end
parse_tags(tags) click to toggle source
# File lib/ulysses/printer.rb, line 92
def parse_tags(tags)
  tags.children.map do |tag|
    if tag.attributes.has_key? 'kind'
      tag.attributes['kind'].value.to_sym
    elsif tag.content === "\t"
      :tab
    end
  end
end
print_annotations() click to toggle source
print_body() click to toggle source
print_footnotes() click to toggle source
print_group(group) click to toggle source
print_library(library) click to toggle source
print_paragraph(p) click to toggle source
print_sheet(sheet) click to toggle source
snake_case(tag) click to toggle source
# File lib/ulysses/printer.rb, line 167
def snake_case(tag)
  tag.to_s.gsub(/::/, '/')
      .gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
      .gsub(/([a-z\d])([A-Z])/,'\1_\2')
      .gsub(/([a-z])(\d)/i, '\1_\2')
      .tr('-', '_')
      .downcase
end