card-mod-content 0.11.5 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/db/migrate_core_cards/20201115133753_add_asset_file_card.rb +7 -0
- data/lib/card/content/chunk/link.rb +68 -59
- data/set/abstract/00_sources.rb +24 -0
- data/set/abstract/{code_file.rb → 01_code_file.rb} +8 -23
- data/set/abstract/read_only.rb +14 -0
- data/set/all/chunk.rb +4 -2
- data/set/all/contextual_content.rb +20 -0
- metadata +10 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 199643e67c9b580e4b7e1d07fa1c4e6540581a3543a1ce40099a27367c0ff659
|
4
|
+
data.tar.gz: b9646360212c31dd400f05982f27e8b6641ad72bd1bfe26bfb98109934346103
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b6a60b6d20ca5cbf559f11e2251601316172f17cb811b8249d6c599449d96cee22c105c90ff48fc764e4235964d816109e17cfdf61d98c120a76aa8b647a658
|
7
|
+
data.tar.gz: cfbb2405eb833e001ad71cb9f946a4ace15dad15897c3b34dc76c46adef10dbc3f42abcf7659aac6133444d7b659e4c195181afea19d7332d4f39d8ec79ed456
|
@@ -6,22 +6,75 @@ load File.expand_path("reference.rb", __dir__)
|
|
6
6
|
class Card
|
7
7
|
class Content
|
8
8
|
module Chunk
|
9
|
-
|
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
12
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
idx_char: "["
|
13
|
+
Chunk.register_class self, prefix_re: '\\[\\[',
|
14
|
+
full_re: /\A\[\[([^\]]+)\]\]/,
|
15
|
+
idx_char: "["
|
16
|
+
|
21
17
|
def reference_code
|
22
18
|
CODE
|
23
19
|
end
|
24
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
|
25
78
|
def interpret match, _content
|
26
79
|
target, @link_text = target_and_link_text match[1]
|
27
80
|
|
@@ -36,9 +89,9 @@ class Card
|
|
36
89
|
def target_and_link_text raw_syntax
|
37
90
|
return unless raw_syntax
|
38
91
|
|
39
|
-
if (i = divider_index raw_syntax) # [[A | B]]
|
92
|
+
if (i = divider_index raw_syntax) # if [[A | B]]
|
40
93
|
[raw_syntax[0..(i - 1)], raw_syntax[(i + 1)..-1]] # [A, B]
|
41
|
-
else # [[ A ]]
|
94
|
+
else # else must be [[ A ]]
|
42
95
|
[raw_syntax, nil] # [A, nil]
|
43
96
|
end
|
44
97
|
end
|
@@ -55,61 +108,21 @@ class Card
|
|
55
108
|
string_copy.index "|"
|
56
109
|
end
|
57
110
|
|
58
|
-
#
|
59
|
-
|
60
|
-
link_text ? { title: link_text } : {}
|
61
|
-
end
|
62
|
-
|
111
|
+
# turn a string into a Content object if it looks like it might have more
|
112
|
+
# chunks in it
|
63
113
|
def objectify raw
|
64
114
|
return unless raw
|
65
115
|
|
66
116
|
raw.strip!
|
67
117
|
if raw.match?(/(^|[^\\])\{\{/)
|
68
|
-
|
118
|
+
Content.new raw, format
|
69
119
|
else
|
70
120
|
raw
|
71
121
|
end
|
72
122
|
end
|
73
123
|
|
74
|
-
def render_link view: :link, explicit_link_opts: {}
|
75
|
-
@link_text = render_obj @link_text
|
76
|
-
|
77
|
-
if @explicit_link
|
78
|
-
@explicit_link = render_obj @explicit_link
|
79
|
-
format.link_to_resource @explicit_link, @link_text, explicit_link_opts
|
80
|
-
elsif @name
|
81
|
-
format.with_nest_mode :normal do
|
82
|
-
format.nest referee_name, options.merge(view: view)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def link_target
|
88
|
-
if @explicit_link
|
89
|
-
render_obj @explicit_link
|
90
|
-
elsif @name
|
91
|
-
referee_name
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def process_chunk
|
96
|
-
@process_chunk ||= render_link
|
97
|
-
end
|
98
|
-
|
99
|
-
def inspect
|
100
|
-
"<##{self.class}:e[#{@explicit_link}]n[#{@name}]l[#{@link_text}]" \
|
101
|
-
"p[#{@process_chunk}] txt:#{@text}>"
|
102
|
-
end
|
103
|
-
|
104
|
-
def replace_reference old_name, new_name
|
105
|
-
replace_name_reference old_name, new_name
|
106
|
-
replace_link_text old_name, new_name
|
107
|
-
@text =
|
108
|
-
@link_text.nil? ? "[[#{referee_name}]]" : "[[#{referee_name}|#{@link_text}]]"
|
109
|
-
end
|
110
|
-
|
111
124
|
def replace_link_text old_name, new_name
|
112
|
-
if @link_text.is_a?(
|
125
|
+
if @link_text.is_a?(Content)
|
113
126
|
@link_text.find_chunks(:Reference).each do |chunk|
|
114
127
|
chunk.replace_reference old_name, new_name
|
115
128
|
end
|
@@ -117,10 +130,6 @@ class Card
|
|
117
130
|
@link_text = old_name.to_name.sub_in(@link_text, with: new_name)
|
118
131
|
end
|
119
132
|
end
|
120
|
-
|
121
|
-
def explicit_link?
|
122
|
-
@explicit_link
|
123
|
-
end
|
124
133
|
end
|
125
134
|
end
|
126
135
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
def source_paths
|
2
|
+
[]
|
3
|
+
end
|
4
|
+
|
5
|
+
def find_file file_path
|
6
|
+
unknown_file?(file_path) ? nil : file_path
|
7
|
+
end
|
8
|
+
|
9
|
+
def unknown_file? file_path
|
10
|
+
return false if File.exist? file_path
|
11
|
+
|
12
|
+
Rails.logger.info "couldn't locate file #{file_path}"
|
13
|
+
true
|
14
|
+
end
|
15
|
+
|
16
|
+
def existing_source_paths
|
17
|
+
Array.wrap(source_paths).reject do |file_path|
|
18
|
+
unknown_file?(file_path)
|
19
|
+
end.compact
|
20
|
+
end
|
21
|
+
|
22
|
+
def source_changed? since:
|
23
|
+
existing_source_paths.any? { |path| ::File.mtime(path) > since }
|
24
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
include_set Abstract::Sources
|
2
|
+
|
1
3
|
class << self
|
2
4
|
def included host_class
|
3
5
|
track_mod_name host_class, caller
|
@@ -31,12 +33,6 @@ def source_dir
|
|
31
33
|
end
|
32
34
|
end
|
33
35
|
|
34
|
-
def find_file filename
|
35
|
-
File.join(mod_path, source_dir, filename).tap do |file_path|
|
36
|
-
return nil if unknown_file? filename, file_path
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
36
|
def mod_path
|
41
37
|
modname = file_content_mod_name
|
42
38
|
if (match = modname.match(/^card-mod-(\w*)/))
|
@@ -45,28 +41,17 @@ def mod_path
|
|
45
41
|
Cardio::Mod.dirs.path modname
|
46
42
|
end
|
47
43
|
|
48
|
-
def
|
49
|
-
return false if File.exist? file_path
|
50
|
-
|
51
|
-
Rails.logger.info "couldn't locate file #{filename} at #{file_path}"
|
52
|
-
true
|
53
|
-
end
|
54
|
-
|
55
|
-
def existing_source_paths
|
44
|
+
def source_paths
|
56
45
|
Array.wrap(source_files).map do |filename|
|
57
|
-
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def source_changed? since:
|
62
|
-
existing_source_paths.any? { |path| ::File.mtime(path) > since }
|
46
|
+
::File.join mod_path, source_dir, filename
|
47
|
+
end
|
63
48
|
end
|
64
49
|
|
65
50
|
def content
|
66
|
-
Array.wrap(
|
67
|
-
if (source_path = find_file
|
51
|
+
Array.wrap(source_paths).map do |path|
|
52
|
+
if (source_path = find_file path)
|
68
53
|
Rails.logger.debug "reading file: #{source_path}"
|
69
|
-
File.read source_path
|
54
|
+
::File.read source_path
|
70
55
|
end
|
71
56
|
end.compact.join "\n"
|
72
57
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
format :html do
|
2
|
+
view :input do
|
3
|
+
"Content can't be edited."
|
4
|
+
end
|
5
|
+
|
6
|
+
def short_content
|
7
|
+
fa_icon("exclamation-circle", class: "text-muted pr-2") +
|
8
|
+
wrap_with(:span, "read-only", class: "text-muted")
|
9
|
+
end
|
10
|
+
|
11
|
+
def standard_submit_button
|
12
|
+
multi_card_editor? ? super : ""
|
13
|
+
end
|
14
|
+
end
|
data/set/all/chunk.rb
CHANGED
@@ -110,13 +110,15 @@ format do
|
|
110
110
|
|
111
111
|
def process_nested_chunk chunk, virtual, &block
|
112
112
|
if chunk.referee_card&.virtual?
|
113
|
-
|
113
|
+
process_virtual_chunk chunk, virtual, &block
|
114
114
|
else
|
115
115
|
yield chunk
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
119
|
-
def process_virtual_chunk chunk, &block
|
119
|
+
def process_virtual_chunk chunk, virtual, &block
|
120
|
+
return if virtual
|
121
|
+
|
120
122
|
subformat(chunk.referee_card).each_nested_field_chunk(&block)
|
121
123
|
end
|
122
124
|
|
@@ -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
|
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.
|
4
|
+
version: 0.13.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-
|
13
|
+
date: 2021-08-06 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.
|
21
|
+
version: 1.103.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.
|
28
|
+
version: 1.103.0
|
29
29
|
description: ''
|
30
30
|
email:
|
31
31
|
- info@decko.org
|
@@ -33,6 +33,7 @@ executables: []
|
|
33
33
|
extensions: []
|
34
34
|
extra_rdoc_files: []
|
35
35
|
files:
|
36
|
+
- db/migrate_core_cards/20201115133753_add_asset_file_card.rb
|
36
37
|
- lib/card/content/chunk/escaped_literal.rb
|
37
38
|
- lib/card/content/chunk/keep_escaped_literal.rb
|
38
39
|
- lib/card/content/chunk/link.rb
|
@@ -41,12 +42,15 @@ files:
|
|
41
42
|
- lib/card/content/chunk/reference.rb
|
42
43
|
- lib/card/content/chunk/uri.rb
|
43
44
|
- lib/card/content/chunk/view_stub.rb
|
44
|
-
- set/abstract/
|
45
|
+
- set/abstract/00_sources.rb
|
46
|
+
- set/abstract/01_code_file.rb
|
45
47
|
- set/abstract/haml_file.rb
|
46
48
|
- set/abstract/lock.rb
|
49
|
+
- set/abstract/read_only.rb
|
47
50
|
- set/abstract/templated_nests.rb
|
48
51
|
- set/abstract/vendor_code_file.rb
|
49
52
|
- set/all/chunk.rb
|
53
|
+
- set/all/contextual_content.rb
|
50
54
|
- set/all/templating.rb
|
51
55
|
- set/right/default.rb
|
52
56
|
- set/right/structure.rb
|
@@ -77,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
77
81
|
- !ruby/object:Gem::Version
|
78
82
|
version: '0'
|
79
83
|
requirements: []
|
80
|
-
rubygems_version: 3.1.
|
84
|
+
rubygems_version: 3.1.6
|
81
85
|
signing_key:
|
82
86
|
specification_version: 4
|
83
87
|
summary: card content handling
|