Module: Card::Content::Chunk

Defined in:
lib/card/content/chunk.rb,
mod/core/chunk/uri.rb,
mod/core/chunk/link.rb,
mod/core/chunk/nest.rb,
mod/core/chunk/literal.rb,
mod/core/chunk/reference.rb,
mod/core/chunk/view_stub.rb,
mod/core/chunk/query_reference.rb

Overview

This wiki chunk matches arbitrary URIs, using patterns from the Ruby URI modules. It parses out a variety of fields that could be used by formats to format the links in various ways (shortening domain names, hiding email addresses) It matches email addresses and host.com.au domains without schemes (http://) but adds these on as required.

The heuristic used to match a URI is designed to err on the side of caution. That is, it is more likely to not autolink a URI than it is to accidently autolink something that is not a URI. The reason behind this is it is easier to force a URI link by prefixing 'http://' to it than it is to escape and incorrectly marked up non-URI.

I'm using a part of the ISO 3166-1 Standard for country name suffixes. The generic names are from www.bnoack.com/data/countrycode2.html)

Defined Under Namespace

Classes: Abstract, EmailURI, EscapedLiteral, HostURI, Link, Nest, QueryReference, Reference, URI, ViewStub

Constant Summary collapse

@@raw_list =
{}
@@prefix_regexp_by_list =
{}
@@prefix_map_by_chunkname =
{}
@@prefix_map_by_list =
Hash.new { |h, k| h[k] = {} }

Class Method Summary collapse

Class Method Details

.build_prefix_regexp(chunk_list_key) ⇒ Object



64
65
66
67
68
69
70
71
72
73
# File 'lib/card/content/chunk.rb', line 64

def build_prefix_regexp chunk_list_key
  validate_chunk_list_key chunk_list_key

  prefix_res =
    raw_list[chunk_list_key].map do |chunkname|
      chunk_class = const_get chunkname
      chunk_class.config[:prefix_re]
    end
  /(?:#{ prefix_res * '|' })/m
end

.find_class_by_prefix(prefix, chunk_list_key = :default) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/card/content/chunk.rb', line 46

def find_class_by_prefix prefix, chunk_list_key=:default
  validate_chunk_list_key chunk_list_key

  prefix_map = prefix_map_by_list[chunk_list_key]
  config = prefix_map[prefix[0, 1]] ||
           prefix_map[prefix[-1, 1]] ||
           prefix_map[:default]
  # prefix identified by first character, last character, or default.
  # a little ugly...

  config[:class]
end

.prefix_regexp(chunk_list_key) ⇒ Object



59
60
61
62
# File 'lib/card/content/chunk.rb', line 59

def prefix_regexp chunk_list_key
  prefix_regexp_by_list[chunk_list_key] ||=
    build_prefix_regexp chunk_list_key
end

.register_class(klass, hash) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/card/content/chunk.rb', line 22

def register_class klass, hash
  klass.config = hash.merge class: klass
  prefix_index = hash[:idx_char] || :default
  # ^ this is gross and needs to be moved out.

  klassname = klass.name.split("::").last.to_sym
  prefix_map_by_chunkname[klassname] = { prefix_index => klass.config }
  raw_list.each do |key, list|
    next unless list.include? klassname

    prefix_map_by_list[key].merge! prefix_map_by_chunkname[klassname]
  end
end

.register_list(key, list) ⇒ Object



36
37
38
39
40
41
42
43
44
# File 'lib/card/content/chunk.rb', line 36

def register_list key, list
  raw_list[key] = list
  prefix_map_by_list[key] =
    list.each_with_object({}) do |chunkname, h|
      next unless (p_map = prefix_map_by_chunkname[chunkname])

      h.merge! p_map
    end
end

.validate_chunk_list_key(chunk_list_key) ⇒ Object



75
76
77
78
79
# File 'lib/card/content/chunk.rb', line 75

def validate_chunk_list_key chunk_list_key
  unless raw_list.key? chunk_list_key
    raise ArgumentError, "invalid chunk list key: #{chunk_list_key}"
  end
end