Sha256: 582d067dc3b879252422f7e6e1f2dd2abd006b172b93ade2f847d6010c6aed0e

Contents?: true

Size: 1.73 KB

Versions: 14

Compression:

Stored size: 1.73 KB

Contents

require 'set'
require 'stringio'

module CommonMarker
  class Renderer
    attr_accessor :in_tight, :warnings, :in_plain
    def initialize
      @stream = StringIO.new
      @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 { |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 { |child| render(child) }
      else
        begin
          send(node.type, node)
        rescue NoMethodError => e
          @warnings.add('WARNING:  ' + node.type.to_s + ' 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(&blk)
      cr
      blk.call
      cr
    end

    def container(starter, ender, &blk)
      out(starter)
      blk.call
      out(ender)
    end

    def plain(&blk)
      old_in_plain = @in_plain
      @in_plain = true
      blk.call
      @in_plain = old_in_plain
    end
  end
end

Version data entries

14 entries across 14 versions & 1 rubygems

Version Path
commonmarker-0.8.0 lib/commonmarker/renderer.rb
commonmarker-0.7.0 lib/commonmarker/renderer.rb
commonmarker-0.6.0 lib/commonmarker/renderer.rb
commonmarker-0.5.1 lib/commonmarker/renderer.rb
commonmarker-0.5.0 lib/commonmarker/renderer.rb
commonmarker-0.4.1 lib/commonmarker/renderer.rb
commonmarker-0.4.0 lib/commonmarker/renderer.rb
commonmarker-0.3.0 lib/commonmarker/renderer.rb
commonmarker-0.2.1 lib/commonmarker/renderer.rb
commonmarker-0.2.0 lib/commonmarker/renderer.rb
commonmarker-0.1.3 lib/commonmarker/renderer.rb
commonmarker-0.1.2 lib/commonmarker/renderer.rb
commonmarker-0.1.1 lib/commonmarker/renderer.rb
commonmarker-0.1.0 lib/commonmarker/renderer.rb