#!/bin/bash
# author: Lukas Kluft
# version: 06.02.2017
#
# purpose: update vim's ARTS syntax highlighting

# path to ARTS executable. This variable has to be set in order to run run the script
# e.g. arts="$HOME/arts/build/src/arts"

[[ $# -eq 1 ]] && ARTS_BIN=$1 || ARTS_BIN=arts

if ! which &> /dev/null $ARTS_BIN; then
    echo "ERROR: $ARTS_BIN not found"
    echo "Usage: $0 [PATH_TO_ARTS_BINARY]"
    exit 1
fi

# create subdirectories in ~/.vim
mkdir -p $HOME/.vim/{syntax,ftdetect}

# path to vim syntax file
f="$HOME/.vim/ftdetect/arts.vim"

# enable file extension for auto recognition
echo "au BufRead,BufNewFile *.arts set filetype=arts" > $f
echo "Written $f"

# generate arts.vim file
f="$HOME/.vim/syntax/arts.vim"

cat << 'EOF' > $f
" Vim syntax file
" Language: ARTS
" Maintainer: via update-vim-arts-syntax script
EOF

echo \" Latest Revision: $(date) >> $f

cat << 'EOF' >> $f
if exists("b:current_syntax")
  finish
endif

" highlighting style for different classes
hi def link ArtsMethod Constant
hi def link ArtsComment Comment
hi def link ArtsVariable Structure
hi def link ArtsGroup Type
hi def link ArtsNumber Number
hi def link ArtsString Statement

let b:current_syntax = "arts"

" definition of comments
syn match ArtsComment "#.*$"
setlocal commentstring=#\ %s

" definition of numbers. Taken from the Python synatx highlighting:
" https://github.com/hdima/python-syntax/blob/master/syntax/python.vim#L392
syn match ArtsNumber "\<\d[lL]\=\>" display
syn match ArtsNumber "\<[0-9]\d\+[lL]\=\>" display
syn match ArtsNumber "\<\d\+[lLjJ]\>" display
syn match ArtsNumber "\.\d\+\%([eE][+-]\=\d\+\)\=[jJ]\=\>" display
syn match ArtsNumber "\<\d\+[eE][+-]\=\d\+[jJ]\=\>" display
syn match ArtsNumber "\<\d\+\.\d*\%([eE][+-]\=\d\+\)\=[jJ]\=" display

" definition of strings
syn region ArtsString start='"' end='"'
EOF

echo -e \\n\" workspace methods >> $f
$ARTS_BIN -p -m all | sed 's/^/syn keyword ArtsMethod /g' >> $f

echo -e \\n\" workspace variables >> $f
$ARTS_BIN -p -w all | sed 's/^/syn keyword ArtsVariable /g' >> $f

echo -e \\n\" groups of variables >> $f
$ARTS_BIN -p -g all | sed 's/^/syn keyword ArtsGroup /g' >> $f

echo "Written $f"

exit 0
