# References
# https://github.com/zyedidia/micro/blob/master/runtime/syntax/go.yaml
# https://github.com/vim-scripts/octave.vim--/blob/master/syntax/octave.vim
#
# TODO
# include only needed operators
# ... highlighting
# built-in function highlighting?
# highlight eps/pi/e etc. as functions when followed by ()
# what are skip and error fields in strings?
# multiline comments not working

filetype: octave

detect:
    filename: "\\.m$"

rules:
    # Statements https://www.gnu.org/software/octave/doc/v4.0.0/Statements.html
    - statement: "\\b(function|endfunction|return|end|global|persistent)\\b"
    - statement: "\\b(if|elseif|else|endif|switch|case|otherwise|endswitch)\\b"
    - statement: "\\b(while|endwhile|do|until|for|endfor|parfor|endparfor|break|continue)\\b"
    - statement: "\\b(unwind_protect|unwind_protect_cleanup|end_unwind_protect|try|catch|end_try_catch)\\b"

    # Operators
    - symbol.operator: "[-+/*=<>!~%&|^]|:="

    # Brackets
    - symbol.brackets: "(\\{|\\})"
    - symbol.brackets: "(\\(|\\))"
    - symbol.brackets: "(\\[|\\])"

    # Commas
    - symbol: ","

    # Numbers https://www.gnu.org/software/octave/doc/v4.0.1/Mathematical-Constants.html
    - constant.number: "\\b([0-9]+|0x[0-9a-fA-F]*)\\b|'.'"
    - constant.number: "\\b(pi|e|I|Inf|NaN|eps|realmax|realmin)\\b|"

    # Boolean
    - constant.bool: "\\b(true|false)\\b"

    # Strings https://www.gnu.org/software/octave/doc/v4.0.1/Strings.html
    - constant.string:
        start: "\""
        end: "\""
        skip: "\\\\."
        rules:
            - constant.specialChar: "%"
            - constant.specialChar: "\\\\[abfnrtv'\\\"\\\\]"
            - constant.specialChar: "\\\\([0-7]{3}|x[A-Fa-f0-9]{2}|u[A-Fa-f0-9]{4}|U[A-Fa-f0-9]{8})"

    - constant.string:
        start: "'"
        end: "'"
        skip: "\\\\."
        rules:
            - error: "..+"
            - constant.specialChar: "%"
            - constant.specialChar: "\\\\[abfnrtv'\\\"\\\\]"
            - constant.specialChar: "\\\\([0-7]{3}|x[A-Fa-f0-9]{2}|u[A-Fa-f0-9]{4}|U[A-Fa-f0-9]{8})"

    # Comments https://www.gnu.org/software/octave/doc/v4.2.1/Comments.html
    - comment:
        start: "%"
        end: "$"
        rules:
            - todo: "(TODO|XXX|FIXME):?"
    - comment:
        start: "#"
        end: "$"
        rules:
            - todo: "(TODO|XXX|FIXME):?"
    - comment:
        start: "%{"
        end: "%}"
        rules:
            - todo: "(TODO|XXX|FIXME):?"
    - comment:
        start: "#{"
        end: "#}"
        rules:
            - todo: "(TODO|XXX|FIXME):?"
