Class: RDoc::Markdown::Literals
Relationships & Source Files | |
Namespace Children | |
Classes:
| |
Exceptions:
| |
Inherits: | Object |
Defined in: | lib/rdoc/markdown/literals.rb |
Overview
This set of literals is for Ruby 1.9 regular expressions and gives full unicode support.
Unlike peg-markdown, this set of literals recognizes Unicode alphanumeric characters, newlines and spaces.
Constant Summary
Class Method Summary
-
.new(str, debug = false) ⇒ Literals
constructor
Internal use only
This is distinct from setup_parser so that a standalone parser can redefine #initialize and still have access to the proper parser setup code.
- .rule_info(name, rendered) Internal use only
Instance Attribute Summary
- #failed_rule readonly Internal use only
- #failing_rule_offset readonly Internal use only
- #pos rw Internal use only
- #result rw Internal use only
- #string readonly Internal use only
Instance Method Summary
-
#_Alphanumeric
Alphanumeric = /p
Word
/. -
#_AlphanumericAscii
AlphanumericAscii = /[A-Za-z0-9]/.
-
#_BOM
BOM = “uFEFF”.
-
#_Newline
Newline = /n|rn?|p
Zl
|pZp
/. -
#_NonAlphanumeric
NonAlphanumeric = /p
^Word
/. -
#_Spacechar
Spacechar = /t|p
Zs
/. - #setup_foreign_grammar
- #apply(rule) Internal use only
- #apply_with_args(rule, *args) Internal use only
- #current_character(target = pos) Internal use only
- #current_column(target = pos) Internal use only
-
#current_line(target = pos)
Internal use only
See additional method definition at line 63.
- #current_pos_info(target = pos) Internal use only
- #external_invoke(other, rule, *args) Internal use only
- #failure_caret Internal use only
- #failure_character Internal use only
- #failure_info Internal use only
- #failure_oneline Internal use only
-
#get_byte
Internal use only
See additional method definition at line 222.
- #get_line(no) Internal use only
- #get_text(start) Internal use only
- #grow_lr(rule, args, start_pos, m) Internal use only
- #lines Internal use only
- #match_string(str) Internal use only
- #parse(rule = nil) Internal use only
- #position_line_offsets Internal use only
- #raise_error Internal use only
- #scan(reg) Internal use only
- #set_failed_rule(name) Internal use only
-
#set_string(string, pos)
Internal use only
Sets the string and current parsing position for the parser.
-
#setup_parser(str, debug = false)
Internal use only
Prepares for parsing
str
. - #show_error(io = STDOUT) Internal use only
- #show_pos Internal use only
Constructor Details
.new(str, debug = false) ⇒ Literals
This is distinct from setup_parser so that a standalone parser can redefine RDoc::Markdown#initialize and still have access to the proper parser setup code.
# File 'lib/rdoc/markdown/literals.rb', line 17
def initialize(str, debug=false) setup_parser(str, debug) end
Class Method Details
.rule_info(name, rendered)
Instance Attribute Details
#failed_rule (readonly)
# File 'lib/rdoc/markdown/literals.rb', line 200
attr_reader :failed_rule
#failing_rule_offset (readonly)
# File 'lib/rdoc/markdown/literals.rb', line 37
attr_reader :failing_rule_offset
#pos (rw)
# File 'lib/rdoc/markdown/literals.rb', line 38
attr_accessor :result, :pos
#result (rw)
# File 'lib/rdoc/markdown/literals.rb', line 38
attr_accessor :result, :pos
#string (readonly)
# File 'lib/rdoc/markdown/literals.rb', line 36
attr_reader :string
Instance Method Details
#_Alphanumeric
Alphanumeric = /pWord
/
# File 'lib/rdoc/markdown/literals.rb', line 405
def _Alphanumeric _tmp = scan(/\G(?-mix:\p{Word})/) set_failed_rule :_Alphanumeric unless _tmp return _tmp end
#_AlphanumericAscii
AlphanumericAscii = /[A-Za-z0-9]/
# File 'lib/rdoc/markdown/literals.rb', line 412
def _AlphanumericAscii _tmp = scan(/\G(?-mix:[A-Za-z0-9])/) set_failed_rule :_AlphanumericAscii unless _tmp return _tmp end
#_BOM
BOM = “uFEFF”
# File 'lib/rdoc/markdown/literals.rb', line 419
def _BOM _tmp = match_string("uFEFF") set_failed_rule :_BOM unless _tmp return _tmp end
#_Newline
Newline = /n|rn?|pZl
|pZp
/
# File 'lib/rdoc/markdown/literals.rb', line 426
def _Newline _tmp = scan(/\G(?-mix:\n|\r\n?|\p{Zl}|\p{Zp})/) set_failed_rule :_Newline unless _tmp return _tmp end
#_NonAlphanumeric
NonAlphanumeric = /p^Word
/
# File 'lib/rdoc/markdown/literals.rb', line 433
def _NonAlphanumeric _tmp = scan(/\G(?-mix:\p{^Word})/) set_failed_rule :_NonAlphanumeric unless _tmp return _tmp end
#_Spacechar
Spacechar = /t|pZs
/
# File 'lib/rdoc/markdown/literals.rb', line 440
def _Spacechar _tmp = scan(/\G(?-mix:\t|\p{Zs})/) set_failed_rule :_Spacechar unless _tmp return _tmp end
#apply(rule)
# File 'lib/rdoc/markdown/literals.rb', line 331
def apply(rule) @result = nil if m = @memoizations[rule][@pos] @pos = m.pos if !m.set m.left_rec = true return nil end @result = m.result return m.ans else m = MemoEntry.new(nil, @pos) @memoizations[rule][@pos] = m start_pos = @pos ans = __send__ rule lr = m.left_rec m.move! ans, @pos, @result # Don't bother trying to grow the left recursion # if it's failing straight away (thus there is no seed) if ans and lr return grow_lr(rule, nil, start_pos, m) else return ans end end end
#apply_with_args(rule, *args)
# File 'lib/rdoc/markdown/literals.rb', line 297
def apply_with_args(rule, *args) @result = nil memo_key = [rule, args] if m = @memoizations[memo_key][@pos] @pos = m.pos if !m.set m.left_rec = true return nil end @result = m.result return m.ans else m = MemoEntry.new(nil, @pos) @memoizations[memo_key][@pos] = m start_pos = @pos ans = __send__ rule, *args lr = m.left_rec m.move! ans, @pos, @result # Don't bother trying to grow the left recursion # if it's failing straight away (thus there is no seed) if ans and lr return grow_lr(rule, args, start_pos, m) else return ans end end end
#current_character(target = pos)
#current_column(target = pos)
#current_line(target = pos)
See additional method definition at line 63.
# File 'lib/rdoc/markdown/literals.rb', line 70
def current_line(target=pos) if line = position_line_offsets.bsearch_index {|x| x > target } return line + 1 end raise "Target position #{target} is outside of string" end
#current_pos_info(target = pos)
# File 'lib/rdoc/markdown/literals.rb', line 88
def current_pos_info(target=pos) l = current_line target c = current_column target ln = get_line(l-1) chr = string[target,1] KpegPosInfo.new(target, l, c, ln, chr) end
#external_invoke(other, rule, *args)
# File 'lib/rdoc/markdown/literals.rb', line 278
def external_invoke(other, rule, *args) old_pos = @pos old_string = @string set_string other.string, other.pos begin if val = __send__(rule, *args) other.pos = @pos other.result = @result else other.set_failed_rule "#{self.class}##{rule}" end val ensure set_string old_string, old_pos end end
#failure_caret
# File 'lib/rdoc/markdown/literals.rb', line 147
def failure_caret p = current_pos_info @failing_rule_offset "#{p.line.chomp}\n#{' ' * (p.col - 1)}^" end
#failure_character
# File 'lib/rdoc/markdown/literals.rb', line 152
def failure_character current_character @failing_rule_offset end
#failure_info
# File 'lib/rdoc/markdown/literals.rb', line 135
def failure_info l = current_line @failing_rule_offset c = current_column @failing_rule_offset if @failed_rule.kind_of? Symbol info = self.class::Rules[@failed_rule] "line #{l}, column #{c}: failed rule '#{info.name}' = '#{info.rendered}'" else "line #{l}, column #{c}: failed rule '#{@failed_rule}'" end end
#failure_oneline
# File 'lib/rdoc/markdown/literals.rb', line 156
def failure_oneline p = current_pos_info @failing_rule_offset if @failed_rule.kind_of? Symbol info = self.class::Rules[@failed_rule] "@#{p.lno}:#{p.col} failed rule '#{info.name}', got '#{p.char}'" else "@#{p.lno}:#{p.col} failed rule '#{@failed_rule}', got '#{p.char}'" end end
#get_byte
See additional method definition at line 222.
# File 'lib/rdoc/markdown/literals.rb', line 232
def get_byte if @pos >= @string_size return nil end s = @string[@pos].ord @pos += 1 s end
#get_line(no)
# File 'lib/rdoc/markdown/literals.rb', line 100
def get_line(no) loff = position_line_offsets if no < 0 raise "Line No is out of range: #{no} < 0" elsif no >= loff.size raise "Line No is out of range: #{no} >= #{loff.size}" end lend = loff[no]-1 lstart = no > 0 ? loff[no-1] : 0 string[lstart..lend] end
#get_text(start)
# File 'lib/rdoc/markdown/literals.rb', line 114
def get_text(start) @string[start..@pos-1] end
#grow_lr(rule, args, start_pos, m)
# File 'lib/rdoc/markdown/literals.rb', line 364
def grow_lr(rule, args, start_pos, m) while true @pos = start_pos @result = m.result if args ans = __send__ rule, *args else ans = __send__ rule end return nil unless ans break if @pos <= m.pos m.move! ans, @pos, @result end @result = m.result @pos = m.pos return m.ans end
#lines
# File 'lib/rdoc/markdown/literals.rb', line 96
def lines string.lines end
#match_string(str)
# File 'lib/rdoc/markdown/literals.rb', line 202
def match_string(str) len = str.size if @string[pos,len] == str @pos += len return str end return nil end
#parse(rule = nil)
# File 'lib/rdoc/markdown/literals.rb', line 243
def parse(rule=nil) # We invoke the rules indirectly via apply # instead of by just calling them as methods because # if the rules use left recursion, apply needs to # manage that. if !rule apply(:_root) else method = rule.gsub("-","_hyphen_") apply :"_#{method}" end end
#position_line_offsets
# File 'lib/rdoc/markdown/literals.rb', line 50
def position_line_offsets unless @position_line_offsets @position_line_offsets = [] total = 0 string.each_line do |line| total += line.size @position_line_offsets << total end end @position_line_offsets end
#raise_error
# File 'lib/rdoc/markdown/literals.rb', line 170
def raise_error raise ParseError, failure_oneline end
#scan(reg)
# File 'lib/rdoc/markdown/literals.rb', line 212
def scan(reg) if m = reg.match(@string, @pos) @pos = m.end(0) return true end return nil end
#set_failed_rule(name)
# File 'lib/rdoc/markdown/literals.rb', line 193
def set_failed_rule(name) if @pos > @failing_rule_offset @failed_rule = name @failing_rule_offset = @pos end end
#set_string(string, pos)
Sets the string and current parsing position for the parser.
#setup_foreign_grammar
[ GitHub ]# File 'lib/rdoc/markdown/literals.rb', line 402
def setup_foreign_grammar; end
#setup_parser(str, debug = false)
Prepares for parsing str
. If you define a custom initialize you must call this method before #parse
# File 'lib/rdoc/markdown/literals.rb', line 25
def setup_parser(str, debug=false) set_string str, 0 @memoizations = Hash.new { |h,k| h[k] = {} } @result = nil @failed_rule = nil @failing_rule_offset = -1 @line_offsets = nil setup_foreign_grammar end
#show_error(io = STDOUT)
# File 'lib/rdoc/markdown/literals.rb', line 174
def show_error(io=STDOUT) error_pos = @failing_rule_offset p = current_pos_info(error_pos) io.puts "On line #{p.lno}, column #{p.col}:" if @failed_rule.kind_of? Symbol info = self.class::Rules[@failed_rule] io.puts "Failed to match '#{info.rendered}' (rule '#{info.name}')" else io.puts "Failed to match rule '#{@failed_rule}'" end io.puts "Got: #{p.char.inspect}" io.puts "=> #{p.line}" io.print(" " * (p.col + 2)) io.puts "^" end
#show_pos
# File 'lib/rdoc/markdown/literals.rb', line 126
def show_pos width = 10 if @pos < width "#{@pos} (\"#{@string[0,@pos]}\" @ \"#{@string[@pos,width]}\")" else "#{@pos} (\"... #{@string[@pos - width, width]}\" @ \"#{@string[@pos,width]}\")" end end