#
# JavaScript syntax highlighting
# for MC Editor/CoolEdit
#
# Authors:
#    * Vlad Romanenko <VladRomanenko@ukr.net>
#    * Timur Shemsedinov <timur.shemsedinov@gmail.com>
#    * Pavel Roskin <proski@gnu.org>
# Based on c.syntax
#
# 2022-08-17  Timur Shemsedinov <timur.shemsedinov@gmail.com>
#    * Support latest ECMAScript syntax
#    * Support ECMAScript global identifiers
#    * Support node.js specific identifiers
#
# 2002-09-17  Vlad Romanenko <VladRomanenko@ukr.net>
#    * More C and Java consistency by Pavel Roskin <proski@gnu.org>
#    * Advanced number highlighting
#
# 2002-09-16  Vlad Romanenko <VladRomanenko@ukr.net>
#    * Initial public release
#

context default

    #=========================
    # Keywords
    keyword whole arguments yellow
    keyword whole async yellow
    keyword whole await yellow
    keyword whole break yellow
    keyword whole caller yellow
    keyword whole case yellow
    keyword whole catch yellow
    keyword whole class yellow
    keyword whole const yellow
    keyword whole constructor yellow
    keyword whole continue yellow
    keyword whole debugger yellow
    keyword whole default yellow
    keyword whole delete yellow
    keyword whole do yellow
    keyword whole else yellow
    keyword whole export yellow
    keyword whole extends yellow
    keyword whole finally yellow
    keyword whole for yellow
    keyword whole function yellow
    keyword whole if yellow
    keyword whole import yellow
    keyword whole in yellow
    keyword whole instanceof yellow
    keyword whole let yellow
    keyword whole new yellow
    keyword whole of yellow
    keyword whole prototype yellow
    keyword whole return yellow
    keyword whole super yellow
    keyword whole switch yellow
    keyword whole this yellow
    keyword whole throw yellow
    keyword whole try yellow
    keyword whole typeof yellow
    keyword whole var yellow
    keyword whole void yellow
    keyword whole while yellow
    keyword whole with yellow
    keyword whole yield yellow

    #=========================
    # Objects
    keyword whole AbortController yellow
    keyword whole AbortSignal yellow
    keyword whole AggregateError yellow
    keyword whole Array yellow
    keyword whole ArrayBuffer yellow
    keyword whole AsyncFunction yellow
    keyword whole AsyncGenerator yellow
    keyword whole AsyncGeneratorFunction yellow
    keyword whole Atomics yellow
    keyword whole BigInt64Array yellow
    keyword whole BigInt yellow
    keyword whole BigUint64Array yellow
    keyword whole Blob yellowOB
    keyword whole Boolean yellow
    keyword whole Buffer yellow
    keyword whole DataView yellow
    keyword whole Date yellow
    keyword whole DOMException yellow
    keyword whole Error yellow
    keyword whole EvalError yellow
    keyword whole Float32Array yellow
    keyword whole Float64Array yellow
    keyword whole Function yellow
    keyword whole Generator yellow
    keyword whole GeneratorFunction yellow
    keyword whole global yellow
    keyword whole globalThis yellow
    keyword whole Image yellow
    keyword whole Infinity yellow
    keyword whole Int16Array yellow
    keyword whole Int32Array yellow
    keyword whole Int8Array yellow
    keyword whole Intl yellow
    keyword whole JSON yellow
    keyword whole Map yellow
    keyword whole Math yellow
    keyword whole Number yellow
    keyword whole Object yellow
    keyword whole Promise yellow
    keyword whole Promise yellow
    keyword whole Proxy yellow
    keyword whole RangeError yellow
    keyword whole ReferenceError yellow
    keyword whole Reflect yellow
    keyword whole RegExp yellow
    keyword whole Set yellow
    keyword whole SharedArrayBuffer yellow
    keyword whole Symbol yellow
    keyword whole SyntaxError yellow
    keyword whole TextDecoder yellow
    keyword whole TypeError yellow
    keyword whole Uint16Array yellow
    keyword whole Uint32Array yellow
    keyword whole Uint8Array yellow
    keyword whole Uint8ClampedArray yellow
    keyword whole URIError yellow
    keyword whole URL yellow
    keyword whole URLSearchParams yellow
    keyword whole WeakMap yellow
    keyword whole WeakSet yellow
    keyword whole WebAssembly yellow
    keyword whole window yellow

    #=========================
    # Most common functions
    keyword whole alert yellow
    keyword whole clearInterval yellow
    keyword whole clearTimeout yellow
    keyword whole console yellow
    keyword whole decodeURIComponent yellow
    keyword whole decodeURI yellow
    keyword whole encodeURIComponent yellow
    keyword whole escape yellow
    keyword whole eval yellow
    keyword whole fetch yellow
    keyword whole isFinite yellow
    keyword whole isNaN yellow
    keyword whole module yellow
    keyword whole parseFloat yellow
    keyword whole parseInt yellow
    keyword whole performance yellow
    keyword whole process yellow
    keyword whole queueMicrotask yellow
    keyword whole require yellow
    keyword whole setImmediate yellow
    keyword whole setInterval yellow
    keyword whole setTimeout yellow
    keyword whole structuredClone yellow
    keyword whole unescape yellow

    #=========================
    # Constants
    keyword whole true brightgreen
    keyword whole false brightgreen
    keyword whole null brightgreen
    keyword whole undefined yellow
    keyword whole NaN yellow
    keyword whole __dirname yellow
    keyword whole __filename yellow

    #=========================
    # Comments
    keyword /\* brown
    keyword \*/ brown
    keyword // brown

    #=========================
    # Numbers
    wholechars abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.

    keyword whole 0\{xX\}\{0123456789abcdefABCDEF\}\[0123456789abcdefABCDEF\] brightgreen
    keyword whole \{0123456789\}\[0123456789\] brightgreen
    keyword whole \[0123456789\]\.\{0123456789\}\[0123456789\] brightgreen
    keyword whole \{0123456789\}\[0123456789\]\.\[0123456789\] brightgreen
    keyword whole \{0123456789\}\[0123456789\]\{eE\}\{0123456789\}\[0123456789\] brightgreen
    keyword whole \{0123456789\}\[0123456789\]\{eE\}\{\-\+\}\{0123456789\}\[0123456789\] brightgreen
    keyword whole \{0123456789\}\[0123456789\]\.\{0123456789\}\[0123456789\]\{eE\}\{0123456789\}\[0123456789\] brightgreen
    keyword whole \{0123456789\}\[0123456789\]\.\{0123456789\}\[0123456789\]\{eE\}\{\-\+\}\{0123456789\}\[0123456789\] brightgreen

    #=========================
    # Special symbols
    keyword => brightcyan
    keyword \. yellow
    keyword \* yellow
    keyword \+ yellow
    keyword - yellow
    keyword / yellow
    keyword % yellow
    keyword = yellow
    keyword ! yellow
    keyword & yellow
    keyword | yellow
    keyword ^ yellow
    keyword ~ yellow
    keyword > yellow
    keyword < yellow

    #=========================
    # Separators
    keyword { brightcyan
    keyword } brightcyan
    keyword ( brightcyan
    keyword ) brightcyan
    keyword [ brightcyan
    keyword ] brightcyan
    keyword , brightcyan
    keyword ? brightcyan
    keyword : brightcyan
    keyword ; brightmagenta


#=============================
# Comments

context exclusive /\* \*/ brown
    spellcheck
    keyword whole BUG brightred
    keyword whole FixMe brightred
    keyword whole FIXME brightred
    keyword whole Note brightred
    keyword whole NOTE brightred
    keyword whole ToDo brightred
    keyword whole TODO brightred
    keyword !!\[!\] brightred
    keyword ??\[?\] brightred


context exclusive // \n brown
    spellcheck
    keyword whole BUG brightred
    keyword whole FixMe brightred
    keyword whole FIXME brightred
    keyword whole Note brightred
    keyword whole NOTE brightred
    keyword whole ToDo brightred
    keyword whole TODO brightred
    keyword !!\[!\] brightred
    keyword ??\[?\] brightred


#=============================
# Strings

context " " green
    spellcheck
    keyword \\\{\\'"abtnvfr\} brightgreen
    keyword \\\{0123\}\{01234567\}\{01234567\} brightgreen

    keyword ' brightgreen

context ' ' green
    spellcheck
    keyword \\\{\\'"abtnvfr\} brightgreen
    keyword \\\{0123\}\{01234567\}\{01234567\} brightgreen

    keyword " brightgreen

context ` ` green
    spellcheck
    keyword \\\{\\'"abtnvfr\} brightgreen
    keyword \\\{0123\}\{01234567\}\{01234567\} brightgreen
    keyword ${*} yellow
