card-mod-content 0.11.4 → 0.11.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/card/content/chunk/escaped_literal.rb +2 -2
- data/lib/card/content/chunk/keep_escaped_literal.rb +2 -2
- data/lib/card/content/chunk/link.rb +7 -4
- data/lib/card/content/chunk/nest.rb +8 -5
- data/lib/card/content/chunk/reference.rb +1 -0
- data/lib/card/content/chunk/uri.rb +119 -114
- data/lib/card/content/chunk/view_stub.rb +0 -4
- data/set/abstract/code_file.rb +0 -1
- data/set/abstract/haml_file.rb +0 -1
- data/set/abstract/lock.rb +1 -0
- data/set/all/chunk.rb +4 -3
- data/set/all/templating.rb +1 -1
- data/set/right/structure.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 20ef16ab1cd68c60cef87aac784c6e59e693653c1dd83824c41836c779241dbc
|
4
|
+
data.tar.gz: af181919b1be08412e2f1a58e114ee1bd5f58fd115d23fd1f4971b8bbe0b2e40
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e4a460218fb818da58cfc64fdd5bee8ad0a88901833d03fa2a2bb7291386986dbb9acc0130b8f8a1ad9091ef779cd8d22d9f3537003d1ddc3b07a09a1a0c2c50
|
7
|
+
data.tar.gz: 6dfa5408e034673b954087356ee7f9c90f2e331c584e7b6761ae559b9571b487267091a4334346d80dc7edb0e13813200387d5108f271dc90b7b84901041f8e4
|
@@ -9,10 +9,10 @@ class Card
|
|
9
9
|
# and within HTML tags.
|
10
10
|
class EscapedLiteral < Abstract
|
11
11
|
FULL_RE = { "[" => /\A\\\[\[[^\]]*\]\]/,
|
12
|
-
"{" => /\A\\\{\{[
|
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\\\{\{[
|
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,7 +1,7 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
|
3
3
|
# require File.expand_path("../reference", __FILE__)
|
4
|
-
load File.expand_path("
|
4
|
+
load File.expand_path("reference.rb", __dir__)
|
5
5
|
|
6
6
|
class Card
|
7
7
|
class Content
|
@@ -12,11 +12,12 @@ class Card
|
|
12
12
|
class Link < Card::Content::Chunk::Reference
|
13
13
|
CODE = "L".freeze # L for "Link"
|
14
14
|
attr_reader :link_text
|
15
|
+
|
15
16
|
# Groups: $1, [$2]: [[$1]] or [[$1|$2]] or $3, $4: [$3][$4]
|
16
17
|
Card::Content::Chunk.register_class self,
|
17
18
|
prefix_re: '\\[\\[',
|
18
|
-
full_re:
|
19
|
-
idx_char:
|
19
|
+
full_re: /\A\[\[([^\]]+)\]\]/,
|
20
|
+
idx_char: "["
|
20
21
|
def reference_code
|
21
22
|
CODE
|
22
23
|
end
|
@@ -46,8 +47,9 @@ class Card
|
|
46
47
|
# there's probably a better way to do the following.
|
47
48
|
# point is to find the first pipe that's not inside an nest
|
48
49
|
return unless string.index "|"
|
50
|
+
|
49
51
|
string_copy = string.dup
|
50
|
-
string.scan(/\{\{[
|
52
|
+
string.scan(/\{\{[^}]*\}\}/) do |incl|
|
51
53
|
string_copy.gsub! incl, ("x" * incl.length)
|
52
54
|
end
|
53
55
|
string_copy.index "|"
|
@@ -60,6 +62,7 @@ class Card
|
|
60
62
|
|
61
63
|
def objectify raw
|
62
64
|
return unless raw
|
65
|
+
|
63
66
|
raw.strip!
|
64
67
|
if raw.match?(/(^|[^\\])\{\{/)
|
65
68
|
Card::Content.new raw, format
|
@@ -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:
|
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
|
-
#
|
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(/\{\{([
|
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
|
@@ -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
|
-
|
23
|
-
class
|
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
|
-
last_char = chunk[-1, 1]
|
58
|
-
chunk.gsub!(/(?: )+/, "")
|
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
|
-
|
61
|
-
|
62
|
-
|
63
|
-
chunk.
|
64
|
-
|
58
|
+
def interpret match, _content
|
59
|
+
chunk = match[0]
|
60
|
+
last_char = chunk[-1, 1]
|
61
|
+
chunk.gsub!(/(?: )+/, "")
|
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
|
-
|
80
|
+
private
|
78
81
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
+
def process_text
|
83
|
+
@link_text
|
84
|
+
end
|
82
85
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
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
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
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
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
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
|
data/set/abstract/code_file.rb
CHANGED
data/set/abstract/haml_file.rb
CHANGED
data/set/abstract/lock.rb
CHANGED
data/set/all/chunk.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
def chunks content, type=nil, named=false
|
3
2
|
content ||= self.content
|
4
3
|
all_chunks = Card::Content.new(content, self).find_chunks type
|
@@ -75,6 +74,7 @@ format do
|
|
75
74
|
|
76
75
|
def each_nested_chunk content: nil, fields: false, uniq: true, virtual: true, &block
|
77
76
|
return unless block_given?
|
77
|
+
|
78
78
|
chunks = prepare_nested_chunks content, fields, uniq
|
79
79
|
process_nested_chunks chunks, virtual, &block
|
80
80
|
end
|
@@ -116,8 +116,8 @@ format do
|
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
119
|
-
def process_virtual_chunk chunk
|
120
|
-
subformat(chunk.referee_card).each_nested_field_chunk
|
119
|
+
def process_virtual_chunk chunk, &block
|
120
|
+
subformat(chunk.referee_card).each_nested_field_chunk(&block)
|
121
121
|
end
|
122
122
|
|
123
123
|
def explicit_edit_fields_config
|
@@ -136,6 +136,7 @@ format do
|
|
136
136
|
def normalized_edit_field_mark cardish, options
|
137
137
|
return cardish if cardish.is_a?(Card) ||
|
138
138
|
(options.is_a?(Hash) && options.delete(:absolute))
|
139
|
+
|
139
140
|
card.name.field cardish
|
140
141
|
end
|
141
142
|
end
|
data/set/all/templating.rb
CHANGED
data/set/right/structure.rb
CHANGED
@@ -55,7 +55,7 @@ def structuree_names
|
|
55
55
|
end
|
56
56
|
|
57
57
|
def update_structurees args
|
58
|
-
#
|
58
|
+
# NOTE: that this is not smart about overriding templating rules
|
59
59
|
# for example, if someone were to change the type of a
|
60
60
|
# +*right+*structure rule that was overridden
|
61
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.
|
4
|
+
version: 0.11.5
|
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-05-
|
13
|
+
date: 2021-05-10 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.
|
21
|
+
version: 1.101.5
|
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.
|
28
|
+
version: 1.101.5
|
29
29
|
description: ''
|
30
30
|
email:
|
31
31
|
- info@decko.org
|