Re: Highlighting regular expression literals in JavaScript code

[email protected] Thu, 30 Aug 2007 10:31:34 -0500
Newsgroups gmane.comp.gnu.source-highlight.general
Message-ID <[email protected]>
Lorenzo Bettini wrote:
> [email protected] wrote:
>> Source-highlight currently does not highlight JavaScript regular 
>> expression literals.
>>
>> http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:RegExp 
>>
>>
>> I am wondering what would be the best way to highlight these?  This is 
>> what I came up with:
>>
>> include "c_comment.lang"
>>
>> #
>> # Pattern for matching regular expression literals:
>> # The negative lookahead at the end protects against cases like this:
>> #   var foo = a / b;  /* foo is the quotient */
>> # Still fooled by things like this:
>> #   var foo = a / b / c;
>> #   var foo = a / f('foo/bar');
>> #
>> regexp = '/(\\.|[^\\/])+/(?![*/])'
>>
>> include "number.lang"
>>
>> include "c_string.lang"
>>
>> keyword = 
>> "abstract|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|final|finally|for|function|goto|if|implements|in|instanceof|interface|native|new|null|private|protected|prototype|public|return|static|super|switch|synchronized|throw|throws|this|transient|true|try|typeof|var|volatile|while|with" 
>>
>>
>> include "symbols.lang"
>>
>> cbracket = "{|}"
>>
>> include "function.lang"
>>
> 
> sorry for my late answer on this issue! :-)
> 
> I'll try to take a look at this problem, probably your solution should 
> be fine :-)
> 
> cheers
>     Lorenzo
> 

I have been doing some additional work on it and made a few modifications:

include "c_comment.lang"

# highlight the flags    vvvvvv
regexp = '/(\\.|[^\\/])+/[gim]*(?![*/])'

include "number.lang"

include "c_string.lang"

keyword = 
"abstract|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|final|finally|for|function|goto|if|implements|in|instanceof|interface|native|new|null|private|protected|prototype|public|return|static|super|switch|synchronized|throw|throws|this|transient|true|try|typeof|var|volatile|while|with"

# this was originally in the java.lang file, I removed it because I
# thought it was only for Java, but on further reflection all the
# words are reserved words in JavaScript (and "void" is an actual
# keyword), so it is best to leave it in
type = "int|byte|boolean|char|long|float|double|short|void"

include "symbols.lang"

cbracket = "{|}"

# in JavaScript, the '$' is valid in an identifier
vardef FUNCTION = '([[:alpha:]]|_|\$)[[:word:]\$]*[[:blank:]]*(?=\()'
function = $FUNCTION