vim-patch:9.1.0551: filetype: htmlangular files are not properly detected

Problem:  filetype: htmlangular files are not properly detected
Solution: Use the new htmlangular filetype for angular files, because
          since angular v17, those are no longer valid HTML files.
          (Dennis van den Berg)

Since Angular 17, the new Control Flow Syntax is not valid HTML. This PR
adds a new filetype detection for the HTML templates of Angular.

It first checks the filename. The Angular convention is to use
*.component.html for the template. However, this is not mandatory.

If the filename does not match, it will check the contents of the file
if it contains:

  - One of the Control-Flow blocks: @if, @for, @switch, @defer
  - A structural directive: *ngIf, *ngFor, *ngSwitch, *ngTemplateOutlet
  - Builtin Angular elements: ng-template or ng-content
  - String interpolation: {{ something }}

This enables the Angular LSP to attach only to htmlangular filetypes, as
well as language parsers, such as tree-sitter.

closes: vim/vim#15190

1ad194c0df

Co-authored-by: Dennis van den Berg <dennis.vandenberg@nedap.com>
This commit is contained in:
Christian Clason
2024-07-09 19:58:02 +02:00
parent 80530d07e7
commit 7fa089f463
3 changed files with 66 additions and 4 deletions

View File

@@ -710,9 +710,22 @@ function M.haredoc(path, _)
end
--- @type vim.filetype.mapfn
function M.html(_, bufnr)
function M.html(path, bufnr)
-- Test if the filename follows the Angular component template convention
local filename = fn.fnamemodify(path, ':t')
if filename:find('%.component%.html$') then
return 'htmlangular'
end
for _, line in ipairs(getlines(bufnr, 1, 40)) do
if matchregex(line, [[\<DTD\s\+XHTML\s]]) then
if
matchregex(
line,
[[@\(if\|for\|defer\|switch\)\|\*\(ngIf\|ngFor\|ngSwitch\|ngTemplateOutlet\)\|ng-template\|ng-content\|{{.*}}]]
)
then
return 'htmlangular'
elseif matchregex(line, [[\<DTD\s\+XHTML\s]]) then
return 'xhtml'
elseif
matchregex(