<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "language.dtd">
<!--
    LUA (www.lua.org) syntax highlighting for Kate

    CHANGES

    [ Version 1.03 (2007-09-12) by Bruno Massa ]

    - [=[ ]=] comment and string style is now working (thanks to Dominik and Sebastian)
    - it uses DoxygenLua.xml to format the comments in a Doxygen style

    [ Version 1.02 (2007-07-15) by Bruno Massa ]

    - based on Lua 5.1
    - highlight the Kepler function (cgilua, luasql, lfs, luazip)
    - true, false and nil are highlighted in black
    - table.foreach and foreachi are marked as alerts

    [ Version 1.01 (2007-01-01) by Bruno Massa ]

    - highlighting similar to PHP
    - error detection on one-line strings and common mistakes from other languages like using "!=" "++"
    - uppercase-only variables are highlighted as constants
    - { } now is collapsable

    [ Version 1.00 (2006-12-05) by Bruno Massa ]

    - based on Lua 5.0.2 syntax
    - strings "[[ ]]" and single quoted strings
    - block comments
    - function, if/elseif/else, do-end chunks, comment blocks, strings using [[ ]] collapsable
    - nil, false and true consided pseudo-variables (displayed as numbers)
    - NOTE, FIXME, TODO alerts added on comments
    - improved highlighting

    -->
<language name="Lua" version="2" indenter="lua" kateversion="3.4" section="Scripts" extensions="*.lua" mimetype="text/x-lua">
  <highlighting>
    <list name="keywords">
      <item>and</item>
      <item>function</item>
      <item>in</item>
      <item>local</item>
      <item>not</item>
      <item>or</item>
    </list>
    <list name="control">
      <item>break</item>
      <item>do</item>
      <item>else</item>
      <item>elseif</item>
      <item>end</item>
      <item>for</item>
      <item>if</item>
      <item>repeat</item>
      <item>return</item>
      <item>then</item>
      <item>until</item>
      <item>while</item>
    </list>
    <list name="pseudo-variables">
      <item>nil</item>
      <item>false</item>
      <item>true</item>
    </list>
    <list name="basefunc">
      <item>string.byte</item>  <item>string.char</item>
      <item>string.find</item>  <item>string.len</item>
      <item>string.lower</item> <item>string.rep</item>
      <item>string.sub</item>   <item>string.upper</item>
      <item>string.format</item><item>string.gfind</item>
      <item>string.gsub</item>  <item>table.concat</item>
      <item>table.getn</item>   <item>table.sort</item>
      <item>table.insert</item> <item>table.remove</item>
      <item>table.setn</item>   <item>math.abs</item>
      <item>math.sin</item>     <item>math.cos</item>
      <item>math.tan</item>     <item>math.asin</item>
      <item>math.acos</item>    <item>math.atan</item>
      <item>math.atan2</item>   <item>math.ceil</item>
      <item>math.floor</item>   <item>math.mod</item>
      <item>math.frexp</item>   <item>math.ldexp</item>
      <item>math.squrt</item>   <item>math.min</item>
      <item>math.max</item>     <item>math.log</item>
      <item>math.log10</item>   <item>math.exp</item>
      <item>math.deg</item>     <item>math.rad</item>
      <item>math.random</item>  <item>math.randomseed</item>
      <item>io.close</item>     <item>io.flush</item>
      <item>io.input</item>     <item>io.lines</item>
      <item>io.open</item>      <item>io.output</item>
      <item>io.read</item>      <item>io.stderr</item>
      <item>io.stdin</item>     <item>io.stdout</item>
      <item>io.tmpfile</item>   <item>io.write</item>
      <item>os.clock</item>     <item>os.date</item>
      <item>os.difftime</item>  <item>os.execute</item>
      <item>os.exit</item>      <item>os.getenv</item>
      <item>os.remove</item>    <item>os.rename</item>
      <item>os.setlocale</item> <item>os.time</item>
      <item>os.tmpname</item>   <item>debug.getinfo</item>
      <item>debug.getlocal</item><item>debug.setlocal</item>
      <item>debug.sethook</item><item>debug.gethook</item>
      <item>assert</item>      <item>collectgarbage</item>
      <item>dofile</item>      <item>error</item>
      <item>next</item>        <item>print</item>
      <item>rawget</item>      <item>rawset</item>
      <item>tonumber</item>    <item>tostring</item>
      <item>type</item>        <item>_ALERT</item>
      <item>_ERRORMESSAGE</item><item>call</item>
      <item>getmetatable</item><item>gcinfo</item>
      <item>ipairs</item>      <item>loadfile</item>
      <item>loadstring</item>  <item>pairs</item>
      <item>pcall</item>       <item>require</item>
      <item>LUA_PATH</item>    <item>setmetatable</item>
      <item>_LOADED</item>     <item>_VERSION</item>
      <item>gettagmethod</item><item>globals</item>
      <item>newtag</item>      <item>setglobal</item>
      <item>settag</item>      <item>settagmethod</item>
      <item>setlinehook</item> <item>getglobals</item>
      <item>copytagmethods</item><item>dostring</item>
      <item>getglobal</item>   <item>tag</item>
      <item>setglobals</item>  <item>unpack</item>
      <item>exit</item>        <item>readfrom</item>
      <item>writeto</item>     <item>appendto</item>
      <item>read</item>        <item>write</item>
      <item>getinfo</item>     <item>getlocal</item>
      <item>setlocal</item>    <item>setcallhook</item>
      <item>tinsert</item>     <item>tremove</item>
      <item>flush</item>       <item>seek</item>
      <item>setlocale</item>   <item>execute</item>
      <item>remove</item>      <item>rename</item>
      <item>tmpname</item>     <item>getenv</item>
      <item>getn</item>        <item>sort</item>
      <item>table.foreach</item> <item>table.foreachi</item>
      <item>foreach</item>     <item>foreachi</item>
      <item>abs</item>         <item>sin</item>
      <item>cos</item>         <item>tan</item>
      <item>asin</item>        <item>acos</item>
      <item>atan</item>        <item>atan2</item>
      <item>ceil</item>        <item>floor</item>
      <item>mod</item>         <item>frexp</item>
      <item>ldexp</item>       <item>squrt</item>
      <item>min</item>         <item>max</item>
      <item>log</item>         <item>log10</item>
      <item>exp</item>         <item>deg</item>
      <item>rad</item>         <item>random</item>
      <item>randomseed</item>  <item>strlen</item>
      <item>strsub</item>      <item>strlower</item>
      <item>strupper</item>    <item>strchar</item>
      <item>strrep</item>      <item>ascii</item>
      <item>strbyte</item>     <item>format</item>
      <item>strfind</item>     <item>gsub</item>
      <item>openfile</item>    <item>closefile</item>
      <item>date</item>        <item>clock</item>


      <item>cgilua</item>                     <item>cgilua.lp.translate</item>
      <item>cgilua.contentheader</item>       <item>cgilua.script_file</item>
      <item>cgilua.header</item>              <item>cgilua.script_path</item>
      <item>cgilua.htmlheader</item>          <item>cgilua.script_pdir</item>
      <item>cgilua.redirect</item>            <item>cgilua.script_vdir</item>
      <item>cgilua.mkabsoluteurl</item>       <item>cgilua.script_vpath</item>
      <item>cgilua.mkurlpath</item>           <item>cgilua.servervariable</item>
      <item>cgilua.put</item>                 <item>cgilua.urlpath</item>
      <item>cgilua.handlelp</item>            <item>cgilua.errorlog</item>
      <item>cgilua.lp.compile</item>          <item>cgilua.seterrorhandler</item>
      <item>cgilua.lp.include</item>          <item>cgilua.seterroroutput</item>
      <item>cgilua.lp.setcompatmode</item>    <item>cgilua.addclosefunction</item>
      <item>cgilua.lp.setoutfunc</item>       <item>cgilua.addopenfunction</item>
      <item>cgilua.addscripthandler</item>    <item>cgilua.addscripthandler</item>
      <item>cgilua.buildprocesshandler</item> <item>cgilua.setmaxfilesize</item>
      <item>cgilua.setmaxinput</item>         <item>cgilua.urlcode.encodetable</item>
      <item>cgilua.urlcode.escape</item>      <item>cgilua.urlcode.parsequery</item>
      <item>cgilua.urlcode.unescape</item>    <item>cgilua.urlcode.insertfield</item>
      <item>cgilua.setoutfunc</item>          <item>cgilua.addopenfunction</item>
      <item>cgilua.doif</item>                <item>cgilua.doscript</item>
      <item>cgilua.pack</item>                <item>cgilua.splitpath</item>
      <item>cgilua.cookies.get</item>         <item>cgilua.cookies.set</item>
      <item>cgilua.cookies.sethtml</item>     <item>cgilua.cookies.delete</item>
      <item>cgilua.serialize</item>           <item>cgilua.session.close</item>
      <item>cgilua.session.data</item>        <item>cgilua.session.load</item>
      <item>cgilua.session.new</item>         <item>cgilua.session.open</item>
      <item>cgilua.session.save</item>        <item>cgilua.session.setsessiondir</item>
      <item>cgilua.session.delete</item>      <item>cgilua.session</item>
      <item>cgilua.cookies</item>

      <item>numrows</item>                    <item>connect</item>
      <item>close</item>                      <item>fetch</item>
      <item>getcolnames</item>                <item>getcoltypes</item>
      <item>commit</item>                     <item>rollback</item>
      <item>setautocommit</item>

      <item>lfs</item>                        <item>lfs.attributes</item>
      <item>lfs.chdir</item>                  <item>lfs.currentdir</item>
      <item>lfs.dir</item>                    <item>lfs.lock</item>
      <item>lfs.mkdir</item>                  <item>lfs.rmdir</item>
      <item>lfs.touch</item>                  <item>lfs.unlock</item>

      <item>zip</item>                        <item>zip.open</item>
      <item>zip.openfile</item>               <item>files</item>
      <item>seek</item>                       <item>close</item>
      <item>lines</item>


    </list>
    <list name="attention">
      <item>TODO</item>
      <item>FIXME</item>
      <item>NOTE</item>
    </list>
    <list name="deprecated">
      <item>table.foreach</item> <item>table.foreachi</item>
      <item>foreach</item>       <item>foreachi</item>
    </list>

    <contexts>
      <context name="Normal"        attribute="Normal Text" lineEndContext="#stay">
        <IncludeRules context="##DoxygenLua" />
        <keyword      attribute="Error"  context="#stay" String="deprecated" />
        <DetectSpaces />
        <RegExpr      attribute="Comment"  context="Block Comment" beginRegion="block comment"  String="--\[(=*)\[" dynamic="true" />
        <Detect2Chars attribute="Comment"  context="Comment"       char="-" char1="-"/>
        <RegExpr      attribute="Strings"  context="String_block"  String="\[(=*)\[" dynamic="true" />
        <DetectChar   attribute="Strings"  context="String_single" char="'"/>
        <DetectChar   attribute="Strings"  context="String_double" char="&quot;"/>
        <keyword      attribute="BFunc"    context="#stay"         String="basefunc"/>

        <RegExpr      attribute="Keyword"  context="#stay" beginRegion="chunk" String="\bfunction\b" />
        <keyword      attribute="Keyword"  context="#stay" String="keywords" />
        <keyword      attribute="Keyword"  context="#stay"  String="pseudo-variables" />
        <RegExpr      attribute="Control"  context="#stay" endRegion="chunk"   beginRegion="chunk" String="\belse\b" />
        <RegExpr      attribute="Control"  context="#stay" endRegion="chunk"   beginRegion="chunk" String="\belseif\b" />
        <RegExpr      attribute="Control"  context="#stay" beginRegion="chunk" String="\bdo\b" />
        <RegExpr      attribute="Control"  context="#stay" beginRegion="chunk" String="\bif\b" />
        <RegExpr      attribute="Control"  context="#stay" endRegion="chunk"   String="\bend\b" />
        <keyword      attribute="Control"  context="#stay" String="control" />

        <DetectChar   attribute="Symbols"  context="#stay" beginRegion="table" char="{" />
        <DetectChar   attribute="Symbols"  context="#stay" endRegion="table"   char="}" />

        <RegExpr      attribute="Numbers"  context="#stay"  String="\b\d*\.?\d*(e|e\-|e\+)?\d+\b"/>
        <RegExpr      attribute="Numbers"  context="#stay"  String="\b-?0[xX][0-9a-fA-F]+\b"/>

        <RegExpr      attribute="Normal Text" context="#stay" String="\b[a-zA-Z_][a-zA-Z0-9_]*(?=\s*([({'&quot;]|\[\[))\b" />
        <RegExpr      attribute="Constant" context="#stay" String="\b[A-Z_][A-Z0-9_]*\b" />
        <RegExpr      attribute="Variable" context="#stay" String="\b[a-zA-Z_][a-zA-Z0-9_]*\b" />

        <Detect2Chars attribute="Error"    context="#stay" char="!" char1="="/>
        <Detect2Chars attribute="Error"    context="#stay" char="-" char1="="/>
        <Detect2Chars attribute="Error"    context="#stay" char="+" char1="="/>
        <Detect2Chars attribute="Error"    context="#stay" char="+" char1="+"/>
        <Detect2Chars attribute="Error"    context="#stay" char="." char1="="/>
        <AnyChar      attribute="Symbols"  context="#stay" String="[]().,=~+-*/^&gt;&lt;#;" />
      </context>
      <context name="Comment"       attribute="Comment"     lineEndContext="#pop">
        <Detect2Chars attribute="Alerts"   context="#stay" char="-" char1="-" />
        <keyword      attribute="Alerts"   context="#stay" String="attention"/>
      </context>
      <context name="Block Comment" attribute="Comment"     lineEndContext="#stay" dynamic="true" >
        <RegExpr attribute="Comment"  context="#pop"  endRegion="block comment" String="\]%1\]" dynamic="true" />
        <Detect2Chars attribute="Alerts"   context="#stay" char="-" char1="-" />
        <keyword      attribute="Alerts"   context="#stay" String="attention" />
      </context>
      <context name="String_single" attribute="Strings"     lineEndContext="Error">
        <RegExpr      attribute="Symbols"  context="#stay" String="\\(a|b|f|n|r|t|v|\\|&quot;|\'|[|])" />
        <DetectChar   attribute="Strings"  context="#pop"  char="'"/>
      </context>
      <context name="String_double" attribute="Strings"     lineEndContext="Error">
        <RegExpr      attribute="Symbols"  context="#stay" String="\\[abfnrtv'&quot;\\\[\]]" />
        <DetectChar   attribute="Strings"  context="#pop"  char="&quot;"/>
      </context>
      <context name="String_block"  attribute="Strings"     lineEndContext="#stay" dynamic="true">
        <RegExpr      attribute="Symbols"  context="#stay" String="\\(a|b|f|n|r|t|v|\\|&quot;|\'|[|])" />
        <RegExpr      attribute="Strings"  context="#pop"  String="\]%1\]" dynamic="true" />
      </context>
      <context name="Error"         attribute="Error"       lineEndContext="#stay">
      </context>
    </contexts>
    <itemDatas>
      <itemData name="Normal Text"     defStyleNum="dsNormal" spellChecking="false"/>
      <itemData name="Alerts"          defStyleNum="dsAlert" spellChecking="false"/>
      <itemData name="BFunc"           defStyleNum="dsFunction" spellChecking="false"/>
      <itemData name="Comment"         defStyleNum="dsComment"/>
      <itemData name="Constant"        defStyleNum="dsNormal" /> <!-- JGM -->
      <itemData name="Control"         defStyleNum="dsKeyword" color="#A1A100" selColor="#ffffff" bold="0" italic="0" spellChecking="false"/>
      <itemData name="Error"           defStyleNum="dsError" spellChecking="false"/>
      <itemData name="Keyword"         defStyleNum="dsKeyword" spellChecking="false"/>
      <itemData name="Numbers"         defStyleNum="dsDecVal" spellChecking="false"/>
      <itemData name="Strings"         defStyleNum="dsString"/>
      <itemData name="Symbols"         defStyleNum="dsOthers" spellChecking="false"/>
      <itemData name="Variable"        defStyleNum="dsNormal" /> <!-- JGM -->
    </itemDatas>
  </highlighting>
  <general>
    <comments>
      <comment name="singleLine" start="--" />
      <comment name="multiLine" start="--[[" end="]]" />
    </comments>
    <keywords casesensitive="1" weakDeliminator="&#46;" additionalDeliminator="&quot;"/>
  </general>
</language>
