flams_stex/quickparse/latex/
directives.rs

1use 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) {}