Sha256: 29610f4d46b533a7c2933a800efd7bf7660d21fa0564d6d8a36c2f26a5d2f76a

Contents?: true

Size: 1.18 KB

Versions: 3

Compression:

Stored size: 1.18 KB

Contents

module Rouge
  module Lexers
    class Session < TemplateLexer
      desc 'an interactive session of another language'
      tag 'session'

      default_options :prompt => /(\A|\n)[^$#]+[$#]/
      default_options :parent => 'shell'

      def prompt_regex
        @prompt_regex ||= option(:prompt).tap do |prompt|
          Regexp === prompt ? prompt : Regexp.new(prompt)
        end
      end

      def stream_tokens(str, &b)
        scanner = StringScanner.new(str)

        until scanner.eos?
          if scanner.scan(prompt_regex)
            debug { "prompt: #{scanner[0].inspect}" }
            yield Token['Generic.Heading'], scanner[0]

            scanner.scan(line_regex)
            debug { "line: #{scanner[0].inspect}" }

            parent.lex(scanner[0], :continue => true, &b)
          end

          scanner.scan(until_prompt_regex)
          debug { "(#{until_prompt_regex.inspect}: #{scanner[0].inspect}" }
          yield Token['Generic.Output'], scanner[0]
        end
      end

      private

      def line_regex
        @line_regex ||= /(\\.|.)*?\n/
      end

      def until_prompt_regex
        @until_prompt_regex ||= /.*?(?=#{prompt_regex})|.*/m
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
rouge-0.2.12 lib/rouge/lexers/session.rb
rouge-0.2.11 lib/rouge/lexers/session.rb
rouge-0.2.10 lib/rouge/lexers/session.rb