{ "name": "Sieve", "scopeName": "source.sieve", "patterns": [ { "include": "#main" } ], "repository": { "action": { "name": "meta.action.sieve", "begin": "\\b(?!\\d)\\w+", "end": "(?=\\s*(?:$|\\]|\\)|[};,]))", "patterns": [ { "include": "#arguments" } ], "beginCaptures": { "0": { "name": "keyword.operator.action.sieve" } } }, "arguments": { "patterns": [ { "include": "#taggedArgument" }, { "include": "#comparator" }, { "include": "#stringBlock" }, { "include": "#testList" }, { "include": "#stringList" }, { "include": "#strings" }, { "include": "#numbers" }, { "include": "#comments" }, { "include": "#punctuation" } ] }, "block": { "name": "meta.block.sieve", "begin": "{", "end": "}", "patterns": [ { "include": "#main" } ], "beginCaptures": { "0": { "name": "punctuation.definition.brace.bracket.curly.begin.sieve" } }, "endCaptures": { "0": { "name": "punctuation.definition.brace.bracket.curly.end.sieve" } } }, "comments": { "patterns": [ { "name": "comment.line.number-sign.sieve", "begin": "#", "end": "$", "beginCaptures": { "0": { "name": "punctuation.definition.comment.sieve" } } }, { "name": "comment.block.bracketed.sieve", "begin": "/\\*", "end": "\\*/", "beginCaptures": { "0": { "name": "punctuation.definition.comment.begin.sieve" } }, "endCaptures": { "0": { "name": "punctuation.definition.comment.end.sieve" } } } ] }, "comparator": { "patterns": [ { "name": "storage.modifier.comparator.${3:/downcase}.sieve", "match": "(?i)(\")i(;)(octet|ascii-casemap)(\")", "captures": { "1": { "name": "punctuation.definition.comparator.begin.sieve" }, "2": { "name": "punctuation.separator.delimiter.semicolon.sieve" }, "4": { "name": "punctuation.definition.comparator.end.sieve" } } }, { "match": "(?i)(?\u003c=:comparator)\\s*((\")(?!i;(?:octet|ascii-casemap)\")[^\"]+(\"))", "captures": { "1": { "name": "storage.modifier.comparator.non-standard.sieve" }, "2": { "name": "punctuation.definition.comparator.begin.sieve" }, "3": { "name": "punctuation.definition.comparator.end.sieve" } } } ] }, "conditional": { "name": "meta.conditional.${1:/downcase}.sieve", "begin": "(?i)\\b(if|elsif|else)(?=[\\s{]|$)", "end": "(?\u003c=\\})", "patterns": [ { "include": "#test" }, { "include": "#comment" }, { "include": "#block" } ], "beginCaptures": { "1": { "name": "keyword.control.flow.${1:/downcase}.sieve" } } }, "encodedCharacter": { "name": "meta.encoded-character.${2:/downcase}.sieve", "match": "(?i)(\\$\\{)(hex|unicode)(:)([\\s0-9A-Fa-f]+)(})", "captures": { "1": { "name": "punctuation.section.embedded.begin.sieve" }, "2": { "name": "entity.name.encoding.${2:/downcase}.sieve" }, "3": { "name": "punctuation.delimiter.separator.colon.sieve" }, "4": { "patterns": [ { "name": "constant.numeric.integer.hex.sieve", "match": "[0-9A-Fa-f]+" } ] }, "5": { "name": "punctuation.section.embedded.end.sieve" } } }, "main": { "patterns": [ { "include": "#comments" }, { "include": "#conditional" }, { "include": "#require" }, { "include": "#arguments" }, { "include": "#block" }, { "include": "#action" } ] }, "numbers": { "name": "constant.numeric.integer.int.decimal.sieve", "match": "(?i)\\d+(K|M|G)?", "captures": { "1": { "name": "constant.language.quantifier.${1:/downcase}b.sieve" } } }, "punctuation": { "patterns": [ { "name": "punctuation.separator.delimiter.sieve", "match": "," }, { "name": "punctuation.terminator.statement.semicolon.sieve", "match": ";" } ] }, "require": { "name": "keyword.control.directive.include.require.sieve", "match": "\\b(?i:require)(?=\\s|$|\\[)" }, "stringBlock": { "name": "meta.multi-line.sieve", "contentName": "string.unquoted.heredoc.multiline.sieve", "begin": "(?i)\\b(text(:))\\s*(?:$|(#.*))", "end": "^\\.$", "beginCaptures": { "1": { "name": "storage.type.text.sieve" }, "2": { "name": "punctuation.definition.heredoc.begin.sieve" }, "3": { "patterns": [ { "include": "#comments" } ] } }, "endCaptures": { "0": { "name": "punctuation.definition.heredoc.end.sieve" } } }, "stringEscapes": { "patterns": [ { "name": "constant.character.escape.backslash.sieve", "match": "(\\\\)\\\\", "captures": { "1": { "name": "punctuation.definition.escape.backslash.sieve" } } }, { "name": "constant.character.escape.quote.sieve", "match": "(\\\\)\"", "captures": { "1": { "name": "punctuation.definition.escape.backslash.sieve" } } }, { "name": "invalid.deprecated.unknown-escape.sieve", "match": "(\\\\).", "captures": { "1": { "name": "punctuation.definition.escape.backslash.sieve" } } } ] }, "stringList": { "name": "meta.string-list.sieve", "begin": "\\[", "end": "\\]", "patterns": [ { "include": "#main" } ], "beginCaptures": { "0": { "name": "punctuation.definition.bracket.square.begin.sieve" } }, "endCaptures": { "0": { "name": "punctuation.definition.bracket.square.end.sieve" } } }, "strings": { "name": "string.quoted.double.sieve", "begin": "\"", "end": "\"", "patterns": [ { "include": "#encodedCharacter" }, { "include": "#stringEscapes" } ], "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.sieve" } }, "endCaptures": { "0": { "name": "punctuation.definition.string.end.sieve" } } }, "taggedArgument": { "name": "keyword.operator.tagged-argument.sieve", "match": "(:)(?!\\d)\\w+", "captures": { "1": { "name": "punctuation.definition.colon.tagged-argument.sieve" } } }, "test": { "name": "meta.tests.sieve", "begin": "(?:\\G|^|(?\u003c=,|\\())\\s*(?i:(not)\\s+)?((?:[^\\s(){},:\\[\\]#/]|/[^*])++)", "end": "(?=\\s*[{,\\)])", "patterns": [ { "include": "#arguments" } ], "beginCaptures": { "1": { "name": "entity.name.function.test.negation.sieve" }, "2": { "name": "entity.name.function.test.sieve" } } }, "testList": { "name": "meta.test-list.sieve", "begin": "\\(", "end": "\\)", "patterns": [ { "include": "#test" }, { "include": "#main" } ], "beginCaptures": { "0": { "name": "punctuation.definition.bracket.round.begin.sieve" } }, "endCaptures": { "0": { "name": "punctuation.definition.bracket.round.end.sieve" } } } } }