mirror of
https://github.com/rm-dr/daisy
synced 2025-07-05 01:59:30 -07:00
Added substitution config switch
This commit is contained in:
@ -21,8 +21,10 @@ pub fn parse(
|
||||
context: &Context, s: &String
|
||||
) -> Result<Expression, (LineLocation, DaisyError)> {
|
||||
|
||||
let expressions = stage::tokenize(context, s);
|
||||
let (_, expressions) = stage::find_subs(expressions);
|
||||
let mut expressions = stage::tokenize(context, s);
|
||||
if context.config.enable_substituion {
|
||||
(_, expressions) = stage::find_subs(expressions);
|
||||
}
|
||||
let g = stage::groupify(context, expressions)?;
|
||||
let g = stage::treeify(context, g)?;
|
||||
|
||||
@ -34,6 +36,7 @@ pub fn parse_no_context(s: &String) -> Result<Expression, (LineLocation, DaisyEr
|
||||
}
|
||||
|
||||
pub fn substitute(context: &Context, s: &String) -> String {
|
||||
if !context.config.enable_substituion { return s.clone(); }
|
||||
let (_, s) = substitute_cursor(context, s, s.chars().count());
|
||||
return s;
|
||||
}
|
||||
@ -43,34 +46,45 @@ pub fn substitute_cursor(
|
||||
s: &String, // The string to substitute
|
||||
c: usize // Location of the cursor right now
|
||||
) -> (
|
||||
usize, // Location of cursor in substituted string
|
||||
usize, // New cursor
|
||||
String // String with substitutions
|
||||
) {
|
||||
|
||||
if !context.config.enable_substituion { return (c, s.clone()); }
|
||||
if s == "" { return (c, s.clone()) }
|
||||
|
||||
|
||||
let mut new_s = s.clone();
|
||||
|
||||
let l = s.chars().count();
|
||||
let expressions = stage::tokenize(context, s);
|
||||
let (mut subs, _) = stage::find_subs(expressions);
|
||||
let mut new_c = l - c;
|
||||
let mut new_c = c.clone();
|
||||
|
||||
while subs.len() > 0 {
|
||||
let r = subs.pop_back().unwrap();
|
||||
// Apply substitutions in reverse order
|
||||
// r is the current substitution: (linelocation, string)
|
||||
let r = subs.pop_back().unwrap();
|
||||
|
||||
if { // Don't substitute if our cursor is inside the substitution
|
||||
c >= r.0.pos &&
|
||||
c < r.0.pos+r.0.len
|
||||
} { continue; }
|
||||
|
||||
if c < r.0.pos {
|
||||
let ct = r.1.chars().count();
|
||||
if ct >= r.0.len {
|
||||
if new_c >= ct - r.0.len {
|
||||
new_c += ct - r.0.len
|
||||
}
|
||||
} else {
|
||||
new_c -= r.0.len - ct
|
||||
// If this substitution is before our cursor,
|
||||
// we need to adjust our cursor's position.
|
||||
if c > r.0.pos {
|
||||
let c_o = r.0.len; // Old length
|
||||
let c_n = r.1.chars().count(); // New length
|
||||
|
||||
if c_n > c_o {
|
||||
// Move cursor right by difference
|
||||
new_c += c_n - c_o;
|
||||
|
||||
} else if c_n < c_o {
|
||||
// Move cursor left by difference
|
||||
if new_c >= c_o - c_n {
|
||||
new_c -= c_o - c_n;
|
||||
} else { new_c = 0; }
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user