summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Allen <dan.j.allen@gmail.com>2019-03-20 04:25:59 -0600
committerGitHub <noreply@github.com>2019-03-20 04:25:59 -0600
commit35a72dd00c1931dcce72a5a1659208fb7bc62d7a (patch)
treeaaa6540a713ad03dd94909439b01b601aa588cdb
parent0bf0f820c9ed583075dbc1b6cda42b06d6f223a9 (diff)
resolves #1699 convert example block to details/summary tag set if collapsible option is set (PR #3157)
- convert example block to details/summary tag set if collapsible option is set - configure details tag to open by default if open option is set on collapsible example block - add margin bottom to details tag in default stylesheet
-rw-r--r--CHANGELOG.adoc1
-rw-r--r--data/stylesheets/asciidoctor-default.css4
-rw-r--r--lib/asciidoctor/converter/html5.rb16
-rw-r--r--test/blocks_test.rb48
4 files changed, 64 insertions, 5 deletions
diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc
index 7ffe037f..1c0358b1 100644
--- a/CHANGELOG.adoc
+++ b/CHANGELOG.adoc
@@ -81,6 +81,7 @@ Enhancements / Compliance::
* log warning if conditional expression in ifeval directive is invalid (#3161)
* drop lines that contain an invalid preprocessor directive (#3161)
* rename AbstractBlock#find_by directives; use :prune in place of :skip_children and :reject in place of :skip
+ * convert example block into details/summary tag set if collapsible option is set; open by default if open option is set (#1699)
Improvements::
diff --git a/data/stylesheets/asciidoctor-default.css b/data/stylesheets/asciidoctor-default.css
index ac120ad9..9944afe4 100644
--- a/data/stylesheets/asciidoctor-default.css
+++ b/data/stylesheets/asciidoctor-default.css
@@ -186,8 +186,8 @@ body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
-details>summary:first-of-type{display:list-item;cursor:pointer;margin-bottom:1.25em}
-.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
+details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
+details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
diff --git a/lib/asciidoctor/converter/html5.rb b/lib/asciidoctor/converter/html5.rb
index 1c22acb8..3219bb94 100644
--- a/lib/asciidoctor/converter/html5.rb
+++ b/lib/asciidoctor/converter/html5.rb
@@ -571,13 +571,23 @@ Your browser does not support the audio tag.
def convert_example node
id_attribute = node.id ? %( id="#{node.id}") : ''
- title_element = node.title? ? %(<div class="title">#{node.captioned_title}</div>\n) : ''
-
- %(<div#{id_attribute} class="exampleblock#{(role = node.role) ? " #{role}" : ''}">
+ if node.option? 'collapsible'
+ class_attribute = node.role ? %( class="#{node.role}") : ''
+ summary_element = node.title? ? %(<summary class="title">#{node.title}</summary>) : '<summary class="title">Details</summary>'
+ %(<details#{id_attribute}#{class_attribute}#{(node.option? 'open') ? ' open' : ''}>
+#{summary_element}
+<div class="content">
+#{node.content}
+</div>
+</details>)
+ else
+ title_element = node.title? ? %(<div class="title">#{node.captioned_title}</div>\n) : ''
+ %(<div#{id_attribute} class="exampleblock#{(role = node.role) ? " #{role}" : ''}">
#{title_element}<div class="content">
#{node.content}
</div>
</div>)
+ end
end
def convert_floating_title node
diff --git a/test/blocks_test.rb b/test/blocks_test.rb
index c6a536ae..3a51c4b9 100644
--- a/test/blocks_test.rb
+++ b/test/blocks_test.rb
@@ -852,6 +852,54 @@ context 'Blocks' do
assert_xpath '(/*[@class="exampleblock"])[3]/*[@class="title"][starts-with(text(), "Exhibit ")]', output, 1
end
+ test 'should create details/summary set if collapsible option is set' do
+ input = <<~'EOS'
+ .Toggle Me
+ [%collapsible]
+ ====
+ This content is revealed when the user clicks the words "Toggle Me".
+ ====
+ EOS
+
+ output = convert_string_to_embedded input
+ assert_css 'details', output, 1
+ assert_css 'details[open]', output, 0
+ assert_css 'details > summary.title', output, 1
+ assert_xpath '//details/summary[text()="Toggle Me"]', output, 1
+ assert_css 'details > summary.title + .content', output, 1
+ assert_css 'details > summary.title + .content p', output, 1
+ end
+
+ test 'should open details/summary set if collapsible and open options are set' do
+ input = <<~'EOS'
+ .Toggle Me
+ [%collapsible%open]
+ ====
+ This content is revealed when the user clicks the words "Toggle Me".
+ ====
+ EOS
+
+ output = convert_string_to_embedded input
+ assert_css 'details', output, 1
+ assert_css 'details[open]', output, 1
+ assert_css 'details > summary.title', output, 1
+ assert_xpath '//details/summary[text()="Toggle Me"]', output, 1
+ end
+
+ test 'should add default summary element if collapsible option is set and title is not specifed' do
+ input = <<~'EOS'
+ [%collapsible]
+ ====
+ This content is revealed when the user clicks the words "Toggle Me".
+ ====
+ EOS
+
+ output = convert_string_to_embedded input
+ assert_css 'details', output, 1
+ assert_css 'details > summary.title', output, 1
+ assert_xpath '//details/summary[text()="Details"]', output, 1
+ end
+
test 'should warn if example block is not terminated' do
input = <<~'EOS'
outside