diff options
| author | Pham Huy Hoang <hoangtun0810@gmail.com> | 2023-01-02 16:28:40 +0900 |
|---|---|---|
| committer | Stephan Seitz <stephan.seitz@fau.de> | 2023-01-03 17:50:44 +0100 |
| commit | 8c71c6c5edfa447aaa867858e2e913340ea964b7 (patch) | |
| tree | e24da0f1a295b3d79de7df3c1fd452510c67acb0 | |
| parent | refactor(svelte): Remove duplicated queries (diff) | |
| download | nvim-treesitter-8c71c6c5edfa447aaa867858e2e913340ea964b7.tar nvim-treesitter-8c71c6c5edfa447aaa867858e2e913340ea964b7.tar.gz nvim-treesitter-8c71c6c5edfa447aaa867858e2e913340ea964b7.tar.bz2 nvim-treesitter-8c71c6c5edfa447aaa867858e2e913340ea964b7.tar.lz nvim-treesitter-8c71c6c5edfa447aaa867858e2e913340ea964b7.tar.xz nvim-treesitter-8c71c6c5edfa447aaa867858e2e913340ea964b7.tar.zst nvim-treesitter-8c71c6c5edfa447aaa867858e2e913340ea964b7.zip | |
fix(html): fix wrong indents for script/style tags
| -rw-r--r-- | queries/html_tags/indents.scm | 27 | ||||
| -rw-r--r-- | tests/indent/html/issue-3986.html | 4 | ||||
| -rw-r--r-- | tests/indent/html/script_style.html | 12 | ||||
| -rw-r--r-- | tests/indent/html/self_closing_tag.html | 14 | ||||
| -rw-r--r-- | tests/indent/html/start_tag.html | 8 | ||||
| -rw-r--r-- | tests/indent/html_spec.lua | 28 |
6 files changed, 91 insertions, 2 deletions
diff --git a/queries/html_tags/indents.scm b/queries/html_tags/indents.scm index 7b9d6afe1..a9e0794f5 100644 --- a/queries/html_tags/indents.scm +++ b/queries/html_tags/indents.scm @@ -1,9 +1,32 @@ [ - (element) + ( + (element + (start_tag + (tag_name) @_not_special) + ) + (#not-any-of? @_not_special "meta" "link") + ) + (element (self_closing_tag)) ] @indent +; These tags are usually written one-lined and doesnt use self-closing tags so special-cased them +; but add indent to the tag to make sure attributes inside them are still indented if written multi-lined +( + (start_tag + (tag_name) @_special) + (#any-of? @_special "meta" "link") +) @indent + + +; These are the nodes that will be captured when we do `normal o` +; But last element has already been ended, so capturing this +; to mark end of last element +(element (end_tag [">"] @indent_end)) +(element (self_closing_tag "/>" @indent_end)) + +; Script/style elements aren't indented, so only branch the end tag of other elements +(element (end_tag) @branch) [ - (end_tag) ">" "/>" ] @branch diff --git a/tests/indent/html/issue-3986.html b/tests/indent/html/issue-3986.html new file mode 100644 index 000000000..2e6d9f0d6 --- /dev/null +++ b/tests/indent/html/issue-3986.html @@ -0,0 +1,4 @@ +<div> + <div> + </div> +</div> diff --git a/tests/indent/html/script_style.html b/tests/indent/html/script_style.html new file mode 100644 index 000000000..b00f3f40f --- /dev/null +++ b/tests/indent/html/script_style.html @@ -0,0 +1,12 @@ +<head> + <style> + a { + stroke-linecap: round; + } + </style> +</head> +<body> + <script> + const foo = "bar" + </script> +</body> diff --git a/tests/indent/html/self_closing_tag.html b/tests/indent/html/self_closing_tag.html new file mode 100644 index 000000000..79376b83d --- /dev/null +++ b/tests/indent/html/self_closing_tag.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <title></title> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <link href="css/style.css" rel="stylesheet"> + </head> + <body> + <br/> + <button + id = "123" + </body> +</html> diff --git a/tests/indent/html/start_tag.html b/tests/indent/html/start_tag.html new file mode 100644 index 000000000..96c83be52 --- /dev/null +++ b/tests/indent/html/start_tag.html @@ -0,0 +1,8 @@ +<meta charset="UTF-8"> + +<html lang="en"> + <head> + <meta + charset="UTF-8" + </head> +</html> diff --git a/tests/indent/html_spec.lua b/tests/indent/html_spec.lua new file mode 100644 index 000000000..b94653613 --- /dev/null +++ b/tests/indent/html_spec.lua @@ -0,0 +1,28 @@ +local Runner = require("tests.indent.common").Runner +local runner = Runner:new(it, "tests/indent/html", { + tabstop = 2, + shiftwidth = 2, + expandtab = true, +}) + +describe("indent HTML:", function() + describe("whole file:", function() + runner:whole_file "." + end) + + describe("new line:", function() + runner:new_line("start_tag.html", { on_line = 1, text = "anything", indent = 0 }) + runner:new_line("start_tag.html", { on_line = 4, text = "anything", indent = 4 }) + runner:new_line("start_tag.html", { on_line = 6, text = "charset = utf-8", indent = 6 }) + runner:new_line("start_tag.html", { on_line = 6, text = ">", indent = 4 }) + runner:new_line("start_tag.html", { on_line = 6, text = "/>", indent = 4 }) + runner:new_line("issue-3986.html", { on_line = 3, text = "indent once", indent = 2 }) + runner:new_line("self_closing_tag.html", { on_line = 10, text = "Something", indent = 4 }) + runner:new_line("self_closing_tag.html", { on_line = 12, text = "disabled", indent = 6 }) + runner:new_line("self_closing_tag.html", { on_line = 12, text = "/>", indent = 4 }) + runner:new_line("script_style.html", { on_line = 5, text = "body", indent = 2 }) + runner:new_line("script_style.html", { on_line = 6, text = "<div></div>", indent = 2 }) + runner:new_line("script_style.html", { on_line = 9, text = "const x = 1", indent = 2 }) + runner:new_line("script_style.html", { on_line = 11, text = "Text", indent = 2 }) + end) +end) |
