From f68e9425ca29b2b89c4a1aa89b327d137b785ca7 Mon Sep 17 00:00:00 2001 From: Dan Allen Date: Thu, 7 Mar 2024 18:59:37 -0700 Subject: backport fix for #4556 set cloaked-context attribute on source block when context is not :listing --- CHANGELOG.adoc | 4 ++++ lib/asciidoctor/parser.rb | 7 +++++-- test/blocks_test.rb | 50 +++++++++++++++++++++++++++++++++++++++++++++++ test/paragraphs_test.rb | 10 ++++++++++ 4 files changed, 69 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 97492088..88270169 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -18,6 +18,10 @@ This project utilizes semantic versioning. // tag::compact[] == Unreleased +Improvements:: + + * Set `cloaked-context` attribute on source block when context is not `:listing` (#4556) + Compliance:: * Remove use of base64 library to prevent warning in Ruby >= 3.3 (#4561) diff --git a/lib/asciidoctor/parser.rb b/lib/asciidoctor/parser.rb index 400e154f..97aec5c8 100644 --- a/lib/asciidoctor/parser.rb +++ b/lib/asciidoctor/parser.rb @@ -561,6 +561,7 @@ class Parser # process lines verbatim if style && Compliance.strict_verbatim_paragraphs && (VERBATIM_STYLES.include? style) block_context = style.to_sym + cloaked_context = :paragraph reader.unshift_line this_line # advance to block parsing => break @@ -819,15 +820,16 @@ class Parser case block_context when :listing, :source if block_context == :source || (language = attributes[1] ? nil : attributes[2] || doc_attrs['source-language']) - if language + if language # :listing attributes['style'] = 'source' attributes['language'] = language AttributeList.rekey attributes, [nil, nil, 'linenums'] - else + else # :source AttributeList.rekey attributes, [nil, 'language', 'linenums'] if doc_attrs.key? 'source-language' attributes['language'] = doc_attrs['source-language'] end unless attributes.key? 'language' + attributes['cloaked-context'] = cloaked_context unless cloaked_context == :listing end if attributes['linenums-option'] || doc_attrs['source-linenums-option'] attributes['linenums'] = '' @@ -856,6 +858,7 @@ class Parser else attributes['language'] = language end + attributes['cloaked-context'] = cloaked_context if attributes['linenums-option'] || doc_attrs['source-linenums-option'] attributes['linenums'] = '' end unless attributes.key? 'linenums' diff --git a/test/blocks_test.rb b/test/blocks_test.rb index 0a8a656f..e51aea06 100644 --- a/test/blocks_test.rb +++ b/test/blocks_test.rb @@ -3487,6 +3487,11 @@ context 'Blocks' do ``` EOS + block = block_from_string input + assert_equal :listing, block.context + assert_equal 'source', (block.attr 'style') + assert_equal :fenced_code, (block.attr 'cloaked-context') + assert_nil (block.attr 'language') output = convert_string_to_embedded input assert_css '.listingblock', output, 1 assert_css '.listingblock pre code', output, 1 @@ -3519,6 +3524,11 @@ context 'Blocks' do ``` EOS + block = (document_from_string input).blocks[0] + assert_equal :listing, block.context + assert_equal 'source', (block.attr 'style') + assert_equal :fenced_code, (block.attr 'cloaked-context') + assert_equal 'ruby', (block.attr 'language') output = convert_string_to_embedded input assert_css '.listingblock', output, 2 assert_css '.listingblock pre code.language-ruby[data-lang=ruby]', output, 1 @@ -3541,6 +3551,46 @@ context 'Blocks' do assert_css '.listingblock pre code.language-ruby[data-lang=ruby]', output, 1 assert_css '.listingblock pre code.language-javascript[data-lang=javascript]', output, 1 end + + test 'should allow source style to be specified on literal block' do + input = <<~'EOS' + [source] + .... + console.log('Hello, World!') + .... + EOS + + block = block_from_string input + assert_equal :listing, block.context + assert_equal 'source', (block.attr 'style') + assert_equal :literal, (block.attr 'cloaked-context') + assert_nil (block.attr 'language') + output = convert_string_to_embedded input + assert_css '.listingblock', output, 1 + assert_css '.listingblock pre', output, 1 + assert_css '.listingblock pre code', output, 1 + assert_css '.listingblock pre code[data-lang]', output, 0 + end + + test 'should allow source style and language to be specified on literal block' do + input = <<~'EOS' + [source,js] + .... + console.log('Hello, World!') + .... + EOS + + block = block_from_string input + assert_equal :listing, block.context + assert_equal 'source', (block.attr 'style') + assert_equal :literal, (block.attr 'cloaked-context') + assert_equal 'js', (block.attr 'language') + output = convert_string_to_embedded input + assert_css '.listingblock', output, 1 + assert_css '.listingblock pre', output, 1 + assert_css '.listingblock pre code', output, 1 + assert_css '.listingblock pre code[data-lang]', output, 1 + end end context 'Abstract and Part Intro' do diff --git a/test/paragraphs_test.rb b/test/paragraphs_test.rb index ebb5fb94..be422234 100644 --- a/test/paragraphs_test.rb +++ b/test/paragraphs_test.rb @@ -328,6 +328,11 @@ context 'Paragraphs' do [source] use the source, luke! EOS + block = block_from_string input + assert_equal :listing, block.context + assert_equal 'source', (block.attr 'style') + assert_equal :paragraph, (block.attr 'cloaked-context') + assert_nil (block.attr 'language') output = convert_string_to_embedded input assert_xpath %(/*[@class="listingblock"]//pre[@class="highlight"]/code[text()="use the source, luke!"]), output, 1 end @@ -337,6 +342,11 @@ context 'Paragraphs' do [source, perl] die 'zomg perl is tough'; EOS + block = block_from_string input + assert_equal :listing, block.context + assert_equal 'source', (block.attr 'style') + assert_equal :paragraph, (block.attr 'cloaked-context') + assert_equal 'perl', (block.attr 'language') output = convert_string_to_embedded input assert_xpath %(/*[@class="listingblock"]//pre[@class="highlight"]/code[@class="language-perl"][@data-lang="perl"][text()="die 'zomg perl is tough';"]), output, 1 end -- cgit v1.2.3