mirror of
https://github.com/tylernguyen/wiki.git
synced 2025-02-05 16:33:14 -06:00
107 lines
3.4 KiB
Python
107 lines
3.4 KiB
Python
|
# LINK https://github.com/facelessuser/pymdown-extensions/blob/main/tools/collapse_code.py
|
||
|
"""Collapsible code."""
|
||
|
import xml.etree.ElementTree as etree
|
||
|
from markdown import util as mutil
|
||
|
import re
|
||
|
from pymdownx.blocks.block import Block
|
||
|
from pymdownx.blocks import BlocksExtension
|
||
|
|
||
|
# Fenced block placeholder for SuperFences
|
||
|
FENCED_BLOCK_RE = re.compile(
|
||
|
r'^([\> ]*){}({}){}$'.format(
|
||
|
mutil.HTML_PLACEHOLDER[0],
|
||
|
mutil.HTML_PLACEHOLDER[1:-1] % r'([0-9]+)',
|
||
|
mutil.HTML_PLACEHOLDER[-1]
|
||
|
)
|
||
|
)
|
||
|
|
||
|
|
||
|
class CollapseCode(Block):
|
||
|
"""Collapse code."""
|
||
|
|
||
|
NAME = 'collapse-code'
|
||
|
|
||
|
def on_init(self):
|
||
|
"""Handle initialization."""
|
||
|
|
||
|
# Track tab group count across the entire page.
|
||
|
if 'collapse_code_count' not in self.tracker:
|
||
|
self.tracker['collapse_code_count'] = 0
|
||
|
|
||
|
self.expand = self.config['expand_text']
|
||
|
if not isinstance(self.expand, str):
|
||
|
raise ValueError("'expand_text' must be a string")
|
||
|
|
||
|
self.collapse = self.config['collapse_text']
|
||
|
if not isinstance(self.collapse, str):
|
||
|
raise ValueError("'collapse_text' must be a string")
|
||
|
|
||
|
self.expand_title = self.config['expand_title']
|
||
|
if not isinstance(self.expand_title, str):
|
||
|
raise ValueError("'expand_title' must be a string")
|
||
|
|
||
|
self.collapse_title = self.config['collapse_title']
|
||
|
if not isinstance(self.collapse_title, str):
|
||
|
raise ValueError("'collapse_title' must be a string")
|
||
|
|
||
|
def on_create(self, parent):
|
||
|
"""Create the element."""
|
||
|
|
||
|
self.count = self.tracker['collapse_code_count']
|
||
|
self.tracker['collapse_code_count'] += 1
|
||
|
el = etree.SubElement(parent, 'div', {'class': 'collapse-code'})
|
||
|
etree.SubElement(
|
||
|
el,
|
||
|
'input',
|
||
|
{
|
||
|
"type": "checkbox",
|
||
|
"id": f"__collapse{self.count}",
|
||
|
"name": f"__collapse{self.count}",
|
||
|
'checked': 'checked'
|
||
|
}
|
||
|
)
|
||
|
return el
|
||
|
|
||
|
def on_end(self, block):
|
||
|
"""Convert non list items to details."""
|
||
|
|
||
|
el = etree.SubElement(block, 'div', {'class': 'code-footer'})
|
||
|
attrs = {'for': f'__collapse{self.count}', 'class': 'expand', 'tabindex': '0'}
|
||
|
if self.expand_title:
|
||
|
attrs['title'] = self.expand_title
|
||
|
expand = etree.SubElement(el, 'label', attrs)
|
||
|
expand.text = self.expand
|
||
|
|
||
|
attrs = {'for': f'__collapse{self.count}', 'class': 'collapse', 'tabindex': '0'}
|
||
|
if self.collapse_title:
|
||
|
attrs['title'] = self.collapse_title
|
||
|
collapse = etree.SubElement(el, 'label', attrs)
|
||
|
collapse.text = self.collapse
|
||
|
|
||
|
|
||
|
class CollapseCodeExtension(BlocksExtension):
|
||
|
"""Admonition Blocks Extension."""
|
||
|
|
||
|
def __init__(self, *args, **kwargs):
|
||
|
"""Initialize."""
|
||
|
|
||
|
self.config = {
|
||
|
'expand_text': ['Expand', "Set the text for the expand button."],
|
||
|
'collapse_text': ['Collapse', "Set the text for the collapse button."],
|
||
|
'expand_title': ['expand', "Set the text for the expand title."],
|
||
|
'collapse_title': ['collapse', "Set the text for the collapse title."]
|
||
|
}
|
||
|
|
||
|
super().__init__(*args, **kwargs)
|
||
|
|
||
|
def extendMarkdownBlocks(self, md, blocks):
|
||
|
"""Extend Markdown blocks."""
|
||
|
|
||
|
blocks.register(CollapseCode, self.getConfigs())
|
||
|
|
||
|
|
||
|
def makeExtension(*args, **kwargs):
|
||
|
"""Return extension."""
|
||
|
|
||
|
return CollapseCodeExtension(*args, **kwargs)
|