aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/ftplugin/htmlangular.vim12
-rw-r--r--runtime/lua/vim/filetype/detect.lua17
-rw-r--r--test/old/testdir/test_filetype.vim41
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