summaryrefslogtreecommitdiffstats
path: root/indent/mermaid.vim
diff options
context:
space:
mode:
Diffstat (limited to 'indent/mermaid.vim')
-rw-r--r--indent/mermaid.vim64
1 files changed, 64 insertions, 0 deletions
diff --git a/indent/mermaid.vim b/indent/mermaid.vim
new file mode 100644
index 00000000..e1ade711
--- /dev/null
+++ b/indent/mermaid.vim
@@ -0,0 +1,64 @@
+if polyglot#init#is_disabled(expand('<sfile>:p'), 'mermaid', 'indent/mermaid.vim')
+ finish
+endif
+
+let s:indent_next_line_keywords = [
+ \ '^classDiagram',
+ \ '^classDiagram-v2',
+ \ '^erDiagram',
+ \ '^gantt',
+ \ '^graph',
+ \ '^flowchart',
+ \ '^pie',
+ \ '^sequenceDiagram',
+ \ '^stateDiagram',
+ \ '^stateDiagram-v2',
+ \ 'class.*{',
+ \ 'subgraph',
+ \ 'loop',
+ \ 'alt',
+ \ 'else',
+ \ 'opt',
+ \ 'par',
+ \ 'and',
+ \ 'rect',
+ \ '[^a-z]activate',
+ \ ]
+
+let s:deindent_current_line_keywords = [
+ \ '^\s\+classDiagram',
+ \ '^\s\+classDiagram-v2',
+ \ '^\s\+erDiagram',
+ \ '^\s\+gantt',
+ \ '^\s\+graph',
+ \ '^\s\+flowchart',
+ \ '^\s\+pie',
+ \ '^\s\+sequenceDiagram',
+ \ '^\s\+stateDiagram',
+ \ '^\s\+stateDiagram-v2',
+ \ '^\s\+end$',
+ \ '^\s\+}$',
+ \ '^\s\+deactivate$'
+ \ ]
+
+function! s:matches_any_word_in(text, list)
+ return empty(filter(copy(a:list), {_idx, val -> matchstr(a:text, val) != ""})) == v:false
+endfunction
+
+function! MermaidIndent()
+ let sw = shiftwidth()
+ let indent_level = indent(v:lnum - 1) / sw
+ let current_line = getline(v:lnum)
+ let line_above = getline(v:lnum - 1)
+
+ " TODO don't incorrect indent when has empty lines inside graph
+ if s:matches_any_word_in(current_line, s:deindent_current_line_keywords)
+ return (indent_level - 1) * sw
+ endif
+
+ if s:matches_any_word_in(line_above, s:indent_next_line_keywords)
+ return (indent_level + 1) * sw
+ endif
+
+ return indent_level * sw
+endfunction