markdown_exec 1.4.1 → 1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -1
- data/CHANGELOG.md +22 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +6 -1
- data/bin/bmde +103 -1
- data/bin/tab_completion.sh +2 -2
- data/examples/opts.md +10 -1
- data/lib/block_types.rb +9 -5
- data/lib/filter.rb +15 -4
- data/lib/markdown_exec/version.rb +1 -1
- data/lib/markdown_exec.rb +618 -361
- data/lib/mdoc.rb +106 -32
- data/lib/menu.src.yml +179 -8
- data/lib/menu.yml +65 -9
- data/lib/pty1.rb +26 -0
- metadata +5 -4
data/lib/mdoc.rb
CHANGED
@@ -47,7 +47,8 @@ module MarkdownExec
|
|
47
47
|
# write named variables to block at top of script
|
48
48
|
#
|
49
49
|
fcb[:body].join(' ').split.compact.map do |key|
|
50
|
-
format(opts[:block_type_port_set_format],
|
50
|
+
format(opts[:block_type_port_set_format],
|
51
|
+
{ key: key, value: ENV.fetch(key, nil) })
|
51
52
|
end
|
52
53
|
end
|
53
54
|
|
@@ -69,19 +70,19 @@ module MarkdownExec
|
|
69
70
|
# @return [Array<Hash>] An array of code blocks required by the specified code block.
|
70
71
|
#
|
71
72
|
def collect_recursively_required_blocks(name)
|
72
|
-
name_block =
|
73
|
-
|
73
|
+
name_block = get_block_by_anyname(name)
|
74
|
+
if name_block.nil? || name_block.keys.empty?
|
75
|
+
raise "Named code block `#{name}` not found."
|
76
|
+
end
|
74
77
|
|
75
|
-
# all = [name_block.fetch(:name, '')] + recursively_required(name_block[:reqs])
|
76
78
|
all = [name_block.oname] + recursively_required(name_block[:reqs])
|
77
79
|
|
78
80
|
# in order of appearance in document
|
79
81
|
# insert function blocks
|
80
|
-
# @table.select { |fcb| all.include? fcb.fetch(:name, '') }
|
81
82
|
@table.select { |fcb| all.include? fcb.oname }
|
82
83
|
.map do |fcb|
|
83
84
|
if (call = fcb[:call])
|
84
|
-
[
|
85
|
+
[get_block_by_oname("[#{call.match(/^%\((\S+) |\)/)[1]}]")
|
85
86
|
.merge({ cann: call })]
|
86
87
|
else
|
87
88
|
[]
|
@@ -102,9 +103,10 @@ module MarkdownExec
|
|
102
103
|
collect_block_code_cann(fcb)
|
103
104
|
elsif fcb[:stdout]
|
104
105
|
collect_block_code_stdout(fcb)
|
105
|
-
elsif [
|
106
|
+
elsif [BlockType::LINK, BlockType::OPTS,
|
107
|
+
BlockType::VARS].include? fcb[:shell]
|
106
108
|
nil
|
107
|
-
elsif fcb[:shell] ==
|
109
|
+
elsif fcb[:shell] == BlockType::PORT
|
108
110
|
collect_block_code_shell(fcb)
|
109
111
|
else
|
110
112
|
fcb[:body]
|
@@ -147,12 +149,16 @@ module MarkdownExec
|
|
147
149
|
### hide rows correctly
|
148
150
|
|
149
151
|
if opts[:hide_blocks_by_name]
|
150
|
-
selrows.reject
|
151
|
-
|
152
|
-
|
153
|
-
end
|
154
|
-
|
155
|
-
|
152
|
+
selrows = selrows.reject do |block|
|
153
|
+
hide_menu_block_per_options opts, block
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
# remove
|
158
|
+
# . empty chrome between code; edges are same as blanks
|
159
|
+
#
|
160
|
+
select_elements_with_neighbor_conditions(selrows) do |prev_element, current, next_element|
|
161
|
+
!(current[:chrome] && !current[:oname].present?) || !(!prev_element.nil? && prev_element[:shell].present? && !next_element.nil? && next_element[:shell].present?)
|
156
162
|
end
|
157
163
|
end
|
158
164
|
|
@@ -162,8 +168,22 @@ module MarkdownExec
|
|
162
168
|
# @param default [Hash] The default value to return if the code block is not found.
|
163
169
|
# @return [Hash] The code block as a hash or the default value if not found.
|
164
170
|
#
|
165
|
-
def
|
166
|
-
@table.select
|
171
|
+
def get_block_by_anyname(name, default = {})
|
172
|
+
@table.select do |fcb|
|
173
|
+
fcb.fetch(:dname, '') == name || fcb.fetch(:oname, '') == name
|
174
|
+
end.fetch(0, default)
|
175
|
+
end
|
176
|
+
|
177
|
+
def get_block_by_dname(name, default = {})
|
178
|
+
@table.select do |fcb|
|
179
|
+
fcb.fetch(:dname, '') == name
|
180
|
+
end.fetch(0, default)
|
181
|
+
end
|
182
|
+
|
183
|
+
def get_block_by_oname(name, default = {})
|
184
|
+
@table.select do |fcb|
|
185
|
+
fcb.fetch(:oname, '') == name
|
186
|
+
end.fetch(0, default)
|
167
187
|
end
|
168
188
|
|
169
189
|
# Checks if a code block should be hidden based on the given options.
|
@@ -174,17 +194,24 @@ module MarkdownExec
|
|
174
194
|
#
|
175
195
|
# :reek:UtilityFunction
|
176
196
|
def hide_menu_block_per_options(opts, block)
|
177
|
-
(
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
197
|
+
if block.fetch(:chrome, false)
|
198
|
+
false
|
199
|
+
else
|
200
|
+
(opts[:hide_blocks_by_name] &&
|
201
|
+
((opts[:block_name_hidden_match]&.present? &&
|
202
|
+
block.oname&.match(Regexp.new(opts[:block_name_hidden_match]))) ||
|
203
|
+
(opts[:block_name_include_match]&.present? &&
|
204
|
+
block.oname&.match(Regexp.new(opts[:block_name_include_match]))) ||
|
205
|
+
(opts[:block_name_wrapper_match]&.present? &&
|
206
|
+
block.oname&.match(Regexp.new(opts[:block_name_wrapper_match])))) &&
|
207
|
+
(block.oname&.present? || block[:label]&.present?)
|
208
|
+
)
|
209
|
+
end
|
186
210
|
end
|
187
211
|
|
212
|
+
# def load_auto_blocks(opts)
|
213
|
+
# end
|
214
|
+
|
188
215
|
# Recursively fetches required code blocks for a given list of requirements.
|
189
216
|
#
|
190
217
|
# @param reqs [Array<String>] An array of requirements to start the recursion from.
|
@@ -200,13 +227,57 @@ module MarkdownExec
|
|
200
227
|
next if memo.include? req
|
201
228
|
|
202
229
|
memo += [req]
|
203
|
-
|
230
|
+
get_block_by_oname(req).fetch(:reqs, [])
|
204
231
|
end
|
205
232
|
.compact
|
206
233
|
.flatten(1)
|
207
234
|
end
|
208
235
|
memo
|
209
236
|
end
|
237
|
+
|
238
|
+
def select_elements_with_neighbor_conditions(array,
|
239
|
+
last_selected_placeholder = nil, next_selected_placeholder = nil)
|
240
|
+
selected_elements = []
|
241
|
+
last_selected = last_selected_placeholder
|
242
|
+
|
243
|
+
array.each_with_index do |current, index|
|
244
|
+
next_element = if index < array.size - 1
|
245
|
+
array[index + 1]
|
246
|
+
else
|
247
|
+
next_selected_placeholder
|
248
|
+
end
|
249
|
+
|
250
|
+
if yield(last_selected, current, next_element)
|
251
|
+
selected_elements << current
|
252
|
+
last_selected = current
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
selected_elements
|
257
|
+
end
|
258
|
+
|
259
|
+
# def select_elements_with_neighbor_conditions(array)
|
260
|
+
# # This function filters elements from the array where the current element has property A set to true
|
261
|
+
# # and both the previous and next elements have property B set to true.
|
262
|
+
# selected_elements = []
|
263
|
+
|
264
|
+
# array.each_with_index do |element, index|
|
265
|
+
# next if index.zero? # Skip the first element since it has no previous element
|
266
|
+
# break if index >= array.size - 1 # Break before the last to avoid out-of-bound errors
|
267
|
+
|
268
|
+
# prev_element = array[index - 1]
|
269
|
+
# next_element = array[index + 1]
|
270
|
+
|
271
|
+
# # Check the conditions for property A on the current element and property B on adjacent elements
|
272
|
+
# unless element[:chrome] && !element[:oname].present? && prev_element[:shell].present? && next_element[:shell].present?
|
273
|
+
# selected_elements << element
|
274
|
+
# # else
|
275
|
+
# # pp 'SKIPPING', element
|
276
|
+
# end
|
277
|
+
# end
|
278
|
+
|
279
|
+
# selected_elements
|
280
|
+
# end
|
210
281
|
end
|
211
282
|
end
|
212
283
|
|
@@ -220,9 +291,11 @@ if $PROGRAM_NAME == __FILE__
|
|
220
291
|
class TestMDoc < Minitest::Test
|
221
292
|
def setup
|
222
293
|
@table = [
|
223
|
-
{ oname: 'block1', body: ['code for block1'],
|
294
|
+
{ oname: 'block1', body: ['code for block1'],
|
295
|
+
reqs: ['block2'] },
|
224
296
|
{ oname: 'block2', body: ['code for block2'], reqs: nil },
|
225
|
-
{ oname: 'block3', body: ['code for block3'],
|
297
|
+
{ oname: 'block3', body: ['code for block3'],
|
298
|
+
reqs: ['block1'] }
|
226
299
|
]
|
227
300
|
@doc = MDoc.new(@table)
|
228
301
|
end
|
@@ -234,10 +307,10 @@ if $PROGRAM_NAME == __FILE__
|
|
234
307
|
# end
|
235
308
|
|
236
309
|
def test_get_block_by_name
|
237
|
-
result = @doc.
|
310
|
+
result = @doc.get_block_by_oname('block1')
|
238
311
|
assert_equal @table[0], result
|
239
312
|
|
240
|
-
result_missing = @doc.
|
313
|
+
result_missing = @doc.get_block_by_oname('missing_block')
|
241
314
|
assert_equal({}, result_missing)
|
242
315
|
end
|
243
316
|
|
@@ -253,8 +326,9 @@ if $PROGRAM_NAME == __FILE__
|
|
253
326
|
# end
|
254
327
|
|
255
328
|
def test_hide_menu_block_per_options
|
256
|
-
opts = { hide_blocks_by_name: true,
|
257
|
-
|
329
|
+
opts = { hide_blocks_by_name: true,
|
330
|
+
block_name_hidden_match: 'block1' }
|
331
|
+
block = FCB.new(oname: 'block1')
|
258
332
|
result = @doc.hide_menu_block_per_options(opts, block)
|
259
333
|
assert result # this should be true based on the given logic
|
260
334
|
end
|