Skip to content

Commit 134bd7f

Browse files
Add collapsible option to admonition directives (#12507)
This PR adds the `collapsible` and option to the core admonition type directives, which are propagated to the nodes, e.g. ```restructuredtext .. admonition:: title :collapsible: content .. note:: content :collapsible: closed ``` For the HTML5 writer, this replaces the outer `div` with a `details` tag, and the title `p` with a `summary` tag (with an `open` attribute if set), e.g. ```html <div class="admonition note"> <p class="admonition-title">Note</p> <p>hallo</p> </div> ``` changes to ```html <details class="admonition note" open="open"> <summary class="admonition-title">Note</summary> <p>hallo</p> </details> ``` Co-authored-by: Adam Turner <[email protected]>
1 parent 4936b27 commit 134bd7f

File tree

11 files changed

+340
-54
lines changed

11 files changed

+340
-54
lines changed

CHANGES.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ Features added
8888
* #13271: Support the ``:abstract:`` option for
8989
classes, methods, and properties in the Python domain.
9090
Patch by Adam Turner.
91+
* #12507: Add the :ref:`collapsible <collapsible-admonitions>` option
92+
to admonition directives.
93+
Patch by Chris Sewell.
9194

9295
Bugs fixed
9396
----------

doc/_themes/sphinx13/static/sphinx13.css

Lines changed: 83 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@
3131
--icon-warning: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 14h-2v-4h2m0 8h-2v-2h2M1 21h22L12 2 1 21z"/></svg>');
3232
--icon-failure: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2c5.53 0 10 4.47 10 10s-4.47 10-10 10S2 17.53 2 12 6.47 2 12 2m3.59 5L12 10.59 8.41 7 7 8.41 10.59 12 7 15.59 8.41 17 12 13.41 15.59 17 17 15.59 13.41 12 17 8.41 15.59 7z"/></svg>');
3333
--icon-spark: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11.5 20l4.86-9.73H13V4l-5 9.73h3.5V20M12 2c2.75 0 5.1 1 7.05 2.95C21 6.9 22 9.25 22 12s-1 5.1-2.95 7.05C17.1 21 14.75 22 12 22s-5.1-1-7.05-2.95C3 17.1 2 14.75 2 12s1-5.1 2.95-7.05C6.9 3 9.25 2 12 2z"/></svg>');
34+
35+
/* icons used for details summaries */
36+
--icon-details-open: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58 13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42Z"/></svg>');
3437
}
3538

3639
body {
@@ -409,7 +412,7 @@ table td, table th {
409412
padding: 0.2em 0.5em 0.2em 0.5em;
410413
}
411414

412-
div.admonition, div.warning {
415+
div.admonition, div.warning, details.admonition {
413416
font-size: 0.9em;
414417
margin: 1em 0 1em 0;
415418
border: 1px solid #86989B;
@@ -418,16 +421,16 @@ div.admonition, div.warning {
418421
padding: 1rem;
419422
}
420423

421-
div.admonition > p, div.warning > p {
424+
div.admonition > p, div.warning > p, details.admonition > p {
422425
margin: 0;
423426
padding: 0;
424427
}
425428

426-
div.admonition > pre, div.warning > pre {
429+
div.admonition > pre, div.warning > pre, details.admonition > pre {
427430
margin: 0.4em 1em 0.4em 1em;
428431
}
429432

430-
div.admonition > p.admonition-title {
433+
div.admonition > p.admonition-title, details.admonition > summary.admonition-title {
431434
position: relative;
432435
font-weight: 500;
433436
background-color: var(--color-admonition-bg);
@@ -436,33 +439,78 @@ div.admonition > p.admonition-title {
436439
border-radius: var(--admonition-radius) var(--admonition-radius) 0 0;
437440
}
438441

442+
details.admonition:not([open]) {
443+
padding-bottom: 0;
444+
}
445+
details.admonition > summary.admonition-title {
446+
list-style: none;
447+
cursor: pointer;
448+
padding-right: .5rem;
449+
}
450+
details.admonition > summary.admonition-title::after {
451+
background-color: currentcolor;
452+
content: "";
453+
height: 1.2rem;
454+
width: 1.2rem;
455+
-webkit-mask-image: var(--icon-details-open);
456+
mask-image: var(--icon-details-open);
457+
-webkit-mask-position: center;
458+
mask-position: center;
459+
-webkit-mask-repeat: no-repeat;
460+
mask-repeat: no-repeat;
461+
-webkit-mask-size: contain;
462+
mask-size: contain;
463+
transform: rotate(0deg);
464+
transition: transform .25s;
465+
float: right;
466+
}
467+
details.admonition[open] > summary.admonition-title::after {
468+
transform: rotate(90deg);
469+
}
470+
details.admonition:not([open]) > summary.admonition-title {
471+
margin-bottom: 0;
472+
border-radius: var(--admonition-radius);
473+
}
474+
439475
div.attention > p.admonition-title,
440476
div.danger > p.admonition-title,
441-
div.error > p.admonition-title {
477+
div.error > p.admonition-title,
478+
details.attention > summary.admonition-title,
479+
details.danger > summary.admonition-title,
480+
details.error > summary.admonition-title {
442481
background-color: var(--colour-error-bg);
443482
}
444483

445484
div.important > p.admonition-title,
446485
div.caution > p.admonition-title,
447-
div.warning > p.admonition-title {
486+
div.warning > p.admonition-title,
487+
details.important > summary.admonition-title,
488+
details.caution > summary.admonition-title,
489+
details.warning > summary.admonition-title {
448490
background-color: var(--colour-warning-bg);
449491
}
450492

451-
div.note > p.admonition-title {
493+
div.note > p.admonition-title,
494+
details.note > summary.admonition-title {
452495
background-color: var(--colour-note-bg);
453496
}
454497

455498
div.hint > p.admonition-title,
456499
div.tip > p.admonition-title,
457-
div.seealso > p.admonition-title {
500+
div.seealso > p.admonition-title,
501+
details.hint > summary.admonition-title,
502+
details.tip > summary.admonition-title,
503+
details.seealso > summary.admonition-title {
458504
background-color: var(--colour-success-bg);
459505
}
460506

461-
div.admonition-todo > p.admonition-title {
507+
div.admonition-todo > p.admonition-title,
508+
details.admonition-todo > summary.admonition-title {
462509
background-color: var(--colour-todo-bg);
463510
}
464511

465-
p.admonition-title::before {
512+
p.admonition-title::before,
513+
summary.admonition-title::before {
466514
content: "";
467515
height: 1rem;
468516
left: .5rem;
@@ -472,69 +520,81 @@ p.admonition-title::before {
472520
background-color: #5f5f5f;
473521
}
474522

475-
div.admonition > p.admonition-title::before {
523+
div.admonition > p.admonition-title::before,
524+
details.admonition > summary.admonition-title::before {
476525
background-color: var(--color-admonition-fg);
477526
-webkit-mask-image: var(--icon-abstract);
478527
mask-image: var(--icon-abstract);
479528
}
480-
div.attention > p.admonition-title::before {
529+
div.attention > p.admonition-title::before,
530+
details.attention > summary.admonition-title::before {
481531
background-color: var(--colour-error-fg);
482532
-webkit-mask-image: var(--icon-warning);
483533
mask-image: var(--icon-warning);
484534
}
485-
div.caution > p.admonition-title::before {
535+
div.caution > p.admonition-title::before,
536+
details.caution > summary.admonition-title::before {
486537
background-color: var(--colour-warning-fg);
487538
-webkit-mask-image: var(--icon-spark);
488539
mask-image: var(--icon-spark);
489540
}
490-
div.danger > p.admonition-title::before {
541+
div.danger > p.admonition-title::before,
542+
details.danger > summary.admonition-title::before {
491543
background-color: var(--colour-error-fg);
492544
-webkit-mask-image: var(--icon-spark);
493545
mask-image: var(--icon-spark);
494546
}
495-
div.error > p.admonition-title::before {
547+
div.error > p.admonition-title::before,
548+
details.error > summary.admonition-title::before {
496549
background-color: var(--colour-error-fg);
497550
-webkit-mask-image: var(--icon-failure);
498551
mask-image: var(--icon-failure);
499552
}
500-
div.hint > p.admonition-title::before {
553+
div.hint > p.admonition-title::before,
554+
details.hint > summary.admonition-title::before {
501555
background-color: var(--colour-success-fg);
502556
-webkit-mask-image: var(--icon-question);
503557
mask-image: var(--icon-question);
504558
}
505-
div.important > p.admonition-title::before {
559+
div.important > p.admonition-title::before,
560+
details.important > summary.admonition-title::before {
506561
background-color: var(--colour-warning-fg);
507562
-webkit-mask-image: var(--icon-flame);
508563
mask-image: var(--icon-flame);
509564
}
510-
div.note > p.admonition-title::before {
565+
div.note > p.admonition-title::before,
566+
details.note > summary.admonition-title::before {
511567
background-color: var(--colour-note-fg);
512568
-webkit-mask-image: var(--icon-pencil);
513569
mask-image: var(--icon-pencil);
514570
}
515-
div.seealso > p.admonition-title::before {
571+
div.seealso > p.admonition-title::before,
572+
details.seealso > summary.admonition-title::before {
516573
background-color: var(--colour-success-fg);
517574
-webkit-mask-image: var(--icon-info);
518575
mask-image: var(--icon-info);
519576
}
520-
div.tip > p.admonition-title::before {
577+
div.tip > p.admonition-title::before,
578+
details.tip > summary.admonition-title::before {
521579
background-color: var(--colour-success-fg);
522580
-webkit-mask-image: var(--icon-info);
523581
mask-image: var(--icon-info);
524582
}
525-
div.admonition-todo > p.admonition-title::before {
583+
div.admonition-todo > p.admonition-title::before,
584+
details.admonition-todo > summary.admonition-title::before {
526585
background-color: var(--colour-todo-fg);
527586
-webkit-mask-image: var(--icon-pencil);
528587
mask-image: var(--icon-pencil);
529588
}
530-
div.warning > p.admonition-title::before {
589+
div.warning > p.admonition-title::before,
590+
details.warning > summary.admonition-title::before {
531591
background-color: var(--colour-warning-fg);
532592
-webkit-mask-image: var(--icon-warning);
533593
mask-image: var(--icon-warning);
534594
}
535595
div.caution,
536596
div.important,
537-
div.warning {
597+
div.warning, details.warning {
538598
border-color: var(--colour-warning-fg);
539599
}
540600
div.attention,

doc/usage/restructuredtext/directives.rst

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,56 @@ and the generic :rst:dir:`admonition` directive.
480480
Documentation for tar archive files, including GNU tar extensions.
481481

482482

483+
.. _collapsible-admonitions:
484+
485+
.. rubric:: Collapsible text
486+
487+
.. versionadded:: 8.2
488+
489+
Each admonition directive supports a ``:collapsible:`` option,
490+
to make the content of the admonition collapsible
491+
(where supported by the output format).
492+
This can be useful for content that is not always relevant.
493+
By default, collapsible admonitions are initially open,
494+
but this can be controlled with the ``open`` and ``closed`` arguments
495+
to the ``:collapsible:`` option, which change the default state.
496+
In output formats that don't support collapsible content,
497+
the text is always included.
498+
For example:
499+
500+
.. code-block:: rst
501+
502+
.. note::
503+
:collapsible:
504+
505+
This note is collapsible, and initially open by default.
506+
507+
.. admonition:: Example
508+
:collapsible: open
509+
510+
This example is collapsible, and initially open.
511+
512+
.. hint::
513+
:collapsible: closed
514+
515+
This hint is collapsible, but initially closed.
516+
517+
.. note::
518+
:collapsible:
519+
520+
This note is collapsible, and initially open by default.
521+
522+
.. admonition:: Example
523+
:collapsible: open
524+
525+
This example is collapsible, and initially open.
526+
527+
.. hint::
528+
:collapsible: closed
529+
530+
This hint is collapsible, but initially closed.
531+
532+
483533
Describing changes between versions
484534
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
485535

sphinx/application.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@
9595
'sphinx.domains.rst',
9696
'sphinx.domains.std',
9797
'sphinx.directives',
98+
'sphinx.directives.admonitions',
9899
'sphinx.directives.code',
99100
'sphinx.directives.other',
100101
'sphinx.directives.patches',

0 commit comments

Comments
 (0)