diff --git a/dvc/render/base.py b/dvc/render/base.py index b92976b83d..60506f9469 100644 --- a/dvc/render/base.py +++ b/dvc/render/base.py @@ -45,8 +45,17 @@ def SCRIPTS(self): def as_json(self): raise NotImplementedError + @staticmethod + def _remove_special_chars(string: str): + return string.translate( + {ord(c): "_" for c in r"!@#$%^&*()[]{};,<>?\/:.|`~=_+"} + ) + def generate_html(self, path: "StrPath"): """this method might edit content of path""" partial = self._convert(path) - div_id = f"plot_{self.filename.replace('.', '_').replace('/', '_')}" + + div_id = self._remove_special_chars(self.filename) + div_id = f"plot_{div_id}" + return self.DIV.format(id=div_id, partial=partial) diff --git a/tests/unit/render/test_renderer.py b/tests/unit/render/test_renderer.py new file mode 100644 index 0000000000..86e3f15f9b --- /dev/null +++ b/tests/unit/render/test_renderer.py @@ -0,0 +1,9 @@ +from dvc.render.base import Renderer + + +def test_remove_special_characters(): + special_chars = r"!@#$%^&*()[]{};,<>?\/:.|`~=_+" + dirty = f"plot_name{special_chars}" + assert Renderer._remove_special_chars(dirty) == "plot_name" + "_" * len( + special_chars + )