<?xml version="1.0" encoding="UTF-8"?>
<!--

 This file is part of GtkSourceView

 Authors: Marco Barisione, Emanuele Aina
 Copyright (C) 2005-2007 Marco Barisione <barisione@gmail.com>
 Copyright (C) 2005-2007 Emanuele Aina

 GtkSourceView is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2.1 of the License, or (at your option) any later version.

 GtkSourceView is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public License
 along with this library; if not, see <http://www.gnu.org/licenses/>.

-->
<language id="def" name="Defaults" hidden="true" version="2.0">
  <styles>

    <!-- styles defined here are all the styles that
         a language can use as default for its styles.
         The styles are defined in logical groups.
         A style scheme has to at least define the style
         for the first item of each group and if desired
         define the style for the other items to achieve a
         more finegrained control on the apperance.
         Finally a style scheme may also define language
         specific styles. -->

    <!-- Comment group -->
    <!-- Any comment -->
    <style id="comment"             name="Comment"/>
    <!-- A shebang: #!/bin/sh -->
    <style id="shebang"             name="Shebang"               map-to="def:comment"/>
    <!-- A special comment containing documentation like in javadoc or
         gtk-doc -->
    <style id="doc-comment"         name="Documentation comment" map-to="def:comment"/>
    <!-- A element inside a documentation comment: @author -->
    <!-- This style doesn't map to anything since it must be used as an additional
         style for text which is already styled as a "doc-comment" -->
    <style id="doc-comment-element" name="Documentation comment element" />

    <!-- Constant group -->
    <!-- Any constant -->
    <style id="constant"            name="Constant"/>
    <!-- A character constant: 'c' -->
    <style id="character"           name="Character"             map-to="def:constant"/>
    <!-- A string constant: "this is a string" -->
    <style id="string"              name="String"                map-to="def:constant"/>
    <!-- Special character in a string constant: "%s", "\t" -->
    <!-- This style doesn't map to anything since it must be used as an additional
         style for text which is already styled as a "string" -->
    <style id="special-char"        name="Special character (inside a string)" />
    <!-- A generic number constant -->
    <style id="number"              name="Number"                map-to="def:constant"/>
    <!-- A floating point constant: 2.3e10 -->
    <style id="floating-point"      name="Floating point number" map-to="def:number"/>
    <!-- A decimal number: 1234 -->
    <style id="decimal"             name="Decimal number"        map-to="def:number"/>
    <!-- A base-N number: 0xFFFF -->
    <style id="base-n-integer"      name="Base-N number"         map-to="def:number"/>
    <!-- A complex number -->
    <style id="complex"             name="Complex number"        map-to="def:number"/>
    <!-- A special constant like NULL in C or null in Java -->
    <style id="special-constant"    name="Special constant"      map-to="def:constant"/>
    <!-- A boolean constant: TRUE, false -->
    <style id="boolean"             name="Boolean value"         map-to="def:special-constant"/>

    <!-- Identifier group -->
    <!-- Any variable name -->
    <style id="identifier"          name="Identifier" />
    <!-- A function name (also: methods for classes) -->
    <style id="function"            name="Function" map-to="def:identifier"/>
    <!-- A builtin name: like __import__, abs in Python
        (see http://docs.python.org/lib/built-in-funcs.html) -->
    <style id="builtin"             name="Built-in identifier" map-to="def:identifier"/>

    <!-- Statement group -->
    <!-- Any statement -->
    <style id="statement"           name="Statement"/>
    <!-- Operators: "+", "*", etc. -->
    <style id="operator"            name="Operator" map-to="def:statement" />
    <!-- keywords: "if", "for", "while", etc. -->
    <style id="keyword"             name="Keyword" map-to="def:statement" />

    <!-- Type group -->
    <!--A primitive data type: int, long, char, etc. -->
    <style id="type"                name="Data type"/>

    <!-- Markup group -->
    <!-- Emphasis, usually rendered with italics -->
    <style id="emphasis"            name="Emphasis"/>
    <!-- Strong emphasis, usually rendered as bold -->
    <style id="strong-emphasis"     name="Strong emphasis"/>
    <!-- Inline code, usually rendered with a monospace font -->
    <style id="inline-code"         name="Inline code"/>
    <!-- Insertion, usually rendered with an underline -->
    <style id="insertion"           name="Insertion"/>
    <!-- Deletion, usually rendered with a strikethrough -->
    <style id="deletion"            name="Deletion"/>
    <!-- Link text, usually rendered with an underline -->
    <style id="link-text"           name="Link text"/>
    <!-- Link symbol, a part of the markup syntax for links -->
    <style id="link-symbol"         name="Link symbol"/>
    <!-- Link destination, not usually visible -->
    <style id="link-destination"    name="Link destination"/>
    <!-- Heading, usually rendered in a larger font (using h1, h2, etc. tags) -->
    <style id="heading"             name="Heading"/>
    <!-- Thematic break, usually rendered as a horizontal rule (line) -->
    <style id="thematic-break"      name="Thematic break"/>
    <!-- Preformatted section, usually rendered with a monospace font -->
    <style id="preformatted-section" name="Preformatted section"/>
    <!-- List marker, usually rendered as a bullet or number -->
    <style id="list-marker"         name="List marker"/>

    <!-- Others -->
    <!-- This one is for '#include <foo.h>' and "#pragma blah", or 'use foobar', etc.. -->
    <style id="preprocessor"        name="Preprocessor directive"/>
    <!-- Any erroneous construct -->
    <style id="error"               name="Error"/>
    <!-- to mark possibily errors or unrecommended syntax  -->
    <style id="warning"             name="Warning"/>
    <!--Reserved keywords: like "const" and "goto" in Java -->
    <style id="reserved"            name="Reserved keyword" map-to="def:error" />
    <!-- Anything that needs extra attention; mostly the keywords TODO, FIXME and XXX -->
    <style id="note"                name="Note (FIXME, TODO, XXX, etc.)"/>
    <!-- Internet address: URLs, email addresses, etc. -->
    <style id="net-address"         name="Net address (URL, email address, etc.)"/>
    <!-- Deprecated: will be removed in a future version -->
    <style id="underlined"          name="Underlined (DEPRECATED)" map-to="def:net-address"/>
    <!-- Text that acts as some kind of heading, such as h1, h2, ... in html. -->
    <style id="heading0"            name="Heading 0"/>
    <style id="heading1"            name="Heading 1"/>
    <style id="heading2"            name="Heading 2"/>
    <style id="heading3"            name="Heading 3"/>
    <style id="heading4"            name="Heading 4"/>
    <style id="heading5"            name="Heading 5"/>
    <style id="heading6"            name="Heading 6"/>
  </styles>

  <definitions>
    <!-- An empty string always matches. -->
    <define-regex id="always-match"></define-regex>

    <!-- $^ never matches. -->
    <define-regex id="never-match">$^</define-regex>

    <!-- Unicode lexical classes for identifiers

         Descriptions from:
         https://www.unicode.org/reports/tr31/#Table_Lexical_Classes_for_Identifiers
         Code point data from:
         https://www.unicode.org/Public/13.0.0/ucd/DerivedCoreProperties.txt
         https://www.unicode.org/Public/13.0.0/ucd/PropList.txt

         U+2E2F VERTICAL TILDE is the only applicable code point in
         Pattern_Syntax (and Pattern_White_Space) to subtract to form
         ID_Start and ID_Continue
    -->
    <define-regex id="unicode-id-start" extended="true">
      (?!\x{2E2F}) [\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}]
    </define-regex>
    <define-regex id="unicode-id-continue" extended="true">
      (?!\x{2E2F}) [\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}]
    </define-regex>
    <define-regex id="unicode-xid-start" extended="true">
      (?![\x{037A}\x{0E33}\x{0EB3}\x{309B}-\x{309C}\x{FC5E}-\x{FC63}\x{FDFA}-\x{FDFB}\x{FE70}\x{FE72}\x{FE74}\x{FE76}\x{FE78}\x{FE7A}\x{FE7C}\x{FE7E}\x{FF9E}-\x{FF9F}])
      \%{unicode-id-start}
    </define-regex>
    <define-regex id="unicode-xid-continue" extended="true">
      (?![\x{037A}\x{309B}-\x{309C}\x{FC5E}-\x{FC63}\x{FDFA}-\x{FDFB}\x{FE70}\x{FE72}\x{FE74}\x{FE76}\x{FE78}\x{FE7A}\x{FE7C}\x{FE7E}])
      \%{unicode-id-continue}
    </define-regex>

    <define-regex id="decimal" extended="true">
      (?&lt;![\w\.]) ([1-9][0-9]* | 0) (?![\w\.])
    </define-regex>
    <define-regex id="octal" extended="true">
      (?&lt;![\w\.]) 0 [0-7]+ (?![\w\.])
    </define-regex>
    <define-regex id="hexadecimal" extended="true">
      (?&lt;![\w\.]) 0 [xX] [0-9a-fA-F]+ (?![\w\.])
    </define-regex>
    <define-regex id="float" extended="true" case-sensitive="false">
      \b
      ([0-9]+ e [-+]? [0-9]+ |
       ([0-9]* \. [0-9]+ | [0-9]+ \.)
       (e [-+]? [0-9]+)?) [fl]?
      \b
    </define-regex>

    <context id="decimal" style-ref="decimal">
      <match>\%{decimal}</match>
    </context>
    <context id="octal" style-ref="base-n-integer">
      <match>\%{octal}</match>
    </context>
    <context id="hexadecimal" style-ref="base-n-integer">
      <match>\%{hexadecimal}</match>
    </context>
    <context id="float" style-ref="floating-point">
      <match>\%{float}</match>
    </context>

    <!-- FIXME is it working at line end? -->
    <define-regex id="net-address" extended="true" case-sensitive="false">
      \%[                                         # separator
      (https?|ftp|nntp|news|javascript|about):    # protocol
      [^\ \\]* [^\ \\.:;,?&gt;&lt;)]              # address
          (?![a-z0-9_.-])                             # separator
    </define-regex>

    <define-regex id="email-address" extended="true" case-sensitive="false">
      \%[                 # separator
      (mailto:)?          # optional "mailto:"
      [a-z0-9_.+-]+       # user name
      @                   # at
      [a-z0-9_.+-]+       # domain
          \%]                 # separator
    </define-regex>

    <context id="in-comment" class-disabled="no-spell-check">
      <include>
        <context id="net-address" extend-parent="false" style-ref="net-address" class="no-spell-check">
          <match>\%{net-address}</match>
        </context>
        <context id="email-address" extend-parent="false" style-ref="net-address" class="no-spell-check">
          <match>\%{email-address}</match>
        </context>
        <context id="comment-note" extend-parent="false" style-ref="note" class="no-spell-check comment-note">
          <match>\b(FIXME|TODO|XXX)\b</match>
        </context>
      </include>
    </context>

    <!-- A line comment starting with # -->
    <context id="shell-like-comment" style-ref="comment" end-at-line-end="true" class-disabled="no-spell-check" class="comment">
      <start>#</start>
      <include>
        <context ref="in-comment"/>
      </include>
    </context>

    <!-- C style comments -->
    <context id="c-like-comment" style-ref="comment" end-at-line-end="true" class-disabled="no-spell-check" class="comment" >
      <start>//</start>
      <include>
        <context ref="in-line-comment"/>
      </include>
    </context>
    <context id="c-like-comment-multiline" style-ref="comment" class-disabled="no-spell-check" class="comment" >
      <start>/\*</start>
      <end>\*/</end>
      <include>
        <context ref="in-comment"/>
      </include>
    </context>
    <context id="c-like-close-comment-outside-comment" style-ref="error">
      <match>\*/(?!\*)</match>
    </context>

    <context id="line-continue" style-ref="preprocessor">
      <start>\\$</start>
      <end>^</end>
    </context>

    <!-- this is intended to be used from line comments
         that can continue on a different line after "\" -->
    <context id="in-line-comment" class-disabled="no-spell-check" class="comment">
      <include>
        <context ref="line-continue" ignore-style="true"/>
        <context ref="in-comment"/>
      </include>
    </context>

    <context id="shebang" style-ref="shebang" first-line-only="true" class="no-spell-check">
      <start>^#!</start>
      <end>$</end>
    </context>

    <context id="escape" style-ref="special-char">
      <match>\\.</match>
    </context>

    <!-- usual quoted string, ends at line end, \ is an escape char -->
    <context id="string" style-ref="string" end-at-line-end="true" class="string" class-disabled="no-spell-check">
      <start>"</start>
      <end>"</end>
      <include>
        <context ref="escape"/>
        <context ref="line-continue"/>
      </include>
    </context>

    <!-- same thing but with single quote marks -->
    <context id="single-quoted-string" style-ref="string" end-at-line-end="true" class="string" class-disabled="no-spell-check">
      <start>'</start>
      <end>'</end>
      <include>
        <context ref="escape"/>
        <context ref="line-continue"/>
      </include>
    </context>

    <!-- Dummy context, needed to load the style mappings when parsing v1 files -->
    <context id="def"/>

  </definitions>
</language>
