summaryrefslogtreecommitdiffstats
path: root/indent
diff options
context:
space:
mode:
Diffstat (limited to 'indent')
-rw-r--r--indent/twig.vim80
1 files changed, 80 insertions, 0 deletions
diff --git a/indent/twig.vim b/indent/twig.vim
new file mode 100644
index 00000000..421f7201
--- /dev/null
+++ b/indent/twig.vim
@@ -0,0 +1,80 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'twig') == -1
+
+if exists("b:ran_once")
+ finish
+endif
+
+let b:ran_once = 1
+
+let s:baseIndentExpr=&indentexpr
+setlocal indentexpr=GetTwigIndent(v:lnum)
+
+fun! GetTwigIndent(currentLineNumber)
+ let currentLine = getline(a:currentLineNumber)
+ let previousLineNumber = prevnonblank(a:currentLineNumber - 1)
+ let previousLine = getline(previousLineNumber)
+
+ if (previousLine =~ s:startStructures || previousLine =~ s:middleStructures) && (currentLine !~ s:endStructures && currentLine !~ s:middleStructures)
+ return indent(previousLineNumber) + &shiftwidth
+ elseif currentLine =~ s:endStructures || currentLine =~ s:middleStructures
+ let previousOpenStructureNumber = s:FindPreviousOpenStructure(a:currentLineNumber)
+ let previousOpenStructureLine = getline(previousOpenStructureNumber)
+ return indent(previousOpenStructureNumber)
+ endif
+
+ return s:CallBaseIndent()
+endf
+
+function! s:CallBaseIndent()
+ exe 'redir => s:outputOfBaseIndent'
+ exe 'silent echo ' . s:baseIndentExpr
+ exe 'redir END'
+ return split(s:outputOfBaseIndent)[0]
+endf
+
+
+function! s:FindPreviousOpenStructure(lineNumber)
+ let countOpen = 0
+ let countClosed = 0
+ let lineNumber = a:lineNumber
+ while lineNumber != 1 && countOpen <= countClosed
+ let lineNumber -= 1
+ let currentLine = getline(lineNumber)
+
+ if currentLine =~ s:startStructures
+ let countOpen += 1
+ elseif currentLine =~ s:endStructures
+ let countClosed += 1
+ endif
+ endwhile
+
+ return lineNumber
+endfunction
+
+function! s:StartStructure(name)
+ return '^\s*{%\s*' . a:name . '.*%}'
+endfunction
+
+function! s:EndStructure(name)
+ return '^\s*{%\s*end' . a:name . '.*%}'
+endfunction
+
+function! s:Map(Fun, list)
+ if len(a:list) == 0
+ return []
+ else
+ return [a:Fun(a:list[0])] + s:Map(a:Fun, a:list[1:])
+ endif
+endfunction
+
+fun! s:BuildStructures()
+ let structures = ['if','for','block']
+ let mStructures = ['elseif','else']
+ let s:startStructures = join(s:Map(function('s:StartStructure'), structures), '\|')
+ let s:endStructures = join(s:Map(function('s:EndStructure'), structures), '\|')
+ let s:middleStructures = join(s:Map(function('s:StartStructure'), mStructures), '\|')
+endfun
+
+call s:BuildStructures()
+
+endif