" Description: HTML5 and inline SVG indenter " Changed By: HT de Beer " Last Change: 20121013 " Added the SVG elements to the list of indenting element. SVG elements " taken from http://www.w3.org/TR/SVG/eltindex.html " " Description: html5 (and html4) indenter " Changed By: Brian Gershon " Last Change: 30 Jan 2011 " " 1. Started with vim72 html indent file authored by Johannes Zellner (below) " 2. Added html5 list as described here: " http://stackoverflow.com/questions/3232518/how-to-update-vim-to-color-code-new-html-elements " 3. Added this to a fork of https://github.com/othree/html5.vim " which already provides nice html5 syntax highlighting. " " Description: html indenter " Author: Johannes Zellner " Last Change: Mo, 05 Jun 2006 22:32:41 CEST " Restoring 'cpo' and 'ic' added by Bram 2006 May 5 " Globals: " let g:html_indent_tags = 'html\|p\|time' " let g:html_exclude_tags = ['html', 'style', 'script', 'body'] " Only load this indent file when no other was loaded. if exists("b:did_indent") finish endif runtime! indent/javascript.vim let s:jsindent = &indentexpr unlet b:did_indent runtime! indent/css.vim let s:cssindent = &indentexpr let b:did_indent = 1 " [-- local settings (must come before aborting the script) --] setlocal indentexpr=HtmlIndentGet(v:lnum) setlocal indentkeys=o,O,*,<>>,{,},!^F let s:tags = [] " [-- --] call add(s:tags, 'a') call add(s:tags, 'abbr') call add(s:tags, 'acronym') call add(s:tags, 'address') call add(s:tags, 'b') call add(s:tags, 'bdo') call add(s:tags, 'big') call add(s:tags, 'blockquote') call add(s:tags, 'button') call add(s:tags, 'caption') call add(s:tags, 'center') call add(s:tags, 'cite') call add(s:tags, 'code') call add(s:tags, 'colgroup') call add(s:tags, 'del') call add(s:tags, 'dfn') call add(s:tags, 'dir') call add(s:tags, 'div') call add(s:tags, 'dl') call add(s:tags, 'dt') call add(s:tags, 'dd') call add(s:tags, 'em') call add(s:tags, 'fieldset') call add(s:tags, 'font') call add(s:tags, 'form') call add(s:tags, 'frameset') call add(s:tags, 'h1') call add(s:tags, 'h2') call add(s:tags, 'h3') call add(s:tags, 'h4') call add(s:tags, 'h5') call add(s:tags, 'h6') call add(s:tags, 'i') call add(s:tags, 'iframe') call add(s:tags, 'ins') call add(s:tags, 'kbd') call add(s:tags, 'label') call add(s:tags, 'legend') call add(s:tags, 'li') call add(s:tags, 'map') call add(s:tags, 'menu') call add(s:tags, 'noframes') call add(s:tags, 'noscript') call add(s:tags, 'object') call add(s:tags, 'ol') call add(s:tags, 'optgroup') call add(s:tags, 'p') " call add(s:tags, 'pre') call add(s:tags, 'q') call add(s:tags, 's') call add(s:tags, 'samp') call add(s:tags, 'script') call add(s:tags, 'select') call add(s:tags, 'small') call add(s:tags, 'span') call add(s:tags, 'strong') call add(s:tags, 'style') call add(s:tags, 'sub') call add(s:tags, 'sup') call add(s:tags, 'table') call add(s:tags, 'textarea') call add(s:tags, 'title') call add(s:tags, 'tt') call add(s:tags, 'u') call add(s:tags, 'ul') call add(s:tags, 'var') " New HTML 5 elements call add(s:tags, 'article') call add(s:tags, 'aside') call add(s:tags, 'audio') call add(s:tags, 'canvas') call add(s:tags, 'datalist') call add(s:tags, 'details') call add(s:tags, 'figcaption') call add(s:tags, 'figure') call add(s:tags, 'footer') call add(s:tags, 'header') call add(s:tags, 'hgroup') call add(s:tags, 'main') call add(s:tags, 'mark') call add(s:tags, 'meter') call add(s:tags, 'nav') call add(s:tags, 'output') call add(s:tags, 'progress') call add(s:tags, 'picture') call add(s:tags, 'rp') call add(s:tags, 'rt') call add(s:tags, 'ruby') call add(s:tags, 'section') call add(s:tags, 'source') call add(s:tags, 'summary') call add(s:tags, 'time') call add(s:tags, 'video') call add(s:tags, 'bdi') call add(s:tags, 'data') " Web Component call add(s:tags, 'template') " Common inline used SVG elements call add(s:tags, 'clipPath') call add(s:tags, 'defs') call add(s:tags, 'desc') call add(s:tags, 'filter') call add(s:tags, 'foreignObject') call add(s:tags, 'g') call add(s:tags, 'linearGradient') call add(s:tags, 'marker') call add(s:tags, 'mask') call add(s:tags, 'pattern') call add(s:tags, 'radialGradient') call add(s:tags, 'svg') call add(s:tags, 'switch') call add(s:tags, 'symbol') call add(s:tags, 'text') call add(s:tags, 'textPath') call add(s:tags, 'tref') call add(s:tags, 'tspan') call add(s:tags, 'html') call add(s:tags, 'head') call add(s:tags, 'body') call add(s:tags, 'thead') call add(s:tags, 'tbody') call add(s:tags, 'tfoot') call add(s:tags, 'tr') call add(s:tags, 'th') call add(s:tags, 'td') let s:omittable = [ \ ['address', 'article', 'aside', 'blockquote', 'dir', 'div', 'dl', 'fieldset', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'hr', 'menu', 'nav', 'ol', 'p', 'pre', 'section', 'table', 'ul'], \ ['dt', 'dd'], \ ['li'], \ ['thead', 'tbody', 'tfoot'], \ ['th', 'td'], \] if exists('g:html_exclude_tags') for tag in g:html_exclude_tags call remove(s:tags, index(s:tags, tag)) endfor endif let s:html_indent_tags = join(s:tags, '\|') let s:html_indent_tags = s:html_indent_tags.'\|\w\+\(-\w\+\)\+' if exists('g:html_indent_tags') let s:html_indent_tags = s:html_indent_tags.'\|'.g:html_indent_tags endif let s:cpo_save = &cpo set cpo-=C " [-- count indent-increasing tags of line a:lnum --] fun! HtmlIndentOpen(lnum, pattern) let s = substitute('x'.getline(a:lnum), \ '.\{-}\(\(<\)\('.a:pattern.'\)\>\)', "\1", 'g') let s = substitute(s, "[^\1].*$", '', '') return strlen(s) endfun " [-- count indent-decreasing tags of line a:lnum --] fun! HtmlIndentClose(lnum, pattern) let s = substitute('x'.getline(a:lnum), \ '.\{-}\(\(<\)/\('.a:pattern.'\)\>>\)', "\1", 'g') let s = substitute(s, "[^\1].*$", '', '') return strlen(s) endfun " [-- count indent-increasing '{' of (java|css) line a:lnum --] fun! HtmlIndentOpenAlt(lnum) return strlen(substitute(getline(a:lnum), '[^{]\+', '', 'g')) endfun " [-- count indent-decreasing '}' of (java|css) line a:lnum --] fun! HtmlIndentCloseAlt(lnum) return strlen(substitute(getline(a:lnum), '[^}]\+', '', 'g')) endfun " [-- return the sum of indents respecting the syntax of a:lnum --] fun! HtmlIndentSum(lnum, style) if a:style == match(getline(a:lnum), '^\s*') let open = HtmlIndentOpen(a:lnum, s:html_indent_tags) let close = HtmlIndentClose(a:lnum, s:html_indent_tags) if 0 != open || 0 != close return open - close endif endif endif if '' != &syntax && \ synIDattr(synID(a:lnum, 1, 1), 'name') =~ '\(css\|java\).*' && \ synIDattr(synID(a:lnum, strlen(getline(a:lnum)), 1), 'name') \ =~ '\(css\|java\).*' if a:style == match(getline(a:lnum), '^\s*}') return HtmlIndentOpenAlt(a:lnum) - HtmlIndentCloseAlt(a:lnum) endif endif return 0 endfun fun! HtmlIndentGet(lnum) " Find a non-empty line above the current line. let lnum = prevnonblank(a:lnum - 1) " Hit the start of the file, use zero indent. if lnum == 0 return 0 endif let restore_ic = &ic setlocal ic " ignore case " [-- special handling for
: no indenting --]
    if getline(a:lnum) =~ '\c
' \ || 0 < searchpair('\c
', '', '\c
', 'nWb') \ || 0 < searchpair('\c
', '', '\c
', 'nW') " we're in a line with or inside
 ... 
if restore_ic == 0 setlocal noic endif return -1 endif " [-- special handling for : use cindent --] let js = ', 05 Jun 2006 " ZDR: This needs to be an AND (we are 'after the start of the pair' AND " we are 'before the end of the pair'). Otherwise, indentation " before the start of the script block will be affected; the end of " the pair will still match if we are before the beginning of the " pair. " if 0 < searchpair(js, '', jse, 'nWb') \ && 0 < searchpair(js, '', jse, 'nW') " we're inside javascript if getline(searchpair(js, '', '', 'nWb')) !~ '