<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "language.dtd">
<!--
  ========================================================================

  D.XML supports syntax highlighting for the D programming language under Kate.

  Copyright (C) 2004 - Simon J Mackenzie <project.katedxml@smackoz.fastmail.fm>
  This code is released under the LGPL as part of kdelibs/kate.

  ========================================================================

  D is a next generation language written by Walter Bright of Digital Mars fame.
  Digital Mars C, C++ and D Compilers can be obtained from http://www.digitalmars.com/

  ========================================================================

  Updates for D.XML can be obtained from http://kate.kde.org/hl/

  UPDATE HISTORY:-
  2004.08.15 - D.XML 1.36 - D 0.98 - Current release of D.
                                   - package, writef(strictly speaking writyef isn't a keyword) - keywords are now supported.
  2004.??.?? - D.XML 1.35 - D 0.?? - Not sure how this release got posted!
  2004.05.23 - D.XML 1.34 - D 0.90 - updated.
  2004.05.19 - D.XML 1.33 - D 0.89 - mixin - keyword is now supported.
  2004.05.19 - D.XML 1.32 - D 0.77 - pragma, typeof - keywords are now supported.
  2004.05.19 - D.XML 1.31 - D 0.76 - is - keyword is now supported.
  2003.09.06 - D.XML 1.30 - D 0.71 - foreach - keyword is now supported.
  2003.08.18 - D.XML 1.20 - D 0.69 - floats are now supported.
                                   - embedded underscores in integer and float literals are now supported.
  2003.08.11 - D.XML 1.10          - updated.
  2003.07.18 - D.XML 1.00          - First released.

  TODO:-
  - Kate string translation cannot handle \" as a literal within a D string.  The " will be interpreted as an end of string marker
    when it should be ignored because of the preceding back-slash.

   ========================================================================
-->

<language name="D" section="Sources" extensions="*.d;*.D" mimetype="text/x-dsrc" version="1.36" kateversion="2.2" casesensitive="true" author="Simon J Mackenzie (project.katedxml@smackoz.fastmail.fm)" license="LGPL">
  <highlighting>
    <list name="keywords">
      <item> abstract </item>
      <item> alias </item>
      <item> align </item>
      <item> asm </item>
      <item> auto </item>

      <item> body </item>
      <item> break </item>

      <item> case </item>
      <item> cast </item>
      <item> catch </item>
      <item> class </item>
      <item> const </item>
      <item> continue </item>

      <item> default </item>
      <item> delegate </item>
      <item> delete </item>
      <item> deprecated </item>
      <item> do </item>

      <item> else </item>
      <item> enum </item>
      <item> export </item>

      <item> false </item>
      <item> final </item>
      <item> finally </item>
      <item> for </item>
      <item> foreach </item>
      <item> function </item>

      <item> goto </item>

      <item> if </item>
      <item> in </item>
      <item> inout </item>
      <item> interface </item>
      <item> invariant </item>
      <item> is </item>

      <item> mixin </item>

      <item> new </item>
      <item> null </item>

      <item> out </item>
      <item> override </item>

      <item> package </item>
      <item> private </item>
      <item> protected </item>
      <item> public </item>

      <item> return </item>

      <item> static </item>
      <item> struct </item>
      <item> super </item>
      <item> switch </item>
      <item> synchronized </item>

      <item> template </item>
      <item> this </item>
      <item> throw </item>
      <item> true </item>
      <item> try </item>
      <item> typedef </item>
      <item> typeof </item>

      <item> union </item>

      <item> volatile </item>

      <item> while </item>
      <item> with </item>
    </list>
    <list name="modules">
      <item> module </item>
      <item> import </item>
    </list>
    <list name="types">
      <item> void </item>
      <item> bit </item>
      <item> byte </item>
      <item> ubyte </item>
      <item> short </item>
      <item> ushort </item>
      <item> int </item>
      <item> uint </item>
      <item> long </item>
      <item> ulong </item>
      <item> cent </item>
      <item> ucent </item>
      <item> float </item>
      <item> double </item>
      <item> real </item>
      <item> ireal </item>
      <item> ifloat </item>
      <item> idouble </item>
      <item> creal </item>
      <item> cfloat </item>
      <item> cdouble </item>
      <item> char </item>
      <item> wchar </item>
      <item> dchar </item>
    </list>
    <list name="phobos">
      <item> printf </item>
      <item> writef </item>
    </list>

    <list name="linkage">
      <item> extern </item>
    </list>
    <list name="ltypes">
      <item> C </item>
      <item> D </item>
      <item> Windows </item>
      <item> Pascal </item>
    </list>

    <list name="debug">
      <item> debug </item>
    </list>
    <list name="assert">
      <item> assert </item>
    </list>

    <list name="pragma">
      <item> pragma </item>
    </list>
    <list name="ptypes">
      <item> msg </item>
    </list>

    <list name="version">
      <item> version </item>
    </list>
    <list name="vtypes">
      <item> DigitalMars </item>
      <item> X86 </item>
      <item> AMD64 </item>
      <item> Windows </item>
      <item> Win32 </item>
      <item> Win64 </item>
      <item> linux </item>
      <item> LittleEndian </item>
      <item> BigEndian </item>
      <item> D_InlineAsm </item>
      <item> none </item>
    </list>

    <list name="unittest">
      <item> unittest </item>
    </list>

    <contexts>
      <context attribute="Normal Text" lineEndContext="#stay" name="normal">
        <keyword attribute="Keyword"        context="#stay"      String="keywords"/>
        <keyword attribute="Module"         context="ModuleName" String="modules"/>
        <keyword attribute="Type"           context="#stay"      String="types"/>
        <keyword attribute="Phobos Library" context="#stay"      String="phobos"/>
        <keyword attribute="Linkage"        context="Linkage"    String="linkage"/>
        <keyword attribute="Debug"          context="#stay"      String="debug"/>
        <keyword attribute="Assert"         context="#stay"      String="assert"/>
        <keyword attribute="Pragma"         context="Pragmas"    String="pragma"/>
        <keyword attribute="Version"        context="Version"    String="version"/>
        <keyword attribute="Unit Test"      context="#stay"      String="unittest"/>

        <Detect2Chars attribute="Wysiwyg"   context="Wysiwyg" char="r" char1="&quot;"/>
        <Detect2Chars attribute="Hex"       context="Hex"     char="x" char1="&quot;"/>

        <RegExpr attribute="Normal Text"    context="#pop" String="[_a-z][\w]*" insensitive="true"/>

        <RegExpr attribute="Pragma"         context="#pop" String="\#[ ]*line"/>

        <RegExpr attribute="Escape String"  context="#pop" String="\\[n|t|&quot;]"/>
        <RegExpr attribute="Escape String"  context="#pop" String="(\\r\\n)"/>
        <RegExpr attribute="Escape String"  context="#pop" String="\\0[0-7]+"/>
        <RegExpr attribute="Escape String"  context="#pop" String="\\u[\d]+"    insensitive="true"/>
        <RegExpr attribute="Escape String"  context="#pop" String="\\x[\da-fA-F]+"/>

        <RegExpr attribute="Binary"  context="#pop" String="0b[01]+[_01]*[ ]*\.\.[ ]*0b[01]+[_01]*(UL|LU|U|L)?"             insensitive="true"/>
        <RegExpr attribute="Octal"   context="#pop" String="0[0-7]+[_0-7]*[ ]*\.\.[ ]*0[0-7]+[_0-7]*(UL|LU|U|L)?"           insensitive="true"/>
        <RegExpr attribute="Hex"     context="#pop" String="0x[\da-f]+[_\da-f]*[ ]*\.\.[ ]*0x[\da-f]+[_\da-f]*(UL|LU|U|L)?" insensitive="true"/>
        <RegExpr attribute="Integer" context="#pop" String="[\d]+[_\d]*(UL|LU|U|L)?[ ]*\.\.[ ]*[\d]+[_\d]*(UL|LU|U|L)?"     insensitive="true"/>

        <RegExpr attribute="Float" context="#pop" String="[\d]*[_\d]*\.[_\d]*(e-|e|e\+)?[\d]+[_\d]*(F|L|I|FI|LI|)?"                 insensitive="true"/>
        <RegExpr attribute="Float" context="#pop" String="[\d]*[_\d]*\.?[_\d]*(e-|e|e\+)[\d]+[_\d]*(F|L|I|FI|LI|)?"                 insensitive="true"/>
        <RegExpr attribute="Float" context="#pop" String="0x[\da-f]+[_\da-f]*\.[_\da-f]*(p-|p|p\+)?[\da-f]+[_\da-f]*(F|L|I|FI|LI)?" insensitive="true"/>
        <RegExpr attribute="Float" context="#pop" String="0x[\da-f]+[_\da-f]*\.?[_\da-f]*(p-|p|p\+)[\da-f]+[_\da-f]*(F|L|I|FI|LI)?" insensitive="true"/>

        <RegExpr attribute="Binary"  context="#pop" String="0B[01]+[_01]*(UL|LU|U|L)?"       insensitive="true"/>
        <RegExpr attribute="Octal"   context="#pop" String="0[0-7]+[_0-7]*(UL|LU|U|L)?"      insensitive="true"/>
        <RegExpr attribute="Hex"     context="#pop" String="0x[\da-f]+[_\da-f]*(UL|LU|U|L)?" insensitive="true"/>
        <RegExpr attribute="Integer" context="#pop" String="[\d]+[_\d]*(UL|LU|U|L)?"         insensitive="true"/>

        <DetectChar attribute="Char"    context="Char"    char="'"/>
        <DetectChar attribute="String"  context="String"  char="&quot;"/>
        <DetectChar attribute="Wysiwyg" context="Wysiwyg" char="`"/>

        <Detect2Chars attribute="Comment" context="CommentLine"   char="/" char1="/"/>
        <Detect2Chars attribute="Comment" context="CommentBlockA" char="/" char1="*" beginRegion="CommentA"/>
        <Detect2Chars attribute="Comment" context="CommentBlockB" char="/" char1="+" beginRegion="CommentB"/>

        <DetectChar attribute="Normal Text" context="#stay" char="{" beginRegion="BraceA" />
        <DetectChar attribute="Normal Text" context="#stay" char="}" endRegion="BraceA" />
      </context>

      <context attribute="Module Name" lineEndContext="#stay" name="ModuleName">
        <DetectChar   attribute="Normal Text" context="#stay"         char=","/>
        <DetectChar   attribute="Normal Text" context="#pop"          char=";"/>
        <Detect2Chars attribute="Comment"     context="CommentLine"   char="/" char1="/"/>
        <Detect2Chars attribute="Comment"     context="CommentBlockA" char="/" char1="*" beginRegion="CommentA"/>
        <Detect2Chars attribute="Comment"     context="CommentBlockB" char="/" char1="+" beginRegion="CommentB"/>
      </context>

      <context attribute="Linkage" lineEndContext="#pop" name="Linkage">
        <keyword    attribute="Type"         context="#pop"  String="types"/>
        <DetectChar attribute="Normal Text"  context="#stay" char="("/>
        <keyword    attribute="Linkage Type" context="#stay" String="ltypes"/>
        <DetectChar attribute="Normal Text"  context="#pop"  char=")"/>
        <DetectChar attribute="Normal Text"  context="#pop"  char=";"/>
      </context>
      <context attribute="Version" lineEndContext="#pop" name="Version">
        <DetectChar attribute="Normal Text"  context="#pop"  char="="/>
        <DetectChar attribute="Normal Text"  context="#stay" char="("/>
        <keyword    attribute="Version Type" context="#stay" String="vtypes"/>
        <RegExpr    attribute="Normal Text"  context="#pop"  String="\w" insensitive="true"/>
        <DetectChar attribute="Normal Text"  context="#pop"  char=")"/>
      </context>
      <context attribute="Pragma" lineEndContext="#pop" name="Pragmas">
        <DetectChar attribute="Normal Text"  context="#stay" char="("/>
        <keyword    attribute="Version Type" context="#stay" String="ptypes"/>
        <keyword    attribute="Version Type" context="#stay" String="vtypes"/>
        <RegExpr    attribute="Keyword"  context="#pop" String="[_a-z][\w]*" insensitive="true"/>
        <DetectChar attribute="Normal Text"  context="#pop"  char=","/>
        <DetectChar attribute="Normal Text"  context="#pop"  char=")"/>
      </context>

      <context attribute="Wysiwyg" lineEndContext="#stay" name="Wysiwyg">
        <DetectChar attribute="Wysiwyg" context="#pop" char="&quot;"/>
        <DetectChar attribute="Wysiwyg" context="#pop" char="`"/>
      </context>
      <context attribute="Hex" lineEndContext="#stay" name="Hex">
        <DetectChar attribute="Hex" context="#pop" char="&quot;"/>
      </context>
      <context attribute="Char" lineEndContext="#stay" name="Char">
        <Detect2Chars attribute="Char" context="#stay" char="\" char1="'"/>
        <Detect2Chars attribute="Char" context="#stay" char="\" char1="\"/>
        <DetectChar   attribute="Char" context="#pop"  char="'"/>
      </context>
      <context attribute="String" lineEndContext="#stay" name="String">
        <DetectChar attribute="String" context="#pop" char="&quot;"/>
      </context>

      <context attribute="Comment" lineEndContext="#pop" name="CommentLine">
      </context>
      <context attribute="Comment" lineEndContext="#stay" name="CommentBlockA">
        <Detect2Chars attribute="Comment" context="#pop" char="*" char1="/" endRegion="CommentA"/>
      </context>
      <context attribute="Comment" lineEndContext="#stay" name="CommentBlockB">
        <Detect2Chars attribute="Comment" context="#pop" char="+" char1="/" endRegion="CommentB"/>
      </context>
    </contexts>
    <itemDatas>
      <itemData name="Normal Text"    defStyleNum="dsNormal"/>
      <itemData name="Keyword"        defStyleNum="dsKeyword"  color="#000000" selColor="#ffffff" bold="1" italic="0"/>
      <itemData name="Module"         defStyleNum="dsKeyword"  color="#0000ff" selColor="#ffffff" bold="0" italic="0"/>
      <itemData name="Module Name"    defStyleNum="dsKeyword"  color="#0000ff" selColor="#ffffff" bold="1" italic="1"/>
      <itemData name="Type"           defStyleNum="dsDataType"/>
      <itemData name="Phobos Library" defStyleNum="dsKeyword"  color="#000000" selColor="#ffffff" bold="1" italic="1"/>
      <itemData name="Linkage"        defStyleNum="dsKeyword"  color="#ff0000" selColor="#ffffff" bold="0" italic="0"/>
      <itemData name="Linkage Type"   defStyleNum="dsDataType" color="#ff0000" selColor="#ffffff" bold="1" italic="1"/>
      <itemData name="Debug"          defStyleNum="dsKeyword"  color="#ff00ff" selColor="#ffffff" bold="0" italic="0"/>
      <itemData name="Assert"         defStyleNum="dsKeyword"  color="#0000ff" selColor="#ffffff" bold="0" italic="0"/>
      <itemData name="Version"        defStyleNum="dsKeyword"  color="#ff0000" selColor="#ffffff" bold="0" italic="0"/>
      <itemData name="Version Type"   defStyleNum="dsDataType" color="#ff0000" selColor="#ffffff" bold="1" italic="1"/>
      <itemData name="Unit Test"      defStyleNum="dsKeyword"  color="#ff00ff" selColor="#ffffff" bold="1" italic="0"/>
      <itemData name="Pragma"         defStyleNum="dsKeyword"  color="#00aa00" selColor="#ffffff" bold="1" italic="0"/>

      <itemData name="Integer"        defStyleNum="dsDecVal"/>
      <itemData name="Binary"         defStyleNum="dsBaseN"    color="#00dddd" selColor="#00ffff" bold="0" italic="0"/>
      <itemData name="Octal"          defStyleNum="dsBaseN"    color="#00aaaa" selColor="#00ffff" bold="0" italic="0"/>
      <itemData name="Hex"            defStyleNum="dsBaseN"    color="#006666" selColor="#00ffff" bold="0" italic="0"/>
      <itemData name="Float"          defStyleNum="dsFloat"/>

      <itemData name="Escape String"  defStyleNum="dsString"   color="#00aa00" selColor="#ff0000" bold="0" italic="0"/>
      <itemData name="String"         defStyleNum="dsString"   color="#00aa00" selColor="#ff0000" bold="0" italic="0"/>
      <itemData name="Char"           defStyleNum="dsChar"     color="#ff00ff" selColor="#ff00ff" bold="0" italic="0"/>
      <itemData name="Wysiwyg"        defStyleNum="dsChar"     color="#a100a1" selColor="#ff00ff" bold="0" italic="0"/>

      <itemData name="Comment"        defStyleNum="dsComment"/>
    </itemDatas>
  </highlighting>
  <general>
    <comments>
    <comment name="singleLine" start="//"/>
    <comment name="multiLine"  start="/+" end="+/"/>
    </comments>
    <keywords casesensitive="true"/>
  </general>
</language>
