|
| 1 | +if exists("b:ran_once") |
| 2 | + finish |
| 3 | +endif |
| 4 | + |
| 5 | +let b:ran_once = 1 |
| 6 | + |
| 7 | +setlocal indentexpr=GetTwigIndent() |
| 8 | + |
| 9 | +fun! GetTwigIndent() |
| 10 | + let currentLineNumber = v:lnum |
| 11 | + let currentLine = getline(currentLineNumber) |
| 12 | + let previousLineNumber = prevnonblank(currentLineNumber - 1) |
| 13 | + let previousLine = getline(previousLineNumber) |
| 14 | + |
| 15 | + if (previousLine =~ s:startStructures || previousLine =~ s:middleStructures) && (currentLine !~ s:endStructures && currentLine !~ s:middleStructures) |
| 16 | + echo "below start or middle" |
| 17 | + return indent(previousLineNumber) + &shiftwidth |
| 18 | + elseif currentLine =~ s:endStructures || currentLine =~ s:middleStructures |
| 19 | + let previousOpenStructureNumber = s:FindPreviousOpenStructure(0, 0, currentLineNumber) |
| 20 | + let previousOpenStructureLine = getline(previousOpenStructureNumber) |
| 21 | + echo "finding previous open structure" |
| 22 | + return indent(previousOpenStructureNumber) |
| 23 | + endif |
| 24 | + |
| 25 | + echo "none" |
| 26 | + |
| 27 | + return HtmlIndent() |
| 28 | +endf |
| 29 | + |
| 30 | + |
| 31 | +function! s:FindPreviousOpenStructure(countOpen, countClosed, lineNumber) |
| 32 | + echo a:countOpen . a:countClosed . a:lineNumber |
| 33 | + if a:countOpen > a:countClosed |
| 34 | + return a:lineNumber |
| 35 | + elseif a:lineNumber <= 0 |
| 36 | + return 0 |
| 37 | + endif |
| 38 | + |
| 39 | + let currentLineNumber = a:lineNumber - 1 |
| 40 | + let currentLine = getline(currentLineNumber) |
| 41 | + if currentLine =~ s:startStructures |
| 42 | + return s:FindPreviousOpenStructure(a:countOpen + 1, a:countClosed, currentLineNumber) |
| 43 | + elseif currentLine =~ s:endStructures |
| 44 | + return s:FindPreviousOpenStructure(a:countOpen, a:countClosed + 1, currentLineNumber) |
| 45 | + else |
| 46 | + return s:FindPreviousOpenStructure(a:countOpen, a:countClosed, currentLineNumber) |
| 47 | + endif |
| 48 | + |
| 49 | +endfunction |
| 50 | + |
| 51 | +function! s:StartStructure(name) |
| 52 | + return '{%\s*' . a:name . '.*%}' |
| 53 | +endfunction |
| 54 | + |
| 55 | +function! s:EndStructure(name) |
| 56 | + return '{%\s*end' . a:name . '.*%}' |
| 57 | +endfunction |
| 58 | + |
| 59 | +function! s:Map(Fun, list) |
| 60 | + if len(a:list) == 0 |
| 61 | + return [] |
| 62 | + else |
| 63 | + return [a:Fun(a:list[0])] + s:Map(a:Fun, a:list[1:]) |
| 64 | + endif |
| 65 | +endfunction |
| 66 | + |
| 67 | +fun! s:BuildStructures() |
| 68 | + let structures = ['if','for','block'] |
| 69 | + let mStructures = ['elseif','else'] |
| 70 | + let s:startStructures = join(s:Map(function('s:StartStructure'), structures), '\|') |
| 71 | + let s:endStructures = join(s:Map(function('s:EndStructure'), structures), '\|') |
| 72 | + let s:middleStructures = join(s:Map(function('s:StartStructure'), mStructures), '\|') |
| 73 | + let s:allStructures = '{%.*%}' |
| 74 | +endfun |
| 75 | + |
| 76 | +call s:BuildStructures() |
0 commit comments