aboutsummaryrefslogtreecommitdiff
path: root/autoload/html
diff options
context:
space:
mode:
Diffstat (limited to 'autoload/html')
-rw-r--r--autoload/html/spelllang.vim59
1 files changed, 59 insertions, 0 deletions
diff --git a/autoload/html/spelllang.vim b/autoload/html/spelllang.vim
new file mode 100644
index 0000000..dfabf40
--- /dev/null
+++ b/autoload/html/spelllang.vim
@@ -0,0 +1,59 @@
+" The line count limit for looking for the pattern; no sense churning through
+" the whole document every time it's changed.
+"
+let s:lines = get(g:, 'html_spelllang_lines', 128)
+
+" Crude regular expression to match an <html>, <body>, or <main> tag on one
+" line with a lang= attribute set. This isn't exact, by any means, but
+" I don't want to write an actual HTML parser for a mere 'spelllang' hook
+" nicety that fails silently anyway.
+"
+" The first submatch is the language code, e.g. "en", "es". The second
+" submatch is optional and follows a hyphen and is for the regional code,
+" e.g. "US", "GB", "AR".
+"
+let s:pattern = get(g:, 'html_spelllang_pattern',
+ \ '\m\c<\%(html\|body\|main\)\>[^>]*\<lang=["'']\='
+ \.'\([a-z-]\{2,}\)\%(-\([a-z]\{2,}\)\)'
+ \)
+
+" Look for a language code in the first lines of the current buffer, and if it
+" looks understandable, adopt an appropriate spelling language.
+"
+function! html#spelllang#Set() abort
+
+ " Loop through the first s:lines of the buffer
+ for line in getline(1, s:lines)
+
+ " Check if this line has an <html lang=""> tag, or skip it
+ let matches = matchlist(line, s:pattern)
+ if empty(matches)
+ continue
+ endif
+
+ " The line seems to match our pattern, and so we have a language code in
+ " matches[1], and possibly a region code in matches[2].
+ "
+ " Next we need to check whether we'll attempt to use this to set
+ " a spelling language. Build the expected path for a spellfile; looks
+ " like `$VIMRUNTIME/spell/en.utf-8.spl`. Note that this path doesn't
+ " include any language region, per documentation.
+ "
+ let spellfile = 'spell/' . join([
+ \ tolower(matches[1]),
+ \ &encoding,
+ \ 'spl',
+ \], '.')
+
+ " If a spelling list file of the expected name exists in &runtimepath, try
+ " setting the local value of 'spelllang' to reflect what was in the lang=
+ " attribute; force it to lowercase and separate the region with an
+ " underscore rather than a hyphen (if there is a region).
+ "
+ if strlen(globpath(&runtimepath, spellfile))
+ let &l:spelllang = tolower(join(matches[1:2], '_'))
+ endif
+
+ endfor
+
+endfunction