Class: Ycode::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/ycode/base.rb

Constant Summary collapse

URL_PATTERN =
/((?:www\.|https?:\/\/)[^\/\s]+\.[a-z0-9]+(?:\/[^\s\[\]"'<>]+)?)/i

Instance Method Summary collapse

Constructor Details

#initializeBase

Returns a new instance of Base.



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/ycode/base.rb', line 7

def initialize
  global_string_scanner = WillScanString::StringScanner.new
  nested_string_scanner = WillScanString::StringScanner.new

  global_string_scanner.register_replacement (/(?:\^(\d)|\A)([\s\S]+?)(?=\Z|\^\d)/), ->(_, color_id, content) {
    %(<span class="color color#{color_id.to_i}">#{nested_string_scanner.replace(content)}</span>)
  }

  {
    /\!\@\#\$\%([\S\s]+?)\^\&\*\(\)/ => ->(_, content) { %(<code style="white-space: pre;">#{CGI.escapeHTML(content)}</code>) },
    /_(.+?)_/ => ->(_, content) { %(<strong>#{CGI.escapeHTML(content)}</strong>) },
    /([\s\S]*?)~~~~(?:(?:\r\n|\r|\n)\s*(.+?))?\s*(?:\r\n|\r|\n)([\s\S]+?)(?:\r\n|\r|\n)~~~~([\s\S]*?)/ => ->(_, prefix, quotee, content, postfix) {
      %(#{global_string_scanner.replace(prefix)}<blockquote>#{quotee.present? ? %(<span class="quoted">#{CGI.escapeHTML(quotee)}</span>) : ""}#{global_string_scanner.replace(content)}</blockquote>#{global_string_scanner.replace(postfix)})
    },
    "<" => "&lt;",
    ">" => "&gt;",
    "&" => "&amp;",
    /([\s\S]*?)\[rauw\]\s*([\s\S]*?)\s*\[\/rauw\]([\s\S]*?)/ => ->(_, prefix, content, postfix) {
      %(%s<div class="hide">%s</div>%s) % [global_string_scanner.replace(prefix), global_string_scanner.replace(content), global_string_scanner.replace(postfix)]
    },
    /(?:\r\n|\r|\n)/ => "<br>",
    Regexp.new("!#{URL_PATTERN.source}", Regexp::IGNORECASE) => ->(_, url) {
      url = "http://#{url}" if url.starts_with? "www"
      escaped_url = CGI.escapeHTML url
      %(<a href="%s" target="_blank" rel="nofollow">%s</a>) % [escaped_url, escaped_url]
    },
    Regexp.new("M#{URL_PATTERN.source}", Regexp::IGNORECASE) => ->(_, url) {
      url = "http://#{url}" if url.starts_with? "www"
      uri_data = URI.parse(url) rescue nil
      if uri_data.nil?
        escaped_url = CGI.escapeHTML url
        %(<a href="%s" target="_blank" rel="nofollow">%s</a>) % [escaped_url, escaped_url]
      else
        uri_query_params = uri_data.query.present? ? HashWithIndifferentAccess[CGI.parse(uri_data.query).map{|k,v|[k,v.first]}] : HashWithIndifferentAccess.new
        %(<embed src="http://www.youtube.com/v/%s&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="400" height="25"></embed>) % CGI.escape_html(uri_query_params[:v])
      end
    },
    URL_PATTERN => ->(_, url) {
      url = "http://#{url}" if url.starts_with? "www"
      uri_data = URI.parse(url) rescue nil
      uri_query_params = uri_data.present? && uri_data.query.present? ? HashWithIndifferentAccess[CGI.parse(uri_data.query).map{|k,v|[k,v.first]}] : HashWithIndifferentAccess.new
      if uri_data.present? && uri_data.host =~ /youtube\.[a-z]{1,3}$/i && uri_query_params[:v] =~ /[a-z0-9_-]{11}/i
        %(<embed src="http://www.youtube.com/v/%s&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="583" height="354"></embed>) % CGI.escape_html($~.to_s)
      elsif uri_data.present? && uri_data.host =~ /liveleak\.com/i && uri_query_params[:i].present?
        %(<embed src="http://www.liveleak.com/e/%s" type="application/x-shockwave-flash" allowfullscreen="true" wmode="transparent" width="450" height="370"></embed>) % CGI.escape_html(CGI.escape($~.to_s))
      elsif uri_data.present? && uri_data.host =~ /dailymotion\.com/i && uri_data.path =~ /^\/video\/([^\/]+)/
        %(<embed src="http://www.dailymotion.com/swf/%s" type="application/x-shockwave-flash"  width="448" height="357" allowfullscreen="true" allowscriptaccess="always"></embed>) % CGI.escape_html($1)
      elsif uri_data.present? && uri_data.path =~ /\.(?:jpe?g|png|gif)$/i
        %(<img src="%s">) % CGI.escapeHTML(url)
      else
        escaped_url = CGI.escapeHTML url
        %(<a href="%s" target="_blank" rel="nofollow">%s</a>) % [escaped_url, escaped_url]
      end
    }
  }.each do |k, v|
    global_string_scanner.register_replacement k, v
    nested_string_scanner.register_replacement k, v
  end

  @string_scanner = global_string_scanner
end

Instance Method Details

#parse_to_html(string) ⇒ Object



69
70
71
# File 'lib/ycode/base.rb', line 69

def parse_to_html( string )
  @string_scanner.replace string
end