card-mod-content 0.11.4 → 0.11.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|