infoboxer 0.2.7 → 0.2.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +1 -0
  3. data/CHANGELOG.md +6 -0
  4. data/bin/infoboxer +11 -12
  5. data/infoboxer.gemspec +3 -2
  6. data/lib/infoboxer/core_ext.rb +1 -0
  7. data/lib/infoboxer/definitions/en.wikipedia.org.rb +13 -13
  8. data/lib/infoboxer/media_wiki/page.rb +4 -3
  9. data/lib/infoboxer/media_wiki/traits.rb +12 -10
  10. data/lib/infoboxer/media_wiki.rb +97 -68
  11. data/lib/infoboxer/navigation/lookup.rb +30 -26
  12. data/lib/infoboxer/navigation/sections.rb +33 -37
  13. data/lib/infoboxer/navigation/selector.rb +5 -6
  14. data/lib/infoboxer/navigation/shortcuts.rb +12 -11
  15. data/lib/infoboxer/navigation.rb +2 -1
  16. data/lib/infoboxer/parser/context.rb +12 -13
  17. data/lib/infoboxer/parser/html.rb +7 -6
  18. data/lib/infoboxer/parser/image.rb +25 -29
  19. data/lib/infoboxer/parser/inline.rb +82 -79
  20. data/lib/infoboxer/parser/paragraphs.rb +34 -37
  21. data/lib/infoboxer/parser/table.rb +26 -27
  22. data/lib/infoboxer/parser/template.rb +12 -4
  23. data/lib/infoboxer/parser/util.rb +11 -16
  24. data/lib/infoboxer/parser.rb +8 -1
  25. data/lib/infoboxer/templates/base.rb +3 -3
  26. data/lib/infoboxer/templates/set.rb +11 -10
  27. data/lib/infoboxer/tree/compound.rb +7 -6
  28. data/lib/infoboxer/tree/document.rb +1 -0
  29. data/lib/infoboxer/tree/html.rb +5 -4
  30. data/lib/infoboxer/tree/image.rb +8 -7
  31. data/lib/infoboxer/tree/inline.rb +4 -5
  32. data/lib/infoboxer/tree/linkable.rb +3 -5
  33. data/lib/infoboxer/tree/list.rb +15 -16
  34. data/lib/infoboxer/tree/node.rb +11 -10
  35. data/lib/infoboxer/tree/nodes.rb +24 -23
  36. data/lib/infoboxer/tree/paragraphs.rb +3 -2
  37. data/lib/infoboxer/tree/ref.rb +6 -3
  38. data/lib/infoboxer/tree/table.rb +13 -13
  39. data/lib/infoboxer/tree/template.rb +15 -15
  40. data/lib/infoboxer/tree/text.rb +2 -1
  41. data/lib/infoboxer/tree/wikilink.rb +9 -8
  42. data/lib/infoboxer/tree.rb +3 -2
  43. data/lib/infoboxer/version.rb +2 -1
  44. data/lib/infoboxer.rb +24 -26
  45. data/regression/pages/wyoming.wiki +1085 -0
  46. metadata +8 -21
  47. data/lib/infoboxer/media_wiki/mediawiktory_patch.rb +0 -23
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+
2
3
  module Infoboxer
3
4
  module Navigation
4
5
  # `Sections` module provides logical view on document strcture.
@@ -24,7 +25,7 @@ module Infoboxer
24
25
  # lookup_parents(:Section) # => []
25
26
  # ```
26
27
  module Sections
27
- # This module is included in {Tree::Document Document}, allowing
28
+ # This module is included in {Tree::Document Document}, allowing
28
29
  # you to navigate through document's logical sections (and also
29
30
  # included in each {Sections::Section} instance, allowing to navigate
30
31
  # recursively).
@@ -35,9 +36,9 @@ module Infoboxer
35
36
  #
36
37
  # @return {Tree::Nodes}
37
38
  def intro
38
- children.
39
- take_while{|n| !n.is_a?(Tree::Heading)}.
40
- select{|n| n.is_a?(Tree::BaseParagraph)}
39
+ children
40
+ .take_while { |n| !n.is_a?(Tree::Heading) }
41
+ .select { |n| n.is_a?(Tree::BaseParagraph) }
41
42
  end
42
43
 
43
44
  # List of sections inside current container.
@@ -48,12 +49,12 @@ module Infoboxer
48
49
  # document.sections # all top-level sections
49
50
  # document.sections('Culture') # only "Culture" section
50
51
  # document.sections(/^List of/) # all sections with heading matching pattern
51
- #
52
- # document.
52
+ #
53
+ # document.
53
54
  # sections('Culture'). # long way of recieve nested section
54
55
  # sections('Music') # (Culture / Music)
55
- #
56
- # document.
56
+ #
57
+ # document.
57
58
  # sections('Culture', 'Music') # the same as above
58
59
  #
59
60
  # document.
@@ -69,14 +70,14 @@ module Infoboxer
69
70
  h.count == 1 or fail(ArgumentError, "Undefined behavior with #{h}")
70
71
  names.unshift(h.keys.first, h.values.first)
71
72
  end
72
-
73
+
73
74
  case names.count
74
75
  when 0
75
76
  @sections
76
77
  when 1
77
- @sections.select{|s| names.first === s.heading.text_}
78
+ @sections.select { |s| names.first === s.heading.text_ }
78
79
  else
79
- @sections.select{|s| names.first === s.heading.text_}.sections(*names[1..-1])
80
+ @sections.select { |s| names.first === s.heading.text_ }.sections(*names[1..-1])
80
81
  end
81
82
  end
82
83
 
@@ -87,10 +88,10 @@ module Infoboxer
87
88
  return res if headings.empty?
88
89
  level = headings.first.level
89
90
 
90
- children.
91
- chunk{|n| n.matches?(Tree::Heading, level: level)}.
92
- drop_while{|is_heading, nodes| !is_heading}.
93
- each do |is_heading, nodes|
91
+ children
92
+ .chunk { |n| n.matches?(Tree::Heading, level: level) }
93
+ .drop_while { |is_heading, _nodes| !is_heading }
94
+ .each do |is_heading, nodes|
94
95
  if is_heading
95
96
  nodes.each do |node|
96
97
  res << Section.new(node)
@@ -115,18 +116,19 @@ module Infoboxer
115
116
  # @return {Tree::Nodes<Section>}
116
117
  def in_sections
117
118
  main_node = parent.is_a?(Tree::Document) ? self : lookup_parents[-2]
118
-
119
- heading = if main_node.is_a?(Tree::Heading)
120
- main_node.lookup_prev_siblings(Tree::Heading, level: main_node.level - 1).last
121
- else
122
- main_node.lookup_prev_siblings(Tree::Heading).last
123
- end
119
+
120
+ heading =
121
+ if main_node.is_a?(Tree::Heading)
122
+ main_node.lookup_prev_siblings(Tree::Heading, level: main_node.level - 1).last
123
+ else
124
+ main_node.lookup_prev_siblings(Tree::Heading).last
125
+ end
124
126
  return Tree::Nodes[] unless heading
125
-
126
- section = Section.new(heading,
127
- heading.next_siblings.
128
- take_while{|n| !n.is_a?(Tree::Heading) || n.level < heading.level}
129
- )
127
+
128
+ body = heading.next_siblings
129
+ .take_while { |n| !n.is_a?(Tree::Heading) || n.level < heading.level }
130
+
131
+ section = Section.new(heading, body)
130
132
  Tree::Nodes[section, *heading.in_sections]
131
133
  end
132
134
  end
@@ -137,11 +139,11 @@ module Infoboxer
137
139
  module Nodes
138
140
  # @!method sections(*names)
139
141
  # @!method in_sections
140
-
141
- [:sections, :in_sections].each do |sym|
142
- define_method(sym){|*args|
143
- make_nodes map{|n| n.send(sym, *args)}
144
- }
142
+
143
+ %i[sections in_sections].each do |sym|
144
+ define_method(sym) do |*args|
145
+ make_nodes(map { |n| n.send(sym, *args) })
146
+ end
145
147
  end
146
148
  end
147
149
 
@@ -174,12 +176,6 @@ module Infoboxer
174
176
  end
175
177
 
176
178
  include Container
177
-
178
- private
179
-
180
- #def show_params
181
- #super(level: heading.level, heading: heading.text)
182
- #end
183
179
  end
184
180
  end
185
181
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+
2
3
  module Infoboxer
3
4
  module Navigation
4
5
  module Lookup
@@ -7,11 +8,11 @@ module Infoboxer
7
8
  # See {Lookup::Node Lookup::Node} for detailed explanation of available selectors.
8
9
  class Selector
9
10
  include ProcMe
10
-
11
+
11
12
  def initialize(*arg, &block)
12
13
  @arg = [arg, block].flatten.compact.map(&method(:sym_to_class))
13
14
  @arg.each do |a|
14
- a.reject!{|k, v| v.nil?} if a.is_a?(Hash)
15
+ a.reject! { |_k, v| v.nil? } if a.is_a?(Hash)
15
16
  end
16
17
  end
17
18
 
@@ -26,7 +27,7 @@ module Infoboxer
26
27
  end
27
28
 
28
29
  def matches?(node)
29
- @arg.all?{|a| arg_matches?(a, node)}
30
+ @arg.all? { |a| arg_matches?(a, node) }
30
31
  end
31
32
 
32
33
  private
@@ -44,9 +45,7 @@ module Infoboxer
44
45
  when Proc
45
46
  check.call(node)
46
47
  when Hash
47
- check.all?{|attr, value|
48
- node.respond_to?(attr) && value === node.send(attr)
49
- }
48
+ check.all? { |attr, value| node.respond_to?(attr) && value === node.send(attr) }
50
49
  when Symbol
51
50
  node.respond_to?(check) && node.send(check)
52
51
  else
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+
2
3
  module Infoboxer
3
4
  module Navigation
4
5
  # See {Shortcuts::Node Shortcuts::Node} for everything!
@@ -83,19 +84,19 @@ module Infoboxer
83
84
 
84
85
  # Returns true, if current node is **inside** bold.
85
86
  def bold?
86
- has_parent?(Tree::Bold)
87
+ parent?(Tree::Bold)
87
88
  end
88
89
 
89
90
  # Returns true, if current node is **inside** italic.
90
91
  def italic?
91
- has_parent?(Tree::Italic)
92
+ parent?(Tree::Italic)
92
93
  end
93
94
 
94
95
  # Returns true, if current node is **inside** heading.
95
96
  #
96
97
  # @param level optional concrete level to check
97
98
  def heading?(level = nil)
98
- has_parent?(Tree::Heading, level: level)
99
+ parent?(Tree::Heading, level: level)
99
100
  end
100
101
 
101
102
  # Returns all infoboxes inside current node.
@@ -129,12 +130,12 @@ module Infoboxer
129
130
  private
130
131
 
131
132
  def ensure_traits
132
- ensure_page.traits or fail("No site traits found")
133
+ ensure_page.traits or fail('No site traits found')
133
134
  end
134
135
 
135
136
  def ensure_page
136
137
  (is_a?(MediaWiki::Page) ? self : lookup_parents(MediaWiki::Page).first) or
137
- fail("Node is not inside Page, maybe parsed from text?")
138
+ fail('Node is not inside Page, maybe parsed from text?')
138
139
  end
139
140
  end
140
141
 
@@ -154,12 +155,12 @@ module Infoboxer
154
155
  # @!method infoboxes(*selectors, &block)
155
156
  # @!method categories
156
157
 
157
- [:wikilinks, :headings, :paragraphs, :external_links, :images,
158
- :templates, :tables, :lists, :infoboxes, :infobox, :categories].
159
- each do |m|
160
- define_method(m){|*args|
161
- make_nodes map{|n| n.send(m, *args)}
162
- }
158
+ %i[wikilinks headings paragraphs external_links images
159
+ templates tables lists infoboxes infobox categories]
160
+ .each do |m|
161
+ define_method(m) do |*args|
162
+ make_nodes(map { |n| n.send(m, *args) })
163
+ end
163
164
  end
164
165
  end
165
166
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+
2
3
  module Infoboxer
3
4
  # Navigation is one of the things Infoboxer is proud about. It tries
4
5
  # to be logical, unobtrusive and compact.
@@ -64,7 +65,7 @@ module Infoboxer
64
65
  %w[lookup shortcuts sections].each do |nav|
65
66
  require_relative "navigation/#{nav}"
66
67
  end
67
-
68
+
68
69
  class Tree::Node
69
70
  include Navigation::Lookup::Node
70
71
  include Navigation::Shortcuts::Node
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+
2
3
  require 'strscan'
3
4
 
4
5
  module Infoboxer
@@ -8,9 +9,9 @@ module Infoboxer
8
9
  attr_reader :traits
9
10
 
10
11
  def initialize(text, traits = nil)
11
- @lines = text.
12
- gsub(/<!--.+?-->/m, ''). # FIXME: will also kill comments inside <nowiki> tag
13
- split(/[\r\n]/)
12
+ @lines = text
13
+ .gsub(/<!--.+?-->/m, '') # FIXME: will also kill comments inside <nowiki> tag
14
+ .split(/[\r\n]/)
14
15
  @lineno = -1
15
16
  @traits = traits || MediaWiki::Traits.default
16
17
  @scanner = StringScanner.new('')
@@ -82,7 +83,7 @@ module Infoboxer
82
83
 
83
84
  def scan_until(re, leave_pattern = false)
84
85
  guard_eof!
85
-
86
+
86
87
  res = _scan_until(re)
87
88
  res[matched] = '' if res && !leave_pattern
88
89
  res
@@ -102,14 +103,14 @@ module Infoboxer
102
103
  # not using StringScanner#check, as it will change #matched value
103
104
  eol? ||
104
105
  (
105
- (current =~ %r[^(</ref>|}})] || @inline_eol_sign && current =~ @inline_eol_sign) &&
106
- (!exclude || $1 !~ exclude)
106
+ (current =~ %r[^(</ref>|}})] || @inline_eol_sign && current =~ @inline_eol_sign) &&
107
+ (!exclude || Regexp.last_match(1) !~ exclude)
107
108
  ) # FIXME: ugly, but no idea of prettier solution
108
109
  end
109
110
 
110
111
  def scan_continued_until(re, leave_pattern = false)
111
112
  res = ''
112
-
113
+
113
114
  loop do
114
115
  chunk = _scan_until(re)
115
116
  case matched
@@ -122,7 +123,7 @@ module Infoboxer
122
123
  eof? && fail!("Unfinished scan: #{re} not found")
123
124
  end
124
125
  end
125
-
126
+
126
127
  res[/#{re}\Z/] = '' unless leave_pattern
127
128
  res
128
129
  end
@@ -156,23 +157,21 @@ module Infoboxer
156
157
  end
157
158
 
158
159
  def guard_eof!
159
- #eof? and fail!("End of input reached")
160
- @scanner or fail!("End of input reached")
160
+ @scanner or fail!('End of input reached')
161
161
  end
162
162
 
163
163
  def shift(amount)
164
164
  @lineno += amount
165
165
  current = @lines[lineno]
166
- @next_lines = @lines[(lineno+1)..-1]
166
+ @next_lines = @lines[(lineno + 1)..-1]
167
167
  if current
168
168
  @scanner.string = current
169
169
  @rest = current
170
- @matched = nil
171
170
  else
172
171
  @scanner = nil
173
172
  @rest = nil
174
- @matched = nil
175
173
  end
174
+ @matched = nil
176
175
  end
177
176
  end
178
177
  end
@@ -1,18 +1,19 @@
1
1
  # encoding: utf-8
2
+
2
3
  module Infoboxer
3
4
  class Parser
4
5
  module HTML
5
6
  include Tree
6
-
7
+
7
8
  def html
8
9
  case
9
- when @context.check(/\/[a-z]+>/)
10
+ when @context.check(%r{/[a-z]+>})
10
11
  html_closing_tag
11
12
  when @context.check(/br\s*>/)
12
13
  html_br
13
14
  when @context.check(%r{[a-z]+[^/>]*/>})
14
15
  html_auto_closing_tag
15
- when @context.check(/[a-z]+[^>\/]*>/)
16
+ when @context.check(%r{[a-z]+[^>/]*>})
16
17
  html_opening_tag
17
18
  else
18
19
  # not an HTML tag at all!
@@ -21,7 +22,7 @@ module Infoboxer
21
22
  end
22
23
 
23
24
  def html_closing_tag
24
- @context.skip(/\//)
25
+ @context.skip(%r{/})
25
26
  tag = @context.scan(/[a-z]+/)
26
27
  @context.skip(/>/)
27
28
  HTMLClosingTag.new(tag)
@@ -43,8 +44,8 @@ module Infoboxer
43
44
  tag = @context.scan(/[a-z]+/)
44
45
  attrs = @context.scan(/[^>]+/)
45
46
  @context.skip(/>/)
46
- contents = short_inline(/<\/#{tag}>/)
47
- if @context.matched =~ /<\/#{tag}>/
47
+ contents = short_inline(%r{</#{tag}>})
48
+ if @context.matched =~ %r{</#{tag}>}
48
49
  HTMLTag.new(tag, parse_params(attrs), contents)
49
50
  else
50
51
  [
@@ -1,19 +1,16 @@
1
1
  # encoding: utf-8
2
+
2
3
  module Infoboxer
3
4
  class Parser
4
5
  module Image
5
6
  include Tree
6
-
7
+
7
8
  def image
8
9
  @context.skip(re.file_namespace) or
9
10
  @context.fail!("Something went wrong: it's not image?")
10
11
 
11
12
  path = @context.scan_until(/\||\]\]/)
12
- attrs = if @context.matched == '|'
13
- image_attrs
14
- else
15
- {}
16
- end
13
+ attrs = @context.matched == '|' ? image_attrs : {}
17
14
  Tree::Image.new(path, attrs)
18
15
  end
19
16
 
@@ -25,32 +22,31 @@ module Infoboxer
25
22
  break if @context.matched == ']]'
26
23
  end
27
24
 
28
- nodes.map(&method(:image_attr)).
29
- inject(&:merge).
30
- reject{|k, v| v.nil? || v.empty?}
25
+ nodes.map(&method(:image_attr))
26
+ .inject(&:merge)
27
+ .reject { |_k, v| v.nil? || v.empty? }
31
28
  end
32
29
 
33
30
  def image_attr(nodes)
34
- if nodes.count == 1 && nodes.first.is_a?(Text)
35
- case (str = nodes.first.text)
36
- when /^(thumb)(?:nail)?$/, /^(frame)(?:d)?$/
37
- {type: $1}
38
- when 'frameless'
39
- {type: str}
40
- when 'border'
41
- {border: str}
42
- when /^(baseline|middle|sub|super|text-top|text-bottom|top|bottom)$/
43
- {alignment: str}
44
- when /^(\d*)(?:x(\d+))?px$/
45
- {width: $1, height: $2}
46
- when /^link=(.*)$/i
47
- {link: $1}
48
- when /^alt=(.*)$/i
49
- {alt: $1}
50
- else # text-only caption
51
- {caption: ImageCaption.new(nodes)}
52
- end
53
- else # it's caption, and can have inline markup!
31
+ # it's caption, and can have inline markup!
32
+ return {caption: ImageCaption.new(nodes)} unless nodes.count == 1 && nodes.first.is_a?(Text)
33
+
34
+ case (str = nodes.first.text)
35
+ when /^(thumb)(?:nail)?$/, /^(frame)(?:d)?$/
36
+ {type: Regexp.last_match(1)}
37
+ when 'frameless'
38
+ {type: str}
39
+ when 'border'
40
+ {border: str}
41
+ when /^(baseline|middle|sub|super|text-top|text-bottom|top|bottom)$/
42
+ {alignment: str}
43
+ when /^(\d*)(?:x(\d+))?px$/
44
+ {width: Regexp.last_match(1), height: Regexp.last_match(2)}
45
+ when /^link=(.*)$/i
46
+ {link: Regexp.last_match(1)}
47
+ when /^alt=(.*)$/i
48
+ {alt: Regexp.last_match(1)}
49
+ else # text-only caption
54
50
  {caption: ImageCaption.new(nodes)}
55
51
  end
56
52
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+
2
3
  module Infoboxer
3
4
  class Parser
4
5
  module Inline
@@ -33,13 +34,14 @@ module Infoboxer
33
34
  nodes = Nodes[]
34
35
  guarded_loop do
35
36
  # FIXME: quick and UGLY IS HELL JUST TRYING TO MAKE THE SHIT WORK
36
- if @context.inline_eol_sign == /^\]/
37
- chunk = @context.scan_until(re.short_inline_until_cache_brackets[until_pattern])
38
- elsif @context.inline_eol_sign == /^\]\]/
39
- chunk = @context.scan_until(re.short_inline_until_cache_brackets2[until_pattern])
40
- else
41
- chunk = @context.scan_until(re.short_inline_until_cache[until_pattern])
42
- end
37
+ chunk =
38
+ if @context.inline_eol_sign == /^\]/
39
+ @context.scan_until(re.short_inline_until_cache_brackets[until_pattern])
40
+ elsif @context.inline_eol_sign == /^\]\]/
41
+ @context.scan_until(re.short_inline_until_cache_brackets2[until_pattern])
42
+ else
43
+ @context.scan_until(re.short_inline_until_cache[until_pattern])
44
+ end
43
45
  nodes << chunk
44
46
 
45
47
  break if @context.matched_inline?(until_pattern)
@@ -80,89 +82,90 @@ module Infoboxer
80
82
  end
81
83
 
82
84
  private
83
- def inline_formatting(match)
84
- case match
85
- when "'''''"
86
- BoldItalic.new(short_inline(/'''''/))
87
- when "'''"
88
- Bold.new(short_inline(/'''/))
89
- when "''"
90
- Italic.new(short_inline(/''/))
91
- when '[['
92
- if @context.check(re.file_namespace)
93
- image
94
- else
95
- wikilink
96
- end
97
- when /\[(.+)/
98
- external_link($1)
99
- when '{{'
100
- template
101
- when /<nowiki([^>]*)>/
102
- nowiki($1)
103
- when /<ref([^>]*)\/>/
104
- reference($1, true)
105
- when /<ref([^>]*)>/
106
- reference($1)
107
- when /<math>/
108
- math
109
- when '<'
110
- html || Text.new(match) # it was not HTML, just accidental <
85
+
86
+ def inline_formatting(match)
87
+ case match
88
+ when "'''''"
89
+ BoldItalic.new(short_inline(/'''''/))
90
+ when "'''"
91
+ Bold.new(short_inline(/'''/))
92
+ when "''"
93
+ Italic.new(short_inline(/''/))
94
+ when '[['
95
+ if @context.check(re.file_namespace)
96
+ image
111
97
  else
112
- match # FIXME: TEMP
98
+ wikilink
113
99
  end
100
+ when /\[(.+)/
101
+ external_link(Regexp.last_match(1))
102
+ when '{{'
103
+ template
104
+ when /<nowiki([^>]*)>/
105
+ nowiki(Regexp.last_match(1))
106
+ when %r{<ref([^>]*)/>}
107
+ reference(Regexp.last_match(1), true)
108
+ when /<ref([^>]*)>/
109
+ reference(Regexp.last_match(1))
110
+ when /<math>/
111
+ math
112
+ when '<'
113
+ html || Text.new(match) # it was not HTML, just accidental <
114
+ else
115
+ match # FIXME: TEMP
114
116
  end
117
+ end
115
118
 
116
- # http://en.wikipedia.org/wiki/Help:Link#Wikilinks
117
- # [[abc]]
118
- # [[a|b]]
119
- def wikilink
120
- link = @context.scan_continued_until(/\||\]\]/)
121
- if @context.matched == '|'
122
- @context.push_eol_sign(/^\]\]/)
123
- caption = inline(/\]\]/)
124
- @context.pop_eol_sign
125
- end
126
-
127
- Wikilink.new(link, caption)
119
+ # http://en.wikipedia.org/wiki/Help:Link#Wikilinks
120
+ # [[abc]]
121
+ # [[a|b]]
122
+ def wikilink
123
+ link = @context.scan_continued_until(/\||\]\]/)
124
+ if @context.matched == '|'
125
+ @context.push_eol_sign(/^\]\]/)
126
+ caption = inline(/\]\]/)
127
+ @context.pop_eol_sign
128
128
  end
129
129
 
130
- # http://en.wikipedia.org/wiki/Help:Link#External_links
131
- # [http://www.example.org]
132
- # [http://www.example.org link name]
133
- def external_link(protocol)
134
- link = @context.scan_continued_until(/\s+|\]/)
135
- if @context.matched =~ /\s+/
136
- @context.push_eol_sign(/^\]/)
137
- caption = short_inline(/\]/)
138
- @context.pop_eol_sign
139
- end
140
- ExternalLink.new(protocol + link, caption)
141
- end
130
+ Wikilink.new(link, caption)
131
+ end
142
132
 
143
- def reference(param_str, closed = false)
144
- children = closed ? Nodes[] : long_inline(/<\/ref>/)
145
- Ref.new(children, parse_params(param_str))
133
+ # http://en.wikipedia.org/wiki/Help:Link#External_links
134
+ # [http://www.example.org]
135
+ # [http://www.example.org link name]
136
+ def external_link(protocol)
137
+ link = @context.scan_continued_until(/\s+|\]/)
138
+ if @context.matched =~ /\s+/
139
+ @context.push_eol_sign(/^\]/)
140
+ caption = short_inline(/\]/)
141
+ @context.pop_eol_sign
146
142
  end
143
+ ExternalLink.new(protocol + link, caption)
144
+ end
147
145
 
148
- def math
149
- Math.new(@context.scan_continued_until(/<\/math>/))
150
- end
146
+ def reference(param_str, closed = false)
147
+ children = closed ? Nodes[] : long_inline(%r{</ref>})
148
+ Ref.new(children, parse_params(param_str))
149
+ end
151
150
 
152
- def nowiki(tag_rest)
153
- if tag_rest.end_with?('/')
154
- Text.new('')
155
- else
156
- Text.new(@context.scan_continued_until(/<\/nowiki>/))
157
- end
158
- end
151
+ def math
152
+ Math.new(@context.scan_continued_until(%r{</math>}))
159
153
  end
160
154
 
161
- require_relative 'image'
162
- require_relative 'html'
163
- require_relative 'template'
164
- include Infoboxer::Parser::Image
165
- include Infoboxer::Parser::HTML
166
- include Infoboxer::Parser::Template
155
+ def nowiki(tag_rest)
156
+ if tag_rest.end_with?('/')
157
+ Text.new('')
158
+ else
159
+ Text.new(@context.scan_continued_until(%r{</nowiki>}))
160
+ end
161
+ end
162
+ end
163
+
164
+ require_relative 'image'
165
+ require_relative 'html'
166
+ require_relative 'template'
167
+ include Infoboxer::Parser::Image
168
+ include Infoboxer::Parser::HTML
169
+ include Infoboxer::Parser::Template
167
170
  end
168
171
  end