card-mod-content 0.11.2 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 924c9165d4f2bd5dec0210aafa00f0bb13a5cbcfe0e46f07f1e8edc85ee3234b
4
- data.tar.gz: f89c4acfefe8254f96a8116d2408badfaf093de3385ed4ad4f3f6a99d7713296
3
+ metadata.gz: c70d983eed31e1e69a646f97bfd617e414f4fc58f4e12b2e78779f4518911869
4
+ data.tar.gz: 66fe32d82cd73cb8fbae02ef8e2bf568dad409d79f7430eddbce3d9be9836871
5
5
  SHA512:
6
- metadata.gz: 0dd2b2825eeba8508d9d1c0a5bacd0083ce448eff195c3b694bddd7aebbc86441695633ddba076823ce75e2be6916fadcce1e25bf43e9af85a4a2599bceed6b8
7
- data.tar.gz: c5de82f8b83c926609ea0f48cec180c02426808978124a89351e16621aacedfa1b5d00eefaf690fe1bcbe90460de056dbea2914fc752237f53f960c60929fb37
6
+ metadata.gz: 58e6df74fa73efe4804c8a178da5aa1aca3e53d426b858d1a234510956061d93e3f6eee5194ba8c355006bcc8583447d70ab258d0c354443aa480acc61f4e168
7
+ data.tar.gz: f912d472dcc0a6e6721f89045c94516510e1ceb47ffa65aacc74a25eb70b1bbef447f9999f19ac91d39cedfdc7044d29e0664c51ff3fca9d3026c178e2d3c96b
@@ -9,10 +9,10 @@ class Card
9
9
  # and within HTML tags.
10
10
  class EscapedLiteral < Abstract
11
11
  FULL_RE = { "[" => /\A\\\[\[[^\]]*\]\]/,
12
- "{" => /\A\\\{\{[^\}]*\}\}/ }.freeze
12
+ "{" => /\A\\\{\{[^}]*\}\}/ }.freeze
13
13
  Card::Content::Chunk.register_class self,
14
14
  prefix_re: '\\\\(?:\\[\\[|\\{\\{)',
15
- idx_char: '\\'
15
+ idx_char: "\\"
16
16
 
17
17
  def self.full_re prefix
18
18
  FULL_RE[prefix[1, 1]]
@@ -8,10 +8,10 @@ class Card
8
8
  # the escaping survives the markdown rendering.
9
9
  class KeepEscapedLiteral < Abstract
10
10
  FULL_RE = { "[" => /\A\\\[\[[^\]]*\]\]/,
11
- "{" => /\A\\\{\{[^\}]*\}\}/ }.freeze
11
+ "{" => /\A\\\{\{[^}]*\}\}/ }.freeze
12
12
  Card::Content::Chunk.register_class self,
13
13
  prefix_re: '\\\\(?:\\[\\[|\\{\\{)',
14
- idx_char: '\\'
14
+ idx_char: "\\"
15
15
 
16
16
  def self.full_re prefix
17
17
  FULL_RE[prefix[1, 1]]
@@ -1,26 +1,80 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
3
  # require File.expand_path("../reference", __FILE__)
4
- load File.expand_path("../reference.rb", __FILE__)
4
+ load File.expand_path("reference.rb", __dir__)
5
5
 
6
6
  class Card
7
7
  class Content
8
8
  module Chunk
9
- # extend ActiveSupport::Autoload
10
- # autoload :Reference , "reference"
11
-
12
- class Link < Card::Content::Chunk::Reference
9
+ class Link < Reference
13
10
  CODE = "L".freeze # L for "Link"
14
11
  attr_reader :link_text
15
- # Groups: $1, [$2]: [[$1]] or [[$1|$2]] or $3, $4: [$3][$4]
16
- Card::Content::Chunk.register_class self,
17
- prefix_re: '\\[\\[',
18
- full_re: /\A\[\[([^\]]+)\]\]/,
19
- idx_char: "["
12
+
13
+ Chunk.register_class self, prefix_re: '\\[\\[',
14
+ full_re: /\A\[\[([^\]]+)\]\]/,
15
+ idx_char: "["
16
+
20
17
  def reference_code
21
18
  CODE
22
19
  end
23
20
 
21
+ def process_chunk
22
+ @process_chunk ||= render_link
23
+ end
24
+
25
+ def inspect
26
+ "<##{self.class}:e[#{@explicit_link}]n[#{@name}]l[#{@link_text}]" \
27
+ "p[#{@process_chunk}] txt:#{@text}>"
28
+ end
29
+
30
+ # view options
31
+ def options
32
+ link_text ? { title: link_text } : {}
33
+ end
34
+
35
+ def replace_reference old_name, new_name
36
+ replace_name_reference old_name, new_name
37
+ replace_link_text old_name, new_name
38
+ link_text_syntax = "|#{@link_text}" if @link_text.present?
39
+ @text = "[[#{referee_name}#{link_text_syntax}]]"
40
+ end
41
+
42
+ def explicit_link?
43
+ @explicit_link
44
+ end
45
+
46
+ def render_link view: :link, explicit_link_opts: {}
47
+ @link_text = render_obj @link_text
48
+
49
+ if @explicit_link
50
+ render_explicit_link explicit_link_opts
51
+ elsif @name
52
+ render_name_link view
53
+ end
54
+ end
55
+
56
+ def link_target
57
+ if @explicit_link
58
+ render_obj @explicit_link
59
+ elsif @name
60
+ referee_name
61
+ end
62
+ end
63
+
64
+ private
65
+
66
+ def render_explicit_link explicit_link_opts
67
+ @explicit_link = render_obj @explicit_link
68
+ format.link_to_resource @explicit_link, @link_text, explicit_link_opts
69
+ end
70
+
71
+ def render_name_link view
72
+ format.with_nest_mode :normal do
73
+ format.nest referee_name, options.merge(view: view)
74
+ end
75
+ end
76
+
77
+ # interpret a chunk matching
24
78
  def interpret match, _content
25
79
  target, @link_text = target_and_link_text match[1]
26
80
 
@@ -35,9 +89,9 @@ class Card
35
89
  def target_and_link_text raw_syntax
36
90
  return unless raw_syntax
37
91
 
38
- if (i = divider_index raw_syntax) # [[A | B]]
92
+ if (i = divider_index raw_syntax) # if [[A | B]]
39
93
  [raw_syntax[0..(i - 1)], raw_syntax[(i + 1)..-1]] # [A, B]
40
- else # [[ A ]]
94
+ else # else must be [[ A ]]
41
95
  [raw_syntax, nil] # [A, nil]
42
96
  end
43
97
  end
@@ -46,78 +100,36 @@ class Card
46
100
  # there's probably a better way to do the following.
47
101
  # point is to find the first pipe that's not inside an nest
48
102
  return unless string.index "|"
103
+
49
104
  string_copy = string.dup
50
- string.scan(/\{\{[^\}]*\}\}/) do |incl|
105
+ string.scan(/\{\{[^}]*\}\}/) do |incl|
51
106
  string_copy.gsub! incl, ("x" * incl.length)
52
107
  end
53
108
  string_copy.index "|"
54
109
  end
55
110
 
56
- # view options
57
- def options
58
- link_text ? { title: link_text } : {}
59
- end
60
-
111
+ # turn a string into a Content object if it looks like it might have more
112
+ # chunks in it
61
113
  def objectify raw
62
114
  return unless raw
115
+
63
116
  raw.strip!
64
117
  if raw.match?(/(^|[^\\])\{\{/)
65
- Card::Content.new raw, format
118
+ Content.new raw, format
66
119
  else
67
120
  raw
68
121
  end
69
122
  end
70
123
 
71
- def render_link view: :link, explicit_link_opts: {}
72
- @link_text = render_obj @link_text
73
-
74
- if @explicit_link
75
- @explicit_link = render_obj @explicit_link
76
- format.link_to_resource @explicit_link, @link_text, explicit_link_opts
77
- elsif @name
78
- format.with_nest_mode :normal do
79
- format.nest referee_name, options.merge(view: view)
80
- end
81
- end
82
- end
83
-
84
- def link_target
85
- if @explicit_link
86
- render_obj @explicit_link
87
- elsif @name
88
- referee_name
89
- end
90
- end
91
-
92
- def process_chunk
93
- @process_chunk ||= render_link
94
- end
95
-
96
- def inspect
97
- "<##{self.class}:e[#{@explicit_link}]n[#{@name}]l[#{@link_text}]" \
98
- "p[#{@process_chunk}] txt:#{@text}>"
99
- end
100
-
101
- def replace_reference old_name, new_name
102
- replace_name_reference old_name, new_name
103
- replace_link_text old_name, new_name
104
- @text =
105
- @link_text.nil? ? "[[#{referee_name}]]" : "[[#{referee_name}|#{@link_text}]]"
106
- end
107
-
108
124
  def replace_link_text old_name, new_name
109
- if @link_text.is_a?(Card::Content)
110
- @link_text.find_chunks(Card::Content::Chunk::Reference).each do |chunk|
125
+ if @link_text.is_a?(Content)
126
+ @link_text.find_chunks(:Reference).each do |chunk|
111
127
  chunk.replace_reference old_name, new_name
112
128
  end
113
129
  elsif @link_text.present?
114
130
  @link_text = old_name.to_name.sub_in(@link_text, with: new_name)
115
131
  end
116
132
  end
117
-
118
- def explicit_link?
119
- @explicit_link
120
- end
121
133
  end
122
134
  end
123
135
  end
@@ -8,11 +8,12 @@ class Card
8
8
  # Handler for nest chunks: {{example}}
9
9
  class Nest < Reference
10
10
  attr_reader :options
11
+
11
12
  DEFAULT_OPTION = :view # a value without a key is interpreted as view
12
13
 
13
14
  Chunk.register_class(self, prefix_re: '\\{\\{',
14
- full_re: /\A\{\{([^\{\}]*)\}\}/,
15
- idx_char: "{")
15
+ full_re: /\A\{\{([^{}]*)\}\}/,
16
+ idx_char: "{")
16
17
 
17
18
  def interpret match, _content
18
19
  in_brackets = strip_tags match[1]
@@ -27,9 +28,9 @@ class Card
27
28
  end
28
29
 
29
30
  def strip_tags string
30
- # note: not using ActionView's strip_tags here
31
+ # NOTE: not using ActionView's strip_tags here
31
32
  # because this needs to be super fast.
32
- string.gsub(/\<[^\>]*\>/, "")
33
+ string.gsub(/<[^>]*>/, "")
33
34
  end
34
35
 
35
36
  def visible_comment message
@@ -83,6 +84,7 @@ class Card
83
84
 
84
85
  def explicit_view= view
85
86
  return if @options[:view]
87
+
86
88
  # could check to make sure it's not already the default...
87
89
  if @text.match?(/\|/)
88
90
  @text.sub! "|", "|#{view};"
@@ -100,7 +102,7 @@ class Card
100
102
  end
101
103
 
102
104
  def self.gsub string
103
- string.gsub(/\{\{([^\}]*)\}\}/) do |_match|
105
+ string.gsub(/\{\{([^}]*)\}\}/) do |_match|
104
106
  yield(Regexp.last_match[1])
105
107
  end
106
108
  end
@@ -113,6 +115,7 @@ class Card
113
115
 
114
116
  def each_option attr_string
115
117
  return if attr_string.blank?
118
+
116
119
  attr_string.strip.split(";").each do |pair|
117
120
  # key is optional for view option
118
121
  value, key = pair.split(":", 2).reverse
@@ -9,26 +9,28 @@ class Card
9
9
 
10
10
  def referee_name
11
11
  return if name.nil?
12
- @referee_name ||= referee_name_from_rendered(render_obj(name))
13
- @referee_name = @referee_name.absolute(card.name).to_name
12
+
13
+ @referee_name ||= referee_raw_name
14
+ @referee_name = @referee_name.absolute_name card.name
14
15
  rescue Card::Error::NotFound
15
16
  # do not break on missing id/codename references.
16
17
  end
17
18
 
18
- def referee_name_from_rendered rendered_name
19
- ref_card = fetch_referee_card rendered_name
20
- ref_card ? ref_card.name : rendered_name.to_name
19
+ def referee_raw_name
20
+ Name[render_obj(name)]
21
21
  end
22
22
 
23
23
  def referee_card
24
24
  @referee_card ||= referee_name && Card.fetch(referee_name)
25
25
  end
26
26
 
27
+ private
28
+
27
29
  def replace_name_reference old_name, new_name
28
30
  @referee_card = nil
29
31
  @referee_name = nil
30
- if name.is_a? Card::Content
31
- name.find_chunks(Chunk::Reference).each do |chunk|
32
+ if name.is_a? Content
33
+ name.find_chunks(:Reference).each do |chunk|
32
34
  chunk.replace_reference old_name, new_name
33
35
  end
34
36
  else
@@ -37,22 +39,9 @@ class Card
37
39
  end
38
40
 
39
41
  def render_obj raw
40
- if format && raw.is_a?(Card::Content)
41
- format.process_content raw
42
- else
43
- raw
44
- end
45
- end
46
-
47
- private
42
+ return raw unless format && raw.is_a?(Content)
48
43
 
49
- def fetch_referee_card rendered_name
50
- case rendered_name # FIXME: this should be standard fetch option.
51
- when /^\~(\d+)$/ # get by id
52
- Card.fetch Regexp.last_match(1).to_i
53
- when /^\:(\w+)$/ # get by codename
54
- Card.fetch Regexp.last_match(1).to_sym
55
- end
44
+ format.process_content raw
56
45
  end
57
46
  end
58
47
  end
@@ -19,127 +19,132 @@ require "uri"
19
19
  # suffixes.
20
20
  # The generic names are from www.bnoack.com/data/countrycode2.html)
21
21
  # [iso3166]: http://geotags.com/iso3166/
22
- module Card::Content::Chunk
23
- class Uri < Abstract
24
- SCHEMES = %w[irc http https ftp ssh git sftp file ldap ldaps mailto].freeze
25
-
26
- REJECTED_PREFIX_RE = %w{! ": " ' ](}.map { |s| Regexp.escape s } * "|"
27
-
28
- attr_reader :uri, :link_text
29
- delegate :to, :scheme, :host, :port, :path, :query, :fragment, to: :uri
30
-
31
- Card::Content::Chunk.register_class(
32
- self, prefix_re: "(?:(?!#{REJECTED_PREFIX_RE})(?:#{SCHEMES * '|'})\\:)",
33
- full_re: /\A#{::URI.regexp(SCHEMES)}/,
34
- idx_char: ":"
35
- )
36
-
37
- class << self
38
- def full_match content, prefix
39
- prepend_str = if prefix[-1, 1] != ":" && config[:prepend_str]
40
- config[:prepend_str]
41
- else
42
- ""
43
- end
44
- content = prepend_str + content
45
- match = super content, prefix
46
- [match, prepend_str.length]
47
- end
48
-
49
- def context_ok? content, chunk_start
50
- preceding_string = content[chunk_start - 2..chunk_start - 1]
51
- preceding_string !~ /(?:#{REJECTED_PREFIX_RE})$/
52
- end
53
- end
54
-
55
- def interpret match, _content
56
- chunk = match[0]
57
- last_char = chunk[-1, 1]
58
- chunk.gsub!(/(?:&nbsp;)+/, "")
22
+ class Card
23
+ class Content
24
+ module Chunk
25
+ class Uri < Abstract
26
+ SCHEMES = %w[irc http https ftp ssh git sftp file ldap ldaps mailto].freeze
27
+
28
+ REJECTED_PREFIX_RE = %w{! ": " ' ](}.map { |s| Regexp.escape s } * "|"
29
+
30
+ attr_reader :uri, :link_text
31
+
32
+ delegate :to, :scheme, :host, :port, :path, :query, :fragment, to: :uri
33
+
34
+ Card::Content::Chunk.register_class(
35
+ self, prefix_re: "(?:(?!#{REJECTED_PREFIX_RE})(?:#{SCHEMES * '|'})\\:)",
36
+ full_re: /\A#{::URI::DEFAULT_PARSER.make_regexp(SCHEMES)}/,
37
+ idx_char: ":"
38
+ )
39
+
40
+ class << self
41
+ def full_match content, prefix
42
+ prepend_str = if prefix[-1, 1] != ":" && config[:prepend_str]
43
+ config[:prepend_str]
44
+ else
45
+ ""
46
+ end
47
+ content = prepend_str + content
48
+ match = super content, prefix
49
+ [match, prepend_str.length]
50
+ end
51
+
52
+ def context_ok? content, chunk_start
53
+ preceding_string = content[chunk_start - 2..chunk_start - 1]
54
+ preceding_string !~ /(?:#{REJECTED_PREFIX_RE})$/
55
+ end
56
+ end
59
57
 
60
- @trailing_punctuation =
61
- if %w[, . ) ! ? :].member?(last_char)
62
- @text.chop!
63
- chunk.chop!
64
- last_char
58
+ def interpret match, _content
59
+ chunk = match[0]
60
+ last_char = chunk[-1, 1]
61
+ chunk.gsub!(/(?:&nbsp;)+/, "")
62
+
63
+ @trailing_punctuation =
64
+ if %w[, . ) ! ? :].member?(last_char)
65
+ @text.chop!
66
+ chunk.chop!
67
+ last_char
68
+ end
69
+ chunk.sub!(/\.$/, "")
70
+
71
+ @link_text = chunk
72
+ @uri = ::URI.parse(chunk)
73
+ @process_chunk = process_uri_chunk
74
+ rescue ::URI::Error => e
75
+ # warn "rescue parse #{chunk_class}:
76
+ # '#{m}' #{e.inspect} #{e.backtrace*"\n"}"
77
+ Rails.logger.warn "rescue parse #{self.class}: #{e.inspect}"
65
78
  end
66
- chunk.sub!(/\.$/, "")
67
-
68
- @link_text = chunk
69
- @uri = ::URI.parse(chunk)
70
- @process_chunk = process_uri_chunk
71
- rescue ::URI::Error => e
72
- # warn "rescue parse #{chunk_class}:
73
- # '#{m}' #{e.inspect} #{e.backtrace*"\n"}"
74
- Rails.logger.warn "rescue parse #{self.class}: #{e.inspect}"
75
- end
76
79
 
77
- private
80
+ private
78
81
 
79
- def process_text
80
- @link_text
81
- end
82
+ def process_text
83
+ @link_text
84
+ end
82
85
 
83
- def process_uri_chunk
84
- link = format.link_to_resource @link_text, process_text
85
- "#{link}#{@trailing_punctuation}"
86
- end
87
- end
86
+ def process_uri_chunk
87
+ link = format.link_to_resource @link_text, process_text
88
+ "#{link}#{@trailing_punctuation}"
89
+ end
90
+ end
88
91
 
89
- # FIXME: DRY, merge these two into one class
90
- class EmailUri < Uri
91
- PREPEND_STR = "mailto:".freeze
92
- EMAIL = '[a-zA-Z\\d](?:[-a-zA-Z\\d.]*[a-zA-Z\\d])?\\@'.freeze
93
-
94
- Card::Content::Chunk.register_class(
95
- self, prefix_re: "(?:(?!#{REJECTED_PREFIX_RE})#{EMAIL})\\b",
96
- full_re: /\A#{::URI.regexp(SCHEMES)}/,
97
- prepend_str: PREPEND_STR,
98
- idx_char: "@"
99
- )
100
-
101
- # removes the prepended string from the unchanged match text
102
- def process_text
103
- @text = @text.sub(/^mailto:/, "")
104
- end
105
- end
92
+ # FIXME: DRY, merge these two into one class
93
+ class EmailUri < Uri
94
+ PREPEND_STR = "mailto:".freeze
95
+ EMAIL = '[a-zA-Z\\d](?:[-a-zA-Z\\d.]*[a-zA-Z\\d])?\\@'.freeze
96
+
97
+ Card::Content::Chunk.register_class(
98
+ self, prefix_re: "(?:(?!#{REJECTED_PREFIX_RE})#{EMAIL})\\b",
99
+ full_re: /\A#{::URI::DEFAULT_PARSER.make_regexp(SCHEMES)}/,
100
+ prepend_str: PREPEND_STR,
101
+ idx_char: "@"
102
+ )
103
+
104
+ # removes the prepended string from the unchanged match text
105
+ def process_text
106
+ @text = @text.sub(/^mailto:/, "")
107
+ end
108
+ end
106
109
 
107
- class HostUri < Uri
108
- GENERIC = "aero|biz|com|coop|edu|gov|info|int|mil|" \
109
- "museum|name|net|org".freeze
110
-
111
- COUNTRY = "ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|az|ba|bb|bd|be|" \
112
- "bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cf|cd|cg|" \
113
- "ch|ci|ck|cl|cm|cn|co|cr|cs|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|" \
114
- "ec|ee|eg|eh|er|es|et|fi|fj|fk|fm|fo|fr|fx|ga|gb|gd|ge|gf|gh|" \
115
- "gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|" \
116
- "il|in|io|iq|ir|is|it|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|" \
117
- "kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mk|ml|mm|" \
118
- "mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|" \
119
- "no|np|nr|nt|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pt|pw|py|" \
120
- "qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|" \
121
- "st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|" \
122
- "tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|" \
123
- "za|zm|zr|zw|" \
124
- "eu".freeze # made this separate, since it's not technically
125
- # a country -efm
126
- # These are needed otherwise HOST will match almost anything
127
-
128
- TLDS = "(?:#{GENERIC}|#{COUNTRY})".freeze
129
- # TLDS = "(?:#{GENERIC})"
130
-
131
- PREPEND_STR = "http://".freeze
132
- HOST = "(?:[a-zA-Z\\d](?:[-a-zA-Z\\d]*[a-zA-Z\\d])?\\.)+#{TLDS}".freeze
133
-
134
- Card::Content::Chunk.register_class(
135
- self, prefix_re: "(?:(?!#{REJECTED_PREFIX_RE})#{HOST})\\b",
136
- full_re: /\A#{::URI.regexp(SCHEMES)}/,
137
- prepend_str: PREPEND_STR
138
- )
139
-
140
- # removes the prepended string from the unchanged match text
141
- def process_text
142
- @text = @text.sub(%r{^http://}, "")
110
+ class HostUri < Uri
111
+ GENERIC = "aero|biz|com|coop|edu|gov|info|int|mil|" \
112
+ "museum|name|net|org".freeze
113
+
114
+ COUNTRY = "ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|az|ba|bb|bd|be|" \
115
+ "bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cf|cd|cg|" \
116
+ "ch|ci|ck|cl|cm|cn|co|cr|cs|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|" \
117
+ "ec|ee|eg|eh|er|es|et|fi|fj|fk|fm|fo|fr|fx|ga|gb|gd|ge|gf|gh|" \
118
+ "gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|" \
119
+ "il|in|io|iq|ir|is|it|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|" \
120
+ "kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mk|ml|mm|" \
121
+ "mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|" \
122
+ "no|np|nr|nt|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pt|pw|py|" \
123
+ "qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|" \
124
+ "st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|" \
125
+ "tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|" \
126
+ "za|zm|zr|zw|" \
127
+ "eu".freeze # made this separate, since it's not technically
128
+ # a country -efm
129
+ # These are needed otherwise HOST will match almost anything
130
+
131
+ TLDS = "(?:#{GENERIC}|#{COUNTRY})".freeze
132
+ # TLDS = "(?:#{GENERIC})"
133
+
134
+ PREPEND_STR = "http://".freeze
135
+ HOST = "(?:[a-zA-Z\\d](?:[-a-zA-Z\\d]*[a-zA-Z\\d])?\\.)+#{TLDS}".freeze
136
+
137
+ Card::Content::Chunk.register_class(
138
+ self, prefix_re: "(?:(?!#{REJECTED_PREFIX_RE})#{HOST})\\b",
139
+ full_re: /\A#{::URI::DEFAULT_PARSER.make_regexp(SCHEMES)}/,
140
+ prepend_str: PREPEND_STR
141
+ )
142
+
143
+ # removes the prepended string from the unchanged match text
144
+ def process_text
145
+ @text = @text.sub(%r{^http://}, "")
146
+ end
147
+ end
143
148
  end
144
149
  end
145
150
  end
@@ -9,10 +9,6 @@ class Card
9
9
  idx_char: "("
10
10
  )
11
11
 
12
- def initialize text, content
13
- super
14
- end
15
-
16
12
  def interpret match, _content
17
13
  @stub_hash = initial_stub_hash match[1]
18
14
  interpret_hash_values
@@ -1,5 +1,4 @@
1
1
  class << self
2
-
3
2
  def included host_class
4
3
  track_mod_name host_class, caller
5
4
  end
@@ -1,4 +1,3 @@
1
-
2
1
  def self.included host_class
3
2
  host_class.mattr_accessor :template_path
4
3
  host_class.extend Card::Set::Format::HamlPaths
data/set/abstract/lock.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  def lock
2
2
  was_already_locked = locked?
3
3
  return if was_already_locked
4
+
4
5
  Auth.as_bot do
5
6
  lock!
6
7
  yield
data/set/all/chunk.rb CHANGED
@@ -1,23 +1,21 @@
1
-
2
- def chunks content, type, named=false
1
+ def chunks content, type=nil, named=false
3
2
  content ||= self.content
4
- type ||= Card::Content::Chunk
5
3
  all_chunks = Card::Content.new(content, self).find_chunks type
6
4
  named ? all_chunks.select(&:referee_name) : all_chunks
7
5
  end
8
6
 
9
7
  def reference_chunks content=nil, named=true
10
- chunks content, Card::Content::Chunk::Reference, named
8
+ chunks content, :Reference, named
11
9
  end
12
10
 
13
11
  # named=true rejects commented nests
14
12
  def nest_chunks content=nil, named=true
15
- chunks content, Card::Content::Chunk::Nest, named
13
+ chunks content, :Nest, named
16
14
  end
17
15
 
18
16
  # named=true rejects external links (since the don't refer to a card name)
19
17
  def link_chunks content=nil, named=false
20
- chunks content, Card::Content::Chunk::Link, named
18
+ chunks content, :Link, named
21
19
  end
22
20
 
23
21
  def each_item_name_with_options content=nil
@@ -76,6 +74,7 @@ format do
76
74
 
77
75
  def each_nested_chunk content: nil, fields: false, uniq: true, virtual: true, &block
78
76
  return unless block_given?
77
+
79
78
  chunks = prepare_nested_chunks content, fields, uniq
80
79
  process_nested_chunks chunks, virtual, &block
81
80
  end
@@ -111,14 +110,16 @@ format do
111
110
 
112
111
  def process_nested_chunk chunk, virtual, &block
113
112
  if chunk.referee_card&.virtual?
114
- process_nested_virtual_chunk chunk, &block unless virtual
113
+ process_virtual_chunk chunk, virtual, &block
115
114
  else
116
115
  yield chunk
117
116
  end
118
117
  end
119
118
 
120
- def process_virtual_chunk chunk
121
- subformat(chunk.referee_card).each_nested_field_chunk { |sub_chunk| yield sub_chunk }
119
+ def process_virtual_chunk chunk, virtual, &block
120
+ return if virtual
121
+
122
+ subformat(chunk.referee_card).each_nested_field_chunk(&block)
122
123
  end
123
124
 
124
125
  def explicit_edit_fields_config
@@ -137,6 +138,7 @@ format do
137
138
  def normalized_edit_field_mark cardish, options
138
139
  return cardish if cardish.is_a?(Card) ||
139
140
  (options.is_a?(Hash) && options.delete(:absolute))
141
+
140
142
  card.name.field cardish
141
143
  end
142
144
  end
@@ -0,0 +1,20 @@
1
+ def context_card
2
+ @context_card || self
3
+ end
4
+
5
+ def with_context context_card
6
+ old_context = @context_card
7
+ @context_card = context_card if context_card
8
+ yield
9
+ ensure
10
+ @context_card = old_context
11
+ end
12
+
13
+ format do
14
+ delegate :context_card, :with_context, to: :card
15
+
16
+ def contextual_content context_card, options={}
17
+ view = options.delete(:view) || :core
18
+ with_context(context_card) { render! view, options }
19
+ end
20
+ end
@@ -1,4 +1,3 @@
1
-
2
1
  def is_template?
3
2
  return @is_template unless @is_template.nil?
4
3
 
@@ -46,6 +45,7 @@ end
46
45
 
47
46
  def assign_type_to? structure
48
47
  return if type_id == structure.type_id
48
+
49
49
  structure.assigns_type?
50
50
  end
51
51
 
@@ -1,5 +1,9 @@
1
1
  include_set Abstract::TemplatedNests
2
2
 
3
+ def item_names args={}
4
+ item_strings(args).compact.map(&:to_name)
5
+ end
6
+
3
7
  format :rss do
4
8
  def raw_feed_items
5
9
  [card]
@@ -51,7 +55,7 @@ def structuree_names
51
55
  end
52
56
 
53
57
  def update_structurees args
54
- # note that this is not smart about overriding templating rules
58
+ # NOTE: that this is not smart about overriding templating rules
55
59
  # for example, if someone were to change the type of a
56
60
  # +*right+*structure rule that was overridden
57
61
  # by a +*type plus right+*structure rule, the override would not be respected.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: card-mod-content
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.2
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ethan McCutchen
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2021-03-15 00:00:00.000000000 Z
13
+ date: 2021-07-05 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: card
@@ -18,14 +18,14 @@ dependencies:
18
18
  requirements:
19
19
  - - '='
20
20
  - !ruby/object:Gem::Version
21
- version: 1.101.2
21
+ version: 1.102.0
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - '='
27
27
  - !ruby/object:Gem::Version
28
- version: 1.101.2
28
+ version: 1.102.0
29
29
  description: ''
30
30
  email:
31
31
  - info@decko.org
@@ -47,6 +47,7 @@ files:
47
47
  - set/abstract/templated_nests.rb
48
48
  - set/abstract/vendor_code_file.rb
49
49
  - set/all/chunk.rb
50
+ - set/all/contextual_content.rb
50
51
  - set/all/templating.rb
51
52
  - set/right/default.rb
52
53
  - set/right/structure.rb
@@ -77,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
77
78
  - !ruby/object:Gem::Version
78
79
  version: '0'
79
80
  requirements: []
80
- rubygems_version: 3.0.3
81
+ rubygems_version: 3.2.15
81
82
  signing_key:
82
83
  specification_version: 4
83
84
  summary: card content handling