bwq-lint 0.2.0

A linter and parser for Brandwatch query files (.bwq)
Documentation
{
  "name": "Brandwatch Query Language",
  "scopeName": "source.bwq",
  "fileTypes": ["bwq"],
  "patterns": [
    {
      "include": "#comments"
    },
    {
      "include": "#strings"
    },
    {
      "include": "#operators"
    },
    {
      "include": "#field-operators"
    },
    {
      "include": "#proximity-operators"
    },
    {
      "include": "#brackets"
    },
    {
      "include": "#wildcards"
    },
    {
      "include": "#case-sensitive"
    },
    {
      "include": "#numbers"
    },
    {
      "include": "#hashtags"
    },
    {
      "include": "#mentions"
    }
  ],
  "repository": {
    "comments": {
      "patterns": [
        {
          "name": "comment.block.bwq",
          "begin": "<<<",
          "end": ">>>",
          "captures": {
            "0": {
              "name": "punctuation.definition.comment.bwq"
            }
          }
        }
      ]
    },
    "strings": {
      "patterns": [
        {
          "name": "string.quoted.double.bwq",
          "begin": "\"",
          "end": "\"",
          "patterns": [
            {
              "name": "constant.character.escape.bwq",
              "match": "\\\\."
            }
          ]
        }
      ]
    },
    "operators": {
      "patterns": [
        {
          "name": "keyword.operator.logical.bwq",
          "match": "\\b(AND|OR|NOT)\\b"
        },
        {
          "name": "keyword.operator.proximity.bwq",
          "match": "\\bNEAR/\\d+f?\\b"
        },
        {
          "name": "keyword.operator.range.bwq",
          "match": "\\bTO\\b"
        }
      ]
    },
    "field-operators": {
      "patterns": [
        {
          "name": "entity.name.tag.field.location.bwq",
          "match": "\\b(continent|country|region|city|latitude|longitude):"
        },
        {
          "name": "entity.name.tag.field.content.bwq",
          "match": "\\b(title|site|url|channelId|author|links):"
        },
        {
          "name": "entity.name.tag.field.metadata.bwq",
          "match": "\\b(language|rating|minuteOfDay|pubType|publication):"
        },
        {
          "name": "entity.name.tag.field.social.bwq",
          "match": "\\b(authorGender|authorVerified|authorVerifiedType|authorFollowers|engagementType|engagingWith|engagingWithGuid|guid):"
        },
        {
          "name": "entity.name.tag.field.tumblr.bwq",
          "match": "\\b(blogName|parentBlogName|rootBlogName|parentPostId|rootPostId|tags):"
        },
        {
          "name": "entity.name.tag.field.media.bwq",
          "match": "\\b(brandIds|objects|imageType|publisherSubType):"
        },
        {
          "name": "entity.name.tag.field.reddit.bwq",
          "match": "\\b(redditAuthorFlair|redditPostFlair|redditSpoiler|subreddit|subredditNSFW|subredditTopics|weblogTitle):"
        },
        {
          "name": "entity.name.tag.field.other.bwq",
          "match": "\\b(itemReview|topLevelDomain|sensitiveContent):"
        }
      ]
    },
    "proximity-operators": {
      "patterns": [
        {
          "name": "keyword.operator.proximity.tilde.bwq",
          "match": "~\\d+"
        }
      ]
    },
    "brackets": {
      "patterns": [
        {
          "name": "punctuation.definition.group.begin.bwq",
          "match": "\\("
        },
        {
          "name": "punctuation.definition.group.end.bwq",
          "match": "\\)"
        },
        {
          "name": "punctuation.definition.range.begin.bwq",
          "match": "\\["
        },
        {
          "name": "punctuation.definition.range.end.bwq",
          "match": "\\]"
        }
      ]
    },
    "wildcards": {
      "patterns": [
        {
          "name": "keyword.operator.wildcard.bwq",
          "match": "\\*"
        },
        {
          "name": "keyword.operator.replacement.bwq",
          "match": "\\?"
        }
      ]
    },
    "case-sensitive": {
      "patterns": [
        {
          "name": "string.other.case-sensitive.bwq",
          "begin": "\\{",
          "end": "\\}",
          "captures": {
            "0": {
              "name": "punctuation.definition.case-sensitive.bwq"
            }
          }
        }
      ]
    },
    "numbers": {
      "patterns": [
        {
          "name": "constant.numeric.bwq",
          "match": "\\b\\d+(\\.\\d+)?\\b"
        }
      ]
    },
    "hashtags": {
      "patterns": [
        {
          "name": "entity.name.tag.hashtag.bwq",
          "match": "#\\w+"
        }
      ]
    },
    "mentions": {
      "patterns": [
        {
          "name": "entity.name.tag.mention.bwq",
          "match": "@\\w+"
        }
      ]
    }
  }
}