diff --git a/reflex/components/datadisplay/shiki_code_block.py b/reflex/components/datadisplay/shiki_code_block.py index 4d47f4c19..4ba4db205 100644 --- a/reflex/components/datadisplay/shiki_code_block.py +++ b/reflex/components/datadisplay/shiki_code_block.py @@ -44,7 +44,12 @@ LINE_NUMBER_STYLING = { }, } -THEME_MAPPING = {"light": "one-light", "dark": "one-dark-pro"} +THEME_MAPPING = { + "light": "one-light", + "dark": "one-dark-pro", + "a11y-dark": "github-dark", +} +LANGUAGE_MAPPING = {"bash": "shellscript"} LiteralCodeLanguage = Literal[ "abap", "actionscript-3", @@ -372,9 +377,13 @@ class ShikiCodeBlock(Component): """A Code block.""" library = "/components/shiki/code" + tag = "Code" + alias = "ShikiCode" + lib_dependencies: list[str] = ["shiki"] + # The language to use. language: Var[LiteralCodeLanguage] = Var.create("python") @@ -522,8 +531,8 @@ class ShikiCodeBlock(Component): class ShikiHighLevelCodeBlock(ShikiCodeBlock): """High level component for the shiki syntax highlighter.""" - # If this is enabled, the default transformer(shikijs transformer) will be used. - use_transformer: Var[bool] + # If this is enabled, the default transformers(shikijs transformer) will be used. + use_transformers: Var[bool] # If this is enabled line numbers will be shown next to the code block. show_line_numbers: Var[bool] @@ -547,12 +556,17 @@ class ShikiHighLevelCodeBlock(ShikiCodeBlock): Returns: The code block component. """ - use_transformer = props.pop("use_transformer", False) + use_transformers = props.pop("use_transformers", False) show_line_numbers = props.pop("show_line_numbers", False) + language = props.pop("language", None) - if use_transformer: + if use_transformers: props["transformers"] = [ShikiJsTransformer()] + if language is not None: + props["language"] = cls._map_languages(language) + + # line numbers are generated via css if show_line_numbers: props["style"] = {**LINE_NUMBER_STYLING, **props.get("style", {})} @@ -593,6 +607,12 @@ class ShikiHighLevelCodeBlock(ShikiCodeBlock): return THEME_MAPPING[theme] return theme + @staticmethod + def _map_languages(language: str) -> str: + if isinstance(language, str) and language in LANGUAGE_MAPPING: + return LANGUAGE_MAPPING[language] + return language + class TransformerNamespace(ComponentNamespace): """Namespace for the Transformers.""" diff --git a/reflex/components/datadisplay/shiki_code_block.pyi b/reflex/components/datadisplay/shiki_code_block.pyi index e642cddac..3353e004b 100644 --- a/reflex/components/datadisplay/shiki_code_block.pyi +++ b/reflex/components/datadisplay/shiki_code_block.pyi @@ -36,7 +36,12 @@ LINE_NUMBER_STYLING = { "color": "rgba(115,138,148,.4)", }, } -THEME_MAPPING = {"light": "one-light", "dark": "one-dark-pro"} +THEME_MAPPING = { + "light": "one-light", + "dark": "one-dark-pro", + "a11y-dark": "github-dark", +} +LANGUAGE_MAPPING = {"bash": "shellscript"} LiteralCodeLanguage = Literal[ "abap", "actionscript-3", @@ -960,7 +965,7 @@ class ShikiHighLevelCodeBlock(ShikiCodeBlock): *children, can_copy: Optional[bool] = False, copy_button: Optional[Union[Component, bool]] = None, - use_transformer: Optional[Union[Var[bool], bool]] = None, + use_transformers: Optional[Union[Var[bool], bool]] = None, show_line_numbers: Optional[Union[Var[bool], bool]] = None, language: Optional[ Union[ @@ -1571,7 +1576,7 @@ class ShikiHighLevelCodeBlock(ShikiCodeBlock): *children: The children of the component. can_copy: Whether a copy button should appear. copy_button: A custom copy button to override the default one. - use_transformer: If this is enabled, the default transformer(shikijs transformer) will be used. + use_transformers: If this is enabled, the default transformers(shikijs transformer) will be used. show_line_numbers: If this is enabled line numbers will be shown next to the code block. language: The language to use. theme: The theme to use ("light" or "dark"). @@ -1604,7 +1609,7 @@ class CodeblockNamespace(ComponentNamespace): *children, can_copy: Optional[bool] = False, copy_button: Optional[Union[Component, bool]] = None, - use_transformer: Optional[Union[Var[bool], bool]] = None, + use_transformers: Optional[Union[Var[bool], bool]] = None, show_line_numbers: Optional[Union[Var[bool], bool]] = None, language: Optional[ Union[ @@ -2215,7 +2220,7 @@ class CodeblockNamespace(ComponentNamespace): *children: The children of the component. can_copy: Whether a copy button should appear. copy_button: A custom copy button to override the default one. - use_transformer: If this is enabled, the default transformer(shikijs transformer) will be used. + use_transformers: If this is enabled, the default transformers(shikijs transformer) will be used. show_line_numbers: If this is enabled line numbers will be shown next to the code block. language: The language to use. theme: The theme to use ("light" or "dark").