markdown_exec 1.8.5 → 1.8.6

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: 4e802d2af4a779aad7091b20ab189a4c324f15f53643880758b7aac76549ba49
4
- data.tar.gz: 2d6f910706bd10232f8bb87313364f671d3871e06382d57dd6248f07c4e497f2
3
+ metadata.gz: 44e42ccdbdf5eed7e6ee36add8a5dcdcfe62d6cd3fb6fd531daf960c6ce7c9b7
4
+ data.tar.gz: 753076d46e44f5d17698be53a0421212d8f2c804368f9737591dc92a7d5457d6
5
5
  SHA512:
6
- metadata.gz: c0e4b6ff95bccd281e078eb934d3660c52c28530ae12694c81030b3254de468b24d1d93e2e4d68b4d1163be68de029750930f3de0c3034154b05afde6ac9b42a
7
- data.tar.gz: 85e260930e3d097e7028ae16cfeb7905fa702accd1fe2bb5b27fdb817d301be10259069be7c7e99f4af5258efbc7be5867d82834cee68bdc8d4e6485592f821e
6
+ metadata.gz: 84d952fcfafed40a5e3949783760aec570448de48293fdae536b5386b95d8080d2c9c41f0149861686d2fd4985a59ebea6794e7953d7b4dc1185340d790e68a2
7
+ data.tar.gz: 9db0c523154e32c3094046084594564c9114fbd2519f6ff5d9a8fcc5feb0d31b76dc3ccd1d6c4e2625507b81b4f70f9b6fdf31e250d132a5fdf2fa54d3cb8c77
data/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.8.6] - 2023-12-25
4
+
5
+ ### Added
6
+
7
+ - Default path for find command
8
+
9
+ ### Changed
10
+
11
+ - Refactor command-line processing
12
+
3
13
  ## [1.8.5] - 2023-12-22
4
14
 
5
15
  ### Added
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- markdown_exec (1.8.5)
4
+ markdown_exec (1.8.6)
5
5
  clipboard (~> 1.3.6)
6
6
  open3 (~> 0.1.1)
7
7
  optparse (~> 0.1.1)
@@ -13,7 +13,7 @@ __filedirs_all()
13
13
  }
14
14
 
15
15
  _mde_echo_version() {
16
- echo "1.8.5"
16
+ echo "1.8.6"
17
17
  }
18
18
 
19
19
  _mde() {
@@ -54,6 +54,8 @@ _mde() {
54
54
 
55
55
  -?) COMPREPLY="''"; return 0 ;;
56
56
 
57
+ --find-path) COMPREPLY="''"; return 0 ;;
58
+
57
59
  --how) COMPREPLY="''"; return 0 ;;
58
60
 
59
61
  -?) COMPREPLY="''"; return 0 ;;
@@ -92,7 +94,7 @@ _mde() {
92
94
  # present matching option names
93
95
  #
94
96
  if [[ ${cur} == -* ]] ; then
95
- opts=("--block-name" "--config" "--debug" "--dump-dump-delegate-object" "--dump-blocks-in-file" "--dump-dump-inherited-lines" "--dump-menu-blocks" "--dump-selected-block" "--exit" "--filename" "--find" "--help" "--how" "--list-blocks" "--list-count" "--list-default-env" "--list-default-yaml" "--list-docs" "--list-recent-output" "--list-recent-scripts" "--output-execution-summary" "--output-script" "--output-stdout" "--path" "--pwd" "--run-last-script" "--save-executed-script" "--save-execution-output" "--saved-script-folder" "--saved-stdout-folder" "--select-recent-output" "--select-recent-script" "--tab-completions" "--user-must-approve" "--version" "--display-level")
97
+ opts=("--block-name" "--config" "--debug" "--dump-dump-delegate-object" "--dump-blocks-in-file" "--dump-dump-inherited-lines" "--dump-menu-blocks" "--dump-selected-block" "--exit" "--filename" "--find" "--find-path" "--help" "--how" "--list-blocks" "--list-count" "--list-default-env" "--list-default-yaml" "--list-docs" "--list-recent-output" "--list-recent-scripts" "--output-execution-summary" "--output-script" "--output-stdout" "--path" "--pwd" "--run-last-script" "--save-executed-script" "--save-execution-output" "--saved-script-folder" "--saved-stdout-folder" "--select-recent-output" "--select-recent-script" "--tab-completions" "--user-must-approve" "--version" "--display-level")
96
98
  COMPREPLY=( $(compgen -W "$(printf "'%s' " "${opts[@]}")" -- "${cur}") )
97
99
 
98
100
  return 0
@@ -133,6 +135,8 @@ _mde() {
133
135
 
134
136
  -?) COMPREPLY=".FIND."; return 0 ;;
135
137
 
138
+ --find-path) COMPREPLY=".FIND_PATH."; return 0 ;;
139
+
136
140
  --how) COMPREPLY=".HOW."; return 0 ;;
137
141
 
138
142
  -?) COMPREPLY=".HOW."; return 0 ;;
@@ -174,4 +178,4 @@ _mde() {
174
178
 
175
179
  complete -o filenames -o nospace -F _mde mde
176
180
  # _mde_echo_version
177
- # echo "Updated: 2023-12-22 22:55:35 UTC"
181
+ # echo "Updated: 2023-12-26 00:07:49 UTC"
data/examples/linked.md CHANGED
@@ -1,6 +1,7 @@
1
1
  Demonstrate setting a variable interactively for use in generated scripts.
2
2
 
3
3
  ```opts :(document_options)
4
+ dump_inherited_lines: true
4
5
  pause_after_script_execution: false
5
6
  user_must_approve: false
6
7
  ```
@@ -15,6 +16,15 @@ block: display_variable
15
16
  VARIABLE=A
16
17
  ```
17
18
 
19
+ ```link :set_to_A_eval +(set_to_A_eval)
20
+ block: display_variable
21
+ eval: true
22
+ ```
23
+
24
+ ```bash :(set_to_A_eval)
25
+ echo VARIABLE=A
26
+ ```
27
+
18
28
  ::: Set VARIABLE to "B"
19
29
 
20
30
  ```link :set_to_B +(set_to_B)
@@ -25,6 +35,15 @@ block: display_variable
25
35
  VARIABLE=B
26
36
  ```
27
37
 
38
+ ```link :set_to_B_eval +(set_to_B_eval)
39
+ block: display_variable
40
+ eval: true
41
+ ```
42
+
43
+ ```bash :(set_to_B_eval)
44
+ echo VARIABLE=B
45
+ ```
46
+
28
47
  ::: Display value of VARIABLE
29
48
 
30
49
  ```bash :display_variable
data/examples/linked1.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Demo document linking
2
2
 
3
+ ```opts :(document_options)
4
+ dump_inherited_lines: true
5
+ pause_after_script_execution: false
6
+ user_must_approve: false
7
+ ```
8
+
3
9
  ::: * This is document 1 *
4
10
  ::: This document links to a matching document to demonstrate navigation between documents.
5
11
 
@@ -15,6 +21,10 @@ colorize_env_vars 'vars for page3' PAGE3_VAR_VIA_INHERIT page3_var_via_environme
15
21
  PAGE2_VAR_VIA_INHERIT=for_page2_from_page1_via_inherited_code_blocks
16
22
  ```
17
23
 
24
+ ```link :linked2 +(vars2)
25
+ file: examples/linked2.md
26
+ ```
27
+
18
28
  ```link :(linked2) +(vars2)
19
29
  file: examples/linked2.md
20
30
  ```
data/examples/linked2.md CHANGED
@@ -20,6 +20,10 @@ colorize_env_vars 'vars for page3' PAGE3_VAR_VIA_INHERIT page3_var_via_environme
20
20
  PAGE3_VAR_VIA_INHERIT=for_page3_from_page2_via_inherited_code_blocks
21
21
  ```
22
22
 
23
+ ```link :linked3 +(vars3)
24
+ file: examples/linked3.md
25
+ ```
26
+
23
27
  ```link :(linked3) +(vars3)
24
28
  file: examples/linked3.md
25
29
  ```
data/examples/opts.md CHANGED
@@ -2,13 +2,15 @@
2
2
 
3
3
  ::: These Opts blocks set the color of a couple of menu options to demonstrate the live update of options.
4
4
 
5
- ```opts :opts1
5
+ ```opts
6
+ # color scheme 1
6
7
  menu_divider_color: yellow
7
8
  menu_note_match: "^ *(?<line>.+?) *$"
8
9
  menu_task_color: fg_rgb_255_63_255
9
10
  ```
10
11
 
11
- ```opts :opts2
12
+ ```opts
13
+ # color scheme 2
12
14
  menu_divider_color: red
13
15
  menu_note_color: yellow
14
16
  menu_note_match: "^\\+ +(?<line>.+?) *$"
@@ -27,3 +29,21 @@ note 1
27
29
  note 2 ends with /
28
30
  / note 3 starts with /
29
31
  note 4
32
+
33
+ ::: These options toggle the dump of debug information.
34
+
35
+ ```opts
36
+ dump_blocks_in_file: true # Dump BlocksInFile (stage 1)
37
+ dump_delegate_object: true # Dump @delegate_object
38
+ dump_inherited_lines: true # Dump inherited lines
39
+ dump_menu_blocks: true # Dump MenuBlocks (stage 2)
40
+ dump_selected_block: true # Dump selected block
41
+ ```
42
+
43
+ ```opts
44
+ dump_blocks_in_file: false # Dump BlocksInFile (stage 1)
45
+ dump_delegate_object: false # Dump @delegate_object
46
+ dump_inherited_lines: false # Dump inherited lines
47
+ dump_menu_blocks: false # Dump MenuBlocks (stage 2)
48
+ dump_selected_block: false # Dump selected block
49
+ ```
@@ -6,15 +6,9 @@
6
6
  # version 2023-10-03
7
7
 
8
8
  require 'fileutils'
9
+ require_relative 'constants'
9
10
  require_relative 'exceptions'
10
11
 
11
- # a struct to hold the data for a single line
12
- NestedLine = Struct.new(:text, :depth) do
13
- def to_s
14
- text
15
- end
16
- end
17
-
18
12
  ##
19
13
  # The CachedNestedFileReader class provides functionality to read file lines with the ability
20
14
  # to process '#import filename' directives. When such a directive is encountered in a file,
data/lib/constants.rb CHANGED
@@ -3,12 +3,20 @@
3
3
 
4
4
  # encoding=utf-8
5
5
 
6
+ require_relative 'block_types'
7
+
6
8
  class ExecutionStreams
7
9
  StdErr = :stderr
8
10
  StdIn = :stdin
9
11
  StdOut = :stdout
10
12
  end
11
13
 
14
+ IndexedLine = Struct.new(:index, :line) do
15
+ def to_s
16
+ line
17
+ end
18
+ end
19
+
12
20
  class LoadFile
13
21
  Load = true
14
22
  Reuse = false
@@ -34,6 +42,13 @@ class MenuState
34
42
  EXIT = :exit
35
43
  end
36
44
 
45
+ # a struct to hold the data for a single line
46
+ NestedLine = Struct.new(:text, :depth) do
47
+ def to_s
48
+ text
49
+ end
50
+ end
51
+
37
52
  # selected block and subsequent menu state
38
53
  #
39
54
  SelectedBlockMenuState = Struct.new(:block, :state)
@@ -44,3 +59,5 @@ SHELL_COLOR_OPTIONS = {
44
59
  BlockType::OPTS => :menu_opts_color,
45
60
  BlockType::VARS => :menu_vars_color
46
61
  }.freeze
62
+
63
+ ### Struct.new(:state, :block)
@@ -4,6 +4,7 @@
4
4
  # encoding=utf-8
5
5
 
6
6
  require 'find'
7
+ require_relative 'constants'
7
8
 
8
9
  def format_and_highlight_hash(
9
10
  data,
@@ -89,12 +90,6 @@ def format_and_highlight_lines(
89
90
  highlight_color_sym)}#{line_postfix}\n" + formatted_deps.join("\n")
90
91
  end
91
92
 
92
- IndexedLine = Struct.new(:index, :line) do
93
- def to_s
94
- line
95
- end
96
- end
97
-
98
93
  # Class DirectorySearcher
99
94
  # This class provides methods to search for a specified pattern
100
95
  # in directory names, file names, and contents of files within given paths.
@@ -359,7 +359,7 @@ module MarkdownExec
359
359
  @fout.fout "Error ENOENT: #{err.inspect}"
360
360
  end
361
361
 
362
- def command_or_user_selected_block(all_blocks, menu_blocks, default)
362
+ def load_cli_or_user_selected_block(all_blocks, menu_blocks, default)
363
363
  if @delegate_object[:block_name].present?
364
364
  block = all_blocks.find do |item|
365
365
  item[:oname] == @delegate_object[:block_name]
@@ -373,7 +373,7 @@ module MarkdownExec
373
373
 
374
374
  SelectedBlockMenuState.new(block, state)
375
375
  rescue StandardError
376
- error_handler('command_or_user_selected_block')
376
+ error_handler('load_cli_or_user_selected_block')
377
377
  end
378
378
 
379
379
  # This method is responsible for handling the execution of generic blocks in a markdown document.
@@ -383,8 +383,7 @@ module MarkdownExec
383
383
  # @param mdoc [Object] The markdown document object containing code blocks.
384
384
  # @param selected [Hash] The selected item from the menu to be executed.
385
385
  # @return [LoadFileLinkState] An object indicating whether to load the next block or reuse the current one.
386
- def compile_execute_bash_and_special_blocks_and_trigger_reuse(mdoc, selected,
387
- link_state = nil, block_source:)
386
+ def compile_execute_and_trigger_reuse(mdoc, selected, link_state = nil, block_source:)
388
387
  required_lines = collect_required_code_lines(mdoc, selected, link_state,
389
388
  block_source: block_source)
390
389
  output_or_approval = @delegate_object[:output_script] || @delegate_object[:user_must_approve]
@@ -602,8 +601,8 @@ module MarkdownExec
602
601
  # @param opts [Hash] Options hash containing configuration settings.
603
602
  # @param mdoc [YourMDocClass] An instance of the MDoc class.
604
603
  #
605
- def execute_bash_and_special_blocks(selected, mdoc, link_state = LinkState.new,
606
- block_source:)
604
+ def execute_shell_type(selected, mdoc, link_state = LinkState.new,
605
+ block_source:)
607
606
  if selected.fetch(:shell, '') == BlockType::LINK
608
607
  push_link_history_and_trigger_load(selected.fetch(:body, ''), mdoc, selected,
609
608
  link_state)
@@ -618,8 +617,8 @@ module MarkdownExec
618
617
  options_state.load_file_link_state
619
618
 
620
619
  else
621
- compile_execute_bash_and_special_blocks_and_trigger_reuse(mdoc, selected, link_state,
622
- block_source: block_source)
620
+ compile_execute_and_trigger_reuse(mdoc, selected, link_state,
621
+ block_source: block_source)
623
622
  end
624
623
  end
625
624
 
@@ -922,10 +921,12 @@ module MarkdownExec
922
921
  end
923
922
  end
924
923
 
925
- def pop_cli_argument!
926
- return false unless @delegate_object[:input_cli_rest].present?
924
+ def shift_cli_argument!
925
+ return false unless @menu_base_options[:input_cli_rest].present?
927
926
 
928
- @cli_block_name = @delegate_object[:input_cli_rest].pop
927
+ @cli_block_name = @menu_base_options[:input_cli_rest].shift
928
+ # @delegate_object[:input_cli_rest].shift
929
+ # p [__LINE__, @cli_block_name, @menu_base_options[:input_cli_rest]]
929
930
  true
930
931
  end
931
932
 
@@ -1272,102 +1273,208 @@ module MarkdownExec
1272
1273
  # Markdown document, obtain approval, and execute the chosen block of code.
1273
1274
  #
1274
1275
  # @return [Nil] Returns nil if no code block is selected or an error occurs.
1275
- def select_execute_bash_and_special_blocks(_execute: true)
1276
+ def document_menu_loop
1276
1277
  @menu_base_options = @delegate_object
1278
+ link_state, block_name_from_cli, now_using_cli = initialize_selection_states
1279
+ menu_default_dname = nil
1280
+
1281
+ loop do
1282
+ # @bsp 'loop',block_name_from_cli,@cli_block_name
1283
+ block_name_from_cli, now_using_cli, blocks_in_file, menu_blocks, mdoc = \
1284
+ set_delobj_menu_loop_vars(block_name_from_cli, now_using_cli, link_state)
1285
+
1286
+ # cli or user selection
1287
+ #
1288
+ block_state = load_cli_or_user_selected_block(blocks_in_file, menu_blocks,
1289
+ menu_default_dname)
1290
+ if block_state.state == MenuState::EXIT
1291
+ # @bsp 'MenuState::EXIT -> break'
1292
+ break
1293
+ end
1294
+
1295
+ dump_and_warn_block_state(block_state.block)
1296
+ link_state, menu_default_dname = exec_bash_next_state(block_state.block, mdoc,
1297
+ link_state)
1298
+ if prompt_user_exit(block_name_from_cli, block_state.block)
1299
+ # @bsp 'prompt_user_exit -> break'
1300
+ break
1301
+ end
1302
+
1303
+ link_state.block_name, block_name_from_cli, cli_break = \
1304
+ next_state_from_cli(now_using_cli, block_state)
1305
+
1306
+ if cli_break
1307
+ # @bsp 'read_block_name_from_cli + next_link_state -> break'
1308
+ break
1309
+ end
1310
+ end
1311
+ rescue StandardError
1312
+ error_handler('document_menu_loop',
1313
+ { abort: true })
1314
+ end
1315
+
1316
+ def next_state_from_cli(now_using_cli, block_state)
1317
+ was_using_cli = now_using_cli
1318
+ block_name_from_cli, = read_block_name_from_cli(now_using_cli)
1319
+ block_name, block_name_from_cli, cli_break = \
1320
+ next_link_state(block_name_from_cli, was_using_cli, block_state)
1321
+
1322
+ [block_name, block_name_from_cli, cli_break]
1323
+ end
1324
+
1325
+ def exec_bash_next_state(block_state_block, mdoc, link_state)
1326
+ lfls = execute_shell_type(
1327
+ block_state_block,
1328
+ mdoc,
1329
+ link_state,
1330
+ block_source: { document_filename: @delegate_object[:filename] }
1331
+ )
1332
+
1333
+ # if the same menu is being displayed, collect the display name of the selected menu item for use as the default item
1334
+ [lfls.link_state,
1335
+ lfls.load_file == LoadFile::Load ? nil : block_state_block[:dname]]
1336
+ end
1337
+
1338
+ def set_delobj_menu_loop_vars(block_name_from_cli, now_using_cli, link_state)
1339
+ block_name_from_cli, now_using_cli = \
1340
+ manage_cli_selection_state(block_name_from_cli, now_using_cli, link_state)
1341
+ set_delob_filename_block_name(link_state, block_name_from_cli)
1342
+
1343
+ # update @delegate_object and @menu_base_options in auto_load
1344
+ #
1345
+ blocks_in_file, menu_blocks, mdoc = mdoc_menu_and_blocks_from_nested_files
1346
+ dump_delobj(blocks_in_file, menu_blocks, link_state)
1347
+
1348
+ [block_name_from_cli, now_using_cli, blocks_in_file, menu_blocks, mdoc]
1349
+ end
1350
+
1351
+ # user prompt to exit if the menu will be displayed again
1352
+ #
1353
+ def prompt_user_exit(block_name_from_cli, block_state_block)
1354
+ !block_name_from_cli &&
1355
+ block_state_block[:shell] == BlockType::BASH &&
1356
+ @delegate_object[:pause_after_script_execution] &&
1357
+ prompt_select_continue == MenuState::EXIT
1358
+ end
1359
+
1360
+ def manage_cli_selection_state(block_name_from_cli, now_using_cli, link_state)
1361
+ if block_name_from_cli && @cli_block_name == '.'
1362
+ # @bsp 'pause cli control, allow user to select block'
1363
+ block_name_from_cli = false
1364
+ now_using_cli = false
1365
+ @menu_base_options[:block_name] = \
1366
+ @delegate_object[:block_name] = \
1367
+ link_state.block_name = \
1368
+ @cli_block_name = nil
1369
+ end
1370
+
1371
+ @delegate_object = @menu_base_options.dup
1372
+ @menu_user_clicked_back_link = false
1373
+ [block_name_from_cli, now_using_cli]
1374
+ end
1375
+
1376
+ def next_link_state(block_name_from_cli, was_using_cli, block_state)
1377
+ # @bsp 'next_link_state',block_name_from_cli, was_using_cli, block_state
1378
+ # Set block_name based on block_name_from_cli
1379
+ block_name = block_name_from_cli ? @cli_block_name : nil
1380
+
1381
+ # Determine the state of breaker based on was_using_cli and the block type
1382
+ breaker = !block_name_from_cli && was_using_cli && block_state.block[:shell] == BlockType::BASH
1383
+
1384
+ # Reset block_name_from_cli if the conditions are not met
1385
+ block_name_from_cli ||= false
1386
+
1387
+ [block_name, block_name_from_cli, breaker]
1388
+ end
1389
+
1390
+ # Initialize the selection states for the execution loop.
1391
+ def initialize_selection_states
1277
1392
  link_state = LinkState.new(
1278
1393
  block_name: @delegate_object[:block_name],
1279
1394
  document_filename: @delegate_object[:filename]
1280
1395
  )
1281
- block_name_from_cli = link_state.block_name.present?
1282
- @cli_block_name = link_state.block_name
1283
- load_file = nil
1284
- menu_default_dname = nil
1396
+ block_name_from_cli, now_using_cli = handle_cli_block_name(link_state)
1397
+ [link_state, block_name_from_cli, now_using_cli]
1398
+ end
1285
1399
 
1286
- loop do
1287
- loop do
1288
- @delegate_object = @menu_base_options.dup
1289
- @menu_user_clicked_back_link = false
1290
- @delegate_object[:filename] = link_state.document_filename
1291
- link_state.block_name = @delegate_object[:block_name] =
1292
- block_name_from_cli ? @cli_block_name : link_state.block_name
1293
-
1294
- # update @delegate_object and @menu_base_options in auto_load
1295
- #
1296
- blocks_in_file, menu_blocks, mdoc = mdoc_menu_and_blocks_from_nested_files
1400
+ # Update the state related to CLI block name.
1401
+ #
1402
+ # This method updates the flags indicating whether a CLI block name is being used
1403
+ # and if it was being used previously.
1404
+ #
1405
+ # @param block_name_from_cli [Boolean] Indicates if the block name is from CLI.
1406
+ # @return [Array] Returns the updated state of block name from CLI and its usage.
1407
+ def read_block_name_from_cli(block_name_from_cli)
1408
+ # was_using_cli = block_name_from_cli
1409
+ block_name_from_cli = shift_cli_argument!
1410
+ now_using_cli = block_name_from_cli
1297
1411
 
1298
- if @delegate_object[:dump_delegate_object]
1299
- warn format_and_highlight_hash(
1300
- @delegate_object,
1301
- label: '@delegate_object'
1302
- )
1303
- end
1412
+ [block_name_from_cli, now_using_cli]
1413
+ end
1304
1414
 
1305
- if @delegate_object[:dump_blocks_in_file]
1306
- warn format_and_highlight_dependencies(
1307
- compact_and_index_hash(blocks_in_file),
1308
- label: 'blocks_in_file'
1309
- )
1310
- end
1311
- if @delegate_object[:dump_menu_blocks]
1312
- warn format_and_highlight_dependencies(
1313
- compact_and_index_hash(menu_blocks),
1314
- label: 'menu_blocks'
1315
- )
1316
- end
1317
- if @delegate_object[:dump_inherited_lines]
1318
- warn format_and_highlight_lines(
1319
- link_state.inherited_lines,
1320
- label: 'inherited_lines'
1321
- )
1322
- end
1415
+ # Update the block name in the link state and delegate object.
1416
+ #
1417
+ # This method updates the block name based on whether it was specified
1418
+ # through the CLI or derived from the link state.
1419
+ #
1420
+ # @param link_state [LinkState] The current link state object.
1421
+ # @param block_name_from_cli [Boolean] Indicates if the block name is from CLI.
1422
+ def set_delob_filename_block_name(link_state, block_name_from_cli)
1423
+ @delegate_object[:filename] = link_state.document_filename
1424
+ link_state.block_name = @delegate_object[:block_name] =
1425
+ block_name_from_cli ? @cli_block_name : link_state.block_name
1426
+ end
1323
1427
 
1324
- block_state = command_or_user_selected_block(blocks_in_file,
1325
- menu_blocks, menu_default_dname)
1326
- return if block_state.state == MenuState::EXIT
1428
+ # Handle CLI block name and determine the current CLI usage state.
1429
+ #
1430
+ # This method processes the CLI block name from the link state and sets
1431
+ # the initial state for CLI usage.
1432
+ #
1433
+ # @param link_state [LinkState] The current link state object.
1434
+ # @return [Array] Returns the state of block name from CLI and current usage of CLI.
1435
+ def handle_cli_block_name(link_state)
1436
+ block_name_from_cli = link_state.block_name.present?
1437
+ @cli_block_name = link_state.block_name
1438
+ now_using_cli = block_name_from_cli
1327
1439
 
1328
- if block_state.block.nil?
1329
- warn_format('select_execute_bash_and_special_blocks', "Block not found -- #{@delegate_object[:block_name]}",
1330
- { abort: true })
1331
- # error_handler("Block not found -- #{opts[:block_name]}", { abort: true })
1332
- end
1440
+ [block_name_from_cli, now_using_cli]
1441
+ end
1333
1442
 
1334
- if @delegate_object[:dump_selected_block]
1335
- warn block_state.block.to_yaml.sub(/^(?:---\n)?/, "Block:\n")
1336
- end
1443
+ # Outputs warnings based on the delegate object's configuration
1444
+ #
1445
+ # @param delegate_object [Hash] The delegate object containing configuration flags.
1446
+ # @param blocks_in_file [Hash] Hash of blocks present in the file.
1447
+ # @param menu_blocks [Hash] Hash of menu blocks.
1448
+ # @param link_state [LinkState] Current state of the link.
1449
+ def dump_delobj(blocks_in_file, menu_blocks, link_state)
1450
+ if @delegate_object[:dump_delegate_object]
1451
+ warn format_and_highlight_hash(@delegate_object, label: '@delegate_object')
1452
+ end
1337
1453
 
1338
- load_file_link_state = execute_bash_and_special_blocks(
1339
- block_state.block,
1340
- mdoc,
1341
- link_state,
1342
- block_source: { document_filename: @delegate_object[:filename] }
1343
- )
1344
- load_file = load_file_link_state.load_file
1345
- link_state = load_file_link_state.link_state
1454
+ if @delegate_object[:dump_blocks_in_file]
1455
+ warn format_and_highlight_dependencies(compact_and_index_hash(blocks_in_file),
1456
+ label: 'blocks_in_file')
1457
+ end
1346
1458
 
1347
- # if the same menu is being displayed, collect the display name of the selected menu item for use as the default item
1348
- menu_default_dname = load_file == LoadFile::Load ? nil : block_state.block[:dname]
1459
+ if @delegate_object[:dump_menu_blocks]
1460
+ warn format_and_highlight_dependencies(compact_and_index_hash(menu_blocks),
1461
+ label: 'menu_blocks')
1462
+ end
1349
1463
 
1350
- # user prompt to exit if the menu will be displayed again
1351
- #
1352
- if !block_name_from_cli &&
1353
- block_state.block[:shell] == BlockType::BASH &&
1354
- @delegate_object[:pause_after_script_execution] &&
1355
- prompt_select_continue == MenuState::EXIT
1356
- return
1357
- end
1464
+ return unless @delegate_object[:dump_inherited_lines]
1358
1465
 
1359
- # exit current document/menu if loading next document or single block_name was specified
1360
- #
1361
- break if block_state.state == MenuState::CONTINUE && load_file == LoadFile::Load
1362
- break if block_name_from_cli
1363
- end
1364
- break if load_file == LoadFile::Reuse
1466
+ warn format_and_highlight_lines(link_state.inherited_lines, label: 'inherited_lines')
1467
+ end
1365
1468
 
1366
- block_name_from_cli = pop_cli_argument!
1469
+ def dump_and_warn_block_state(block_state_block)
1470
+ if block_state_block.nil?
1471
+ Exceptions.warn_format("Block not found -- name: #{@delegate_object[:block_name]}",
1472
+ { abort: true })
1367
1473
  end
1368
- rescue StandardError
1369
- error_handler('select_execute_bash_and_special_blocks',
1370
- { abort: true })
1474
+
1475
+ return unless @delegate_object[:dump_selected_block]
1476
+
1477
+ warn block_state_block.to_yaml.sub(/^(?:---\n)?/, "Block:\n")
1371
1478
  end
1372
1479
 
1373
1480
  # Presents a TTY prompt to select an option or exit, returns metadata including option and selected
@@ -1561,7 +1668,7 @@ module MarkdownExec
1561
1668
  yield_line_if_selected(line, selected_messages, &block)
1562
1669
 
1563
1670
  else
1564
- # 'rejected'
1671
+ # @bsp 'line is not recognized for block state'
1565
1672
 
1566
1673
  end
1567
1674
  end
@@ -1988,7 +2095,7 @@ if $PROGRAM_NAME == __FILE__
1988
2095
  @hd.instance_variable_set(:@delegate_object,
1989
2096
  { block_name: 'block1' })
1990
2097
 
1991
- result = @hd.command_or_user_selected_block(all_blocks, [], nil)
2098
+ result = @hd.load_cli_or_user_selected_block(all_blocks, [], nil)
1992
2099
 
1993
2100
  assert_equal all_blocks.first, result.block
1994
2101
  assert_nil result.state
@@ -1999,7 +2106,7 @@ if $PROGRAM_NAME == __FILE__
1999
2106
  :some_state)
2000
2107
  @hd.stubs(:wait_for_user_selected_block).returns(block_state)
2001
2108
 
2002
- result = @hd.command_or_user_selected_block([], [], nil)
2109
+ result = @hd.load_cli_or_user_selected_block([], [], nil)
2003
2110
 
2004
2111
  assert_equal block_state.block, result.block
2005
2112
  assert_equal :some_state, result.state
@@ -2291,7 +2398,7 @@ if $PROGRAM_NAME == __FILE__
2291
2398
  @selected_item = mock('FCB')
2292
2399
  end
2293
2400
 
2294
- def test_compile_execute_bash_and_special_blocks_and_trigger_reuse_without_user_approval
2401
+ def test_compile_execute_and_trigger_reuse_without_user_approval
2295
2402
  # Mock the delegate object configuration
2296
2403
  @hd.instance_variable_set(:@delegate_object,
2297
2404
  { output_script: false,
@@ -2301,7 +2408,7 @@ if $PROGRAM_NAME == __FILE__
2301
2408
  # Expectations and assertions go here
2302
2409
  end
2303
2410
 
2304
- def test_compile_execute_bash_and_special_blocks_and_trigger_reuse_with_user_approval
2411
+ def test_compile_execute_and_trigger_reuse_with_user_approval
2305
2412
  # Mock the delegate object configuration
2306
2413
  @hd.instance_variable_set(:@delegate_object,
2307
2414
  { output_script: false,
@@ -2311,7 +2418,7 @@ if $PROGRAM_NAME == __FILE__
2311
2418
  # Expectations and assertions go here
2312
2419
  end
2313
2420
 
2314
- def test_compile_execute_bash_and_special_blocks_and_trigger_reuse_with_output_script
2421
+ def test_compile_execute_and_trigger_reuse_with_output_script
2315
2422
  # Mock the delegate object configuration
2316
2423
  @hd.instance_variable_set(:@delegate_object,
2317
2424
  { output_script: true,
@@ -7,5 +7,5 @@ module MarkdownExec
7
7
  BIN_NAME = 'mde'
8
8
  GEM_NAME = 'markdown_exec'
9
9
  TAP_DEBUG = 'MDE_DEBUG'
10
- VERSION = '1.8.5'
10
+ VERSION = '1.8.6'
11
11
  end
data/lib/markdown_exec.rb CHANGED
@@ -41,6 +41,8 @@ tap_config envvar: MarkdownExec::TAP_DEBUG
41
41
  $stderr.sync = true
42
42
  $stdout.sync = true
43
43
 
44
+ ARGV_SEP = '--'
45
+
44
46
  # custom error: file specified is missing
45
47
  #
46
48
  class FileMissingError < StandardError; end
@@ -136,10 +138,11 @@ module MarkdownExec
136
138
  )
137
139
  end
138
140
 
139
- # return arguments before `--`
141
+ # return arguments before ARGV_SEP
142
+ # arguments after ARGV_SEP are passed to the generatede script
140
143
  #
141
144
  def arguments_for_mde(argv = ARGV)
142
- case ind = argv.find_index('--')
145
+ case ind = argv.find_index(ARGV_SEP)
143
146
  when nil
144
147
  argv
145
148
  when 0
@@ -205,14 +208,13 @@ module MarkdownExec
205
208
  # Reports and executes block logic
206
209
  def execute_block_logic(files)
207
210
  @options[:filename] = select_document_if_multiple(files)
208
- @options.select_execute_bash_and_special_blocks
211
+ @options.document_menu_loop
209
212
  end
210
213
 
211
214
  ## Executes the block specified in the options
212
215
  #
213
216
  def execute_block_with_error_handling
214
217
  finalize_cli_argument_processing
215
- @options[:input_cli_rest] = @rest
216
218
  execute_code_block_based_on_options(@options)
217
219
  rescue FileMissingError
218
220
  warn "File missing: #{$!}"
@@ -293,6 +295,7 @@ module MarkdownExec
293
295
  #
294
296
  block_name = rest.shift
295
297
  @options[:block_name] = block_name if block_name.present?
298
+ @options[:input_cli_rest] = @rest
296
299
  rescue FileMissingError
297
300
  warn_format('finalize_cli_argument_processing',
298
301
  "File missing -- #{$!}", { abort: true })
@@ -346,10 +349,11 @@ module MarkdownExec
346
349
  ->(_) { exit }
347
350
  when 'find'
348
351
  ->(value) {
352
+ find_path = @options[:find_path].present? ? @options[:find_path] : @options[:path]
349
353
  @fout.fout 'Searching in: ' \
350
- "#{HashDelegator.new(@options).string_send_color(@options[:path],
354
+ "#{HashDelegator.new(@options).string_send_color(find_path,
351
355
  :menu_chrome_color)}"
352
- searcher = DirectorySearcher.new(value, [@options[:path]])
356
+ searcher = DirectorySearcher.new(value, [find_path])
353
357
 
354
358
  @fout.fout 'In file contents'
355
359
  hash = searcher.search_in_file_contents
@@ -546,7 +550,7 @@ module MarkdownExec
546
550
 
547
551
  saved_name_split filename
548
552
  @options[:save_executed_script] = false
549
- @options.select_execute_bash_and_special_blocks
553
+ @options.document_menu_loop
550
554
  rescue StandardError
551
555
  error_handler('run_last_script')
552
556
  end
@@ -613,7 +617,7 @@ module MarkdownExec
613
617
 
614
618
  saved_name_split(filename)
615
619
 
616
- @options.select_execute_bash_and_special_blocks ### ({ save_executed_script: false })
620
+ @options.document_menu_loop ### ({ save_executed_script: false })
617
621
  end
618
622
 
619
623
  public
data/lib/menu.src.yml CHANGED
@@ -17,7 +17,7 @@
17
17
 
18
18
  - :arg_name: NAME
19
19
  :compreply: false
20
- :description: Name of block
20
+ :description: Name of block to execute
21
21
  :env_var: MDE_BLOCK_NAME
22
22
  :long_name: block-name
23
23
  :opt_name: block_name
@@ -203,18 +203,20 @@
203
203
  ## match fenced code indented by spaces
204
204
  #
205
205
  - :default: "^(?<indent> *)`{3,}"
206
+ :description: Matches the start and end of a fenced code block
206
207
  :env_var: MDE_FENCED_START_AND_END_REGEX
207
208
  :opt_name: fenced_start_and_end_regex
208
209
  :procname: val_as_str
209
210
 
210
211
  - :default: "^(?<indent> *)`{3,}(?<shell>[^`\\s]*) *:?(?<name>[^\\s]*) *(?<rest>.*) *$"
212
+ :description: Match the start of a fenced block
211
213
  :env_var: MDE_FENCED_START_EXTENDED_REGEX
212
214
  :opt_name: fenced_start_extended_regex
213
215
  :procname: val_as_str
214
216
 
215
217
  - :arg_name: RELATIVE_PATH
216
218
  :compreply: "."
217
- :description: Name of document
219
+ :description: Name of the document to load
218
220
  :env_var: MDE_FILENAME
219
221
  :long_name: filename
220
222
  :opt_name: filename
@@ -228,6 +230,14 @@
228
230
  :procname: find
229
231
  :short_name: "?"
230
232
 
233
+ - :arg_name: FIND_PATH
234
+ :default: ""
235
+ :description: Path for find (uses PATH if empty)
236
+ :env_var: MDE_FIND_PATH
237
+ :long_name: find-path
238
+ :opt_name: find_path
239
+ :procname: val_as_str
240
+
231
241
  - :default: "^# *(?<name>[^#]*?) *$"
232
242
  :env_var: MDE_HEADING1_MATCH
233
243
  :opt_name: heading1_match
@@ -354,7 +364,7 @@
354
364
 
355
365
  - :arg_name: BOOL
356
366
  :default: false
357
- :description: Display headings (levels 1,2,3) in block selection menu
367
+ :description: Controls whether headings(levels 1,2,3) are displayed in the block selection menu
358
368
  :env_var: MDE_MENU_BLOCKS_WITH_HEADINGS
359
369
  :opt_name: menu_blocks_with_headings
360
370
  :procname: val_as_bool
@@ -424,7 +434,8 @@
424
434
 
425
435
  - :arg_name: BOOL
426
436
  :default: false
427
- :description: Include imported notes in menu
437
+ # :description: Include imported notes in menu
438
+ :description: Whether imported blocks should be included in the menu
428
439
  :env_var: MDE_MENU_INCLUDE_IMPORTED_NOTES
429
440
  :opt_name: menu_include_imported_notes
430
441
  :procname: val_as_bool
@@ -606,7 +617,7 @@
606
617
 
607
618
  - :arg_name: BOOL
608
619
  :default: true
609
- :description: Display standard output from execution
620
+ :description: Whether standard output from execution is displayed
610
621
  :env_var: MDE_OUTPUT_STDOUT
611
622
  :long_name: output-stdout
612
623
  :opt_name: output_stdout
@@ -628,14 +639,14 @@
628
639
 
629
640
  - :arg_name: BOOL
630
641
  :default: true
631
- :description: Pause afte executing a BASH block
632
- :env_var: MDE_PAUSE_after_script_execution
642
+ :description: Wheter to pause after manually executing a block and the next menu
643
+ :env_var: MDE_PAUSE_AFTER_SCRIPT_EXECUTION
633
644
  :opt_name: pause_after_script_execution
634
645
  :procname: val_as_bool
635
646
 
636
647
  - :default: "\nContinue?"
637
- :description: Prompt after script execution
638
- :env_var: MDE_PROMPT_after_script_execution
648
+ :description: Prompt after manually executing a block and the next menu
649
+ :env_var: MDE_PROMPT_AFTER_SCRIPT_EXECUTION
639
650
  :opt_name: prompt_after_script_execution
640
651
  :procname: val_as_str
641
652
 
@@ -717,7 +728,7 @@
717
728
 
718
729
  - :arg_name: BOOL
719
730
  :default: false
720
- :description: Save executed script
731
+ :description: Wheter to save an executed script`
721
732
  :env_var: MDE_SAVE_EXECUTED_SCRIPT
722
733
  :long_name: save-executed-script
723
734
  :opt_name: save_executed_script
@@ -759,7 +770,7 @@
759
770
 
760
771
  - :arg_name: RELATIVE_PATH
761
772
  :default: logs
762
- :description: Saved script folder
773
+ :description: Folder where saved scripts are stored
763
774
  :env_var: MDE_SAVED_SCRIPT_FOLDER
764
775
  :long_name: saved-script-folder
765
776
  :opt_name: saved_script_folder
@@ -884,7 +895,7 @@
884
895
 
885
896
  - :arg_name: BOOL
886
897
  :default: true
887
- :description: Pause for user to approve script
898
+ :description: Requires user approval before executing a script
888
899
  :env_var: MDE_USER_MUST_APPROVE
889
900
  :long_name: user-must-approve
890
901
  :opt_name: user_must_approve
data/lib/menu.yml CHANGED
@@ -1,4 +1,4 @@
1
- # MDE - Markdown Executor (1.8.5)
1
+ # MDE - Markdown Executor (1.8.6)
2
2
  ---
3
3
  - :description: Show current configuration values
4
4
  :procname: show_config
@@ -15,7 +15,7 @@
15
15
  :procname: val_as_str
16
16
  - :arg_name: NAME
17
17
  :compreply: false
18
- :description: Name of block
18
+ :description: Name of block to execute
19
19
  :env_var: MDE_BLOCK_NAME
20
20
  :long_name: block-name
21
21
  :opt_name: block_name
@@ -174,17 +174,19 @@
174
174
  :procname: exit
175
175
  :short_name: x
176
176
  - :default: "^(?<indent> *)`{3,}"
177
+ :description: Matches the start and end of a fenced code block
177
178
  :env_var: MDE_FENCED_START_AND_END_REGEX
178
179
  :opt_name: fenced_start_and_end_regex
179
180
  :procname: val_as_str
180
181
  - :default: "^(?<indent> *)`{3,}(?<shell>[^`\\s]*) *:?(?<name>[^\\s]*) *(?<rest>.*)
181
182
  *$"
183
+ :description: Match the start of a fenced block
182
184
  :env_var: MDE_FENCED_START_EXTENDED_REGEX
183
185
  :opt_name: fenced_start_extended_regex
184
186
  :procname: val_as_str
185
187
  - :arg_name: RELATIVE_PATH
186
188
  :compreply: "."
187
- :description: Name of document
189
+ :description: Name of the document to load
188
190
  :env_var: MDE_FILENAME
189
191
  :long_name: filename
190
192
  :opt_name: filename
@@ -196,6 +198,13 @@
196
198
  :long_name: find
197
199
  :procname: find
198
200
  :short_name: "?"
201
+ - :arg_name: FIND_PATH
202
+ :default: ''
203
+ :description: Path for find (uses PATH if empty)
204
+ :env_var: MDE_FIND_PATH
205
+ :long_name: find-path
206
+ :opt_name: find_path
207
+ :procname: val_as_str
199
208
  - :default: "^# *(?<name>[^#]*?) *$"
200
209
  :env_var: MDE_HEADING1_MATCH
201
210
  :opt_name: heading1_match
@@ -300,7 +309,8 @@
300
309
  :procname: val_as_bool
301
310
  - :arg_name: BOOL
302
311
  :default: false
303
- :description: Display headings (levels 1,2,3) in block selection menu
312
+ :description: Controls whether headings(levels 1,2,3) are displayed in the block
313
+ selection menu
304
314
  :env_var: MDE_MENU_BLOCKS_WITH_HEADINGS
305
315
  :opt_name: menu_blocks_with_headings
306
316
  :procname: val_as_bool
@@ -359,7 +369,7 @@
359
369
  :procname: val_as_bool
360
370
  - :arg_name: BOOL
361
371
  :default: false
362
- :description: Include imported notes in menu
372
+ :description: Whether imported blocks should be included in the menu
363
373
  :env_var: MDE_MENU_INCLUDE_IMPORTED_NOTES
364
374
  :opt_name: menu_include_imported_notes
365
375
  :procname: val_as_bool
@@ -511,7 +521,7 @@
511
521
  :procname: val_as_bool
512
522
  - :arg_name: BOOL
513
523
  :default: true
514
- :description: Display standard output from execution
524
+ :description: Whether standard output from execution is displayed
515
525
  :env_var: MDE_OUTPUT_STDOUT
516
526
  :long_name: output-stdout
517
527
  :opt_name: output_stdout
@@ -530,15 +540,15 @@
530
540
  :short_name: p
531
541
  - :arg_name: BOOL
532
542
  :default: true
533
- :description: Pause afte executing a BASH block
534
- :env_var: MDE_PAUSE_after_script_execution
543
+ :description: Wheter to pause after manually executing a block and the next menu
544
+ :env_var: MDE_PAUSE_AFTER_SCRIPT_EXECUTION
535
545
  :opt_name: pause_after_script_execution
536
546
  :procname: val_as_bool
537
547
  - :default: |2-
538
548
 
539
549
  Continue?
540
- :description: Prompt after script execution
541
- :env_var: MDE_PROMPT_after_script_execution
550
+ :description: Prompt after manually executing a block and the next menu
551
+ :env_var: MDE_PROMPT_AFTER_SCRIPT_EXECUTION
542
552
  :opt_name: prompt_after_script_execution
543
553
  :procname: val_as_str
544
554
  - :default: |2-
@@ -615,7 +625,7 @@
615
625
  :procname: val_as_int
616
626
  - :arg_name: BOOL
617
627
  :default: false
618
- :description: Save executed script
628
+ :description: Wheter to save an executed script`
619
629
  :env_var: MDE_SAVE_EXECUTED_SCRIPT
620
630
  :long_name: save-executed-script
621
631
  :opt_name: save_executed_script
@@ -651,7 +661,7 @@
651
661
  :procname: val_as_str
652
662
  - :arg_name: RELATIVE_PATH
653
663
  :default: logs
654
- :description: Saved script folder
664
+ :description: Folder where saved scripts are stored
655
665
  :env_var: MDE_SAVED_SCRIPT_FOLDER
656
666
  :long_name: saved-script-folder
657
667
  :opt_name: saved_script_folder
@@ -760,7 +770,7 @@
760
770
  :procname: val_as_bool
761
771
  - :arg_name: BOOL
762
772
  :default: true
763
- :description: Pause for user to approve script
773
+ :description: Requires user approval before executing a script
764
774
  :env_var: MDE_USER_MUST_APPROVE
765
775
  :long_name: user-must-approve
766
776
  :opt_name: user_must_approve
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # encoding=utf-8
5
+
6
+ require 'find'
7
+
8
+ class RegexpReplacer
9
+ # Constructor to initialize with file path
10
+ def initialize(file_path)
11
+ @file_path = file_path
12
+ end
13
+
14
+ # Perform the replacement based on the specified option
15
+ def perform_replacement(option)
16
+ content = File.read(@file_path)
17
+ modified_content = case option
18
+ when 1
19
+ replace_pattern1(content)
20
+ when 2
21
+ replace_pattern2(content)
22
+ else
23
+ raise "Invalid option. Please choose 1 or 2."
24
+ end
25
+ File.write(@file_path, modified_content)
26
+ end
27
+
28
+ private
29
+
30
+ # Replacement for pattern 1
31
+ def replace_pattern1(content)
32
+ regexp = /^( *)# (@\w+) ('.+)/
33
+ substitution = '\1;;pp __LINE__,\3 #\2'
34
+ content.gsub(regexp, substitution)
35
+ end
36
+
37
+ # Replacement for pattern 2
38
+ def replace_pattern2(content)
39
+ regexp = /^( *);;pp __LINE__,(.+) #(@\w+)/
40
+ substitution = '\1# \3 \2'
41
+ content.gsub(regexp, substitution)
42
+ end
43
+ end
44
+
45
+ # Running the script with command line arguments
46
+ if ARGV.length != 2
47
+ puts "Usage: ruby regexp_replacer.rb [file_path] [option (1 or 2)]"
48
+ exit
49
+ end
50
+
51
+ file_path, option = ARGV
52
+ replacer = RegexpReplacer.new(file_path)
53
+ begin
54
+ replacer.perform_replacement(option.to_i)
55
+ puts "Replacement performed successfully."
56
+ rescue StandardError => e
57
+ puts "Error: #{e.message}"
58
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: markdown_exec
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.5
4
+ version: 1.8.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fareed Stevenson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-22 00:00:00.000000000 Z
11
+ date: 2023-12-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: clipboard
@@ -157,6 +157,7 @@ files:
157
157
  - lib/option_value.rb
158
158
  - lib/pty1.rb
159
159
  - lib/regexp.rb
160
+ - lib/regexp_replacer.rb
160
161
  - lib/rspec_helpers.rb
161
162
  - lib/saved_assets.rb
162
163
  - lib/saved_files_matcher.rb