
Description="CMake"

Categories = {"config", "script"}

Keywords={
  { Id=1,
    List={
    "if", "elseif", "else", "endif", "foreach", "endforeach", "and", "while", "endwhile", "macro", "endmacro", "function", "endfunction", "set", "unset"
    },
  },
  { Id=2,
    Regex=[[ [0-9A-Z_]{2,}  ]],
  },
  { Id=3,
    Regex=[[\$\{.+\$\{[^}]+\}.+?\}|\$\{[^}]+\} ]],
  },
  { Id=3,
    Regex=[[ [A-Z_\>]+\:([\w/]+) ]],
  },
  { Id=4,
    Regex=[[(\w+)\s*\(]],
  },
}

Strings={
  Delimiter=[["|']],
  DelimiterPairs= {
    { Open=[[ \[=*\[ ]], Close=[[ \]=*\] ]], Raw=true }
  },
  AssertEqualLength=true,
  Interpolation=[[ \$\{[^}]+\} ]]
}

IgnoreCase=false

Comments={
  { Block=false,
    Delimiter= { [[ #(?!\[\[) ]] },
  },

  { Block=true,
    Nested=false,
    Delimiter= { [[ #\[\[ ]],[[ \]\] ]],}
  }
}

Operators=[[\(|\)|\{|\}|\[|\]|\,|\;|\.|\:|\&|<|>|\!|\=|\/|\*|\%|\+|\-|\~|\#|\\]]


-- resolve issue with ]] close delimiter which ends comments and strings
function OnStateChange(oldState, newState, token)

  if token=="]]" and oldState==HL_STRING and newState==HL_BLOCK_COMMENT_END then
    return HL_STRING_END
  end

  if  (string.sub(token,1,1) =="$" )  and oldState==HL_STRING and newState==HL_KEYWORD then
    return HL_INTERPOLATION
  end

  return newState
end
