diff --git a/frappe/public/scss/markdown.scss b/frappe/public/scss/markdown.scss index 595b7f96a3..50f46eae19 100644 --- a/frappe/public/scss/markdown.scss +++ b/frappe/public/scss/markdown.scss @@ -122,3 +122,41 @@ main:not(.my-5) .from-markdown { margin-top: 5rem; } } + +.page-toc { + font-size: $font-size-sm; + + h5 { + font-size: $font-size-sm; + margin-bottom: 0.5rem; + color: $gray-500; + } + + > div { + padding-top: 2rem; + position: sticky; + top: 0; + } + + ul { + padding-left: 0; + list-style-type: none; + } + + li > ul { + padding-left: 0.5rem; + } + + a { + display: block; + padding: 0.25rem 0; + + color: $gray-600; + text-decoration: none; + font-weight: 500; + + &:hover { + color: $gray-700; + } + } +} diff --git a/frappe/utils/data.py b/frappe/utils/data.py index a0703c1465..d2ccb42cb8 100644 --- a/frappe/utils/data.py +++ b/frappe/utils/data.py @@ -1129,6 +1129,7 @@ def md_to_html(markdown_text): 'fenced-code-blocks': None, 'tables': None, 'header-ids': None, + 'toc': None, 'highlightjs-lang': None, 'html-classes': { 'table': 'table table-bordered', diff --git a/frappe/website/router.py b/frappe/website/router.py index 4a9db0868f..1e999c1611 100644 --- a/frappe/website/router.py +++ b/frappe/website/router.py @@ -271,6 +271,9 @@ def setup_source(page_info): if page_info.template.endswith('.md'): source = frappe.utils.md_to_html(source) + if page_info.page_toc: + page_info.page_toc_html = source.toc_html + if not page_info.show_sidebar: source = '
' + source + '
'