From c1cbffcacc527e2d7c120b19b994bb14e40cd488 Mon Sep 17 00:00:00 2001 From: Raoul Wols Date: Fri, 19 Jul 2019 23:43:30 +0200 Subject: [PATCH] Do not escape quote characters for hover content Otherwise mdpopups will complain. Also add two hover tests to cement this behavior. --- plugin/hover.py | 11 ++++++++--- tests/test_hover.py | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/plugin/hover.py b/plugin/hover.py index 1ade91461..6989619dd 100644 --- a/plugin/hover.py +++ b/plugin/hover.py @@ -137,12 +137,17 @@ def hover_content(self, point, response: 'Optional[Any]') -> str: formatted = [] for item in contents: value = "" - language = None + language = None # type: Optional[str] if isinstance(item, str): - value = escape(item) + value = item else: - value = escape(item.get("value")) + value = item.get("value") language = item.get("language") + # NOTE: Escape the hover content for languages like C# where the + # hover content may contain "<" and ">" characters, but do not + # escape the quote characters "'" and '"' for languages like Python. + # mdpopups will complain otherwise. + value = escape(value, quote=False) if language: formatted.append("```{}\n{}\n```\n".format(language, value)) else: diff --git a/tests/test_hover.py b/tests/test_hover.py index 7f8943392..3ea40ce1c 100644 --- a/tests/test_hover.py +++ b/tests/test_hover.py @@ -24,3 +24,23 @@ def test_hover_info(self): last_content = _test_contents[-1] self.assertTrue("greeting" in last_content) + + def test_escape_fish_brackets(self): + self.client.responses['textDocument/hover'] = {"contents": "foobar"} + yield 100 + self.view.run_command('insert', {"characters": ORIGINAL_CONTENT}) + self.view.run_command('lsp_hover', {'point': 3}) + yield 100 + self.assertTrue(self.view.is_popup_visible()) + last_content = _test_contents[-1] + self.assertTrue("<summary>foobar</summary>" in last_content) + + def test_dont_escape_quotes(self): + self.client.responses['textDocument/hover'] = {"contents": "print(foo=bar, prefix='LSP')"} + yield 100 + self.view.run_command('insert', {"characters": ORIGINAL_CONTENT}) + self.view.run_command('lsp_hover', {'point': 3}) + yield 100 + self.assertTrue(self.view.is_popup_visible()) + last_content = _test_contents[-1] + self.assertTrue("print(foo=bar, prefix='LSP')" in last_content)