<?xml version="1.0" encoding="UTF-8"?>
<language id="desktop" _name=".desktop" version="2.0" _section="Others">

  <!-- http://standards.freedesktop.org/desktop-entry-spec/latest/ -->

  <metadata>
    <property name="mimetypes">application/x-gnome-app-info;application/x-desktop</property>
  </metadata>

  <styles>
    <style id="group"      _name="Group"               map-to="def:keyword"/>
    <style id="key"        _name="Key"                 map-to="def:data-type"/>
    <style id="language"   _name="Language"            map-to="def:decimal"/>
    <style id="boolean"    _name="Boolean"             map-to="def:floating-point"/>
    <style id="number"     _name="Number"              map-to="def:floating-point"/>
    <style id="encoding"   _name="Encoding"            map-to="def:string"/>
    <style id="exec-param" _name="Execution Parameter" map-to="def:string"/>
  </styles>

  <definitions>

    <!-- just a simplified float regex, we match
         anything that can be passed as %f in C -->
    <define-regex id="float">
      (.\b[0-9]+([Ll]?|[Ff]?)\b)|(b[0-9]*\.\W)
    </define-regex>

    <context id="group" style-ref="group">
      <start>^\[</start>
      <end>\]$</end>
    </context>

    <context id="standard-key" style-ref="key">
      <prefix>^_?</prefix>
      <keyword>Encoding</keyword>
      <keyword>Version</keyword>
      <keyword>Name</keyword>
      <keyword>GenericName</keyword>
      <keyword>Type</keyword>
      <keyword>FilePattern</keyword>
      <keyword>TryExec</keyword>
      <keyword>NoDisplay</keyword>
      <keyword>Comment</keyword>
      <keyword>Exec</keyword>
      <keyword>Actions</keyword>
      <keyword>Icon</keyword>
      <keyword>MiniIcon</keyword>
      <keyword>Hidden</keyword>
      <keyword>Path</keyword>
      <keyword>Terminal</keyword>
      <keyword>TerminalOptions</keyword>
      <keyword>SwallowTitle</keyword>
      <keyword>SwallowExec</keyword>
      <keyword>MimeType</keyword>
      <keyword>Patterns</keyword>
      <keyword>DefaultApp</keyword>
      <keyword>Dev</keyword>
      <keyword>FSType</keyword>
      <keyword>MountPoint</keyword>
      <keyword>ReadOnly</keyword>
      <keyword>UnmountIcon</keyword>
      <keyword>SortOrder</keyword>
      <keyword>URL</keyword>
      <keyword>StartupNotify</keyword>
      <keyword>Categories</keyword>
      <keyword>OnlyShowIn</keyword>
      <keyword>NotShowIn</keyword>
      <keyword>StartupWMClass</keyword>
      <keyword>Protocols</keyword>
      <keyword>Extensions</keyword>
      <keyword>BinaryPattern</keyword>
      <keyword>MapNotify</keyword>
    </context>

    <context id="non-standard-key" style-ref="key">
      <match>^_?X\-[a-zA-Z\-]+</match>
    </context>

    <context id="language" style-ref="language">
      <match>\[[a-zA-Z_]+\]</match>
    </context>

    <context id="boolean" style-ref="boolean">
      <keyword>true</keyword>
      <keyword>false</keyword>
    </context>

    <context id="number" style-ref="number">
      <match>\%{float}</match>
    </context>

    <context id="encoding" style-ref="encoding">
      <keyword>UTF\-8</keyword>
      <keyword>Legacy\-Mixed</keyword>
    </context>

    <context id="exec-param" style-ref="exec-param">
      <prefix></prefix>
      <keyword>%f</keyword>
      <keyword>%F</keyword>
      <keyword>%u</keyword>
      <keyword>%U</keyword>
      <keyword>%d</keyword>
      <keyword>%D</keyword>
      <keyword>%n</keyword>
      <keyword>%N</keyword>
      <keyword>%i</keyword>
      <keyword>%m</keyword>
      <keyword>%c</keyword>
      <keyword>%k</keyword>
      <keyword>%v</keyword>
    </context>

    <context id="key" end-at-line-end="true">
      <start>^</start>
      <end>(?==)</end>
      <include>
        <context ref="standard-key"/>
        <context ref="non-standard-key"/>
        <context ref="language"/>
      </include>
    </context>

    <context id="value" end-at-line-end="true">
      <start>(?&lt;==)</start>
      <include>
        <context ref="boolean"/>
        <context ref="number"/>
        <context ref="encoding"/>
        <context ref="exec-param"/>
      </include>
    </context>

    <context id="desktop">
      <include>
        <context ref="def:shell-like-comment"/>
        <context ref="group"/>
        <context ref="key"/>
        <context ref="value"/>
      </include>
    </context>

  </definitions>
</language>
