Wednesday, September 12, 2007

Kate Highlighting Power

Kate's highlighting capabilities are amazing. If you want you can highlight really complex syntax, without having to hardcode rules in C++. As an example, we'll take a look at how Lua comments can be realized:
  • --[=[ starts a multiline comment (the '=' chars are optional)
  • ]=] ends the multiline comment
  • the number of '=' chars in ]=] must match the number of --[=[
That means: When the highlighting processor matches the end of a multiline comment, it has to know how many '=' chars started the comment. Thanks to the concept of dynamic rules and contexts Kate is able to do that. The highlighting file looks like this. First comes the header
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "language.dtd" >
<language name="Test" version="1.0" kateversion="2.4" section="Markup" extensions="" mimetype="">
Then the body with the contexts. We start in the first context called "Normal Text". When the regular expression --[(=*)[ matches it switches to the context Comment.
<context attribute="Normal Text" lineEndContext="#stay" name="Normal">
<RegExpr attribute="Comment" context="Comment" String="--\[(=*)\[" dynamic="true"/>
The part (=*) is now available as %1 in the rule below:
<context name="Comment" attribute="Comment" lineEndContext="#stay" dynamic="true" >
<RegExpr attribute="Comment" context="#pop" String="\]%1\]" dynamic="true" />
The last part is the footer:
<itemData name="Normal Text" defStyleNum="dsNormal" />
<itemData name="Comment" defStyleNum="dsComment" />
If you want to know more about Kate's highlighting, have a look at the documentation :) There are also lots of bug reports, so if you want to contribute you can fix them!

PS: As I don't know much about Lua, comments might work differently. That does not really matter, as the example still shows what you can do :)