| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- from imgui_bundle import immapp
- import inspect
- import json
- from typing import Any
- SnippetData = immapp.snippets.SnippetData
- def show_python_code(
- python_object: object, # can be a class, function, module, etc.
- read_only: bool = True,
- height_in_lines: int | None = None,
- max_height_in_lines: int | None = None,
- show_cursor_position: bool | None = None,
- de_indent_code: bool | None = None,
- show_copy_button: bool | None = None,
- palette: immapp.snippets.SnippetTheme | None = immapp.snippets.SnippetTheme.dark,
- border: bool | None = None,
- ) -> None:
- """Render the code of an object as a markdown code block"""
- statics = show_python_code
- if not hasattr(statics, "_ALL_PYTHON_SNIPPETS"):
- statics._ALL_PYTHON_SNIPPETS: dict[object, SnippetData] = {} # type: ignore
- if python_object not in statics._ALL_PYTHON_SNIPPETS:
- snippet_data = SnippetData()
- snippet_data.displayed_filename = str(python_object)
- snippet_data.code = inspect.getsource(python_object) # type: ignore
- snippet_data.language = immapp.snippets.SnippetLanguage.python
- if read_only is not None:
- snippet_data.read_only = read_only
- if height_in_lines is not None:
- snippet_data.height_in_lines = height_in_lines
- if max_height_in_lines is not None:
- snippet_data.max_height_in_lines = max_height_in_lines
- if show_cursor_position is not None:
- snippet_data.show_cursor_position = show_cursor_position
- if de_indent_code is not None:
- snippet_data.de_indent_code = de_indent_code
- if show_copy_button is not None:
- snippet_data.show_copy_button = show_copy_button
- if palette is not None:
- snippet_data.palette = palette
- if border is not None:
- snippet_data.border = border
- statics._ALL_PYTHON_SNIPPETS[python_object] = snippet_data
- cached_snippet_data = statics._ALL_PYTHON_SNIPPETS[python_object]
- immapp.snippets.show_code_snippet(cached_snippet_data)
- def _compact_json(data: Any, indent: int = 4) -> str:
- def _compact_list(lst: Any, indent_level: int) -> str:
- compacted = json.dumps(lst)
- if len(compacted) <= 80:
- return compacted
- return json.dumps(lst, indent=indent, separators=(',', ': '))
- def _compact_dict(dct: Any, indent_level: int) -> str:
- items = []
- for key, value in dct.items():
- key_str = json.dumps(key) + ': '
- value_str = (
- _compact_list(value, indent_level + 1)
- if isinstance(value, list)
- else json.dumps(value, indent=indent, separators=(',', ': '))
- )
- items.append('\n' + ' ' * indent_level * indent + key_str + value_str)
- return '{' + ','.join(items) + '\n' + ' ' * (indent_level - 1) * indent + '}'
- return _compact_dict(data, 1)
- def show_json_dict(json_dict: dict[str, Any]) -> None:
- from imgui_bundle import imgui_md
- """Render a json dict as a markdown code block"""
- md_string = "```\n" + _compact_json(json_dict, indent=4) + "\n```"
- imgui_md.render(md_string)
|