Files
news.gitea.happylizard.me/bin/gems/rouge-4.5.1/lib/rouge/lexers/meson.rb
T
pizza2d1 4cee170d66
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 9s
Add bin and edit workflow
2026-09-16 13:11:16 -06:00

159 lines
4.1 KiB
Ruby

# -*- coding: utf-8 -*- #
# frozen_string_literal: true
module Rouge
module Lexers
class Meson < RegexLexer
title "Meson"
desc "Meson's specification language (mesonbuild.com)"
tag 'meson'
filenames 'meson.build', 'meson_options.txt'
mimetypes 'text/x-meson'
def self.keywords
@keywords ||= %w(
continue break elif else endif
if true false foreach endforeach
)
end
def self.builtin_variables
@builtin_variables ||= %w(
meson host_machine build_machine target_machine
)
end
def self.builtin_functions
@builtin_functions ||= %w(
add_global_arguments add_project_arguments
add_global_link_arguments add_project_link_arguments add_test_setup add_languages
alias_target assert benchmark both_libraries build_target configuration_data configure_file
custom_target declare_dependency dependency disabler environment error executable
generator gettext get_option get_variable files find_library find_program
include_directories import install_data install_headers install_man install_subdir
is_disabler is_variable jar join_paths library message option project
run_target run_command set_variable subdir subdir_done
subproject summary shared_library shared_module static_library test vcs_tag warning
)
end
identifier = /[[:alpha:]_][[:alnum:]_]*/
def current_string
@current_string ||= StringRegister.new
end
state :root do
rule %r/\n+/m, Text
rule %r/[^\S\n]+/, Text
rule %r(#(.*)?\n?), Comment::Single
rule %r/[\[\]{}:(),;.]/, Punctuation
rule %r/\\\n/, Text
rule %r/\\/, Text
rule %r/(in|and|or|not)\b/, Operator::Word
rule %r/[-+\/*%=<>]=?|!=/, Operator
rule %r/([f]?)('''|['])/i do |m|
groups Str::Affix, Str
current_string.register type: m[1].downcase, delim: m[2]
push :generic_string
end
rule %r/(?<!\.)#{identifier}\b\s*(?=\()/ do |m|
if self.class.builtin_functions.include? m[0]
token Name::Builtin
else
token Name
end
end
rule %r/(?<!\.)#{identifier}(?!\s*?:)/ do |m|
if self.class.builtin_variables.include? m[0]
token Name::Builtin
elsif self.class.keywords.include? m[0]
token Keyword
else
token Name
end
end
rule identifier, Name
rule %r/0b(_?[0-1])+/i, Num::Bin
rule %r/0o(_?[0-7])+/i, Num::Oct
rule %r/0x(_?[a-f0-9])+/i, Num::Hex
rule %r/([1-9](_?[0-9])*|0(_?0)*)/, Num::Integer
end
state :generic_string do
rule %r/[^'\\\@]+/, Str
rule %r/'''|[']/ do |m|
token Str
if current_string.delim? m[0]
current_string.remove
pop!
end
end
rule %r/(?=\\)/, Str, :generic_escape
rule %r/\@/ do |m|
if current_string.type? "f"
token Str::Interpol
push :generic_interpol
else
token Str
end
end
end
state :generic_escape do
rule %r(\\
( [\\abfnrtv']
| N{[a-zA-Z][a-zA-Z ]+[a-zA-Z]}
| u[a-fA-F0-9]{4}
| U[a-fA-F0-9]{8}
| x[a-fA-F0-9]{2}
| [0-7]{1,3}
)
)x do
token(Str::Escape)
pop!
end
rule %r/\\./, Str, :pop!
end
state :generic_interpol do
rule %r/[^\@]+/ do |m|
recurse m[0]
end
rule %r/\@/, Str::Interpol, :pop!
end
class StringRegister < Array
def delim?(delim)
self.last[1] == delim
end
def register(type: "u", delim: "'")
self.push [type, delim]
end
def remove
self.pop
end
def type?(type)
self.last[0].include? type
end
end
private_constant :StringRegister
end
end
end