" 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: g:html_indent_tags -- indenting tags " g:html_indent_strict -- inhibit 'O O' elements " g:html_indent_strict_table -- inhibit 'O -' elements " Only load this indent file when no other was loaded. if exists("b:did_indent") finish endif let b:did_indent = 1 " [-- local settings (must come before aborting the script) --] setlocal indentexpr=HtmlIndentGet(v:lnum) setlocal indentkeys=o,O,*,<>>,{,} if exists('g:html_indent_tags') unlet g:html_indent_tags endif " [-- helper function to assemble tag list --] fun! HtmlIndentPush(tag) if exists('g:html_indent_tags') let g:html_indent_tags = g:html_indent_tags.'\|'.a:tag else let g:html_indent_tags = a:tag endif endfun " [-- --] call HtmlIndentPush('a') call HtmlIndentPush('abbr') call HtmlIndentPush('acronym') call HtmlIndentPush('address') call HtmlIndentPush('b') call HtmlIndentPush('bdo') call HtmlIndentPush('big') call HtmlIndentPush('blockquote') call HtmlIndentPush('button') call HtmlIndentPush('caption') call HtmlIndentPush('center') call HtmlIndentPush('cite') call HtmlIndentPush('code') call HtmlIndentPush('colgroup') call HtmlIndentPush('del') call HtmlIndentPush('dfn') call HtmlIndentPush('dir') call HtmlIndentPush('div') call HtmlIndentPush('dl') call HtmlIndentPush('em') call HtmlIndentPush('fieldset') call HtmlIndentPush('font') call HtmlIndentPush('form') call HtmlIndentPush('frameset') call HtmlIndentPush('h1') call HtmlIndentPush('h2') call HtmlIndentPush('h3') call HtmlIndentPush('h4') call HtmlIndentPush('h5') call HtmlIndentPush('h6') call HtmlIndentPush('i') call HtmlIndentPush('iframe') call HtmlIndentPush('ins') call HtmlIndentPush('kbd') call HtmlIndentPush('label') call HtmlIndentPush('legend') call HtmlIndentPush('map') call HtmlIndentPush('menu') call HtmlIndentPush('noframes') call HtmlIndentPush('noscript') call HtmlIndentPush('object') call HtmlIndentPush('ol') call HtmlIndentPush('optgroup') " call HtmlIndentPush('pre') call HtmlIndentPush('q') call HtmlIndentPush('s') call HtmlIndentPush('samp') call HtmlIndentPush('script') call HtmlIndentPush('select') call HtmlIndentPush('small') call HtmlIndentPush('span') call HtmlIndentPush('strong') call HtmlIndentPush('style') call HtmlIndentPush('sub') call HtmlIndentPush('sup') call HtmlIndentPush('table') call HtmlIndentPush('textarea') call HtmlIndentPush('title') call HtmlIndentPush('tt') call HtmlIndentPush('u') call HtmlIndentPush('ul') call HtmlIndentPush('var') " New HTML 5 elements call HtmlIndentPush('table') call HtmlIndentPush('article') call HtmlIndentPush('aside') call HtmlIndentPush('audio') call HtmlIndentPush('canvas') call HtmlIndentPush('command') call HtmlIndentPush('datalist') call HtmlIndentPush('details') call HtmlIndentPush('embed') call HtmlIndentPush('figcaption') call HtmlIndentPush('figure') call HtmlIndentPush('footer') call HtmlIndentPush('header') call HtmlIndentPush('hgroup') call HtmlIndentPush('keygen') call HtmlIndentPush('mark') call HtmlIndentPush('meter') call HtmlIndentPush('nav') call HtmlIndentPush('output') call HtmlIndentPush('progress') call HtmlIndentPush('rp') call HtmlIndentPush('rt') call HtmlIndentPush('ruby') call HtmlIndentPush('section') call HtmlIndentPush('source') call HtmlIndentPush('summary') call HtmlIndentPush('time') call HtmlIndentPush('video') call HtmlIndentPush('bdi') " [-- --] if !exists('g:html_indent_strict') call HtmlIndentPush('body') call HtmlIndentPush('head') call HtmlIndentPush('html') call HtmlIndentPush('tbody') endif " [-- --] if !exists('g:html_indent_strict_table') call HtmlIndentPush('th') call HtmlIndentPush('td') call HtmlIndentPush('tr') call HtmlIndentPush('tfoot') call HtmlIndentPush('thead') endif delfun HtmlIndentPush 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, g:html_indent_tags) let close = HtmlIndentClose(a:lnum, g: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, '', '', 'nWb') \ && 0 < searchpair(js, '', '', 'nW') " we're inside javascript if getline(lnum) !~ js && getline(a:lnum) != '' if restore_ic == 0 setlocal noic endif return cindent(a:lnum) endif endif if getline(lnum) =~ '\c' " line before the current line a:lnum contains " a closing . --> search for line before " starting
 to restore the indent.
	let preline = prevnonblank(search('\c
', 'bW') - 1)
	if preline > 0
	    if restore_ic == 0
	      setlocal noic
	    endif
	    return indent(preline)
	endif
    endif

    let ind = HtmlIndentSum(lnum, -1)
    let ind = ind + HtmlIndentSum(a:lnum, 0)

    if restore_ic == 0
	setlocal noic
    endif

    return indent(lnum) + (&sw * ind)
endfun

let &cpo = s:cpo_save
unlet s:cpo_save

" [-- EOF /indent/html.vim --]