Sha256: ece59ba9626194dd84357d964cd4dee3ce0a811bbb09e3117da5c935cc4c1c84

Contents?: true

Size: 1.85 KB

Versions: 23

Compression:

Stored size: 1.85 KB

Contents

require 'set'
require 'stringio'

module CommonMarker
  class Renderer
    attr_accessor :in_tight, :warnings, :in_plain
    def initialize
      @stream = StringIO.new("".force_encoding("utf-8"))
      @need_blocksep = false
      @warnings = Set.new []
      @in_tight = false
      @in_plain = false
      @buffer = ''
    end

    def out(*args)
      args.each do |arg|
        if arg == :children
          @node.each { |child| out(child) }
        elsif arg.is_a?(Array)
          arg.each { |x| render(x) }
        elsif arg.is_a?(Node)
          render(arg)
        else
          @buffer << arg.to_s.force_encoding('utf-8')
          @stream.write(arg)
        end
      end
    end

    def render(node)
      @node = node
      if node.type == :document
        document(node)
        return @stream.string
      elsif @in_plain && node.type != :text && node.type != :softbreak
        node.each { |child| render(child) }
      else
        begin
          send(node.type, node)
        rescue NoMethodError => e
          @warnings.add("WARNING: #{node.type} not implemented.")
          raise e
        end
      end
    end

    def document(_node)
      out(:children)
    end

    def code_block(node)
      code_block(node)
    end

    def reference_def(_node)
    end

    def cr
      return if @buffer.empty? || @buffer[-1] == "\n"
      out("\n")
    end

    def blocksep
      out("\n")
    end

    def containersep
      cr unless @in_tight
    end

    def block
      cr
      yield
      cr
    end

    def container(starter, ender)
      out(starter)
      yield
      out(ender)
    end

    def plain
      old_in_plain = @in_plain
      @in_plain = true
      yield
      @in_plain = old_in_plain
    end

    private

    def escape_href(str)
      @node.html_escape_href(str)
    end

    def escape_html(str)
      @node.html_escape_html(str)
    end
  end
end

Version data entries

23 entries across 23 versions & 1 rubygems

Version Path
commonmarker-0.16.1 lib/commonmarker/renderer.rb
commonmarker-0.16.2 lib/commonmarker/renderer.rb
commonmarker-0.16.3 lib/commonmarker/renderer.rb
commonmarker-0.16.0 lib/commonmarker/renderer.rb
commonmarker-0.15.0 lib/commonmarker/renderer.rb
commonmarker-0.14.15 lib/commonmarker/renderer.rb
commonmarker-0.14.14 lib/commonmarker/renderer.rb
commonmarker-0.14.13 lib/commonmarker/renderer.rb
commonmarker-0.14.12 lib/commonmarker/renderer.rb
commonmarker-0.14.11 lib/commonmarker/renderer.rb
commonmarker-0.14.9 lib/commonmarker/renderer.rb
commonmarker-0.14.8 lib/commonmarker/renderer.rb
commonmarker-0.14.7 lib/commonmarker/renderer.rb
commonmarker-0.14.6 lib/commonmarker/renderer.rb
commonmarker-0.14.5 lib/commonmarker/renderer.rb
commonmarker-0.14.4 lib/commonmarker/renderer.rb
commonmarker-0.14.3 lib/commonmarker/renderer.rb
commonmarker-0.14.2 lib/commonmarker/renderer.rb
commonmarker-0.14.1 lib/commonmarker/renderer.rb
commonmarker-0.14.0 lib/commonmarker/renderer.rb