markdown_exec 2.0.6 → 2.0.8

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.
@@ -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 = '2.0.6'
10
+ VERSION = '2.0.8'
11
11
  end
data/lib/markdown_exec.rb CHANGED
@@ -749,6 +749,7 @@ module MarkdownExec
749
749
  def select_option_or_exit(prompt_text, strings, opts = {})
750
750
  result = @options.select_option_with_metadata(prompt_text, strings,
751
751
  opts)
752
+ ### 2024-04-20 what for?
752
753
  # return unless result.fetch(:option, nil)
753
754
 
754
755
  result[:selected]
data/lib/mdoc.rb CHANGED
@@ -72,11 +72,10 @@ module MarkdownExec
72
72
  #
73
73
  def collect_block_dependencies(anyname:)
74
74
  name_block = get_block_by_anyname(anyname)
75
- if name_block.nil? || name_block.keys.empty?
76
- raise "Named code block `#{anyname}` not found. (@#{__LINE__})"
77
- end
75
+ raise "Named code block `#{anyname}` not found. (@#{__LINE__})" if name_block.nil? || name_block.keys.empty?
76
+
77
+ nickname = name_block.pub_name
78
78
 
79
- nickname = name_block[:nickname] || name_block[:oname]
80
79
  dependencies = collect_dependencies(nickname)
81
80
  # &bc 'dependencies.count:',dependencies.count
82
81
  all_dependency_names = collect_unique_names(dependencies).push(nickname).uniq
@@ -85,9 +84,7 @@ module MarkdownExec
85
84
  # select non-chrome blocks in order of appearance in source documents
86
85
  #
87
86
  blocks = @table.select do |fcb|
88
- !fcb.fetch(:chrome,
89
- false) && all_dependency_names.include?(fcb.fetch(:nickname,
90
- nil) || fcb.fetch(:oname))
87
+ !fcb.fetch(:chrome, false) && all_dependency_names.include?(fcb.pub_name)
91
88
  end
92
89
  # &bc 'blocks.count:',blocks.count
93
90
 
@@ -95,7 +92,7 @@ module MarkdownExec
95
92
  #
96
93
  unmet_dependencies = all_dependency_names.dup
97
94
  blocks = blocks.map do |fcb|
98
- unmet_dependencies.delete(fcb[:nickname] || fcb[:oname]) # may not exist if block name is duplicated
95
+ unmet_dependencies.delete(fcb.pub_name) # may not exist if block name is duplicated
99
96
  if (call = fcb[:call])
100
97
  [get_block_by_anyname("[#{call.match(/^%\((\S+) |\)/)[1]}]")
101
98
  .merge({ cann: call })]
@@ -124,7 +121,7 @@ module MarkdownExec
124
121
  # &bc 'blocks.count:',blocks.count
125
122
 
126
123
  block_search.merge(
127
- { block_names: blocks.map { |block| block[:nickname] || block[:oname] },
124
+ { block_names: blocks.map(&:pub_name),
128
125
  code: blocks.map do |fcb|
129
126
  if fcb[:cann]
130
127
  collect_block_code_cann(fcb)
@@ -136,7 +133,7 @@ module MarkdownExec
136
133
  elsif fcb[:shell] == BlockType::PORT
137
134
  collect_block_code_shell(fcb)
138
135
  elsif label_body
139
- block_name_for_bash_comment = (fcb[:nickname] || fcb[:oname]).gsub(/\s+/, '_')
136
+ block_name_for_bash_comment = fcb.pub_name.gsub(/\s+/, '_')
140
137
  [label_format_above && format(label_format_above,
141
138
  block_source.merge({ block_name: block_name_for_bash_comment }))] +
142
139
  fcb[:body] +
@@ -198,7 +195,7 @@ module MarkdownExec
198
195
 
199
196
  ### hide rows correctly
200
197
 
201
- if !options[:menu_include_imported_blocks]
198
+ unless options[:menu_include_imported_blocks]
202
199
  selrows = selrows.reject do |block|
203
200
  block.fetch(:depth, 0).positive?
204
201
  end
@@ -287,9 +284,7 @@ module MarkdownExec
287
284
  return memo if memo.keys.include? source
288
285
 
289
286
  block = get_block_by_anyname(source)
290
- if block.nil? || block.keys.empty?
291
- raise "Named code block `#{source}` not found. (@#{__LINE__})"
292
- end
287
+ raise "Named code block `#{source}` not found. (@#{__LINE__})" if block.nil? || block.keys.empty?
293
288
 
294
289
  memo[source] = block[:reqs]
295
290
  return memo unless memo[source]&.count&.positive?
data/lib/menu.src.yml CHANGED
@@ -106,6 +106,12 @@
106
106
  :opt_name: display_level_xbase_prefix
107
107
  :procname: val_as_str
108
108
 
109
+ # - :default: "(document_link)"
110
+ # :description: Name of Link block to load with the document
111
+ # :env_var: MDE_DOCUMENT_LOAD_LINK_BLOCK_NAME
112
+ # :opt_name: document_load_link_block_name
113
+ # :procname: val_as_str
114
+
109
115
  - :default: "(document_options)"
110
116
  :description: Name of Opts block to load with the document
111
117
  :env_var: MDE_DOCUMENT_LOAD_OPTS_BLOCK_NAME
@@ -227,6 +233,8 @@
227
233
  :opt_name: exclude_expect_blocks
228
234
  :procname: val_as_bool
229
235
 
236
+ # - :default: >
237
+ # osascript scripts/applescript/mde.applescript "%{batch_index}" "%{home}" " %{started_at} - %{document_filename} - %{block_name} " "%{script_filespec}" "%{output_filespec}"
230
238
  - :default: >
231
239
  osascript -e '
232
240
  on run argv
@@ -328,17 +336,17 @@
328
336
  :opt_name: find_path
329
337
  :procname: val_as_str
330
338
 
331
- - :default: "^# *(?<line>[^#]*?) *$"
339
+ - :default: "^#(?<line>(?!#)(?<indent>[ \t]*)(?<text>.*?)(?<trailing>[ \t]*))?$"
332
340
  :env_var: MDE_HEADING1_MATCH
333
341
  :opt_name: heading1_match
334
342
  :procname: val_as_str
335
343
 
336
- - :default: "^## *(?<line>[^#]*?) *$"
344
+ - :default: "^##(?<line>(?!#)(?<indent>[ \t]*)(?<text>.*?)(?<trailing>[ \t]*))?$"
337
345
  :env_var: MDE_HEADING2_MATCH
338
346
  :opt_name: heading2_match
339
347
  :procname: val_as_str
340
348
 
341
- - :default: "^### *(?<line>.+?) *$"
349
+ - :default: "^###(?<line>(?<indent>[ \t]*)(?<text>.*?)(?<trailing>[ \t]*))?$"
342
350
  :env_var: MDE_HEADING3_MATCH
343
351
  :opt_name: heading3_match
344
352
  :procname: val_as_str
@@ -496,7 +504,7 @@
496
504
  :opt_name: menu_divider_format
497
505
  :procname: val_as_str
498
506
 
499
- - :default: "^::: +(?<line>.+?)$"
507
+ - :default: "^:::(?<line>(?<indent>[ \t]*)(?<text>.*?)(?<trailing>[ \t]*))?$"
500
508
  :description: Pattern for topics/dividers in block selection menu
501
509
  :env_var: MDE_MENU_DIVIDER_MATCH
502
510
  :opt_name: menu_divider_match
@@ -529,37 +537,40 @@
529
537
  :opt_name: menu_final_divider
530
538
  :procname: val_as_str
531
539
 
532
- - :default: fg_rgbh_80_80_c0
540
+ - :default: fg_bg_rgbh_80_80_c0_10_10_20
533
541
  :description: Color for heading 1 in menu
534
542
  :env_var: MDE_MENU_HEADING1_COLOR
535
543
  :opt_name: menu_heading1_color
536
544
  :procname: val_as_str
537
545
 
538
- - :default: "# %{line}"
546
+ # strip heading tag
547
+ - :default: "%{line}"
539
548
  :description: format for menu heading1 in menu
540
549
  :env_var: MDE_MENU_HEADING1_FORMAT
541
550
  :opt_name: menu_heading1_format
542
551
  :procname: val_as_str
543
552
 
544
- - :default: fg_rgbh_60_60_c0
553
+ - :default: fg_bg_rgbh_60_60_c0_10_10_20
545
554
  :description: Color for heading 2 in menu
546
555
  :env_var: MDE_MENU_HEADING2_COLOR
547
556
  :opt_name: menu_heading2_color
548
557
  :procname: val_as_str
549
558
 
550
- - :default: "## %{line}"
559
+ # strip heading tag
560
+ - :default: "%{line}"
551
561
  :description: format for menu heading2 in menu
552
562
  :env_var: MDE_MENU_HEADING2_FORMAT
553
563
  :opt_name: menu_heading2_format
554
564
  :procname: val_as_str
555
565
 
556
- - :default: fg_rgbh_40_40_c0
566
+ - :default: fg_bg_rgbh_40_40_c0_10_10_20
557
567
  :description: Color for heading 3 in menu
558
568
  :env_var: MDE_MENU_HEADING3_COLOR
559
569
  :opt_name: menu_heading3_color
560
570
  :procname: val_as_str
561
571
 
562
- - :default: "### %{line}"
572
+ # strip heading tag
573
+ - :default: "%{line}"
563
574
  :description: format for menu heading3 in menu
564
575
  :env_var: MDE_MENU_HEADING3_FORMAT
565
576
  :opt_name: menu_heading3_format
@@ -624,7 +635,7 @@
624
635
  :opt_name: menu_link_format
625
636
  :procname: val_as_str
626
637
 
627
- - :default: fg_rgbh_b0_b0_b0
638
+ - :default: fg_rgbh_c0_c0_c0
628
639
  :description: Color of menu note
629
640
  :env_var: MDE_MENU_NOTE_COLOR
630
641
  :opt_name: menu_note_color
@@ -637,7 +648,7 @@
637
648
  :procname: val_as_str
638
649
 
639
650
  ## all lines that do not start with "/ " are notes
640
- - :default: "^(?<line>(?!/ ).*)?$"
651
+ - :default: "^(?<line>(?!/ )(?<indent>[ \t]*)(?<text>.*?)(?<trailing>[ \t]*))?$"
641
652
  :description: Pattern for notes in block selection menu
642
653
  :env_var: MDE_MENU_NOTE_MATCH
643
654
  :opt_name: menu_note_match
@@ -678,6 +689,13 @@
678
689
  :opt_name: menu_option_save_name
679
690
  :procname: val_as_str
680
691
 
692
+ - :default:
693
+ :line: "! Shell"
694
+ :description: Text for Shell option
695
+ :env_var: MDE_MENU_OPTION_SHELL_NAME
696
+ :opt_name: menu_option_shell_name
697
+ :procname: val_as_str
698
+
681
699
  - :default:
682
700
  :line: "* View"
683
701
  :description: Text for View option
@@ -709,6 +727,13 @@
709
727
  :opt_name: menu_persist_block_name
710
728
  :procname: val_as_str
711
729
 
730
+ - :arg_name: BOOL
731
+ :default: true
732
+ :description: Resize terminal when displaying menu.
733
+ :env_var: MDE_MENU_RESIZE_TERMINAL
734
+ :opt_name: menu_resize_terminal
735
+ :procname: val_as_bool
736
+
712
737
  - :default: fg_rgbh_ff_ff_ff
713
738
  :description: Color of menu task
714
739
  :env_var: MDE_MENU_TASK_COLOR
@@ -772,6 +797,13 @@
772
797
  :opt_name: menu_with_inherited_lines
773
798
  :procname: val_as_bool
774
799
 
800
+ - :arg_name: BOOL
801
+ :default: true
802
+ :description: Display Shell option in menu
803
+ :env_var: MDE_MENU_WITH_SHELL
804
+ :opt_name: menu_with_shell
805
+ :procname: val_as_bool
806
+
775
807
  - :arg_name: BOOL
776
808
  :default: false
777
809
  :description: Hide decorative menu entries
@@ -874,7 +906,7 @@
874
906
 
875
907
  - :arg_name: BOOL
876
908
  :default: false
877
- :description: Wheter to pause after manually executing a block and the next menu
909
+ :description: Whether to pause after manually executing a block and the next menu
878
910
  :env_var: MDE_PAUSE_AFTER_SCRIPT_EXECUTION
879
911
  :opt_name: pause_after_script_execution
880
912
  :procname: val_as_bool
data/lib/menu.yml CHANGED
@@ -1,4 +1,4 @@
1
- # MDE - Markdown Executor (2.0.6)
1
+ # MDE - Markdown Executor (2.0.8)
2
2
  ---
3
3
  - :description: Show current configuration values
4
4
  :procname: show_config
@@ -285,15 +285,15 @@
285
285
  :long_name: find-path
286
286
  :opt_name: find_path
287
287
  :procname: val_as_str
288
- - :default: "^# *(?<line>[^#]*?) *$"
288
+ - :default: "^#(?<line>(?!#)(?<indent>[ \t]*)(?<text>.*?)(?<trailing>[ \t]*))?$"
289
289
  :env_var: MDE_HEADING1_MATCH
290
290
  :opt_name: heading1_match
291
291
  :procname: val_as_str
292
- - :default: "^## *(?<line>[^#]*?) *$"
292
+ - :default: "^##(?<line>(?!#)(?<indent>[ \t]*)(?<text>.*?)(?<trailing>[ \t]*))?$"
293
293
  :env_var: MDE_HEADING2_MATCH
294
294
  :opt_name: heading2_match
295
295
  :procname: val_as_str
296
- - :default: "^### *(?<line>.+?) *$"
296
+ - :default: "^###(?<line>(?<indent>[ \t]*)(?<text>.*?)(?<trailing>[ \t]*))?$"
297
297
  :env_var: MDE_HEADING3_MATCH
298
298
  :opt_name: heading3_match
299
299
  :procname: val_as_str
@@ -425,7 +425,7 @@
425
425
  :env_var: MDE_MENU_DIVIDER_FORMAT
426
426
  :opt_name: menu_divider_format
427
427
  :procname: val_as_str
428
- - :default: "^::: +(?<line>.+?)$"
428
+ - :default: "^:::(?<line>(?<indent>[ \t]*)(?<text>.*?)(?<trailing>[ \t]*))?$"
429
429
  :description: Pattern for topics/dividers in block selection menu
430
430
  :env_var: MDE_MENU_DIVIDER_MATCH
431
431
  :opt_name: menu_divider_match
@@ -453,32 +453,32 @@
453
453
  :env_var: MDE_MENU_FINAL_DIVIDER
454
454
  :opt_name: menu_final_divider
455
455
  :procname: val_as_str
456
- - :default: fg_rgbh_80_80_c0
456
+ - :default: fg_bg_rgbh_80_80_c0_10_10_20
457
457
  :description: Color for heading 1 in menu
458
458
  :env_var: MDE_MENU_HEADING1_COLOR
459
459
  :opt_name: menu_heading1_color
460
460
  :procname: val_as_str
461
- - :default: "# %{line}"
461
+ - :default: "%{line}"
462
462
  :description: format for menu heading1 in menu
463
463
  :env_var: MDE_MENU_HEADING1_FORMAT
464
464
  :opt_name: menu_heading1_format
465
465
  :procname: val_as_str
466
- - :default: fg_rgbh_60_60_c0
466
+ - :default: fg_bg_rgbh_60_60_c0_10_10_20
467
467
  :description: Color for heading 2 in menu
468
468
  :env_var: MDE_MENU_HEADING2_COLOR
469
469
  :opt_name: menu_heading2_color
470
470
  :procname: val_as_str
471
- - :default: "## %{line}"
471
+ - :default: "%{line}"
472
472
  :description: format for menu heading2 in menu
473
473
  :env_var: MDE_MENU_HEADING2_FORMAT
474
474
  :opt_name: menu_heading2_format
475
475
  :procname: val_as_str
476
- - :default: fg_rgbh_40_40_c0
476
+ - :default: fg_bg_rgbh_40_40_c0_10_10_20
477
477
  :description: Color for heading 3 in menu
478
478
  :env_var: MDE_MENU_HEADING3_COLOR
479
479
  :opt_name: menu_heading3_color
480
480
  :procname: val_as_str
481
- - :default: "### %{line}"
481
+ - :default: "%{line}"
482
482
  :description: format for menu heading3 in menu
483
483
  :env_var: MDE_MENU_HEADING3_FORMAT
484
484
  :opt_name: menu_heading3_format
@@ -532,7 +532,7 @@
532
532
  :env_var: MDE_MENU_LINK_FORMAT
533
533
  :opt_name: menu_link_format
534
534
  :procname: val_as_str
535
- - :default: fg_rgbh_b0_b0_b0
535
+ - :default: fg_rgbh_c0_c0_c0
536
536
  :description: Color of menu note
537
537
  :env_var: MDE_MENU_NOTE_COLOR
538
538
  :opt_name: menu_note_color
@@ -542,7 +542,7 @@
542
542
  :env_var: MDE_MENU_NOTE_FORMAT
543
543
  :opt_name: menu_note_format
544
544
  :procname: val_as_str
545
- - :default: "^(?<line>(?!/ ).*)?$"
545
+ - :default: "^(?<line>(?!/ )(?<indent>[ \t]*)(?<text>.*?)(?<trailing>[ \t]*))?$"
546
546
  :description: Pattern for notes in block selection menu
547
547
  :env_var: MDE_MENU_NOTE_MATCH
548
548
  :opt_name: menu_note_match
@@ -577,6 +577,12 @@
577
577
  :env_var: MDE_MENU_OPTION_SAVE_NAME
578
578
  :opt_name: menu_option_save_name
579
579
  :procname: val_as_str
580
+ - :default:
581
+ :line: "! Shell"
582
+ :description: Text for Shell option
583
+ :env_var: MDE_MENU_OPTION_SHELL_NAME
584
+ :opt_name: menu_option_shell_name
585
+ :procname: val_as_str
580
586
  - :default:
581
587
  :line: "* View"
582
588
  :description: Text for View option
@@ -603,6 +609,12 @@
603
609
  :env_var: MDE_MENU_PERSIST_BLOCK_NAME
604
610
  :opt_name: menu_persist_block_name
605
611
  :procname: val_as_str
612
+ - :arg_name: BOOL
613
+ :default: true
614
+ :description: Resize terminal when displaying menu.
615
+ :env_var: MDE_MENU_RESIZE_TERMINAL
616
+ :opt_name: menu_resize_terminal
617
+ :procname: val_as_bool
606
618
  - :default: fg_rgbh_ff_ff_ff
607
619
  :description: Color of menu task
608
620
  :env_var: MDE_MENU_TASK_COLOR
@@ -656,6 +668,12 @@
656
668
  :env_var: MDE_MENU_WITH_INHERITED_LINES
657
669
  :opt_name: menu_with_inherited_lines
658
670
  :procname: val_as_bool
671
+ - :arg_name: BOOL
672
+ :default: true
673
+ :description: Display Shell option in menu
674
+ :env_var: MDE_MENU_WITH_SHELL
675
+ :opt_name: menu_with_shell
676
+ :procname: val_as_bool
659
677
  - :arg_name: BOOL
660
678
  :default: false
661
679
  :description: Hide decorative menu entries
@@ -743,7 +761,7 @@
743
761
  :short_name: p
744
762
  - :arg_name: BOOL
745
763
  :default: false
746
- :description: Wheter to pause after manually executing a block and the next menu
764
+ :description: Whether to pause after manually executing a block and the next menu
747
765
  :env_var: MDE_PAUSE_AFTER_SCRIPT_EXECUTION
748
766
  :opt_name: pause_after_script_execution
749
767
  :procname: val_as_bool
@@ -0,0 +1,215 @@
1
+ #!/usr/bin/env bundle exec ruby
2
+ # frozen_string_literal: true
3
+
4
+ # encoding=utf-8
5
+ require 'io/console'
6
+ require 'timeout'
7
+
8
+ # This function attempts to resize the terminal to its maximum supported size.
9
+ # It checks if the script is running in an interactive terminal with no arguments.
10
+ # If so, it sends escape sequences to query the terminal size and reads the response.
11
+ # It then compares the current terminal size with the calculated size and adjusts if necessary.
12
+ # If the terminal emulator is unsupported, it prints an error message.
13
+ def resize_terminal(show_dims: false, show_rectangle: false)
14
+ # Check if running in an interactive terminal and no arguments are provided
15
+ if $stdin.tty? && ARGV.empty?
16
+ begin
17
+ # Save the current state and send the escape sequence to get the cursor position
18
+ print "\e7\e[r\e[999;999H\e[6n\e8"
19
+ $stdout.flush
20
+
21
+ # Read the response from the terminal
22
+ response = String.new
23
+ Timeout.timeout(5) do
24
+ loop do
25
+ char = $stdin.getch
26
+ response << char
27
+ break if response.include?('R')
28
+ end
29
+ end
30
+
31
+ if response.empty?
32
+ warn "Error: No response received from terminal. Response: #{response.inspect}"
33
+ return 1
34
+ end
35
+
36
+ # Match the response to extract the terminal dimensions
37
+ match_data = response.match(/\[(\d+);(\d+)R/)
38
+ unless match_data
39
+ warn "Error: Failed to match terminal response pattern. Response: #{response.inspect}"
40
+ return 1
41
+ end
42
+
43
+ calculated_rows, calculated_columns = match_data.captures.map(&:to_i)
44
+
45
+ if ENV['COLUMNS'].to_i == calculated_columns && ENV['LINES'].to_i == calculated_rows
46
+ puts "#{ENV.fetch('TERM', nil)} #{calculated_columns}x#{calculated_rows}"
47
+ elsif calculated_columns.positive? && calculated_rows.positive?
48
+ warn "#{ENV.fetch('COLUMNS', nil)}x#{ENV.fetch('LINES', nil)} -> #{calculated_columns}x#{calculated_rows}" if show_dims
49
+ system("stty cols #{calculated_columns} rows #{calculated_rows}")
50
+ else
51
+ warn "Error: Calculated terminal size is invalid. Columns: #{calculated_columns}, Rows: #{calculated_rows}"
52
+ return 1
53
+ end
54
+
55
+ # Display a text rectangle if the option is enabled
56
+ display_terminal_rectangle(calculated_columns, calculated_rows) if show_rectangle
57
+ rescue Timeout::Error
58
+ warn 'Error: Timeout while reading terminal response. Unsupported terminal emulator.'
59
+ 1
60
+ rescue StandardError => err
61
+ warn "Error: #{err.message}. Unsupported terminal emulator."
62
+ 1
63
+ end
64
+ else
65
+ warn 'Usage: resize_terminal'
66
+ end
67
+ end
68
+
69
+ # This function draws a rectangle of the given width and height
70
+ # with stars on the edges and empty space inside.
71
+ def display_terminal_rectangle(width, height)
72
+ puts '*' * width
73
+ (height - 2).times { puts "*#{' ' * (width - 2)}*" }
74
+ puts '*' * width
75
+ end
76
+
77
+ # resize_terminal(show_rectangle: true) if __FILE__ == $PROGRAM_NAME
78
+ return if __FILE__ != $PROGRAM_NAME
79
+
80
+ require 'minitest/autorun'
81
+
82
+ class ResizeTerminalTest < Minitest::Test
83
+ def setup
84
+ # Backup original ARGV and environment variables
85
+ @original_argv = ARGV.dup
86
+ @original_columns = ENV.fetch('COLUMNS', nil)
87
+ @original_lines = ENV.fetch('LINES', nil)
88
+ end
89
+
90
+ def teardown
91
+ # Restore original ARGV and environment variables
92
+ ARGV.replace(@original_argv)
93
+ ENV['COLUMNS'] = @original_columns
94
+ ENV['LINES'] = @original_lines
95
+ end
96
+
97
+ # def test_resize_terminal_successful
98
+ # # Simulate interactive terminal
99
+ # $stdin.stub(:tty?, true) do
100
+ # ARGV.replace([])
101
+ # ENV['COLUMNS'] = '80'
102
+ # ENV['LINES'] = '24'
103
+ # response = "\e[999;999H\e[6n\e[24;80R"
104
+ # $stdin.stub(:getch, -> { response.slice!(0) || '' }) do
105
+ # assert_output(nil, /24x80/) do
106
+ # resize_terminal
107
+ # end
108
+ # end
109
+ # end
110
+ # end
111
+ def test_resize_terminal_successful
112
+ # Simulate interactive terminal
113
+ $stdin.stub(:tty?, true) do
114
+ ARGV.replace([])
115
+ columns = 40 + (2 * rand(10))
116
+ ENV['COLUMNS'] = columns.to_s
117
+ ENV['LINES'] = '24'
118
+ response = "\e[999;999H\e[6n\e[24;#{columns}R".dup
119
+ $stdin.stub(:getch, -> { response.slice!(0) || '' }) do
120
+ assert_output("\e7\e[r\e[999;999H\e[6n\e8xterm-256color #{columns}x24\n") do
121
+ # assert_output('', '') do
122
+ resize_terminal
123
+ end
124
+ end
125
+ end
126
+ end
127
+
128
+ def test_resize_terminal_no_response
129
+ # Simulate interactive terminal with no response
130
+ $stdin.stub(:tty?, true) do
131
+ ARGV.replace([])
132
+ $stdin.stub(:getch, -> { '' }) do
133
+ # assert_output(nil, /Error: No response received from terminal/) do
134
+ assert_output(nil, "Error: Timeout while reading terminal response. Unsupported terminal emulator.\n") do
135
+ assert_equal 1, resize_terminal
136
+ end
137
+ end
138
+ end
139
+ end
140
+
141
+ def test_resize_terminal_invalid_response
142
+ # Simulate interactive terminal with invalid response
143
+ $stdin.stub(:tty?, true) do
144
+ ARGV.replace([])
145
+ response = "\e[999;999H\e[6n\e[InvalidResponse".dup
146
+ $stdin.stub(:getch, -> { response.slice!(0) || '' }) do
147
+ assert_output(nil, /Error: Failed to match terminal response pattern/) do
148
+ assert_equal 1, resize_terminal
149
+ end
150
+ end
151
+ end
152
+ end
153
+
154
+ def test_resize_terminal_timeout
155
+ # Simulate interactive terminal with timeout
156
+ $stdin.stub(:tty?, true) do
157
+ ARGV.replace([])
158
+ Timeout.stub(:timeout, ->(_) { raise Timeout::Error }) do
159
+ assert_output(nil, /Error: Timeout while reading terminal response/) do
160
+ assert_equal 1, resize_terminal
161
+ end
162
+ end
163
+ end
164
+ end
165
+
166
+ def test_resize_terminal_non_interactive
167
+ # Simulate non-interactive terminal
168
+ $stdin.stub(:tty?, false) do
169
+ assert_output(nil, /Usage: resize_terminal/) do
170
+ resize_terminal
171
+ end
172
+ end
173
+ end
174
+
175
+ # def test_resize_terminal_display_rectangle
176
+ # # Simulate interactive terminal with rectangle display
177
+ # $stdin.stub(:tty?, true) do
178
+ # ARGV.replace([])
179
+ # ENV['COLUMNS'] = '80'
180
+ # ENV['LINES'] = '24'
181
+ # response = "\e[999;999H\e[6n\e[24;80R".dup
182
+ # $stdin.stub(:getch, -> { response.slice!(0) || '' }) do
183
+ # expected_output = "\e7\e[r\e[999;999H\e[6n\e8"
184
+ # # expected_output = <<-RECTANGLE
185
+ # # ********************************************************************************
186
+ # # * *
187
+ # # * *
188
+ # # * *
189
+ # # * *
190
+ # # * *
191
+ # # * *
192
+ # # * *
193
+ # # * *
194
+ # # * *
195
+ # # * *
196
+ # # * *
197
+ # # * *
198
+ # # * *
199
+ # # * *
200
+ # # * *
201
+ # # * *
202
+ # # * *
203
+ # # * *
204
+ # # * *
205
+ # # * *
206
+ # # * *
207
+ # # ********************************************************************************
208
+ # # RECTANGLE
209
+ # assert_output(expected_output.strip) do
210
+ # resize_terminal(show_rectangle: true)
211
+ # end
212
+ # end
213
+ # end
214
+ # end
215
+ end
data/lib/saved_assets.rb CHANGED
@@ -12,7 +12,8 @@ module MarkdownExec
12
12
  # method derives a name for stdout redirection.
13
13
  #
14
14
  class SavedAsset
15
- FNR11 = %r{/|:}.freeze
15
+ FNR11 = %r{[^!#%&()\+,\-0-9=A-Z_a-z~]}.freeze
16
+ # / !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
16
17
  FNR12 = '_'
17
18
  DEFAULT_FTIME = '%F-%H-%M-%S'
18
19
 
@@ -43,7 +44,7 @@ class SavedAssetTest < Minitest::Test
43
44
  time = Time.new(2023, 1, 1, 12, 0, 0)
44
45
  blockname = 'block/1:2'
45
46
 
46
- expected_name = 'test_2023-01-01-12-00-00_sample.txt_,_block_1_2.sh'
47
+ expected_name = 'test_2023-01-01-12-00-00_sample_txt_,_block_1_2.sh'
47
48
  assert_equal expected_name, MarkdownExec::SavedAsset.script_name(
48
49
  filename: filename, prefix: prefix, time: time, blockname: blockname
49
50
  )
@@ -55,7 +56,7 @@ class SavedAssetTest < Minitest::Test
55
56
  time = Time.new(2023, 1, 1, 12, 0, 0)
56
57
  blockname = 'block/1:2'
57
58
 
58
- expected_name = 'test_2023-01-01-12-00-00_sample.txt_,_block_1_2.out.txt'
59
+ expected_name = 'test_2023-01-01-12-00-00_sample_txt_,_block_1_2.out.txt'
59
60
  assert_equal expected_name, MarkdownExec::SavedAsset.stdout_name(
60
61
  filename: filename, prefix: prefix, time: time, blockname: blockname
61
62
  )
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: 2.0.6
4
+ version: 2.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fareed Stevenson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-05-31 00:00:00.000000000 Z
11
+ date: 2024-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: clipboard
@@ -122,6 +122,8 @@ files:
122
122
  - examples/include.md
123
123
  - examples/indent.md
124
124
  - examples/index.md
125
+ - examples/interrupt.md
126
+ - examples/line-wrapping.md
125
127
  - examples/linked.md
126
128
  - examples/linked1.md
127
129
  - examples/linked2.md
@@ -134,6 +136,7 @@ files:
134
136
  - examples/nickname.md
135
137
  - examples/opts.md
136
138
  - examples/pass-through.md
139
+ - examples/pause-after-execution.md
137
140
  - examples/plant.md
138
141
  - examples/port.md
139
142
  - examples/search.md
@@ -170,6 +173,7 @@ files:
170
173
  - lib/object_present.rb
171
174
  - lib/option_value.rb
172
175
  - lib/regexp.rb
176
+ - lib/resize_terminal.rb
173
177
  - lib/rspec_helpers.rb
174
178
  - lib/saved_assets.rb
175
179
  - lib/saved_files_matcher.rb