diff options
-rw-r--r-- | runtime/ftplugin/htmlangular.vim | 12 | ||||
-rw-r--r-- | runtime/lua/vim/filetype/detect.lua | 17 | ||||
-rw-r--r-- | test/old/testdir/test_filetype.vim | 41 |
3 files changed, 66 insertions, 4 deletions
diff --git a/runtime/ftplugin/htmlangular.vim b/runtime/ftplugin/htmlangular.vim new file mode 100644 index 0000000000..b181b203d0 --- /dev/null +++ b/runtime/ftplugin/htmlangular.vim @@ -0,0 +1,12 @@ +" Vim filetype plugin file +" Language: Angular HTML Template +" Maintainer: Dennis van den Berg <dennis@vdberg.dev> +" Last Change: 2024 Jul 8 + +" Only use this filetype plugin when no other was loaded. +if exists("b:did_ftplugin") + finish +endif + +" Use HTML and Angular template ftplugins +runtime! ftplugin/html.vim diff --git a/runtime/lua/vim/filetype/detect.lua b/runtime/lua/vim/filetype/detect.lua index 85c8d4c9dc..8a217a4ac2 100644 --- a/runtime/lua/vim/filetype/detect.lua +++ b/runtime/lua/vim/filetype/detect.lua @@ -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( diff --git a/test/old/testdir/test_filetype.vim b/test/old/testdir/test_filetype.vim index a421c83340..00756ad68a 100644 --- a/test/old/testdir/test_filetype.vim +++ b/test/old/testdir/test_filetype.vim @@ -336,7 +336,8 @@ func s:GetFilenameChecks() abort \ 'hoon': ['file.hoon'], \ 'hostconf': ['/etc/host.conf', 'any/etc/host.conf'], \ 'hostsaccess': ['/etc/hosts.allow', '/etc/hosts.deny', 'any/etc/hosts.allow', 'any/etc/hosts.deny'], - \ 'html': ['file.html', 'file.htm', 'file.cshtml', 'file.component.html'], + \ 'html': ['file.html', 'file.htm', 'file.cshtml'], + \ 'htmlangular': ['file.component.html'], \ 'htmlm4': ['file.html.m4'], \ 'httest': ['file.htt', 'file.htb'], \ 'hurl': ['file.hurl'], @@ -1045,7 +1046,8 @@ func Test_emptybuf_ftdetect() call assert_equal('', &filetype) filetype detect call assert_equal('sh', &filetype) - close! + " close the swapfile + bw! endfunc " Test for ':filetype indent on' and ':filetype indent off' commands @@ -1569,6 +1571,41 @@ func Test_hook_file() filetype off endfunc +func Test_html_file() + filetype on + + " HTML Angular + let content = ['@for (item of items; track item.name) {', ' <li> {{ item.name }}</li>', '} @empty {', ' <li> There are no items.</li>', '}'] + call writefile(content, 'Xfile.html', 'D') + split Xfile.html + call assert_equal('htmlangular', &filetype) + bwipe! + + " Django Template + let content = ['{% if foobar %}', + \ ' <ul>', + \ ' {% for question in list %}', + \ ' <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>', + \ ' {% endfor %}', + \ ' </ul>', + \ '{% else %}', + \ ' <p>No polls are available.</p>', + \ '{% endif %}'] + call writefile(content, 'Xfile.html', 'D') + split Xfile.html + call assert_equal('htmldjango', &filetype) + bwipe! + + " regular HTML + let content = ['<!DOCTYPE html>', '<html>', ' <head>Foobar</head>', ' <body>Content', ' </body>', '</html>'] + call writefile(content, 'Xfile.html', 'D') + split Xfile.html + call assert_equal('html', &filetype) + bwipe! + + filetype off +endfunc + func Test_m_file() filetype on |