aboutsummaryrefslogtreecommitdiff
path: root/lua/lexers/troff.lua
diff options
context:
space:
mode:
authorMatěj Cepl <mcepl@cepl.eu>2023-08-11 01:27:32 +0200
committerRandy Palamar <randy@rnpnr.xyz>2024-03-27 06:04:21 -0600
commit4c4392d29df777ff702dfe99b4f3c23142976e05 (patch)
tree5355324abe18952f7d19d6cfc5dbeb5d6cb72b84 /lua/lexers/troff.lua
parent95bf9f59f8a9a37148bdc0787db378d62c7cd032 (diff)
downloadvis-4c4392d29df777ff702dfe99b4f3c23142976e05.tar.gz
vis-4c4392d29df777ff702dfe99b4f3c23142976e05.tar.xz
update lexers to orbitalquark/scintillua@b789dde
Rather than cherry pick patches from after 6.2 we will just grab everything as is.
Diffstat (limited to 'lua/lexers/troff.lua')
-rw-r--r--lua/lexers/troff.lua42
1 files changed, 42 insertions, 0 deletions
diff --git a/lua/lexers/troff.lua b/lua/lexers/troff.lua
new file mode 100644
index 0000000..b2d8e63
--- /dev/null
+++ b/lua/lexers/troff.lua
@@ -0,0 +1,42 @@
+-- Copyright 2023-2024 Mitchell. See LICENSE.
+-- troff/man LPeg lexer.
+-- Based on original Man lexer by David B. Lamkins and modified by Eolien55.
+
+local lexer = lexer
+local P, R, S = lpeg.P, lpeg.R, lpeg.S
+
+local lex = lexer.new(...)
+
+-- Registers and groff's structured programming.
+lex:add_rule('keywords', lex:tag(lexer.KEYWORD, (lexer.starts_line('.') * (lexer.space - '\n')^0 *
+ (P('while') + 'break' + 'continue' + 'nr' + 'rr' + 'rnn' + 'aln' + '\\}')) + '\\{'))
+
+-- Markup.
+lex:add_rule('escape_sequences', lex:tag(lexer.VARIABLE,
+ '\\' * (('s' * S('+-')^-1) + S('*fgmnYV'))^-1 * (P('(') * 2 + lexer.range('[', ']') + 1)))
+
+lex:add_rule('headings', lex:tag(lexer.NUMBER,
+ lexer.starts_line('.') * (lexer.space - '\n')^0 * (S('STN') * 'H') * (lexer.space - '\n') *
+ lexer.nonnewline^0))
+lex:add_rule('man_alignment', lex:tag(lexer.KEYWORD,
+ lexer.starts_line('.') * (lexer.space - '\n')^0 * (P('br') + 'DS' + 'RS' + 'RE' + 'PD' + 'PP') *
+ lexer.space))
+lex:add_rule('font', lex:tag(lexer.VARIABLE,
+ lexer.starts_line('.') * (lexer.space - '\n')^0 * ('B' * P('R')^-1 + 'I' * S('PR')^-1) *
+ lexer.space))
+
+-- Lowercase troff macros are plain macros (like .so or .nr).
+lex:add_rule('troff_plain_macros', lex:tag(lexer.VARIABLE, lexer.starts_line('.') *
+ (lexer.space - '\n')^0 * lexer.lower^1))
+lex:add_rule('any_macro', lex:tag(lexer.PREPROCESSOR,
+ lexer.starts_line('.') * (lexer.space - '\n')^0 * (lexer.any - lexer.space)^0))
+lex:add_rule('comment', lex:tag(lexer.COMMENT,
+ (lexer.starts_line('.\\"') + '\\"' + '\\#') * lexer.nonnewline^0))
+lex:add_rule('string', lex:tag(lexer.STRING, lexer.range('"', true)))
+
+-- Usually used by eqn, and mandoc in some way.
+lex:add_rule('in_dollars', lex:tag(lexer.EMBEDDED, lexer.range('$', false, false)))
+
+-- TODO: a lexer for each preprocessor?
+
+return lex