code.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435
  1. import asyncio
  2. from typing import Optional
  3. from ..element import Element
  4. from ..elements.button import Button as button
  5. from ..elements.markdown import Markdown as markdown
  6. from ..elements.markdown import remove_indentation
  7. from ..functions.javascript import run_javascript
  8. class Code(Element):
  9. def __init__(self, content: str, *, language: Optional[str] = 'python') -> None:
  10. """Code
  11. This element displays a code block with syntax highlighting.
  12. :param content: code to display
  13. :param language: language of the code (default: "python")
  14. """
  15. super().__init__()
  16. self._classes.append('nicegui-code')
  17. self.content = remove_indentation(content)
  18. with self:
  19. self.markdown = markdown(f'```{language}\n{self.content}\n```').classes('overflow-auto')
  20. self.copy_button = button(icon='content_copy', on_click=self.copy_to_clipboard) \
  21. .props('round flat size=sm').classes('absolute right-2 top-2 opacity-20 hover:opacity-80')
  22. async def copy_to_clipboard(self) -> None:
  23. await run_javascript('navigator.clipboard.writeText(`' + self.content + '`)', respond=False)
  24. self.copy_button.props('icon=check')
  25. await asyncio.sleep(3.0)
  26. self.copy_button.props('icon=content_copy')