Class: RDoc::RD::InlineParser

Inherits:
Racc::Parser show all
Defined in:
lib/rdoc/rd/inline_parser.rb

Overview

RD format parser for inline markup such as emphasis, links, footnotes, etc.

Constant Summary collapse

EM_OPEN =

:stopdoc:

'((*'
EM_OPEN_RE =
/\A#{Regexp.quote(EM_OPEN)}/
EM_CLOSE =
'*))'
EM_CLOSE_RE =
/\A#{Regexp.quote(EM_CLOSE)}/
CODE_OPEN =
'(({'
CODE_OPEN_RE =
/\A#{Regexp.quote(CODE_OPEN)}/
CODE_CLOSE =
'}))'
CODE_CLOSE_RE =
/\A#{Regexp.quote(CODE_CLOSE)}/
VAR_OPEN =
'((|'
VAR_OPEN_RE =
/\A#{Regexp.quote(VAR_OPEN)}/
VAR_CLOSE =
'|))'
VAR_CLOSE_RE =
/\A#{Regexp.quote(VAR_CLOSE)}/
KBD_OPEN =
'((%'
KBD_OPEN_RE =
/\A#{Regexp.quote(KBD_OPEN)}/
KBD_CLOSE =
'%))'
KBD_CLOSE_RE =
/\A#{Regexp.quote(KBD_CLOSE)}/
INDEX_OPEN =
'((:'
INDEX_OPEN_RE =
/\A#{Regexp.quote(INDEX_OPEN)}/
INDEX_CLOSE =
':))'
INDEX_CLOSE_RE =
/\A#{Regexp.quote(INDEX_CLOSE)}/
REF_OPEN =
'((<'
REF_OPEN_RE =
/\A#{Regexp.quote(REF_OPEN)}/
REF_CLOSE =
'>))'
REF_CLOSE_RE =
/\A#{Regexp.quote(REF_CLOSE)}/
FOOTNOTE_OPEN =
'((-'
FOOTNOTE_OPEN_RE =
/\A#{Regexp.quote(FOOTNOTE_OPEN)}/
FOOTNOTE_CLOSE =
'-))'
FOOTNOTE_CLOSE_RE =
/\A#{Regexp.quote(FOOTNOTE_CLOSE)}/
VERB_OPEN =
"(('"
VERB_OPEN_RE =
/\A#{Regexp.quote(VERB_OPEN)}/
VERB_CLOSE =
"'))"
VERB_CLOSE_RE =
/\A#{Regexp.quote(VERB_CLOSE)}/
BAR =
"|"
BAR_RE =
/\A#{Regexp.quote(BAR)}/
QUOTE =
'"'
QUOTE_RE =
/\A#{Regexp.quote(QUOTE)}/
SLASH =
"/"
SLASH_RE =
/\A#{Regexp.quote(SLASH)}/
BACK_SLASH =
"\\"
BACK_SLASH_RE =
/\A#{Regexp.quote(BACK_SLASH)}/
URL =
"URL:"
URL_RE =
/\A#{Regexp.quote(URL)}/
OTHER_RE =
Regexp.new(
  "\\A.+?(?=#{Regexp.quote(EM_OPEN)}|#{Regexp.quote(EM_CLOSE)}|
#{Regexp.quote(CODE_OPEN)}|#{Regexp.quote(CODE_CLOSE)}|
#{Regexp.quote(VAR_OPEN)}|#{Regexp.quote(VAR_CLOSE)}|
#{Regexp.quote(KBD_OPEN)}|#{Regexp.quote(KBD_CLOSE)}|
#{Regexp.quote(INDEX_OPEN)}|#{Regexp.quote(INDEX_CLOSE)}|
#{Regexp.quote(REF_OPEN)}|#{Regexp.quote(REF_CLOSE)}|
            #{Regexp.quote(FOOTNOTE_OPEN)}|#{Regexp.quote(FOOTNOTE_CLOSE)}|
#{Regexp.quote(VERB_OPEN)}|#{Regexp.quote(VERB_CLOSE)}|
#{Regexp.quote(BAR)}|
#{Regexp.quote(QUOTE)}|
#{Regexp.quote(SLASH)}|
#{Regexp.quote(BACK_SLASH)}|
#{Regexp.quote(URL)})", other_re_mode)
Racc_arg =
[
racc_action_table,
racc_action_check,
racc_action_default,
racc_action_pointer,
racc_goto_table,
racc_goto_check,
racc_goto_default,
racc_goto_pointer,
racc_nt_base,
racc_reduce_table,
racc_token_table,
racc_shift_n,
racc_reduce_n,
racc_use_result_var ]
Racc_token_to_s_table =
[
"$end",
"error",
"EX_LOW",
"QUOTE",
"BAR",
"SLASH",
"BACK_SLASH",
"URL",
"OTHER",
"REF_OPEN",
"FOOTNOTE_OPEN",
"FOOTNOTE_CLOSE",
"EX_HIGH",
"EM_OPEN",
"EM_CLOSE",
"CODE_OPEN",
"CODE_CLOSE",
"VAR_OPEN",
"VAR_CLOSE",
"KBD_OPEN",
"KBD_CLOSE",
"INDEX_OPEN",
"INDEX_CLOSE",
"REF_CLOSE",
"VERB_OPEN",
"VERB_CLOSE",
"$start",
"content",
"elements",
"element",
"emphasis",
"code",
"var",
"keyboard",
"index",
"reference",
"footnote",
"verb",
"normal_str_ele",
"substitute",
"ref_label",
"ref_label2",
"ref_url_strings",
"filename",
"element_label",
"element_label2",
"ref_subst_content",
"ref_subst_content_q",
"ref_subst_strings_q",
"ref_subst_strings_first",
"ref_subst_ele2",
"ref_subst_eles",
"ref_subst_str_ele_first",
"ref_subst_eles_q",
"ref_subst_ele",
"ref_subst_ele_q",
"ref_subst_str_ele",
"ref_subst_str_ele_q",
"ref_subst_strings",
"ref_subst_string3",
"ref_subst_string",
"ref_subst_string_q",
"ref_subst_string2",
"ref_url_string",
"verb_strings",
"normal_string",
"normal_strings",
"verb_string",
"verb_normal_string" ]
Racc_debug_parser =
false

Constants inherited from Racc::Parser

Racc::Parser::Racc_Runtime_Core_Version_R, Racc::Parser::Racc_Runtime_Version

Instance Method Summary collapse

Methods inherited from Racc::Parser

#_racc_do_parse_rb, #_racc_do_reduce, #_racc_evalact, #_racc_init_sysvars, #_racc_setup, #_racc_yyparse_rb, #racc_accept, #racc_e_pop, #racc_next_state, #racc_print_stacks, #racc_print_states, #racc_read_token, #racc_reduce, racc_runtime_type, #racc_shift, #racc_token2str, #token_to_str, #yyaccept, #yyerrok, #yyerror

Constructor Details

#initialize(block_parser) ⇒ InlineParser

Creates a new parser for inline markup in the rd format. The block_parser is used to for footnotes and labels in the inline text.



90
91
92
# File 'lib/rdoc/rd/inline_parser.rb', line 90

def initialize block_parser
  @block_parser = block_parser
end

Instance Method Details

#_reduce_101(val, _values, result) ⇒ Object

reduce 100 omitted



1102
1103
1104
1105
1106
1107
# File 'lib/rdoc/rd/inline_parser.rb', line 1102

def _reduce_101(val, _values, result)
      index = @block_parser.add_footnote val[1].rdoc
      result = "{*#{index}}[rdoc-label:foottext-#{index}:footmark-#{index}]"

    result
end

#_reduce_102(val, _values, result) ⇒ Object



1109
1110
1111
1112
1113
# File 'lib/rdoc/rd/inline_parser.rb', line 1109

def _reduce_102(val, _values, result)
      result = inline "<tt>#{val[1]}</tt>", val[1]

    result
end

#_reduce_109(val, _values, result) ⇒ Object

reduce 108 omitted



1127
1128
1129
1130
# File 'lib/rdoc/rd/inline_parser.rb', line 1127

def _reduce_109(val, _values, result)
 result << val[1]
    result
end

#_reduce_111(val, _values, result) ⇒ Object

reduce 110 omitted



1134
1135
1136
1137
1138
# File 'lib/rdoc/rd/inline_parser.rb', line 1134

def _reduce_111(val, _values, result)
      result = inline val[0]

    result
end

#_reduce_113(val, _values, result) ⇒ Object

reduce 112 omitted



1142
1143
1144
1145
# File 'lib/rdoc/rd/inline_parser.rb', line 1142

def _reduce_113(val, _values, result)
 result = val[1]
    result
end

#_reduce_114(val, _values, result) ⇒ Object



1147
1148
1149
1150
# File 'lib/rdoc/rd/inline_parser.rb', line 1147

def _reduce_114(val, _values, result)
 result = val[1]
    result
end

#_reduce_115(val, _values, result) ⇒ Object



1152
1153
1154
1155
# File 'lib/rdoc/rd/inline_parser.rb', line 1152

def _reduce_115(val, _values, result)
 result = val[1]
    result
end

#_reduce_13(val, _values, result) ⇒ Object

reduce 12 omitted



765
766
767
768
769
770
# File 'lib/rdoc/rd/inline_parser.rb', line 765

def _reduce_13(val, _values, result)
      content = val[1]
      result = inline "<em>#{content}</em>", content

    result
end

#_reduce_136(val, _values, result) ⇒ Object

reduce 135 omitted



1197
1198
1199
1200
# File 'lib/rdoc/rd/inline_parser.rb', line 1197

def _reduce_136(val, _values, result)
 result << val[1]
    result
end

#_reduce_14(val, _values, result) ⇒ Object



772
773
774
775
776
777
# File 'lib/rdoc/rd/inline_parser.rb', line 772

def _reduce_14(val, _values, result)
      content = val[1]
      result = inline "<code>#{content}</code>", content

    result
end

#_reduce_15(val, _values, result) ⇒ Object



779
780
781
782
783
784
# File 'lib/rdoc/rd/inline_parser.rb', line 779

def _reduce_15(val, _values, result)
      content = val[1]
      result = inline "+#{content}+", content

    result
end

#_reduce_16(val, _values, result) ⇒ Object



786
787
788
789
790
791
# File 'lib/rdoc/rd/inline_parser.rb', line 786

def _reduce_16(val, _values, result)
      content = val[1]
      result = inline "<tt>#{content}</tt>", content

    result
end

#_reduce_17(val, _values, result) ⇒ Object



793
794
795
796
797
798
799
# File 'lib/rdoc/rd/inline_parser.rb', line 793

def _reduce_17(val, _values, result)
      label = val[1]
      @block_parser.add_label label.reference
      result = "<span id=\"label-#{label}\">#{label}</span>"

    result
end

#_reduce_18(val, _values, result) ⇒ Object



801
802
803
804
805
# File 'lib/rdoc/rd/inline_parser.rb', line 801

def _reduce_18(val, _values, result)
      result = "{#{val[1]}}[#{val[2].join}]"

    result
end

#_reduce_19(val, _values, result) ⇒ Object



807
808
809
810
811
812
813
# File 'lib/rdoc/rd/inline_parser.rb', line 807

def _reduce_19(val, _values, result)
      scheme, inline = val[1]

      result = "{#{inline}}[#{scheme}#{inline.reference}]"

    result
end

#_reduce_2(val, _values, result) ⇒ Object

reduce 1 omitted



737
738
739
740
# File 'lib/rdoc/rd/inline_parser.rb', line 737

def _reduce_2(val, _values, result)
 result.append val[1]
    result
end

#_reduce_20(val, _values, result) ⇒ Object



815
816
817
818
819
# File 'lib/rdoc/rd/inline_parser.rb', line 815

def _reduce_20(val, _values, result)
      result = [nil, inline(val[1])]

    result
end

#_reduce_21(val, _values, result) ⇒ Object



821
822
823
824
825
826
827
828
# File 'lib/rdoc/rd/inline_parser.rb', line 821

def _reduce_21(val, _values, result)
      result = [
        'rdoc-label:',
        inline("#{val[0].reference}/#{val[1].reference}")
      ]

    result
end

#_reduce_22(val, _values, result) ⇒ Object



830
831
832
833
834
# File 'lib/rdoc/rd/inline_parser.rb', line 830

def _reduce_22(val, _values, result)
      result = ['rdoc-label:', val[0].reference]

    result
end

#_reduce_23(val, _values, result) ⇒ Object



836
837
838
839
840
# File 'lib/rdoc/rd/inline_parser.rb', line 836

def _reduce_23(val, _values, result)
      result = ['rdoc-label:', "#{val[0].reference}/"]

    result
end

#_reduce_24(val, _values, result) ⇒ Object



842
843
844
845
846
# File 'lib/rdoc/rd/inline_parser.rb', line 842

def _reduce_24(val, _values, result)
      result = [nil, inline(val[1])]

    result
end

#_reduce_25(val, _values, result) ⇒ Object



848
849
850
851
852
853
854
855
# File 'lib/rdoc/rd/inline_parser.rb', line 848

def _reduce_25(val, _values, result)
      result = [
        'rdoc-label:',
        inline("#{val[0].reference}/#{val[1].reference}")
      ]

    result
end

#_reduce_26(val, _values, result) ⇒ Object



857
858
859
860
861
# File 'lib/rdoc/rd/inline_parser.rb', line 857

def _reduce_26(val, _values, result)
      result = ['rdoc-label:', val[0]]

    result
end

#_reduce_27(val, _values, result) ⇒ Object



863
864
865
866
867
868
# File 'lib/rdoc/rd/inline_parser.rb', line 863

def _reduce_27(val, _values, result)
      ref = val[0].reference
      result = ['rdoc-label:', inline(ref, "#{ref}/")]

    result
end

#_reduce_29(val, _values, result) ⇒ Object

reduce 28 omitted



872
873
874
875
# File 'lib/rdoc/rd/inline_parser.rb', line 872

def _reduce_29(val, _values, result)
 result = val[1]
    result
end

#_reduce_3(val, _values, result) ⇒ Object



742
743
744
745
# File 'lib/rdoc/rd/inline_parser.rb', line 742

def _reduce_3(val, _values, result)
 result = val[0]
    result
end

#_reduce_30(val, _values, result) ⇒ Object



877
878
879
880
# File 'lib/rdoc/rd/inline_parser.rb', line 877

def _reduce_30(val, _values, result)
 result = val[1]
    result
end

#_reduce_31(val, _values, result) ⇒ Object



882
883
884
885
886
# File 'lib/rdoc/rd/inline_parser.rb', line 882

def _reduce_31(val, _values, result)
      result = inline val[0]

    result
end

#_reduce_32(val, _values, result) ⇒ Object



888
889
890
891
892
# File 'lib/rdoc/rd/inline_parser.rb', line 888

def _reduce_32(val, _values, result)
      result = inline "\"#{val[1]}\""

    result
end

#_reduce_33(val, _values, result) ⇒ Object



894
895
896
897
898
# File 'lib/rdoc/rd/inline_parser.rb', line 894

def _reduce_33(val, _values, result)
      result = inline val[0]

    result
end

#_reduce_34(val, _values, result) ⇒ Object



900
901
902
903
904
# File 'lib/rdoc/rd/inline_parser.rb', line 900

def _reduce_34(val, _values, result)
      result = inline "\"#{val[1]}\""

    result
end

#_reduce_36(val, _values, result) ⇒ Object

reduce 35 omitted



908
909
910
911
# File 'lib/rdoc/rd/inline_parser.rb', line 908

def _reduce_36(val, _values, result)
 result = val[1]
    result
end

#_reduce_37(val, _values, result) ⇒ Object



913
914
915
916
# File 'lib/rdoc/rd/inline_parser.rb', line 913

def _reduce_37(val, _values, result)
 result = inline val[1]
    result
end

#_reduce_38(val, _values, result) ⇒ Object



918
919
920
921
922
# File 'lib/rdoc/rd/inline_parser.rb', line 918

def _reduce_38(val, _values, result)
      result = val[0].append val[1]

    result
end

#_reduce_39(val, _values, result) ⇒ Object



924
925
926
927
928
# File 'lib/rdoc/rd/inline_parser.rb', line 924

def _reduce_39(val, _values, result)
      result = val[0].append val[1]

    result
end

#_reduce_40(val, _values, result) ⇒ Object



930
931
932
933
934
# File 'lib/rdoc/rd/inline_parser.rb', line 930

def _reduce_40(val, _values, result)
      result = val[0]

    result
end

#_reduce_41(val, _values, result) ⇒ Object



936
937
938
939
940
# File 'lib/rdoc/rd/inline_parser.rb', line 936

def _reduce_41(val, _values, result)
      result = inline val[0]

    result
end

#_reduce_43(val, _values, result) ⇒ Object

reduce 42 omitted



944
945
946
947
948
# File 'lib/rdoc/rd/inline_parser.rb', line 944

def _reduce_43(val, _values, result)
      result = val[0].append val[1]

    result
end

#_reduce_44(val, _values, result) ⇒ Object



950
951
952
953
954
# File 'lib/rdoc/rd/inline_parser.rb', line 950

def _reduce_44(val, _values, result)
      result = inline val[0]

    result
end

#_reduce_45(val, _values, result) ⇒ Object



956
957
958
959
960
# File 'lib/rdoc/rd/inline_parser.rb', line 956

def _reduce_45(val, _values, result)
      result = val[0].append val[1]

    result
end

#_reduce_46(val, _values, result) ⇒ Object



962
963
964
965
966
# File 'lib/rdoc/rd/inline_parser.rb', line 962

def _reduce_46(val, _values, result)
      result = val[0]

    result
end

#_reduce_57(val, _values, result) ⇒ Object

reduce 56 omitted



988
989
990
991
992
# File 'lib/rdoc/rd/inline_parser.rb', line 988

def _reduce_57(val, _values, result)
      result = val[0]

    result
end

#_reduce_58(val, _values, result) ⇒ Object



994
995
996
997
998
# File 'lib/rdoc/rd/inline_parser.rb', line 994

def _reduce_58(val, _values, result)
      result = inline val[0]

    result
end

#_reduce_59(val, _values, result) ⇒ Object



1000
1001
1002
1003
1004
# File 'lib/rdoc/rd/inline_parser.rb', line 1000

def _reduce_59(val, _values, result)
      result = inline val[0]

    result
end

#_reduce_60(val, _values, result) ⇒ Object



1006
1007
1008
1009
# File 'lib/rdoc/rd/inline_parser.rb', line 1006

def _reduce_60(val, _values, result)
 result << val[1]
    result
end

#_reduce_62(val, _values, result) ⇒ Object

reduce 61 omitted



1013
1014
1015
1016
1017
# File 'lib/rdoc/rd/inline_parser.rb', line 1013

def _reduce_62(val, _values, result)
      result << val[1]

    result
end

#_reduce_64(val, _values, result) ⇒ Object

reduce 63 omitted



1021
1022
1023
1024
1025
# File 'lib/rdoc/rd/inline_parser.rb', line 1021

def _reduce_64(val, _values, result)
      result << val[1]

    result
end

#_reduce_78(val, _values, result) ⇒ Object

reduce 77 omitted



1053
1054
1055
1056
# File 'lib/rdoc/rd/inline_parser.rb', line 1053

def _reduce_78(val, _values, result)
 result << val[1]
    result
end

#_reduce_none(val, _values, result) ⇒ Object

reduce 137 omitted



1204
1205
1206
# File 'lib/rdoc/rd/inline_parser.rb', line 1204

def _reduce_none(val, _values, result)
  val[0]
end

#inline(rdoc, reference = rdoc) ⇒ Object

Creates a new RDoc::RD::Inline for the rdoc markup and the raw reference



239
240
241
# File 'lib/rdoc/rd/inline_parser.rb', line 239

def inline rdoc, reference = rdoc
  RDoc::RD::Inline.new rdoc, reference
end

#next_tokenObject

Returns the next token from the inline text



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
# File 'lib/rdoc/rd/inline_parser.rb', line 108

def next_token
  return [false, false] if @src.eos?
#  p @src.rest if @yydebug
  if ret = @src.scan(EM_OPEN_RE)
    @pre << ret
    [:EM_OPEN, ret]
  elsif ret = @src.scan(EM_CLOSE_RE)
    @pre << ret
    [:EM_CLOSE, ret]
  elsif ret = @src.scan(CODE_OPEN_RE)
    @pre << ret
    [:CODE_OPEN, ret]
  elsif ret = @src.scan(CODE_CLOSE_RE)
    @pre << ret
    [:CODE_CLOSE, ret]
  elsif ret = @src.scan(VAR_OPEN_RE)
    @pre << ret
    [:VAR_OPEN, ret]
  elsif ret = @src.scan(VAR_CLOSE_RE)
    @pre << ret
    [:VAR_CLOSE, ret]
  elsif ret = @src.scan(KBD_OPEN_RE)
    @pre << ret
    [:KBD_OPEN, ret]
  elsif ret = @src.scan(KBD_CLOSE_RE)
    @pre << ret
    [:KBD_CLOSE, ret]
  elsif ret = @src.scan(INDEX_OPEN_RE)
    @pre << ret
    [:INDEX_OPEN, ret]
  elsif ret = @src.scan(INDEX_CLOSE_RE)
    @pre << ret
    [:INDEX_CLOSE, ret]
  elsif ret = @src.scan(REF_OPEN_RE)
    @pre << ret
    [:REF_OPEN, ret]
  elsif ret = @src.scan(REF_CLOSE_RE)
    @pre << ret
    [:REF_CLOSE, ret]
  elsif ret = @src.scan(FOOTNOTE_OPEN_RE)
    @pre << ret
    [:FOOTNOTE_OPEN, ret]
  elsif ret = @src.scan(FOOTNOTE_CLOSE_RE)
    @pre << ret
    [:FOOTNOTE_CLOSE, ret]
  elsif ret = @src.scan(VERB_OPEN_RE)
    @pre << ret
    [:VERB_OPEN, ret]
  elsif ret = @src.scan(VERB_CLOSE_RE)
    @pre << ret
    [:VERB_CLOSE, ret]
  elsif ret = @src.scan(BAR_RE)
    @pre << ret
    [:BAR, ret]
  elsif ret = @src.scan(QUOTE_RE)
    @pre << ret
    [:QUOTE, ret]
  elsif ret = @src.scan(SLASH_RE)
    @pre << ret
    [:SLASH, ret]
  elsif ret = @src.scan(BACK_SLASH_RE)
    @pre << ret
    [:BACK_SLASH, ret]
  elsif ret = @src.scan(URL_RE)
    @pre << ret
    [:URL, ret]
  elsif ret = @src.scan(OTHER_RE)
    @pre << ret
    [:OTHER, ret]
  else
    ret = @src.rest
    @pre << ret
    @src.terminate
    [:OTHER, ret]
  end
end

#next_words_on_errorObject

Returns words following an error



228
229
230
231
232
233
234
# File 'lib/rdoc/rd/inline_parser.rb', line 228

def next_words_on_error
  if n = @src.rest.index("\n")
    @src.rest[0 .. (n-1)]
  else
    @src.rest
  end
end

#on_error(et, ev, values) ⇒ Object

Raises a ParseError when invalid formatting is found

Raises:



188
189
190
191
192
193
194
195
196
197
198
199
200
# File 'lib/rdoc/rd/inline_parser.rb', line 188

def on_error(et, ev, values)
  lines_of_rest = @src.rest.lines.to_a.length
  prev_words = prev_words_on_error(ev)
  at = 4 + prev_words.length

  message = <<-MSG
RD syntax error: line #{@block_parser.line_index - lines_of_rest}:
...#{prev_words} #{(ev||'')} #{next_words_on_error()} ...
  MSG

  message << " " * at + "^" * (ev ? ev.length : 0) + "\n"
  raise ParseError, message
end

#parse(inline) ⇒ Object

Parses the inline text from RD format into RDoc format.



97
98
99
100
101
102
103
# File 'lib/rdoc/rd/inline_parser.rb', line 97

def parse inline
  @inline = inline
  @src = StringScanner.new inline
  @pre = "".dup
  @yydebug = true
  do_parse.to_s
end

#prev_words_on_error(ev) ⇒ Object

Returns words before the error



205
206
207
208
209
210
211
# File 'lib/rdoc/rd/inline_parser.rb', line 205

def prev_words_on_error(ev)
  pre = @pre
  if ev and /#{Regexp.quote(ev)}$/ =~ pre
    pre = $`
  end
  last_line(pre)
end