<?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" />
        <style id="method-calls"        name="Method Calls"/>

        <!-- 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>
