File: gdscript.rb

package info (click to toggle)
ruby-rouge 4.7.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,844 kB
  • sloc: ruby: 38,489; sed: 2,071; perl: 152; makefile: 8
file content (171 lines) | stat: -rw-r--r-- 5,208 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# -*- coding: utf-8 -*- #
# frozen_string_literal: true

module Rouge
  module Lexers
    class GDScript < RegexLexer
      title "GDScript"
      desc "The Godot Engine programming language (https://godotengine.org/)"
      tag 'gdscript'
      aliases 'gd', 'gdscript'
      filenames '*.gd'
      mimetypes 'text/x-gdscript', 'application/x-gdscript'

      def self.keywords
        @keywords ||= %w(
          and in not or as breakpoint class class_name extends is func setget
          signal tool const enum export onready static var break continue
          if elif else for pass return match while remote master puppet
          remotesync mastersync puppetsync
        ).join('|')
      end

      # Reserved for future implementation
      def self.keywords_reserved
        @keywords_reserved ||= %w(
          do switch case
        ).join('|')
      end

      def self.builtins
        @builtins ||= %w(
          Color8 ColorN abs acos asin assert atan atan2 bytes2var ceil char
          clamp convert cos cosh db2linear decimals dectime deg2rad dict2inst
          ease exp floor fmod fposmod funcref hash inst2dict instance_from_id
          is_inf is_nan lerp linear2db load log max min nearest_po2 pow
          preload print print_stack printerr printraw prints printt rad2deg
          rand_range rand_seed randf randi randomize range round seed sign
          sin sinh sqrt stepify str str2var tan tan tanh type_exist typeof
          var2bytes var2str weakref yield
        ).join('|')
      end

      def self.builtins_type
        @builtins_type ||= %w(
          bool int float String Vector2 Rect2 Transform2D Vector3 AABB
          Plane Quat Basis Transform Color RID Object NodePath Dictionary
          Array PoolByteArray PoolIntArray PoolRealArray PoolStringArray
          PoolVector2Array PoolVector3Array PoolColorArray null
        ).join('|')
      end

      state :root do
        rule %r/\n/, Text
        rule %r/[^\S\n]+/, Text
        rule %r/#.*/, Comment::Single
        rule %r/[\[\]{}:(),;]/, Punctuation
        rule %r/\\\n/, Text
        rule %r/(in|and|or|not)\b/, Operator::Word
        rule %r/!=|==|<<|>>|&&|\+=|-=|\*=|\/=|%=|&=|\|=|\|\||[-~+\/*%=<>&^.!|$]/, Operator
        rule %r/(func)((?:\s|\\)+)/ do
          groups Keyword, Text
          push :funcname
        end
        rule %r/(class)((?:\s|\\)+)/ do
          groups Keyword, Text
          push :classname
        end
        mixin :keywords
        mixin :builtins
        rule %r/"""/, Str::Double, :escape_tdqs
        rule %r/'''/, Str::Double, :escape_tsqs
        rule %r/"/, Str::Double, :escape_dqs
        rule %r/'/, Str::Double, :escape_sqs
        mixin :name
        mixin :numbers
      end

      state :keywords do
        rule %r/\b(#{GDScript.keywords})\b/, Keyword
        rule %r/\b(#{GDScript.keywords_reserved})\b/, Keyword::Reserved
      end

      state :builtins do
        rule %r/\b(#{GDScript.builtins})\b/, Name::Builtin
        rule %r/\b((self|false|true)|(PI|TAU|NAN|INF))\b/, Name::Builtin::Pseudo
        rule %r/\b(#{GDScript.builtins_type})\b/, Keyword::Type
      end

      state :numbers do
        rule %r/(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?j?/, Num::Float
        rule %r/\d+[eE][+-]?[0-9]+j?/, Num::Float
        rule %r/0[xX][a-fA-F0-9]+/, Num::Hex
        rule %r/\d+j?/, Num::Integer
      end

      state :name do
        rule %r/[a-zA-Z_]\w*/, Name
      end

      state :funcname do
        rule %r/[a-zA-Z_]\w*/, Name::Function, :pop!
      end

      state :classname do
        rule %r/[a-zA-Z_]\w*/, Name::Class, :pop!
      end

      state :string_escape do
        rule %r/\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})/, Str::Escape
      end

      state :strings_single do
        rule %r/%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?[hlL]?[E-GXc-giorsux%]/, Str::Interpol
        rule %r/[^\\'%\n]+/, Str::Single
        rule %r/["\\]/, Str::Single
        rule %r/%/, Str::Single
      end

      state :strings_double do
        rule %r/%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?[hlL]?[E-GXc-giorsux%]/, Str::Interpol
        rule %r/[^\\"%\n]+/, Str::Double
        rule %r/['\\]/, Str::Double
        rule %r/%/, Str::Double
      end

      state :dqs do
        rule %r/"/, Str::Double, :pop!
        rule %r/\\\\|\\"|\\\n/, Str::Escape
        mixin :strings_double
      end

      state :escape_dqs do
        mixin :string_escape
        mixin :dqs
      end

      state :sqs do
        rule %r/'/, Str::Single, :pop!
        rule %r/\\\\|\\'|\\\n/, Str::Escape
        mixin :strings_single
      end

      state :escape_sqs do
        mixin :string_escape
        mixin :sqs
      end

      state :tdqs do
        rule %r/"""/, Str::Double, :pop!
        mixin :strings_double
        rule %r/\n/, Str::Double
      end

      state :escape_tdqs do
        mixin :string_escape
        mixin :tdqs
      end

      state :tsqs do
        rule %r/'''/, Str::Single, :pop!
        mixin :strings_single
        rule %r/\n/, Str::Single
      end

      state :escape_tsqs do
        mixin :string_escape
        mixin :tsqs
      end
    end
  end
end