flams_stex/quickparse/latex/
directives.rs1use flams_utils::{parsing::{ParseSource, StringOrStr}, sourcerefs::SourceRange};
2
3use crate::quickparse::stex::DiagnosticLevel;
4
5use super::{rules::{DynEnv, DynMacro}, AnyEnv, AnyMacro, Environment, EnvironmentResult, FromLaTeXToken, LaTeXParser, Macro, MacroResult, ParserState};
6
7#[allow(clippy::needless_pass_by_value)]
8pub fn verbcmd<'a,
9 Pa: ParseSource<'a>,
10 T: FromLaTeXToken<'a, Pa::Pos, Pa::Str>,
11 Err:FnMut(String,SourceRange<Pa::Pos>,DiagnosticLevel),
12 State: ParserState<'a,Pa,T,Err>
13>(parser: &mut LaTeXParser<'a,Pa,T,Err,State>,args:Pa::Str) {
14 if !args.as_ref().is_empty() {
15 parser.add_macro_rule(args.as_cow(), Some(AnyMacro::Ptr(super::rules::lstinline as _)));
16 }
17}
18
19#[allow(clippy::needless_pass_by_value)]
20pub fn verbenv<'a,
21 Pa: ParseSource<'a>,
22 T: FromLaTeXToken<'a, Pa::Pos, Pa::Str>,
23 Err:FnMut(String,SourceRange<Pa::Pos>,DiagnosticLevel),
24 State: ParserState<'a,Pa,T,Err>
25>(parser: &mut LaTeXParser<'a,Pa, T, Err, State>,args:Pa::Str) {
26 if !args.as_ref().is_empty() {
27 parser.add_environment_rule(args.as_cow(), Some(AnyEnv::Ptr((super::rules::general_listing_open as _, super::rules::general_listing_close as _))));
28 }
29}
30
31pub fn macro_dir<'a,
32 Pa: ParseSource<'a>,
33 T: FromLaTeXToken<'a, Pa::Pos, Pa::Str>,
34 Err:FnMut(String,SourceRange<Pa::Pos>,DiagnosticLevel),
35 State: ParserState<'a,Pa,T,Err>
36>(parser: &mut LaTeXParser<'a,Pa, T, Err, State>,args:Pa::Str) {
37 if !args.as_ref().is_empty() {
38 if let Some((m,_)) = args.as_ref().split_once(' ') {
39 let len = m.len();
40 let (m,mut spec) = args.split_n(len);
41 spec.trim_ws();
42 parser.add_macro_rule(m.as_cow(), Some(AnyMacro::Str(DynMacro {
43 ptr:do_macro_dir as _,
44 arg:spec
45 })));
46 }
47 }
48}
49
50fn do_macro_dir<'a,
51 Pa: ParseSource<'a>,
52 T: FromLaTeXToken<'a, Pa::Pos, Pa::Str>,
53 Err:FnMut(String,SourceRange<Pa::Pos>,DiagnosticLevel),
54 State: ParserState<'a,Pa,T,Err>
55>(arg:&Pa::Str,
56 mut m:Macro<'a, Pa::Pos, Pa::Str>,
57 parser: &mut LaTeXParser<'a,Pa, T, Err, State>
58) -> MacroResult<'a, Pa::Pos, Pa::Str, T> {
59 let arg = arg.as_ref();
60 do_spec(arg,&mut m,parser);
61 MacroResult::Simple(m)
62}
63
64#[inline]
65fn do_spec<'a,
66 Pa: ParseSource<'a>,
67 T: FromLaTeXToken<'a, Pa::Pos, Pa::Str>,
68 Err:FnMut(String,SourceRange<Pa::Pos>,DiagnosticLevel),
69 State: ParserState<'a,Pa,T,Err>
70>(spec:&str,
71 m:&mut Macro<'a, Pa::Pos, Pa::Str>,
72 parser: &mut LaTeXParser<'a,Pa, T, Err, State>
73) {
74 for c in spec.as_bytes() { match *c {
75 b'v' => parser.skip_arg(m),
76 _ => parser.tokenizer.problem(m.range.start, format!("Unknown arg spec {c}"),DiagnosticLevel::Error),
77 }}
78}
79
80pub fn env_dir<'a,
81 Pa: ParseSource<'a>,
82 T: FromLaTeXToken<'a, Pa::Pos, Pa::Str>,
83 Err:FnMut(String,SourceRange<Pa::Pos>,DiagnosticLevel),
84 State: ParserState<'a,Pa,T,Err>
85>(parser: &mut LaTeXParser<'a,Pa, T, Err, State>,args:Pa::Str) {
86 if !args.as_ref().is_empty() {
87 if let Some((m,_)) = args.as_ref().split_once(' ') {
88 let len = m.len();
89 let (m,mut spec) = args.split_n(len);
90 spec.trim_ws();
91 parser.add_environment_rule(m.as_cow(), Some(AnyEnv::Str(DynEnv {
92 open:do_env_dir as _,
93 close: do_env_dir_close as _,
94 arg:spec
95 })));
96 }
97 }
98}
99
100
101fn do_env_dir<'a,'b,'c,
102 Pa: ParseSource<'a>,
103 T: FromLaTeXToken<'a, Pa::Pos, Pa::Str>,
104 Err:FnMut(String,SourceRange<Pa::Pos>,DiagnosticLevel),
105 State: ParserState<'a,Pa,T,Err>
106>(arg:&Pa::Str,
107 e:&'b mut Environment<'a, Pa::Pos, Pa::Str, T>,
108 parser: &'c mut LaTeXParser<'a,Pa, T, Err, State>) {
109 let arg = arg.as_ref();
110 do_spec(arg, &mut e.begin, parser);
111}
112
113fn do_env_dir_close<'a,'b,
114 Pa: ParseSource<'a>,
115 T: FromLaTeXToken<'a, Pa::Pos, Pa::Str>,
116 Err:FnMut(String,SourceRange<Pa::Pos>,DiagnosticLevel),
117 State: ParserState<'a,Pa,T,Err>
118>(
119 e:Environment<'a, Pa::Pos, Pa::Str, T>,
120 _: &'b mut LaTeXParser<'a,Pa,T,Err,State>
121) -> EnvironmentResult<'a, Pa::Pos, Pa::Str, T> {
122 EnvironmentResult::Simple(e)
123}
124
125pub fn nolint<'a,
126 Pa: ParseSource<'a>,
127 T: FromLaTeXToken<'a, Pa::Pos, Pa::Str>,
128 Err:FnMut(String,SourceRange<Pa::Pos>,DiagnosticLevel),
129 State: ParserState<'a,Pa,T,Err>
130>(parser: &mut LaTeXParser<'a,Pa, T, Err, State>, _:Pa::Str) {
131 parser.tokenizer.reader.read_until_str("%%STEXIDE dolint");
132}
133
134#[inline]
135pub fn dolint<'a,
136 Pa: ParseSource<'a>,
137 T: FromLaTeXToken<'a, Pa::Pos, Pa::Str>,
138 Err:FnMut(String,SourceRange<Pa::Pos>,DiagnosticLevel),
139 State: ParserState<'a,Pa,T,Err>
140>(_: &mut LaTeXParser<'a,Pa, T, Err, State>, _:Pa::Str) {}