Skip to content

Instantly share code, notes, and snippets.

@DethAriel
Created September 7, 2016 00:43
Show Gist options
  • Save DethAriel/96d63decc0ba4f1c948e898c61086fce to your computer and use it in GitHub Desktop.
Save DethAriel/96d63decc0ba4f1c948e898c61086fce to your computer and use it in GitHub Desktop.
Basic TypeScript syntax highlighting rules for FishEye/Crucible
# Basic TypeScript syntax highlighting rules for FishEye/Crucible.
#
# Put this file to the <FISHEYE_INST>/syntax directory and update the
# <FISHEYE_INST>/syntax/filename.map file to contain the following lines:
#
# "**/*.ts" typescript.def "TypeScript"
#
# FishEye/Crucible might need to be restarted to have the changes take effect.
#
# References:
# * https://confluence.atlassian.com/display/FISHKB/Defining+your+own+syntax+highlighting+in+Crucible+or+Fisheye
# * https://confluence.atlassian.com/display/FISHKB/Configure+syntax+highlighting+for+non-standard+file+extensions
#
# Notes:
# * this schema considers identifiers that start with an uppercase letter to represent classes or constants, so
# it treats such identifiers as 'symbol' for better colors. If you don't want such treatment, replace the
# 'symbol' with 'identifier'.
#
# TODO: multiline strings do not really work, e.g.:
# var mySuperString = 'this is a \
# multiline string';
syntaxdef typescript {
# whitespaces
/\s+/m : ;
# keywords
/\b(a(ny|s)|b(oolean|reak)|c(a(se|tch)|lass|on(st(|ructor)|tinue))|d(e(bugger|clare|fault|lete)|o)|e(lse|num|x(port|tends))|f(alse|inally|or|rom|unction)|get|i(f|mp(lements|ort)|n(|stanceof|terface))|let|module|n(ew|u(ll|mber))|of|p(ackage|r(ivate|otected)|ublic)|r(equire|eturn)|s(et|t(atic|ring)|uper|witch|ymbol)|t(h(is|row)|r(ue|y)|ype(|of))|v(ar|oid)|w(hile|ith)|yield)\b/ : {
region {
type=keyword;
index=word;
}
}
# decorators
/@[a-zA-Z_][a-zA-Z0-9_]*/ : {
region {
type=decorator;
index=word;
}
}
# backquote string literal
/`/ : {
context {
/\\`/: ;
"`" : exit;
/(\$\{.*?\})/ : {
region ${1} {
type=identifier;
index=word;
}
}
}
region ${ALL} {
type=string;
}
}
# single-quote string literal
/'/ : {
context {
/\\'/: ;
/$/m : exit;
"'" : exit;
}
region ${ALL} {
type=string;
}
}
# double-quote string literal
/"/ : {
context {
/\\"/: ;
/$/m : exit;
"\"" : exit;
}
region ${ALL} {
type=string;
}
}
# numbers
/(0x[0-9a-f]+)|(([0-9]+\.?)|([0-9]*\.[0-9]+))/i : {
region {
type=numeric;
}
}
# Identifiers
/[a-z_$][a-zA-Z_0-9]*/ : {
region {
type=identifier;
index=word;
}
}
# probable classes or constant expressions
/[A-Z][a-zA-Z_0-9]*/ : {
region {
type=symbol;
index=word;
}
}
# multiline comment
/\/\*(.*?)\*\//s : {
todo(${1});
region {
type=comment;
findlinks=true;
}
region ${1} {
index=prose;
}
}
# one-line comment
/\/\/.*$/m : {
todo(${0});
region {
type=comment;
index=prose;
findlinks=true;
}
}
context todo {
/(?i)(todo):?\s.*/ : {
region {
type=todo;
}
}
}
# regex
/
\/
([^\n\r*\\\/]|\\[^\r\n])# RegularExpressionFirstChar
/x : {
context { # RegularExpresionChar*
/\\[^\r\n]/ : ;
/\// : exit;
/[\r\n]/ : exit; # for safety
}
region ${ALL} {
type=regex;
}
}
}
@DethAriel
Copy link
Author

DethAriel commented Sep 26, 2016

TODOs / Bugs

  1. multiline strings do not really work, e.g.:

    const mySuperString = 'this is a \
    multiline string'; // this line is not considered a string, although it should be
  2. Object properties are highlighted as "types":

    let num = this.response.TotalNum; // here 'TotalNum' is highlighted as object, but it shouldn't be

    Desired behavior: after-comma PascalCased stuff is not considered a type

  3. abstract keyword is missing

@henrik242
Copy link

@DethAriel Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment