2727PROP_NAME_PATTERN = re .compile (r"""(\n- )(\w+?) \(""" )
2828NESTED_PROP_NAME_PATTERN = re .compile (r"""(\n\s+- )(\w+?) \(""" )
2929
30+ HEADING_TEMPLATE = """<h{level} id="{id_}" style="scroll-margin-top:60px">
31+ {heading}<a href="#{id_}" class="anchor-link">#</a>
32+ </h{level}>"""
33+
3034
3135def parse (app , markdown_path , extra_env_vars = None ):
3236 extra_env_vars = extra_env_vars or {}
@@ -46,7 +50,8 @@ def parse(app, markdown_path, extra_env_vars=None):
4650
4751 markdown_blocks = SPLIT_PATTERN .split (raw )
4852 markdown_blocks = [
49- dcc .Markdown (block .strip ()) for block in markdown_blocks
53+ dcc .Markdown (_preprocess_markdown (block ), dangerously_allow_html = True )
54+ for block in markdown_blocks
5055 ]
5156
5257 examples_docs = EXAMPLE_DOC_PATTERN .findall (raw )
@@ -55,7 +60,24 @@ def parse(app, markdown_path, extra_env_vars=None):
5560 ]
5661
5762 content .extend (_interleave (markdown_blocks , examples_docs ))
58- return html .Div (content , key = str (markdown_path ))
63+ return html .Div ([dcc .Location (id = "url" )] + content , key = str (markdown_path ))
64+
65+
66+ def _preprocess_markdown (text ):
67+ text = text .strip ()
68+ lines = text .split ("\n " )
69+ new_lines = []
70+ for line in lines :
71+ if line .startswith ("#" ):
72+ level , heading = line .split (" " , 1 )
73+ level = level .count ("#" )
74+ id_ = heading .replace (" " , "-" ).lower ()
75+ new_lines .append (
76+ HEADING_TEMPLATE .format (level = level , id_ = id_ , heading = heading )
77+ )
78+ else :
79+ new_lines .append (line )
80+ return "\n " .join (new_lines )
5981
6082
6183def _parse_block (block , app , extra_env_vars ):
0 commit comments