Files
news.gitea.happylizard.me/bin/gems/rouge-4.7.0/lib/rouge/lexers/terraform.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

122 lines
2.7 KiB
Ruby

# -*- coding: utf-8 -*- #
# frozen_string_literal: true
module Rouge
module Lexers
load_lexer 'hcl.rb'
class Terraform < Hcl
title "Terraform"
desc "Terraform HCL Interpolations"
tag 'terraform'
aliases 'tf'
filenames '*.tf', '*.tfvars', '*.tofu'
def self.keywords
@keywords ||= Set.new %w(
terraform module provider variable resource data provisioner output
)
end
def self.declarations
@declarations ||= Set.new %w(
var local
)
end
def self.reserved
@reserved ||= Set.new %w()
end
def self.constants
@constants ||= Set.new %w(true false null)
end
def self.builtins
@builtins ||= %w()
end
state :strings do
rule %r/\\./, Str::Escape
rule %r/(\$[\$]+|%[%]+)(\{)/, Str
rule %r/\$\{/ do
token Punctuation
push :interpolation
end
end
state :dq do
rule %r/[^\\"\$]+/, Str::Double
mixin :strings
rule %r/"/, Str::Double, :pop!
end
state :sq do
rule %r/[^\\'\$]+/, Str::Single
mixin :strings
rule %r/'/, Str::Single, :pop!
end
state :heredoc do
rule %r/\n/, Str::Heredoc, :heredoc_nl
rule %r/[^$\n]+/, Str::Heredoc
rule %r/[$]/, Str::Heredoc
mixin :strings
end
state :interpolation do
rule %r/\}/ do
token Punctuation
pop!
end
mixin :expression
end
state :regexps do
rule %r/"\// do
token Str::Delimiter
goto :regexp_inner
end
end
state :regexp_inner do
rule %r/[^"\/\\]+/, Str::Regex
rule %r/\\./, Str::Regex
rule %r/\/"/, Str::Delimiter, :pop!
rule %r/["\/]/, Str::Regex
end
id = /[$a-z_\-][a-z0-9_\-]*/io
state :expression do
mixin :regexps
mixin :primitives
rule %r/\s+/, Text
rule %r(\+\+ | -- | ~ | && | \|\| | \\(?=\n) | << | >>>? | == | != )x, Operator
rule %r([-<>+*%&|\^/!=?:]=?), Operator
rule %r/[(\[,]/, Punctuation
rule %r/[)\].]/, Punctuation
rule id do |m|
if self.class.keywords.include? m[0]
token Keyword
elsif self.class.declarations.include? m[0]
token Keyword::Declaration
elsif self.class.reserved.include? m[0]
token Keyword::Reserved
elsif self.class.constants.include? m[0]
token Keyword::Constant
elsif self.class.builtins.include? m[0]
token Name::Builtin
else
token Name::Other
end
end
end
end
end
end