ubbparser 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +8 -8
  2. data/lib/ubbparser.rb +212 -204
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YTRmMmJhM2U0ZDdhZDZjNDExM2JiODkxNTg2NTVmYWRkZTQzZDVkZg==
4
+ ODA4MjgzN2VjNDlhMGE4OWIzOWE0MTJhMGJkNzRkNzgzZmM3OTIwOQ==
5
5
  data.tar.gz: !binary |-
6
- YzJmZmZiNjAxNTYzMGNiNDY5ZDc5OTg5NzNiMWE1ZmM4YzU3MmQ5NA==
6
+ NWFmZjJlMjFmMjZkMDA2NTljMGVlYjJmYjZkNGMzMmUyYWNkMWZjMA==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- ODhjZWUyMjE0OGIyOTA5Nzk0NTgwZDliZmY5ZTJiOGVlZDNiZWU2MjVjM2U0
10
- MGI1MGEwOWY3MDJkMjk3N2ExZjlkNzUwMGM5MTk1YTBhNWExZmViNjAxNmQ5
11
- NDZiMzFhZGU1NjhlZmU3MGY0YmVlNDhkODYzZWQ0M2YwNjI3MGM=
9
+ NzI0OTZmMGEyZGIxNmE5Y2Y3ZTk0ZGQ2NjY1YTVhMTlkOGMzODhiYjNkNThj
10
+ ZTY0NjZhNWU5YjljNTc1MDhlOWY4Y2M2YmU4NWQ1NmQ2NGU4YjA2YTYxZmVl
11
+ YzlkOGI3ZTI3YWEwMzliYzE2OWJjNDg5NzExMDZkYmY1Zjg3OGM=
12
12
  data.tar.gz: !binary |-
13
- ODBhY2U4MjE3YjJmZjRiM2NmZDE0OGM1MmI3MTZjMmMyYWQ1ZTY2ZGU4NDhj
14
- MTY3ZDY1NzY0ODZjNjlmYjY2YTAzMThhMjZmYzI3ZGUzYzM0YjI4OWViMTUx
15
- NDA5YjFhOTJlZTIwMGYwMWJiNWI3OTllNzM1NGMwY2UzMDQxYmU=
13
+ NzFkZWU4OGI1OWFiZWNjMDZmMGUwODJmOWE2NDY1ODA1OWUxMGFmNDdlMGZm
14
+ YjVkMjE5ZGFjYmVlMzZjYjE1MjA0OGQyNzVkZTc2YjQyZDk2ODIxZTI1YWQx
15
+ NTdkMDA2Yzk5MmMzYjk1ZWUwYjRmNTlmYjgwYjRiM2U5ZDU2YmM=
data/lib/ubbparser.rb CHANGED
@@ -1,6 +1,6 @@
1
- require "strscan"
2
- require "securerandom"
3
- require "cgi"
1
+ require 'strscan'
2
+ require 'securerandom'
3
+ require 'cgi'
4
4
 
5
5
  # The UBBParser module converts UBB code into HTML. The parser is flexibel
6
6
  # and adding new ubb codes is as easy as writing methods.
@@ -24,6 +24,7 @@ require "cgi"
24
24
  # When defining new ubb codes with a method and the name contains a dash, replace the dash by an underscore.
25
25
  # I.e. the ubb code for img-left uses the method render_img_left.
26
26
 
27
+ #noinspection RubyUnusedLocalVariable RubyTooManyMethods
27
28
  module UBBParser
28
29
 
29
30
  # Mapping can be used to allow simplified use of files
@@ -33,27 +34,30 @@ module UBBParser
33
34
  @@file_url_convert_method = callback_method
34
35
  end
35
36
 
36
- # Converts a strings containing key-value-list into a hash. This function is mostly used by the parser itself.
37
- # Attributes are given to the render methods as a hash.
37
+ #noinspection RubyClassVariableUsageInspection
38
+ @@file_url_convert_method = nil
39
+
40
+ # Converts a strings containing key-value-list into a hash. This function is mostly used by the parser itself.
41
+ # Attributes are given to the render methods as a hash.
38
42
  def self.attrib_str_to_hash(attrib_str)
39
- result = {:original_attrib_str => attrib_str.gsub(/^=/, "")}
43
+ result = {:original_attrib_str => attrib_str.gsub(/^=/, '')}
40
44
 
41
- attrib_str.insert(0, "default") if (attrib_str[0] == "=")
42
- attrib_str.scan(/((\S*)=(\"[^\"]*\"|\'[^\']*\'|\S*))/) { | all, key, val |
43
- result[(key.gsub(/-/, "_").to_sym rescue key)] = val.gsub(/^[\"\']/, "").gsub(/[\"\']$/, "")
45
+ attrib_str.insert(0, 'default') if (attrib_str[0] == '=')
46
+ attrib_str.scan(/((\S*)=("[^"]*"|'[^']*'|\S*))/) { |_, key, val|
47
+ result[(key.gsub(/-/, '_').to_sym rescue key)] = val.gsub(/^["']/, '').gsub(/["']$/, '')
44
48
  }
45
49
  return result
46
50
  end
47
51
 
48
- # Converts a hash into a string with key-values. You can use one of the following options:
49
- # [:allowed_keys] An array of keys that are only allowed
50
- # [:denied_keys] An array of keys that are denied
51
- # ===Example:
52
- # UBBParser.hash_to_attrib_str({}, {:allowed_keys => [:class, :src, :width]})
52
+ # Converts a hash into a string with key-values. You can use one of the following options:
53
+ # [:allowed_keys] An array of keys that are only allowed
54
+ # [:denied_keys] An array of keys that are denied
55
+ # ===Example:
56
+ # UBBParser.hash_to_attrib_str({}, {:allowed_keys => [:class, :src, :width]})
53
57
  def self.hash_to_attrib_str(hash, options = {})
54
- hash.delete_if { | k, v | !options[:allowed_keys].include?(k) } if options[:allowed_keys].is_a?(Array)
55
- hash.delete_if { | k, v | options[:denied_keys].include?(k) } if options[:denied_keys].is_a?(Array)
56
- return hash.map { | k, v | v = v.to_s.gsub(/\\|'/) { |c| "\\#{c}" }; "#{k}='#{v}'" }.join(" ");
58
+ hash.delete_if { |k, _| !options[:allowed_keys].include?(k) } if options[:allowed_keys].is_a?(Array)
59
+ hash.delete_if { |k, _| options[:denied_keys].include?(k) } if options[:denied_keys].is_a?(Array)
60
+ return hash.map { |k, v| v = v.to_s.gsub(/\\|'/) { |c| "\\#{c}" }; "#{k}='#{v}'" }.join(' ')
57
61
  end
58
62
 
59
63
  # Parses the given text with ubb code into html. Use parse_options to specify a hash of options:
@@ -65,36 +69,36 @@ module UBBParser
65
69
  # {:class_code: "prettify linenums"} => <pre class='prettify linenums'>...</pre>
66
70
  #
67
71
  # When developing your own tags, you can also define your own parse_options.
68
- def self.parse(text, parse_options = {})
69
- result = ""
70
- scnr = StringScanner.new(text)
71
- parse_options.each { | k, v | v.to_s.gsub(/-/, "_").gsub(/[^\w]+/, "") if (k.to_s.start_with?("class_")); v }
72
- while (!scnr.eos?)
72
+ def self.parse(text, parse_options = {})
73
+ result = ''
74
+ scnr = StringScanner.new(text)
75
+ parse_options.each { |k, v| v.to_s.gsub(/-/, '_').gsub(/[^\w]+/, '') if (k.to_s.start_with?('class_')); v }
76
+ until scnr.eos?
73
77
  untagged_text = CGI.escapeHTML(scnr.scan(/[^\[]*/))
74
78
 
75
79
  # convert newlines to breaks
76
- untagged_text.gsub!(/\n/, "<br />") if (!parse_options.include?(:convert_newlines) || parse_options[:convert_newlines])
80
+ untagged_text.gsub!(/\n/, '<br />') if (!parse_options.include?(:convert_newlines) || parse_options[:convert_newlines])
77
81
 
78
82
  # check for untagged url's
79
83
  uri_pattern = /(((http|https|ftp)\:\/\/)|(www))[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4}(:[a-zA-Z0-9]*)?\/?([a-zA-Z0-9\-\._\?\,\'\/\\\+&amp;%\$#\=~])*[^\.\,\)\(\s]*/
80
- untagged_text.gsub!(uri_pattern) { | url, | render_url(url, {}, parse_options) }
84
+ untagged_text.gsub!(uri_pattern) { |url,| render_url(url, {}, parse_options) }
81
85
 
82
86
  # check for untagged emails
83
87
  email_pattern = /(([a-zA-Z0-9_\-\.\+]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?))/
84
- untagged_text.gsub!(email_pattern) { | email, | render_email(email, {}, parse_options) }
88
+ untagged_text.gsub!(email_pattern) { |email,| render_email(email, {}, parse_options) }
85
89
 
86
90
  result << untagged_text
87
91
 
88
92
  # check for the upcoming ubb tag and process it (if valid tag)
89
- if (scnr.match?(/\[/))
93
+ if scnr.match?(/\[/)
90
94
  scnr.skip(/\[/)
91
95
  code = scnr.scan(/[\w-]*/)
92
- method_name = ("render_" + code.to_s.gsub(/-/, "_")).to_sym
96
+ method_name = ('render_' + code.to_s.gsub(/-/, '_')).to_sym
93
97
  if ((scnr.eos?) || (code == "") || (!self.respond_to?(method_name)))
94
- result << "[" + code
98
+ result << '[' + code
95
99
  else
96
100
  attributes = self.attrib_str_to_hash(scnr.scan(/[^\]]*/))
97
- scnr.skip(/\]/)
101
+ scnr.skip(/]/)
98
102
  inner_text = scnr.scan_until(/\[\/#{code}\]/)
99
103
  if inner_text.nil? #no closing tag found
100
104
  inner_text = scnr.rest
@@ -108,120 +112,124 @@ module UBBParser
108
112
  end
109
113
  end
110
114
  return result
111
- end
115
+ end
112
116
 
113
117
  # Returns true if the given value matches the given regular expression.
114
- # :category: Validation methods
115
- def self.matches_regexp?(value, regexp)
116
- return !value.to_s.match(regexp).nil?
117
- end
118
+ # :category: Validation methods
119
+ def self.matches_regexp?(value, regexp)
120
+ return !value.to_s.match(regexp).nil?
121
+ end
118
122
 
119
123
  # Returns true if the given value is a valid email address
120
- # :category: Validation methods
121
- def self.is_email?(value)
122
- return false if !value.is_a?(String)
123
- return self.matches_regexp?(value, /^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i)
124
- end
124
+ # :category: Validation methods
125
+ def self.is_email?(value)
126
+ return false unless value.is_a?(String)
127
+ return self.matches_regexp?(value, /^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i)
128
+ end
125
129
 
126
130
  # Returns true if the given value is a valid url
127
- # :category: Validation methods
128
- def self.is_url?(value)
129
- return self.matches_regexp?(value, /^(http|https)\:\/\/([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&amp;%\$\-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|localhost|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(\:[0-9]+)*(\/($|[a-zA-Z0-9\.\,\?\'\\\+&amp;%\$#\=~_\-]+))*$/)
130
- end
131
+ # :category: Validation methods
132
+ def self.is_url?(value)
133
+ return self.matches_regexp?(value, /^(http|https)\:\/\/([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&amp;%\$\-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]{1}|[0-9])|localhost|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9\.\,\?\'\\\+&amp;%\$#\=~_\-]+))*$/)
134
+ end
131
135
 
132
136
  # Converts the [anchor=myname]...[/anchor] tag into <a name='myname'>...</a>. Use the :class_anchor parse option to define html classes.
133
- # :category: Render methods
137
+ # :category: Render methods
134
138
  def self.render_anchor(inner_text, attributes = {}, parse_options = {})
135
- name = attributes[:default] || ""
136
- name.inner_text.gsub!(/\\|'/) { |c| "\\#{c}" }
137
- "<a name='#{name}' class='#{parse_options[:class_anchor].to_s.strip}'>#{self.parse(inner_text, parse_options)}</a>"
139
+ name = attributes[:default] || ''
140
+ inner_text.gsub!(/\\|'/) { |c| "\\#{c}" }
141
+ css_class = parse_options[:class_anchor] || 'ubb-anchor'
142
+ "<a name='#{name}' class='#{css_class}'>#{self.parse(inner_text, parse_options)}</a>"
138
143
  end
139
144
 
140
145
  # Converts the url in the inner_text into a webplayer, playing the audio file.
141
- # :category: Render methods
146
+ # :category: Render methods
142
147
  def self.render_audio(inner_text, attributes = {}, parse_options = {})
143
148
  # Not yet implemented
144
149
  end
145
150
 
146
- # Renders the inner_text bold (using <strong>).
147
- # :category: Render methods
151
+ # Renders the inner_text bold (using <strong>).
152
+ # :category: Render methods
148
153
  def self.render_b(inner_text, attributes = {}, parse_options = {})
149
- "<strong>#{self.parse(inner_text, parse_options)}</strong>"
154
+ "<strong>#{self.parse(inner_text, parse_options)}</strong>"
150
155
  end
151
156
 
152
- # Converts [br] into a <br />.
153
- # :category: Render methods
157
+ # Converts [br] into a <br />.
158
+ # :category: Render methods
154
159
  def self.render_br(inner_text, attributes = {}, parse_options = {})
155
- "<br />#{self.parse(inner_text, parse_options)}"
160
+ "<br />#{self.parse(inner_text, parse_options)}"
156
161
  end
157
162
 
158
163
  # Converts all lines in the inner_text as a bullet list. Each line represents one list item. Empty lines are ignored. Use the :class_bullet parse option to define html classes.
159
- # :category: Render methods
164
+ # :category: Render methods
160
165
  def self.render_bullets(inner_text, attributes = {}, parse_options = {})
161
166
  items = inner_text.split(/\n/)
162
- items.delete_if { | item | item.strip == "" }
163
- items.map! { | item | "<li>" + self.parse(item, parse_options) + "</li>" }
164
- return (items.empty?) ? "" : "<ul class='#{parse_options[:class_list].to_s.strip}'>" + items.join("") + "</ul>"
167
+ items.delete_if { |item| item.strip == '' }
168
+ items.map! { |item| '<li>' + self.parse(item, parse_options) + '</li>' }
169
+ css_class = parse_options[:class_list] || 'ubb-list'
170
+ return (items.empty?) ? '' : "<ul class='#{css_class}'>" + items.join('') + '</ul>'
165
171
  end
166
172
 
167
173
  # Centers the inner_text.
168
- # :category: Render methods
174
+ # :category: Render methods
169
175
  def self.render_center(inner_text, attributes = {}, parse_options = {})
170
- "<div style='text-align: center'>#{self.parse(inner_text, parse_options)}</div>"
176
+ "<div style='text-align: center'>#{self.parse(inner_text, parse_options)}</div>"
171
177
  end
172
178
 
173
179
  # Assures the inner_text is rendered below floating elements.
174
- # :category: Render methods
180
+ # :category: Render methods
175
181
  def self.render_clear(inner_text, attributes = {}, parse_options = {})
176
- "<div style='clear: both'></div>"
182
+ "<div style='clear: both'></div>"
177
183
  end
178
184
 
179
185
  # Changes the font color of the inner_text
180
- # :category: Render methods
186
+ # :category: Render methods
181
187
  def self.render_color(inner_text, attributes = {}, parse_options = {})
182
- "<div style='color:#{attributes[:default]}'>#{self.parse(inner_text, parse_options)}</div>"
188
+ "<div style='color:#{attributes[:default]}'>#{self.parse(inner_text, parse_options)}</div>"
183
189
  end
184
190
 
185
191
  # Ignores all the inner_text
186
- # :category: Render methods
192
+ # :category: Render methods
187
193
  def self.render_comment(inner_text, attributes = {}, parse_options = {})
188
- ""
194
+ ''
189
195
  end
190
196
 
191
197
  # Places the inner_text in a fixed font type. Also adds the classes prettify and linenums for styling purposes. Use the :class_code parse option to define html classes.
192
- # :category: Render methods
198
+ # :category: Render methods
193
199
  def self.render_code(inner_text, attributes = {}, parse_options = {})
194
- "<pre class='#{parse_options[:class_code].to_s.strip}'>#{inner_text}</pre>"
200
+ css_class = parse_options[:class_code] || 'ubb-code'
201
+ "<pre class='#{css_class}'>#{inner_text}</pre>"
195
202
  end
196
203
 
197
204
  # Renders csv-data into a html table. You can use the following attributes:
198
205
  # [:has_header] The first row should be rendered as header cells (using th).
199
- # :category: Render methods
206
+ # :category: Render methods
200
207
  def self.render_csv(inner_text, attributes = {}, parse_options = {})
201
- head_cells = body_cells = ""
202
- cell_tag = (attributes[:has_header] || false) ? "th" : "td"
208
+ head_cells = body_cells = ''
209
+ cell_tag = (attributes[:has_header]) ? 'th' : 'td'
203
210
  lines = inner_text.gsub(/(^\n|\n*$)/, '').split(/\n/)
204
211
  sep_char = (attributes[:sepchar] || ',')
205
212
  csv_pattern = /(\"[^\"]*\"|\'[^\']*\'|[^\n\r#{sep_char}]+)[#{sep_char}\n]?/
206
- lines.each { | line |
207
- cells = ""
208
- line.scan(csv_pattern) { | item |
213
+ lines.each { |line|
214
+ cells = ''
215
+ line.scan(csv_pattern) { |item|
209
216
  cells += "<#{cell_tag}>#{item[0]}</#{cell_tag}>"
210
217
  }
211
218
  cells = "<tr>#{cells}</tr>"
212
- if (cell_tag == "th")
219
+ if cell_tag == 'th'
213
220
  head_cells += cells
214
221
  else
215
222
  body_cells += cells
216
223
  end
217
- cell_tag = "td"
224
+ cell_tag = 'td'
218
225
  }
219
- result = ""
220
- if (!head_cells.empty? || !body_cells.empty?)
221
- result = "<table class='#{parse_options[:class_csv].to_s.strip}'>"
226
+ result = ''
227
+ if !head_cells.empty? || !body_cells.empty?
228
+ css_class = parse_options[:class_csv] || 'ubb-csv ubb-table'
229
+ result = "<table class='#{css_class}'>"
222
230
  result += "<thead>#{head_cells}</thead>" unless head_cells.empty?
223
231
  result += "<tbody>#{body_cells}</tbody>"
224
- result += "</table>"
232
+ result += '</table>'
225
233
  end
226
234
  return result
227
235
  end
@@ -229,232 +237,233 @@ module UBBParser
229
237
  # Renders an email address. There are two options to define:
230
238
  # [email]info@osingasoftware.nl[/email]
231
239
  # [email=info@osingasoftware.nl]Osinga Software[/email]
232
- # By default the email address is protected against spoofing, using JavaScript. Use the :class_email parse option to define html classes.
233
- # :category: Render methods
240
+ # By default the email address is protected against spoofing, using JavaScript. Use the email parse option to define html classes.
241
+ # :category: Render methods
234
242
  def self.render_email(inner_text, attributes = {}, parse_options = {})
235
- email = (attributes[:default] || inner_text)
236
- if (!self.is_email?(email))
237
- parse_options[:class_email] = parse_options[:class_email].to_s + " ubbparser-error"
238
- result = "<span class='#{parse_options[:class_email].to_s.strip}'>UBB error: invalid email address #{email}</span>"
239
- elsif ((parse_options.has_key?(:protect_email) && !parse_options[:protect_email]) || (attributes[:protected] == "false"))
240
- result = "<a href='mailto:#{email}' class='#{parse_options[:class_email].to_s.strip}'>#{inner_text}</a>"
241
- else
242
- username, domain = email.split("@", 2)
243
- id = "ubb-email-" + SecureRandom.hex(16)
244
-
245
- # Some generic javascript so every browser can parse this (instantly), regardless of used framework
246
- if (inner_text == email)
247
- title = "Protected email address"
248
- js_title = "email"
249
- else
243
+ email = (attributes[:default] || inner_text)
244
+ css_class = parse_options[:class_email] || 'ubb-email'
245
+ if !self.is_email?(email)
246
+ result = "<span class='#{css_class} ubbparser-error'>UBB error: invalid email address #{email}</span>"
247
+ elsif parse_options.has_key?(:protect_email) && !parse_options[:protect_email]
248
+ result = "<a href='mailto:#{email}' class='#{css_class}'>#{inner_text}</a>"
249
+ else
250
+ username, domain = email.split('@', 2)
251
+ id = 'ubb-email-' + SecureRandom.hex(16)
252
+
253
+ # Some generic javascript so every browser can parse this (instantly), regardless of used framework
254
+ if inner_text == email
255
+ title = 'Protected email address'
256
+ js_title = 'email'
257
+ else
250
258
  title = inner_text
251
259
  js_title = "\"#{inner_text}\""
252
260
  end
253
- script = "<script type='text/javascript'>obj=document.getElementById(\"#{id}\");email=obj.getAttribute(\"data-username\")+\"@\"+obj.getAttribute(\"data-domain\");obj.href=\"mailto:\"+email;obj.innerHTML=#{js_title}</script>";
254
- result = "<a id='#{id}' class='#{parse_options[:class_email].to_s.strip}' href='#' data-username='#{username}' data-domain='#{domain}'>#{title}</a>#{script}"
255
- end
256
- return result
261
+ script = "<script type='text/javascript'>obj=document.getElementById(\"#{id}\");email=obj.getAttribute(\"data-username\")+\"@\"+obj.getAttribute(\"data-domain\");obj.href=\"mailto:\"+email;obj.innerHTML=#{js_title}</script>"
262
+ result = "<a id='#{id}' class='#{css_class}' href='#' data-username='#{username}' data-domain='#{domain}'>#{title}</a>#{script}"
263
+ end
264
+
265
+ return result
257
266
  end
258
267
 
259
- # Renders the inner_text in the specified list. The list should contain CSS style font-families, i.e.:
260
- # [font=Arial, Helvetica, Sans]...[/font]
261
- # :category: Render methods
268
+ # Renders the inner_text in the specified list. The list should contain CSS style font-families, i.e.:
269
+ # [font=Arial, Helvetica, Sans]...[/font]
270
+ # :category: Render methods
262
271
  def self.render_font(inner_text, attributes = {}, parse_options = {})
263
272
  font = attributes[:original_attrib_str].gsub!(/\\|'/) { |c| "\\#{c}" }
264
273
  "<span style='font-family: #{font}'>#{self.parse(inner_text, parse_options)}</span>"
265
274
  end
266
275
 
267
- # Renders the inner_text in a H1 heading.
268
- # :category: Render methods
276
+ # Renders the inner_text in a H1 heading.
277
+ # :category: Render methods
269
278
  def self.render_h1(inner_text, attributes = {}, parse_options = {})
270
279
  "<h1>#{self.parse(inner_text, parse_options)}</h1>"
271
280
  end
272
281
 
273
- # Renders the inner_text in a H2 heading.
274
- # :category: Render methods
282
+ # Renders the inner_text in a H2 heading.
283
+ # :category: Render methods
275
284
  def self.render_h2(inner_text, attributes = {}, parse_options = {})
276
285
  "<h2>#{self.parse(inner_text, parse_options)}</h2>"
277
286
  end
278
287
 
279
- # Renders the inner_text in a H3 heading.
280
- # :category: Render methods
288
+ # Renders the inner_text in a H3 heading.
289
+ # :category: Render methods
281
290
  def self.render_h3(inner_text, attributes = {}, parse_options = {})
282
291
  "<h3>#{self.parse(inner_text, parse_options)}</h3>"
283
292
  end
284
293
 
285
- # Renders a horizontal ruler.
286
- # :category: Render methods
294
+ # Renders a horizontal ruler.
295
+ # :category: Render methods
287
296
  def self.render_hr(inner_text, attributes = {}, parse_options = {})
288
297
  "<hr />#{self.parse(inner_text, parse_options)}"
289
298
  end
290
299
 
291
- # Renders the inner_text in italic.
292
- # :category: Render methods
300
+ # Renders the inner_text in italic.
301
+ # :category: Render methods
293
302
  def self.render_i(inner_text, attributes = {}, parse_options = {})
294
- "<em>#{self.parse(inner_text, parse_options)}</em>"
303
+ "<em>#{self.parse(inner_text, parse_options)}</em>"
295
304
  end
296
305
 
297
- # Renders an iframe. Use the inner_text as source. Use the :class_iframe parse option to define html classes.
298
- # :category: Render methods
306
+ # Renders an iframe. Use the inner_text as source. Use the :class_iframe parse option to define html classes.
307
+ # :category: Render methods
299
308
  def self.render_iframe(inner_text, attributes = {}, parse_options = {})
300
- src = inner_text
301
- src = "http://" + src if (src.match(/^www\./))
309
+ src = inner_text
310
+ src = 'http://' + src if (src.match(/^www\./))
302
311
  src.gsub!(/\\|'/) { |c| "\\#{c}" }
303
- attributes[:src] = inner_text
304
- attributes[:class] = (attributes[:class].to_s + " " + parse_options[:class_iframe].to_s).strip if ((!attributes.has_key?(:skip_class)) || !attributes[:skip_class])
305
- attrib_str = self.hash_to_attrib_str(attributes, :allowed_keys => [:src, :class, :frameborder, :marginwidth, :marginheight, :width, :height])
306
- return "<iframe #{attrib_str}></iframe>"
312
+ attributes[:src] = inner_text
313
+ attributes[:class] = attributes[:class] || parse_options[:class_iframe] || 'ubb-iframe'
314
+ attrib_str = self.hash_to_attrib_str(attributes, :allowed_keys => [:src, :class, :frameborder, :marginwidth, :marginheight, :width, :height])
315
+ return "<iframe #{attrib_str}></iframe>"
307
316
  end
308
317
 
309
- # Doesn't render the ubb code in the inner_text. It does strip all html-tags from the inner_text
310
- # :category: Render methods
318
+ # Doesn't render the ubb code in the inner_text. It does strip all html-tags from the inner_text
319
+ # :category: Render methods
311
320
  def self.render_ignore(inner_text, attributes = {}, parse_options = {})
312
321
  inner_text
313
322
  end
314
323
 
315
- # Renders an image. Use the :class_img parse option to define html classes.
316
- # :category: Render methods
317
- #noinspection RubyClassVariableUsageInspection
324
+ # Renders an image. Use the :class_img parse option to define html classes.
325
+ # :category: Render methods
326
+ #noinspection RubyClassVariableUsageInspection
318
327
  def self.render_img(inner_text, attributes = {}, parse_options = {})
319
328
  url = inner_text
320
329
  url = @@file_url_convert_method.call(url) unless @@file_url_convert_method.nil?
321
330
  attributes[:src] = url.gsub(/\\|'/) { |c| "\\#{c}" }
322
- attributes[:alt] ||= ""
323
- attributes[:class] = parse_options[:class_img] if ((!attributes.has_key?(:skip_class)) || !attributes[:skip_class])
331
+ attributes[:alt] ||= ''
332
+
333
+ attributes[:class] = attributes[:class] || parse_options[:class] || 'ubb-img'
324
334
  attrib_str = self.hash_to_attrib_str(attributes, :allowed_keys => [:src, :alt, :styles, :class])
325
335
  return "<img #{attrib_str} />"
326
336
  end
327
337
 
328
- # Renders an image, floated on the left side of the text frame. Use the :class_img_left parse option to define html classes.
329
- # :category: Render methods
338
+ # Renders an image, floated on the left side of the text frame. Use the :class_img_left parse option to define html classes.
339
+ # :category: Render methods
330
340
  def self.render_img_left(inner_text, attributes = {}, parse_options = {})
331
- attributes[:styles] = "float: left; margin: 0px 10px 10px 0px"
332
- attributes[:class] += " " + parse_options[:class_img_left]
333
- attributes[:skip_class] = true
341
+ attributes[:styles] = 'float: left; margin: 0px 10px 10px 0px'
342
+ attributes[:class] = parse_options[:class_img_left] || 'ubb-img-left'
334
343
  render_img(inner_text, attributes, parse_options)
335
344
  end
336
345
 
337
- # Renders an image, floated on the right side of the text frame. Use the :class_img_right parse option to define html classes.
338
- # :category: Render methods
346
+ # Renders an image, floated on the right side of the text frame. Use the :class_img_right parse option to define html classes.
347
+ # :category: Render methods
339
348
  def self.render_img_right(inner_text, attributes = {}, parse_options = {})
340
- attributes[:styles] = "float: left; margin: 0px 0px 10px 10px"
341
- attributes[:class] += " " + parse_options[:class_img_right]
342
- attributes[:skip_class] = true
349
+ attributes[:styles] = 'float: left; margin: 0px 0px 10px 10px'
350
+ attributes[:class] = parse_options[:class_img_right] || 'ubb-img-right'
343
351
  render_img(inner_text, attributes, parse_options)
344
352
  end
345
353
 
346
- # Renders the inner_text with a justified text alignment.
347
- # :category: Render methods
354
+ # Renders the inner_text with a justified text alignment.
355
+ # :category: Render methods
348
356
  def self.render_justify(inner_text, attributes = {}, parse_options = {})
349
357
  "<div style='text-align: justify'>#{self.parse(inner_text, parse_options)}</div>"
350
358
  end
351
359
 
352
- # Renders the inner_text with a left text alignment.
353
- # :category: Render methods
360
+ # Renders the inner_text with a left text alignment.
361
+ # :category: Render methods
354
362
  def self.render_left(inner_text, attributes = {}, parse_options = {})
355
363
  "<div style='text-align: left'>#{self.parse(inner_text, parse_options)}</div>"
356
364
  end
357
365
 
358
- # Renders the inner_text as an ordered list. Each line represents a list item. Use the :class_list parse option to define html classes.
359
- # :category: Render methods
366
+ # Renders the inner_text as an ordered list. Each line represents a list item. Use the :class_list parse option to define html classes.
367
+ # :category: Render methods
360
368
  def self.render_list(inner_text, attributes = {}, parse_options = {})
361
369
  items = inner_text.split(/\n/)
362
- items.delete_if { | item | item.strip == "" }
363
- items.map! { | item | "<li>" + self.parse(item, parse_options) + "</li>" }
364
- return (items.empty?) ? "" : "<ol class='#{parse_options[:class_list].to_s.strip}'>" + items.join("") + "</ol>"
370
+ items.delete_if { |item| item.strip == '' }
371
+ items.map! { |item| '<li>' + self.parse(item, parse_options) + '</li>' }
372
+ return (items.empty?) ? '' : "<ol class='#{parse_options[:class_list].to_s.strip}'>" + items.join('') + '</ol>'
365
373
  end
366
374
 
367
- # Renders the inner_text as a paragraph. Use the :class_p parse option to define html classes.
368
- # :category: Render methods
375
+ # Renders the inner_text as a paragraph. Use the :class_p parse option to define html classes.
376
+ # :category: Render methods
369
377
  def self.render_p(inner_text, attributes = {}, parse_options = {})
370
- "<p class='#{parse_options[:class_p].to_s.strip}'>#{self.parse(inner_text, parse_options)}</p>"
378
+ css_class = parse_options[:class_p] || 'ubb-p'
379
+ "<p class='#{css_class}'>#{self.parse(inner_text, parse_options)}</p>"
371
380
  end
372
381
 
373
- # Renders the inner_text with a right text alignment.
374
- # :category: Render methods
382
+ # Renders the inner_text with a right text alignment.
383
+ # :category: Render methods
375
384
  def self.render_right(inner_text, attributes = {}, parse_options = {})
376
385
  "<div style='text-align: right'>#{self.parse(inner_text, parse_options)}</div>"
377
386
  end
378
387
 
379
- # Renders the inner_text in a <div> block with inline CSS styles, i.e.:
380
- # [style color: red; border: 1px solid green]...[/style]
381
- # :category: Render methods
388
+ # Renders the inner_text in a <div> block with inline CSS styles, i.e.:
389
+ # [style color: red; border: 1px solid green]...[/style]
390
+ # :category: Render methods
382
391
  def self.render_style(inner_text, attributes = {}, parse_options = {})
383
- styles = attributes[:original_attrib_str].gsub(/'/, "\'")
392
+ styles = attributes[:original_attrib_str].gsub(/'/, "\\'")
384
393
  "<div style='#{styles}'>#{self.parse(inner_text, parse_options)}</div>"
385
394
  end
386
395
 
387
- # Converts the [table] to a <table>. Always use this in combination with [tr] and [td] or [th]. Use the :class_table parse option to define html classes.
388
- # :category: Render methods
396
+ # Converts the [table] to a <table>. Always use this in combination with [tr] and [td] or [th]. Use the :class_table parse option to define html classes.
397
+ # :category: Render methods
389
398
  def self.render_table(inner_text, attributes = {}, parse_options = {})
390
- "<table class='#{parse_options[:class_table].to_s.strip}'>#{self.parse(inner_text.gsub(/(^\n+)|(\n+$)/, ""), parse_options)}</table>"
399
+ css_class = parse_options[:class_table] || 'ubb-table'
400
+ "<table class='#{css_class}'>#{self.parse(inner_text.gsub(/(^\n+)|(\n+$)/, ''), parse_options)}</table>"
391
401
  end
392
402
 
393
- # Converts the [td] to a <td>. Always use this in combination with [table] and [tr].
394
- # :category: Render methods
403
+ # Converts the [td] to a <td>. Always use this in combination with [table] and [tr].
404
+ # :category: Render methods
395
405
  def self.render_td(inner_text, attributes = {}, parse_options = {})
396
406
  "<td>#{self.parse(inner_text, parse_options)}</td>"
397
407
  end
398
408
 
399
- # Converts the [th] to a <th>. Always use this in combination with [table] and [tr].
400
- # :category: Render methods
409
+ # Converts the [th] to a <th>. Always use this in combination with [table] and [tr].
410
+ # :category: Render methods
401
411
  def self.render_th(inner_text, attributes = {}, parse_options = {})
402
-
403
412
  "<th>#{self.parse(inner_text, parse_options)}</th>"
404
413
  end
405
414
 
406
- # Converts the [tr] to a <tr>. Always use this in combination with [table] and [td] or [th].
407
- # :category: Render methods
415
+ # Converts the [tr] to a <tr>. Always use this in combination with [table] and [td] or [th].
416
+ # :category: Render methods
408
417
  def self.render_tr(inner_text, attributes = {}, parse_options = {})
409
- "<tr>#{self.parse(inner_text.gsub(/(^\n+)|(\n+$)/, ""), parse_options)}</tr>"
418
+ "<tr>#{self.parse(inner_text.gsub(/(^\n+)|(\n+$)/, ''), parse_options)}</tr>"
410
419
  end
411
420
 
412
- # Renders the inner_text underline. Use this with caution, since underline text is associated with hyperlinks.
413
- # :category: Render methods
421
+ # Renders the inner_text underline. Use this with caution, since underline text is associated with hyperlinks.
422
+ # :category: Render methods
414
423
  def self.render_u(inner_text, attributes = {}, parse_options = {})
415
- "<u>#{self.parse(inner_text, parse_options)}</u>"
424
+ "<u>#{self.parse(inner_text, parse_options)}</u>"
416
425
  end
417
426
 
418
- # Renders a web addres. There are two options to define:
419
- # [url]www.osingasoftware.nl[/ur]
420
- # [url=www.osingasoftware.nl]Osinga Software[/url]
421
- # Use the :class_url parse option to define html classes.
422
- # :category: Render methods
427
+ # Renders a web addres. There are two options to define:
428
+ # [url]www.osingasoftware.nl[/ur]
429
+ # [url=www.osingasoftware.nl]Osinga Software[/url]
430
+ # Use the :class_url parse option to define html classes.
431
+ # :category: Render methods
432
+ #noinspection RubyClassVariableUsageInspection
423
433
  def self.render_url(inner_text, attributes = {}, parse_options = {})
424
- url = (attributes[:default] || inner_text)
425
- url = "http://" + url if (url.match(/^www\./))
426
- url = @@file_url_convert_method.call(url) unless @@file_url_convert_method.nil?
427
- url.to_s.gsub!(/\\|'/) { |c| "\\#{c}" }
428
- return "<a href='#{url}' class='#{parse_options[:class_url].to_s.strip}'>#{inner_text}</a>"
434
+ url = (attributes[:default] || inner_text)
435
+ url = 'http://' + url if (url.match(/^www\./))
436
+ url = @@file_url_convert_method.call(url) unless @@file_url_convert_method.nil?
437
+ url.to_s.gsub!(/\\|'/) { |c| "\\#{c}" }
438
+ css_class = parse_options[:class_url] || 'ubb-url'
439
+ return "<a href='#{url}' class='#{css_class}'>#{inner_text}</a>"
429
440
  end
430
441
 
431
- # Renders a YouTube video using the video id or url in the inner_text.
432
- # :category: Render methods
442
+ # Renders a YouTube video using the video id or url in the inner_text.
443
+ # :category: Render methods
433
444
  def self.render_vimeo(inner_text, attributes = {}, parse_options = {})
434
445
  attributes[:width] ||= 500
435
446
  attributes[:height] ||= 281
436
- attributes[:class] = parse_options[:class_vimeo]
437
- attributes[:skip_class] = true
438
- videoid = (inner_text.scan(/[0-9]{5,}/).to_a)[0].to_s
439
- src = "http://player.vimeo.com/video/#{videoid}"
447
+ attributes[:class] = parse_options[:class_vimeo] || 'ubb-vimeo'
448
+ video_id = (inner_text.scan(/[0-9]{5,}/).to_a)[0].to_s
449
+ src = "http://player.vimeo.com/video/#{video_id}"
440
450
  return render_iframe(src, attributes, parse_options)
441
451
  end
442
452
 
443
- # Renders a YouTube video using the video id or url in the inner_text.
444
- # :category: Render methods
453
+ # Renders a YouTube video using the video id or url in the inner_text.
454
+ # :category: Render methods
445
455
  def self.render_youtube(inner_text, attributes = {}, parse_options = {})
446
456
  attributes[:width] ||= 560
447
457
  attributes[:height] ||= 315
448
- attributes[:class] = parse_options[:class_youtube]
449
- attributes[:skip_class] = true
458
+ attributes[:class] = parse_options[:class_youtube] || 'ubb-youtube'
450
459
  videoid = !inner_text.match(/^[^\?\&]$/).nil? ? inner_text : inner_text.scan(/(\?|&)v=([^\&]*)/)[0][1]
451
460
  src = "http://www.youtube.com/embed/#{videoid}"
452
461
  return render_iframe(src, attributes, parse_options)
453
462
  end
454
463
 
455
- # Renders a Youtube, Vimeo or Zideo video using the video id or url in the inner_text.
456
- # It automatically determines which video renderer should be used based on the given url.
457
- # :category: Render methods
464
+ # Renders a Youtube, Vimeo or Zideo video using the video id or url in the inner_text.
465
+ # It automatically determines which video renderer should be used based on the given url.
466
+ # :category: Render methods
458
467
  def self.render_video(inner_text, attributes = {}, parse_options = {})
459
468
  attributes[:class] = "#{attributes[:class]} #{parse_options[:class_zideo]}"
460
469
  url = inner_text
@@ -462,22 +471,21 @@ module UBBParser
462
471
  return self.render_zideo(inner_text, attributes, parse_options)
463
472
  elsif (!url.match(/[0-9]{5,}/).nil?) || (!url.match(/vimeo/).nil?)
464
473
  return self.render_vimeo(inner_text, attributes, parse_options)
465
- elsif (!url.match(/youtu/).nil?) || (!url.match(/^[^\?\&]+{11}$/).nil?)
474
+ elsif (!url.match(/youtu/).nil?) || (!url.match(/^[^\?&]+\{11}$/).nil?)
466
475
  return self.render_youtube(inner_text, attributes, parse_options)
467
476
  else
468
- return "Unknown video"
477
+ return 'Unknown video'
469
478
  end
470
479
  end
471
480
 
472
- # Renders a zideo.nl video using the video id or url in the inner_text.
473
- # :category: Render methods
481
+ # Renders a zideo.nl video using the video id or url in the inner_text.
482
+ # :category: Render methods
474
483
  def self.render_zideo(inner_text, attributes = {}, parse_options = {})
475
484
  attributes[:width] ||= 480
476
- attributes[:height] ||= auto
477
- attributes[:class] += " " + parse_options[:class_zideo]
478
- attributes[:skip_class] = true
479
- videoid = !inner_text.match(/^\w+$/).nil? ? inner_text : (inner_text.scan(/playzideo\/(\w+)/).to_a)[1].to_s
480
- src = "http://www.zideo.nl/zideomediaplayer.php?" + inner_text
485
+ attributes[:height] ||= :auto
486
+ attributes[:class] = parse_options[:class_zideo] || 'ubb-zideo'
487
+ video_id = !inner_text.match(/^\w+$/).nil? ? inner_text : (inner_text.scan('/playzideo/(\w+)/').to_a)[1].to_s
488
+ src = 'http://www.zideo.nl/zideomediaplayer.php?' + video_id
481
489
  return render_iframe(src, attributes, parse_options)
482
490
  end
483
491
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ubbparser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taco Jan Osinga
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-14 00:00:00.000000000 Z
11
+ date: 2014-01-22 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A simple and flexibel ubb parser.
14
14
  email: info@osingasoftware.nl