markdown_exec 2.7.2 → 2.7.4
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.
- checksums.yaml +4 -4
 - data/CHANGELOG.md +46 -1
 - data/Gemfile.lock +1 -1
 - data/Rakefile +29 -11
 - data/bats/block-type-opts.bats +23 -0
 - data/bats/block-type-vars.bats +26 -0
 - data/bats/block-types.bats +0 -36
 - data/bats/line-wrapping.bats +8 -0
 - data/bats/options-collapse.bats +5 -5
 - data/bin/tab_completion.sh +1 -1
 - data/docs/dev/block-type-opts.md +4 -1
 - data/docs/dev/block-type-vars.md +11 -4
 - data/docs/dev/line-wrapping.md +24 -0
 - data/docs/dev/options-collapse.md +1 -1
 - data/examples/link-blocks-vars.md +69 -41
 - data/lib/collapser.rb +35 -21
 - data/lib/colorize.rb +11 -37
 - data/lib/fcb.rb +47 -11
 - data/lib/format_table.rb +55 -17
 - data/lib/hash_delegator.rb +201 -111
 - data/lib/hierarchy_string.rb +9 -0
 - data/lib/markdown_exec/version.rb +1 -1
 - data/lib/markdown_exec.rb +2 -2
 - data/lib/mdoc.rb +16 -86
 - data/lib/menu.src.yml +7 -2
 - data/lib/menu.yml +6 -1
 - data/lib/ww.rb +6 -4
 - metadata +7 -3
 - /data/examples/{wrap.md → wrapped-blocks.md} +0 -0
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 5b2dff995a0986c3e248185703f187d49b9cabaabdfae999af261b524ebac1d9
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 4303e59dc01d2c600872b506cb365d1de0452a93bacb13c47358525e80d39ad8
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: ab35fe5e0b66c683133f65e9937cdf3336231e3522aed575bedceae8a7044fcf155b11c7e28b324720858dfa53f1443e35b8c5b188796300aa499bb6071930f1
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: e8146b88c20bf43c4f43c6d19dd016a249f3227f42450196bf1a40b3356a1f37ae53c645122d25b285ae58c806df3724dd5e32d2e1ac120b45e8f4f86fe7ebbf
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -1,5 +1,50 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # Changelog
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            ## [2.7.4] - 2025-02-02
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            ### Added
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            - Option to control initial truncation of table cell text to fit screen width.
         
     | 
| 
      
 8 
     | 
    
         
            +
            - Truncate text to fit table cell fit to screen width. Click on first row of any table to toggle.
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            ### Changed
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            - Fix the display of collapsible sections.
         
     | 
| 
      
 13 
     | 
    
         
            +
            - Fix the display of shell expansion and command substitution output.
         
     | 
| 
      
 14 
     | 
    
         
            +
            - Hide gem sources in caller.deref.
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            ## [2.7.3] - 2025-01-29
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            ### Added
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            - Automatic loading of multiple Opts and Vars blocks when opening a document.
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            ### Changed
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            - Fix text displayed when text is wrapped to the next line.
         
     | 
| 
      
 25 
     | 
    
         
            +
            - Handle and report failure of single tests.
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            ## [2.7.2] - 2025-01-03
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            ### Added
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            - Block name comparison in FCB class.
         
     | 
| 
      
 32 
     | 
    
         
            +
            - Option for automatic shell block per document.
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
            ### Changed
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
            - Disable command substitution in comments.
         
     | 
| 
      
 37 
     | 
    
         
            +
            - Fix the source reported by debug function ww0.
         
     | 
| 
      
 38 
     | 
    
         
            +
            - Inverse the entire line to highlight the active menu line.
         
     | 
| 
      
 39 
     | 
    
         
            +
            - Return single file if no globs in load block.
         
     | 
| 
      
 40 
     | 
    
         
            +
            - Update the calculation and use of IDs for blocks used to retrieve the block selected from the menu.
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
            ## [2.7.1] - 2024-12-10
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            ### Changed
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
            - Register console dimensions prior to arguments.
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
       3 
48 
     | 
    
         
             
            ## [2.7.0] - 2024-12-09
         
     | 
| 
       4 
49 
     | 
    
         | 
| 
       5 
50 
     | 
    
         
             
            ### Added
         
     | 
| 
         @@ -399,7 +444,7 @@ Rename options to match use. 
     | 
|
| 
       399 
444 
     | 
    
         
             
              These blocks can be hidden blocks and required in a script.
         
     | 
| 
       400 
445 
     | 
    
         | 
| 
       401 
446 
     | 
    
         
             
            - Add a "wrap" fenced code block type to facilitate script generation.
         
     | 
| 
       402 
     | 
    
         
            -
              See document `examples/ 
     | 
| 
      
 447 
     | 
    
         
            +
              See document `examples/wrapped-blocks.md`.
         
     | 
| 
       403 
448 
     | 
    
         
             
              These blocks are hidden and can be required by one or more blocks.
         
     | 
| 
       404 
449 
     | 
    
         | 
| 
       405 
450 
     | 
    
         
             
            ### Changed
         
     | 
    
        data/Gemfile.lock
    CHANGED
    
    
    
        data/Rakefile
    CHANGED
    
    | 
         @@ -74,14 +74,38 @@ task :clean do 
     | 
|
| 
       74 
74 
     | 
    
         
             
              system 'rm *.gem'
         
     | 
| 
       75 
75 
     | 
    
         
             
            end
         
     | 
| 
       76 
76 
     | 
    
         | 
| 
      
 77 
     | 
    
         
            +
            def execute_with_error_handling(iterator)
         
     | 
| 
      
 78 
     | 
    
         
            +
              all_error_level = 0
         
     | 
| 
      
 79 
     | 
    
         
            +
              all_failed_files = []
         
     | 
| 
      
 80 
     | 
    
         
            +
              
         
     | 
| 
      
 81 
     | 
    
         
            +
              iterator.each do |item|
         
     | 
| 
      
 82 
     | 
    
         
            +
                command = yield(item)
         
     | 
| 
      
 83 
     | 
    
         
            +
                next unless command # Skip if command is nil
         
     | 
| 
      
 84 
     | 
    
         
            +
                
         
     | 
| 
      
 85 
     | 
    
         
            +
                result = system(command)
         
     | 
| 
      
 86 
     | 
    
         
            +
                error_level = $?.exitstatus
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
                if error_level != 0
         
     | 
| 
      
 89 
     | 
    
         
            +
                  puts "Error: Command '#{command}' failed with exit status #{error_level}."
         
     | 
| 
      
 90 
     | 
    
         
            +
                  all_error_level = error_level
         
     | 
| 
      
 91 
     | 
    
         
            +
                  all_failed_files << command
         
     | 
| 
      
 92 
     | 
    
         
            +
                end
         
     | 
| 
      
 93 
     | 
    
         
            +
              end
         
     | 
| 
      
 94 
     | 
    
         
            +
             
     | 
| 
      
 95 
     | 
    
         
            +
              if all_error_level != 0
         
     | 
| 
      
 96 
     | 
    
         
            +
                puts "Error: #{all_failed_files.join(', ')} failed."
         
     | 
| 
      
 97 
     | 
    
         
            +
                exit all_error_level
         
     | 
| 
      
 98 
     | 
    
         
            +
              end
         
     | 
| 
      
 99 
     | 
    
         
            +
            end
         
     | 
| 
      
 100 
     | 
    
         
            +
             
     | 
| 
       77 
101 
     | 
    
         
             
            desc 'bats'
         
     | 
| 
       78 
102 
     | 
    
         
             
            task :bats do
         
     | 
| 
       79 
     | 
    
         
            -
              FileList['bats/**/*.bats'] 
     | 
| 
       80 
     | 
    
         
            -
                next if %w[bats/bats.bats bats/fail.bats].include?(file)
         
     | 
| 
      
 103 
     | 
    
         
            +
              execute_with_error_handling(FileList['bats/**/*.bats']) do |file|
         
     | 
| 
      
 104 
     | 
    
         
            +
                next nil if %w[bats/bats.bats bats/fail.bats].include?(file)
         
     | 
| 
       81 
105 
     | 
    
         | 
| 
       82 
106 
     | 
    
         
             
                # temporary clear WW to disable debugging
         
     | 
| 
       83 
107 
     | 
    
         
             
                # WW pollutes output expected by BATS tests
         
     | 
| 
       84 
     | 
    
         
            -
                 
     | 
| 
      
 108 
     | 
    
         
            +
                "unset WW; bats #{file}"
         
     | 
| 
       85 
109 
     | 
    
         
             
              end
         
     | 
| 
       86 
110 
     | 
    
         
             
            end
         
     | 
| 
       87 
111 
     | 
    
         | 
| 
         @@ -118,14 +142,8 @@ task :minitest do 
     | 
|
| 
       118 
142 
     | 
    
         
             
                './lib/dev/process_template.rb --test'
         
     | 
| 
       119 
143 
     | 
    
         
             
              ]
         
     | 
| 
       120 
144 
     | 
    
         | 
| 
       121 
     | 
    
         
            -
              commands 
     | 
| 
       122 
     | 
    
         
            -
                 
     | 
| 
       123 
     | 
    
         
            -
                error_level = $?.exitstatus
         
     | 
| 
       124 
     | 
    
         
            -
             
     | 
| 
       125 
     | 
    
         
            -
                if error_level != 0
         
     | 
| 
       126 
     | 
    
         
            -
                  puts "Error: Command '#{command}' failed with exit status #{error_level}."
         
     | 
| 
       127 
     | 
    
         
            -
                  exit error_level
         
     | 
| 
       128 
     | 
    
         
            -
                end
         
     | 
| 
      
 145 
     | 
    
         
            +
              execute_with_error_handling(commands) do |command|
         
     | 
| 
      
 146 
     | 
    
         
            +
                "bundle exec ruby #{command}"
         
     | 
| 
       129 
147 
     | 
    
         
             
              end
         
     | 
| 
       130 
148 
     | 
    
         
             
            end
         
     | 
| 
       131 
149 
     | 
    
         
             
            task mini: %i[minitest]
         
     | 
| 
         @@ -0,0 +1,23 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env bats
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            load 'test_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            # Type: Opts
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            @test 'Opts block - before' {
         
     | 
| 
      
 8 
     | 
    
         
            +
              skip 'Fails because command executes after the block is processed'
         
     | 
| 
      
 9 
     | 
    
         
            +
              spec_mde_xansi_dname_doc_blocks_expect docs/dev/block-type-opts.md \
         
     | 
| 
      
 10 
     | 
    
         
            +
               'BEFORE Species_menu_note_format: "AFTER %{line}" '
         
     | 
| 
      
 11 
     | 
    
         
            +
            }
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            @test 'Opts block - after' {
         
     | 
| 
      
 14 
     | 
    
         
            +
              spec_mde_xansi_dname_doc_blocks_expect docs/dev/block-type-opts.md \
         
     | 
| 
      
 15 
     | 
    
         
            +
               '[decorate-note]' \
         
     | 
| 
      
 16 
     | 
    
         
            +
               'AFTER Species_menu_note_format: "AFTER %{line}"'
         
     | 
| 
      
 17 
     | 
    
         
            +
            }
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            @test 'Opts block - show that menu has changed' {
         
     | 
| 
      
 20 
     | 
    
         
            +
              skip 'Unable to show that menu has changed'
         
     | 
| 
      
 21 
     | 
    
         
            +
              spec_mde_args_expect docs/dev/block-type-opts.md '[decorate-note]' \
         
     | 
| 
      
 22 
     | 
    
         
            +
               'AFTER Species'
         
     | 
| 
      
 23 
     | 
    
         
            +
            }
         
     | 
| 
         @@ -0,0 +1,26 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env bats
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            load 'test_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            # Type: Vars
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            # includes output from automatic vars blocks
         
     | 
| 
      
 8 
     | 
    
         
            +
            @test 'Vars block - auto load' {
         
     | 
| 
      
 9 
     | 
    
         
            +
              BATS_OUTPUT_FILTER=A
         
     | 
| 
      
 10 
     | 
    
         
            +
              spec_mde_args_expect docs/dev/block-type-vars.md show \
         
     | 
| 
      
 11 
     | 
    
         
            +
               'Species = Not specified Genus = Not specified  Species: Not specified VAULT:'
         
     | 
| 
      
 12 
     | 
    
         
            +
            }
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            # includes output from assignment and from shell block
         
     | 
| 
      
 15 
     | 
    
         
            +
            @test 'Vars block - set variable' {
         
     | 
| 
      
 16 
     | 
    
         
            +
              BATS_OUTPUT_FILTER=A
         
     | 
| 
      
 17 
     | 
    
         
            +
              spec_mde_args_expect docs/dev/block-type-vars.md '[set_vault_1]' show \
         
     | 
| 
      
 18 
     | 
    
         
            +
               'Species = Not specified Genus = Not specified VAULT = 1  Species: Not specified VAULT: 1'
         
     | 
| 
      
 19 
     | 
    
         
            +
            }
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            # handles invalid YAML in block
         
     | 
| 
      
 22 
     | 
    
         
            +
            @test 'Vars block - invalid YAML' {
         
     | 
| 
      
 23 
     | 
    
         
            +
              BATS_OUTPUT_FILTER=A
         
     | 
| 
      
 24 
     | 
    
         
            +
              spec_mde_args_expect docs/dev/block-type-vars.md '[invalid_yaml]' show \
         
     | 
| 
      
 25 
     | 
    
         
            +
               'Species = Not specified Genus = Not specified  Species: Not specified VAULT:'
         
     | 
| 
      
 26 
     | 
    
         
            +
            }
         
     | 
    
        data/bats/block-types.bats
    CHANGED
    
    | 
         @@ -47,26 +47,6 @@ load 'test_helper' 
     | 
|
| 
       47 
47 
     | 
    
         
             
              run_mde_specs_md_args_expect_xansi '[VARIABLE1]' '(echo-VARIABLE1)' ' VARIABLE1: 1   VARIABLE1: 1'
         
     | 
| 
       48 
48 
     | 
    
         
             
            }
         
     | 
| 
       49 
49 
     | 
    
         | 
| 
       50 
     | 
    
         
            -
            # Type: Opts
         
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
            @test 'Opts block - before' {
         
     | 
| 
       53 
     | 
    
         
            -
              skip 'Fails because command executes after the block is processed'
         
     | 
| 
       54 
     | 
    
         
            -
              spec_mde_xansi_dname_doc_blocks_expect docs/dev/block-type-opts.md \
         
     | 
| 
       55 
     | 
    
         
            -
               'BEFORE Species_menu_note_format: "AFTER %{line}" '
         
     | 
| 
       56 
     | 
    
         
            -
            }
         
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
            @test 'Opts block - after' {
         
     | 
| 
       59 
     | 
    
         
            -
              spec_mde_xansi_dname_doc_blocks_expect docs/dev/block-type-opts.md \
         
     | 
| 
       60 
     | 
    
         
            -
               '[decorate-note]' \
         
     | 
| 
       61 
     | 
    
         
            -
               'AFTER Species_menu_note_format: "AFTER %{line}"'
         
     | 
| 
       62 
     | 
    
         
            -
            }
         
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
       64 
     | 
    
         
            -
            @test 'Opts block - show that menu has changed' {
         
     | 
| 
       65 
     | 
    
         
            -
              skip 'Unable to show that menu has changed'
         
     | 
| 
       66 
     | 
    
         
            -
              spec_mde_args_expect docs/dev/block-type-opts.md '[decorate-note]' \
         
     | 
| 
       67 
     | 
    
         
            -
               'AFTER Species'
         
     | 
| 
       68 
     | 
    
         
            -
            }
         
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
50 
     | 
    
         
             
            # Type: Port
         
     | 
| 
       71 
51 
     | 
    
         | 
| 
       72 
52 
     | 
    
         
             
            # includes output from assignment and from shell block
         
     | 
| 
         @@ -81,19 +61,3 @@ load 'test_helper' 
     | 
|
| 
       81 
61 
     | 
    
         
             
              spec_mde_args_expect docs/dev/block-type-port.md VAULT-is-export show \
         
     | 
| 
       82 
62 
     | 
    
         
             
               '   VAULT: This variable has not been set.'
         
     | 
| 
       83 
63 
     | 
    
         
             
            }
         
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
     | 
    
         
            -
            # Type: Vars
         
     | 
| 
       86 
     | 
    
         
            -
             
     | 
| 
       87 
     | 
    
         
            -
            # includes output from automatic vars block
         
     | 
| 
       88 
     | 
    
         
            -
            @test 'Vars block - auto load' {
         
     | 
| 
       89 
     | 
    
         
            -
              BATS_OUTPUT_FILTER=A
         
     | 
| 
       90 
     | 
    
         
            -
              spec_mde_args_expect docs/dev/block-type-vars.md show \
         
     | 
| 
       91 
     | 
    
         
            -
               'Species = Not specified  Species: Not specified VAULT:'
         
     | 
| 
       92 
     | 
    
         
            -
            }
         
     | 
| 
       93 
     | 
    
         
            -
             
     | 
| 
       94 
     | 
    
         
            -
            # includes output from assignment and from shell block
         
     | 
| 
       95 
     | 
    
         
            -
            @test 'Vars block - set variable' {
         
     | 
| 
       96 
     | 
    
         
            -
              BATS_OUTPUT_FILTER=A
         
     | 
| 
       97 
     | 
    
         
            -
              spec_mde_args_expect docs/dev/block-type-vars.md '[set_vault_1]' show \
         
     | 
| 
       98 
     | 
    
         
            -
               'Species = Not specified VAULT = 1  Species: Not specified VAULT: 1'
         
     | 
| 
       99 
     | 
    
         
            -
            }
         
     | 
| 
         @@ -0,0 +1,8 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env bats
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            load 'test_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            @test 'Text and Headings' {
         
     | 
| 
      
 6 
     | 
    
         
            +
              spec_mde_xansi_dname_doc_blocks_expect docs/dev/line-wrapping.md \
         
     | 
| 
      
 7 
     | 
    
         
            +
               "          DEMO WRAPPING LONG LINES__MDE detects the screen's dimensions:_height (lines) and width (characters)__Normal document text is displayed as_disabled menu lines. The width of these_lines is limited according to the screen's_width.__Test Indented Lines__  Indented with two spaces, this line_  should wrap in an aesthetically pleasing_  way.__    Indented with a tab, this line should_    wrap in an aesthetically pleasing way.__  SPECIES GENUS FAMILY ORDER CLASS PHYLUM_               KINGDOM DOMAIN_species genus family order class phylum_kingdom domain"
         
     | 
| 
      
 8 
     | 
    
         
            +
            }
         
     | 
    
        data/bats/options-collapse.bats
    CHANGED
    
    | 
         @@ -4,23 +4,23 @@ load 'test_helper' 
     | 
|
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            @test 'Options - Collapsible - Document options' {
         
     | 
| 
       6 
6 
     | 
    
         
             
              spec_mde_xansi_oname_doc_blocks_expect docs/dev/options-collapse.md \
         
     | 
| 
       7 
     | 
    
         
            -
               'H1.1_L1.1_H2.1_H1. 
     | 
| 
      
 7 
     | 
    
         
            +
               'H1.1_L1.1_H2.1_H1.2_H1.3_L1.3_H2.3_L2.3_h3.3_L3.3_D4.3_L4.3'
         
     | 
| 
       8 
8 
     | 
    
         
             
            }
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
            @test 'Options - Collapsible Heading - Expand' {
         
     | 
| 
       11 
11 
     | 
    
         
             
              spec_mde_xansi_oname_doc_blocks_expect docs/dev/options-collapse.md \
         
     | 
| 
       12 
12 
     | 
    
         
             
               H2.1 \
         
     | 
| 
       13 
     | 
    
         
            -
               'H1.1_L1.1_H2.1_L2.1_h3.1_L3.1_D4.1_L4.1_H1. 
     | 
| 
      
 13 
     | 
    
         
            +
               'H1.1_L1.1_H2.1_L2.1_h3.1_L3.1_D4.1_L4.1_H1.2_H1.3_L1.3_H2.3_L2.3_h3.3_L3.3_D4.3_L4.3'
         
     | 
| 
       14 
14 
     | 
    
         
             
            }
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
            @test 'Options - Collapsible Divider' {
         
     | 
| 
       17 
17 
     | 
    
         
             
              spec_mde_xansi_oname_doc_blocks_expect docs/dev/options-collapse.md \
         
     | 
| 
       18 
18 
     | 
    
         
             
               D4.3 \
         
     | 
| 
       19 
     | 
    
         
            -
               'H1.1_L1.1_H2.1_H1. 
     | 
| 
      
 19 
     | 
    
         
            +
               'H1.1_L1.1_H2.1_H1.2_H1.3_L1.3_H2.3_L2.3_h3.3_L3.3_D4.3'
         
     | 
| 
       20 
20 
     | 
    
         
             
            }
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
22 
     | 
    
         
             
            @test 'Options - Reveal' {
         
     | 
| 
       23 
23 
     | 
    
         
             
              spec_mde_xansi_oname_doc_blocks_expect docs/dev/options-collapse.md \
         
     | 
| 
       24 
     | 
    
         
            -
               H2.2 h3.2 D4.2 \
         
     | 
| 
       25 
     | 
    
         
            -
               'H1.1_L1.1_H2.1_H1.2_H2.2_L2.2_h3.2_L3.2_D4.2_L4.2_H1.3_L1.3_H2.3_L2.3_h3.3_L3.3_D4.3_L4.3'
         
     | 
| 
      
 24 
     | 
    
         
            +
               H1.2 H2.2 h3.2 D4.2 \
         
     | 
| 
      
 25 
     | 
    
         
            +
               'H1.1_L1.1_H2.1_H1.2_L1.2_H2.2_L2.2_h3.2_L3.2_D4.2_L4.2_H1.3_L1.3_H2.3_L2.3_h3.3_L3.3_D4.3_L4.3'
         
     | 
| 
       26 
26 
     | 
    
         
             
            }
         
     | 
    
        data/bin/tab_completion.sh
    CHANGED
    
    
    
        data/docs/dev/block-type-opts.md
    CHANGED
    
    | 
         @@ -6,6 +6,9 @@ menu_note_format: "AFTER %{line}" 
     | 
|
| 
       6 
6 
     | 
    
         
             
            ```opts :(document_opts)
         
     | 
| 
       7 
7 
     | 
    
         
             
            menu_final_divider:
         
     | 
| 
       8 
8 
     | 
    
         
             
            menu_for_saved_lines: false
         
     | 
| 
      
 9 
     | 
    
         
            +
            ```
         
     | 
| 
      
 10 
     | 
    
         
            +
            / Demonstrate multiple (document_opts) in a single file
         
     | 
| 
      
 11 
     | 
    
         
            +
            ```opts :(document_opts)
         
     | 
| 
       9 
12 
     | 
    
         
             
            menu_initial_divider:
         
     | 
| 
       10 
13 
     | 
    
         
             
            menu_note_format: "BEFORE %{line}"
         
     | 
| 
       11 
     | 
    
         
            -
            ```
         
     | 
| 
      
 14 
     | 
    
         
            +
            ```
         
     | 
    
        data/docs/dev/block-type-vars.md
    CHANGED
    
    | 
         @@ -1,6 +1,15 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ```vars :(document_vars)
         
     | 
| 
      
 2 
     | 
    
         
            +
            Species: Not specified
         
     | 
| 
      
 3 
     | 
    
         
            +
            ```
         
     | 
| 
      
 4 
     | 
    
         
            +
            ```vars :(document_vars)
         
     | 
| 
      
 5 
     | 
    
         
            +
            Genus: Not specified
         
     | 
| 
      
 6 
     | 
    
         
            +
            ```
         
     | 
| 
       1 
7 
     | 
    
         
             
            ```vars :[set_vault_1]
         
     | 
| 
       2 
8 
     | 
    
         
             
            VAULT: 1
         
     | 
| 
       3 
9 
     | 
    
         
             
            ```
         
     | 
| 
      
 10 
     | 
    
         
            +
            ```vars :[invalid_yaml]
         
     | 
| 
      
 11 
     | 
    
         
            +
            this is not yaml
         
     | 
| 
      
 12 
     | 
    
         
            +
            ```
         
     | 
| 
       4 
13 
     | 
    
         
             
            ```bash :show
         
     | 
| 
       5 
14 
     | 
    
         
             
            echo "Species: $Species"
         
     | 
| 
       6 
15 
     | 
    
         
             
            echo "VAULT: $VAULT"
         
     | 
| 
         @@ -8,8 +17,6 @@ echo "VAULT: $VAULT" 
     | 
|
| 
       8 
17 
     | 
    
         
             
            | Variable| Value
         
     | 
| 
       9 
18 
     | 
    
         
             
            | -| -
         
     | 
| 
       10 
19 
     | 
    
         
             
            | Species| ${Species}
         
     | 
| 
      
 20 
     | 
    
         
            +
            | Genus| ${Genus}
         
     | 
| 
       11 
21 
     | 
    
         
             
            | VAULT| ${VAULT}
         
     | 
| 
       12 
     | 
    
         
            -
            @import bats-document-configuration.md
         
     | 
| 
       13 
     | 
    
         
            -
            ```vars :(document_vars)
         
     | 
| 
       14 
     | 
    
         
            -
            Species: Not specified
         
     | 
| 
       15 
     | 
    
         
            -
            ```
         
     | 
| 
      
 22 
     | 
    
         
            +
            @import bats-document-configuration.md
         
     | 
| 
         @@ -0,0 +1,24 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Demo wrapping long lines
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            MDE detects the screen's dimensions: height (lines) and width (characters)
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            Normal document text is displayed as disabled menu lines. The width of these lines is limited according to the screen's width.
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            ::: Test Indented Lines
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
              Indented with two spaces, this line should wrap in an aesthetically pleasing way.
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            	Indented with a tab, this line should wrap in an aesthetically pleasing way.
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            # species genus family order class phylum kingdom domain
         
     | 
| 
      
 14 
     | 
    
         
            +
            ## species genus family order class phylum kingdom domain
         
     | 
| 
      
 15 
     | 
    
         
            +
            @import bats-document-configuration.md
         
     | 
| 
      
 16 
     | 
    
         
            +
            ```opts :(document_opts)
         
     | 
| 
      
 17 
     | 
    
         
            +
            divider4_center: false
         
     | 
| 
      
 18 
     | 
    
         
            +
            heading1_center: true
         
     | 
| 
      
 19 
     | 
    
         
            +
            heading2_center: false
         
     | 
| 
      
 20 
     | 
    
         
            +
            screen_width: 48
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            menu_note_match: "^(?<indent>[ \t]*)(?<line>(?!/)(?<text>.*?)(?<trailing>[ \t]*))?$"
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            ```
         
     | 
| 
         @@ -1,59 +1,87 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # Demonstrate  
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            ``` 
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
            pause_after_script_execution: true
         
     | 
| 
      
 1 
     | 
    
         
            +
            # Demonstrate Setting Variables in the Inherited Lines
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            ```link :select-a-folder +(select-a-folder)
         
     | 
| 
      
 4 
     | 
    
         
            +
            eval: true
         
     | 
| 
      
 5 
     | 
    
         
            +
            ```
         
     | 
| 
      
 6 
     | 
    
         
            +
            ```bash :(select-a-folder)
         
     | 
| 
      
 7 
     | 
    
         
            +
            echo "PT=$(osascript -e 'do shell script "echo " & quoted form of POSIX path of (choose folder with prompt "Please select a folder:")' 2>/dev/null)"
         
     | 
| 
       9 
8 
     | 
    
         
             
            ```
         
     | 
| 
       10 
9 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
            ::: Select below to trigger. If it prints "VARIABLE1: 1", the Link block was processed.
         
     | 
| 
      
 10 
     | 
    
         
            +
            This table displays the value of variables in the context of the current inherited lines. At first, the variable is empty unless it exists in the current shell environment.
         
     | 
| 
       13 
11 
     | 
    
         | 
| 
       14 
12 
     | 
    
         
             
            | Variable| Value
         
     | 
| 
       15 
13 
     | 
    
         
             
            | -| -
         
     | 
| 
       16 
     | 
    
         
            -
            |  
     | 
| 
      
 14 
     | 
    
         
            +
            | SPECIES| ${SPECIES}
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            ## Current Inherited Lines
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            ```view
         
     | 
| 
      
 19 
     | 
    
         
            +
            View the current inherited lines.
         
     | 
| 
      
 20 
     | 
    
         
            +
            ```
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            The inherited lines can also be displayed automatically within the menu by enabling this option:
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            ```opts
         
     | 
| 
      
 25 
     | 
    
         
            +
            menu_with_inherited_lines: true
         
     | 
| 
      
 26 
     | 
    
         
            +
            ```
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            ## Setting Variables in the Inherited Lines
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            You can set environment variables in the inherited lines by adding shell expressions. For example, a line such as `SPECIES=Unknown` in the inherited lines defines a variable that can be used in the rest of the executed script.
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            Below are several ways to add such expressions to the inherited lines:
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
            ### Vars Block
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
            This block (YAML) adds a variable and its value to the inherited lines:
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
            ```vars
         
     | 
| 
      
 39 
     | 
    
         
            +
            SPECIES: Tapanuli Orangutan
         
     | 
| 
      
 40 
     | 
    
         
            +
            ```
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
            ### Link Block
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            This block (YAML) also adds a variable and its value to the inherited lines:
         
     | 
| 
       17 
45 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
            The block sets VARIABLE1.
         
     | 
| 
       19 
     | 
    
         
            -
            For each environment variable in `vars`, append an inherited line that assigns the variable the specified value.
         
     | 
| 
       20 
46 
     | 
    
         
             
                ```link
         
     | 
| 
       21 
47 
     | 
    
         
             
                vars:
         
     | 
| 
       22 
     | 
    
         
            -
                   
     | 
| 
      
 48 
     | 
    
         
            +
                  SPECIES: Psychedelic Frogfish
         
     | 
| 
       23 
49 
     | 
    
         
             
                ```
         
     | 
| 
       24 
50 
     | 
    
         | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
            This block "[bash_set_to_3]" is required below. It sets the variable "ALPHA".
         
     | 
| 
       27 
     | 
    
         
            -
                ```bash :[bash_set_to_3]
         
     | 
| 
       28 
     | 
    
         
            -
                ALPHA=3
         
     | 
| 
       29 
     | 
    
         
            -
                ```
         
     | 
| 
       30 
     | 
    
         
            -
            ::: Select below to trigger. If it prints "ALPHA: 3", the Link block was processed.
         
     | 
| 
       31 
     | 
    
         
            -
            These blocks require the *code* of the named shell block.
         
     | 
| 
       32 
     | 
    
         
            -
                ```link +[bash_set_to_3]
         
     | 
| 
       33 
     | 
    
         
            -
                block: "(display_variable_ALPHA)"
         
     | 
| 
       34 
     | 
    
         
            -
                ```
         
     | 
| 
       35 
     | 
    
         
            -
                ```link +[bash_set_to_3]
         
     | 
| 
       36 
     | 
    
         
            -
                next_block: "(display_variable_ALPHA)"
         
     | 
| 
       37 
     | 
    
         
            -
                ```
         
     | 
| 
      
 51 
     | 
    
         
            +
            ### Link+Bash Blocks
         
     | 
| 
       38 
52 
     | 
    
         | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
            These blocks require the *output* of the execution of the code in the named shell block.
         
     | 
| 
       45 
     | 
    
         
            -
                ```link +[bash_set_to_4]
         
     | 
| 
       46 
     | 
    
         
            -
                eval: true
         
     | 
| 
       47 
     | 
    
         
            -
                block: "(display_variable_ALPHA)"
         
     | 
| 
      
 53 
     | 
    
         
            +
            ::: Adding Code to the Inherited Lines
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
            This Link block (YAML) appends the Bash code defined in the referenced block to the inherited lines:
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                ```link :add-bash-code +[bash_species]
         
     | 
| 
       48 
58 
     | 
    
         
             
                ```
         
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
      
 59 
     | 
    
         
            +
                    ```bash :[bash_species] @disable
         
     | 
| 
      
 60 
     | 
    
         
            +
                    SPECIES='Ruby Seadragon'
         
     | 
| 
      
 61 
     | 
    
         
            +
                    ```
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
            If necessary to extract environment variable values displayed in the menu, inherited lines are executed every time the menu displayed. Therefore, do add code that has unwanted side effects when executed multiple times.
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
            ::: Adding Evaluated Code Output to the Inherited Lines
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
            This Link block (YAML) appends the output of the Bash code to the inherited lines. The Bash code is executed first to generate the output:
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                ```link :add-evaluated-bash-code +[bash_species_code]
         
     | 
| 
       50 
70 
     | 
    
         
             
                eval: true
         
     | 
| 
       51 
     | 
    
         
            -
                next_block: "(display_variable_ALPHA)"
         
     | 
| 
       52 
71 
     | 
    
         
             
                ```
         
     | 
| 
      
 72 
     | 
    
         
            +
                    ```bash :[bash_species_code] @disable
         
     | 
| 
      
 73 
     | 
    
         
            +
                    echo "SPECIES='Illacme tobini (Millipede)'"
         
     | 
| 
      
 74 
     | 
    
         
            +
                    ```
         
     | 
| 
       53 
75 
     | 
    
         | 
| 
       54 
76 
     | 
    
         
             
            | Variable| Value
         
     | 
| 
       55 
77 
     | 
    
         
             
            | -| -
         
     | 
| 
       56 
     | 
    
         
            -
            |  
     | 
| 
      
 78 
     | 
    
         
            +
            | SPECIES| ${SPECIES}
         
     | 
| 
       57 
79 
     | 
    
         | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
            ```
         
     | 
| 
      
 80 
     | 
    
         
            +
            @import example-document-opts.md
         
     | 
| 
      
 81 
     | 
    
         
            +
            ```opts :(document_opts)
         
     | 
| 
      
 82 
     | 
    
         
            +
            execute_in_own_window: false
         
     | 
| 
      
 83 
     | 
    
         
            +
            menu_with_inherited_lines: false
         
     | 
| 
      
 84 
     | 
    
         
            +
            output_execution_report: false
         
     | 
| 
      
 85 
     | 
    
         
            +
            output_execution_summary: false
         
     | 
| 
      
 86 
     | 
    
         
            +
            pause_after_script_execution: true
         
     | 
| 
      
 87 
     | 
    
         
            +
            ```
         
     | 
    
        data/lib/collapser.rb
    CHANGED
    
    | 
         @@ -6,18 +6,20 @@ 
     | 
|
| 
       6 
6 
     | 
    
         
             
            require_relative 'constants'
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
       8 
8 
     | 
    
         
             
            class Collapser
         
     | 
| 
       9 
     | 
    
         
            -
              attr_accessor : 
     | 
| 
      
 9 
     | 
    
         
            +
              attr_accessor :compress_ids, :expand_ids, :options
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
              def initialize(
         
     | 
| 
       12 
12 
     | 
    
         
             
                collapsed_level: nil,
         
     | 
| 
       13 
13 
     | 
    
         
             
                collapsible_types: COLLAPSIBLE_TYPES,
         
     | 
| 
       14 
     | 
    
         
            -
                 
     | 
| 
       15 
     | 
    
         
            -
                 
     | 
| 
      
 14 
     | 
    
         
            +
                compress_ids:,
         
     | 
| 
      
 15 
     | 
    
         
            +
                expand_ids:,
         
     | 
| 
      
 16 
     | 
    
         
            +
                options: {}
         
     | 
| 
       16 
17 
     | 
    
         
             
              )
         
     | 
| 
       17 
18 
     | 
    
         
             
                @collapsed_level = collapsed_level
         
     | 
| 
       18 
19 
     | 
    
         
             
                @collapsible_types = collapsible_types.dup
         
     | 
| 
       19 
20 
     | 
    
         
             
                @options = options.dup
         
     | 
| 
       20 
     | 
    
         
            -
                @ 
     | 
| 
      
 21 
     | 
    
         
            +
                @compress_ids = compress_ids # by ref, user action
         
     | 
| 
      
 22 
     | 
    
         
            +
                @expand_ids = expand_ids # by ref, user action
         
     | 
| 
       21 
23 
     | 
    
         
             
              end
         
     | 
| 
       22 
24 
     | 
    
         | 
| 
       23 
25 
     | 
    
         
             
              def collapse_per_options?(fcb, options: @options)
         
     | 
| 
         @@ -27,13 +29,15 @@ class Collapser 
     | 
|
| 
       27 
29 
     | 
    
         
             
                criteria
         
     | 
| 
       28 
30 
     | 
    
         
             
              end
         
     | 
| 
       29 
31 
     | 
    
         | 
| 
       30 
     | 
    
         
            -
               
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
                 
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
                 
     | 
| 
      
 32 
     | 
    
         
            +
              # collapse per user action
         
     | 
| 
      
 33 
     | 
    
         
            +
              def collapse_per_state?(fcb, default: false)
         
     | 
| 
      
 34 
     | 
    
         
            +
                if @compress_ids.key?(fcb.id) && !!@compress_ids[fcb.id]
         
     | 
| 
      
 35 
     | 
    
         
            +
                  true
         
     | 
| 
      
 36 
     | 
    
         
            +
                elsif @expand_ids.key?(fcb.id) && !!@expand_ids[fcb.id]
         
     | 
| 
      
 37 
     | 
    
         
            +
                  false
         
     | 
| 
      
 38 
     | 
    
         
            +
                else
         
     | 
| 
      
 39 
     | 
    
         
            +
                  default
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
       37 
41 
     | 
    
         
             
              end
         
     | 
| 
       38 
42 
     | 
    
         | 
| 
       39 
43 
     | 
    
         
             
              def collapse_per_token?(fcb)
         
     | 
| 
         @@ -52,10 +56,11 @@ class Collapser 
     | 
|
| 
       52 
56 
     | 
    
         
             
              end
         
     | 
| 
       53 
57 
     | 
    
         | 
| 
       54 
58 
     | 
    
         
             
              def collapse?(fcb, initialize: false)
         
     | 
| 
      
 59 
     | 
    
         
            +
                per_options_and_token = (collapse_per_options?(fcb) || collapse_per_token?(fcb)) && !expand_per_token?(fcb)
         
     | 
| 
       55 
60 
     | 
    
         
             
                if initialize
         
     | 
| 
       56 
     | 
    
         
            -
                   
     | 
| 
      
 61 
     | 
    
         
            +
                  per_options_and_token
         
     | 
| 
       57 
62 
     | 
    
         
             
                else
         
     | 
| 
       58 
     | 
    
         
            -
                  collapse_per_state?(fcb, default:  
     | 
| 
      
 63 
     | 
    
         
            +
                  collapse_per_state?(fcb, default: per_options_and_token)
         
     | 
| 
       59 
64 
     | 
    
         
             
                end
         
     | 
| 
       60 
65 
     | 
    
         
             
              end
         
     | 
| 
       61 
66 
     | 
    
         | 
| 
         @@ -100,8 +105,13 @@ class Collapser 
     | 
|
| 
       100 
105 
     | 
    
         
             
                else
         
     | 
| 
       101 
106 
     | 
    
         
             
                  fcb.hide = true
         
     | 
| 
       102 
107 
     | 
    
         
             
                end
         
     | 
| 
       103 
     | 
    
         
            -
                 
     | 
| 
       104 
     | 
    
         
            -
             
     | 
| 
      
 108 
     | 
    
         
            +
                if fcb.collapse
         
     | 
| 
      
 109 
     | 
    
         
            +
                  @compress_ids[fcb.id] = fcb.level
         
     | 
| 
      
 110 
     | 
    
         
            +
                  @expand_ids.delete(fcb.id)
         
     | 
| 
      
 111 
     | 
    
         
            +
                else
         
     | 
| 
      
 112 
     | 
    
         
            +
                  @compress_ids.delete(fcb.id)
         
     | 
| 
      
 113 
     | 
    
         
            +
                  @expand_ids[fcb.id] = fcb.level
         
     | 
| 
      
 114 
     | 
    
         
            +
                end
         
     | 
| 
       105 
115 
     | 
    
         
             
                collapsed_level
         
     | 
| 
       106 
116 
     | 
    
         
             
              end
         
     | 
| 
       107 
117 
     | 
    
         | 
| 
         @@ -138,13 +148,15 @@ OPTIONS = { 
     | 
|
| 
       138 
148 
     | 
    
         
             
              heading3_collapse: false,
         
     | 
| 
       139 
149 
     | 
    
         
             
              heading3_collapsible: true
         
     | 
| 
       140 
150 
     | 
    
         
             
            }.freeze
         
     | 
| 
       141 
     | 
    
         
            -
            STATE = {}.freeze
         
     | 
| 
       142 
151 
     | 
    
         | 
| 
       143 
152 
     | 
    
         
             
            class CollapserTest < Minitest::Test
         
     | 
| 
       144 
153 
     | 
    
         
             
              def setup
         
     | 
| 
       145 
     | 
    
         
            -
                @collapser = Collapser.new( 
     | 
| 
       146 
     | 
    
         
            -
             
     | 
| 
       147 
     | 
    
         
            -
             
     | 
| 
      
 154 
     | 
    
         
            +
                @collapser = Collapser.new(
         
     | 
| 
      
 155 
     | 
    
         
            +
                  collapsible_types: COLLAPSIBLE_TYPES.dup,
         
     | 
| 
      
 156 
     | 
    
         
            +
                  options: OPTIONS.dup,
         
     | 
| 
      
 157 
     | 
    
         
            +
                  compress_ids: {},
         
     | 
| 
      
 158 
     | 
    
         
            +
                  expand_ids: {}
         
     | 
| 
      
 159 
     | 
    
         
            +
                ).dup
         
     | 
| 
       148 
160 
     | 
    
         
             
              end
         
     | 
| 
       149 
161 
     | 
    
         | 
| 
       150 
162 
     | 
    
         
             
              def test_analyze
         
     | 
| 
         @@ -312,7 +324,8 @@ class CollapserTest < Minitest::Test 
     | 
|
| 
       312 
324 
     | 
    
         
             
                    { name: 'collapsed remains collapsed',
         
     | 
| 
       313 
325 
     | 
    
         
             
                      fcbs: [fc_h1a__collapse_collapsible],
         
     | 
| 
       314 
326 
     | 
    
         
             
                      options: { heading1_collapsible: true },
         
     | 
| 
       315 
     | 
    
         
            -
                       
     | 
| 
      
 327 
     | 
    
         
            +
                      compress_ids: { 'h1a' => 1 },
         
     | 
| 
      
 328 
     | 
    
         
            +
                      expand_ids: {},
         
     | 
| 
       316 
329 
     | 
    
         
             
                      initialize: false,
         
     | 
| 
       317 
330 
     | 
    
         
             
                      expected: [fc_h1a__collapse_collapsible] }
         
     | 
| 
       318 
331 
     | 
    
         
             
                  ]
         
     | 
| 
         @@ -324,7 +337,8 @@ class CollapserTest < Minitest::Test 
     | 
|
| 
       324 
337 
     | 
    
         
             
                      collapsed_level: test_case[:collapsed_level],
         
     | 
| 
       325 
338 
     | 
    
         
             
                      collapsible_types: test_case[:collapsible_types] || COLLAPSIBLE_TYPES,
         
     | 
| 
       326 
339 
     | 
    
         
             
                      options: (test_case[:options] || OPTIONS).dup,
         
     | 
| 
       327 
     | 
    
         
            -
                       
     | 
| 
      
 340 
     | 
    
         
            +
                      compress_ids: test_case[:compress_ids] || {},
         
     | 
| 
      
 341 
     | 
    
         
            +
                      expand_ids: {}
         
     | 
| 
       328 
342 
     | 
    
         
             
                    )
         
     | 
| 
       329 
343 
     | 
    
         
             
                    analysis = @collapser.analyze(
         
     | 
| 
       330 
344 
     | 
    
         
             
                      test_case[:fcbs],
         
     |