Skip to content

Commit ad51633

Browse files
committed
support customized key's name; add customized layout
1 parent 939c12d commit ad51633

3 files changed

Lines changed: 113 additions & 3 deletions

File tree

layouts/customized.tvkl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
:| < {"left"} [$3] | ^ {"up"} [$3] | > {"right"} [$3] | v {"down"} [$3] |-

src/lexer.rs

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ impl<'a> Lexer<'a> {
205205
fn collect_ident(&mut self) -> Token {
206206
let mut value = String::new();
207207
while let Some(&c) = self.src.peek() {
208-
if c.is_alphanumeric() || c == '_' || c == '-' || c == '?'{
208+
if c.is_alphanumeric() || c == '_' || c == '-' || c == '?' {
209209
value.push(c);
210210
self.src.next();
211211
} else {
@@ -462,4 +462,49 @@ mod tests {
462462

463463
assert_eq!(tokens, right_result);
464464
}
465+
466+
#[test]
467+
fn customized_name() {
468+
let input = ":| '^' {'up'} |-";
469+
470+
let mut lexer = Lexer::new(input);
471+
let tokens: Vec<Token> = lexer.tokenization();
472+
473+
let right_result = vec![
474+
Token {
475+
token_type: TokenType::LineHead,
476+
value: String::from(":"),
477+
},
478+
Token {
479+
token_type: TokenType::Split,
480+
value: String::from("|"),
481+
},
482+
Token {
483+
token_type: TokenType::Name,
484+
value: String::from("^"),
485+
},
486+
Token {
487+
token_type: TokenType::LBrace,
488+
value: String::from("{"),
489+
},
490+
Token {
491+
token_type: TokenType::Name,
492+
value: String::from("up"),
493+
},
494+
Token {
495+
token_type: TokenType::RBrace,
496+
value: String::from("}"),
497+
},
498+
Token {
499+
token_type: TokenType::Split,
500+
value: String::from("|"),
501+
},
502+
Token {
503+
token_type: TokenType::LineTail,
504+
value: String::from("-"),
505+
},
506+
];
507+
508+
assert_eq!(tokens, right_result);
509+
}
465510
}

src/parser.rs

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,14 +115,36 @@ impl Parser {
115115
let name_token = self.consume(TokenType::Name)?;
116116
let name_str = name_token.value.clone();
117117
let mut binds = vec![];
118-
binds.push((Arc::from(name_str.as_str()), get_rdev_key(&name_str)));
119118
let mut attr = Attr::default(&name_str);
120119

120+
let r_key = if self.peek()?.token_type == TokenType::LBrace {
121+
self.consume(TokenType::LBrace)?;
122+
let spec_token = self.consume(TokenType::Name)?;
123+
let spec_key = spec_token.value.clone();
124+
self.consume(TokenType::RBrace)?;
125+
spec_key
126+
} else {
127+
name_str.clone()
128+
};
129+
130+
binds.push((Arc::from(name_str.as_str()), get_rdev_key(&r_key)));
131+
121132
while self.peek()?.token_type == TokenType::Comma {
122133
self.consume(TokenType::Comma)?;
123134
let name_token = self.consume(TokenType::Name)?;
124135
let name_str = name_token.value.clone();
125-
binds.push((Arc::from(name_str.as_str()), get_rdev_key(&name_str)));
136+
137+
let r_key = if self.peek()?.token_type == TokenType::LBrace {
138+
self.consume(TokenType::LBrace)?;
139+
let spec_token = self.consume(TokenType::Name)?;
140+
let spec_key = spec_token.value.clone();
141+
self.consume(TokenType::RBrace)?;
142+
spec_key
143+
} else {
144+
name_str.clone()
145+
};
146+
147+
binds.push((Arc::from(name_str.as_str()), get_rdev_key(&r_key)));
126148
}
127149

128150
if self.peek()?.token_type == TokenType::LBracket {
@@ -689,4 +711,46 @@ mod tests {
689711
assert_eq!(button_2.binds[0].1, Some(Key::KeyB));
690712
assert_eq!(button_2.attr.width, 4);
691713
}
714+
715+
#[test]
716+
fn test_customized_name() {
717+
// Input sequence for: :| ^ {"up"} | -
718+
let tokens = vec![
719+
Token {
720+
token_type: TokenType::LineHead,
721+
value: ":".into(),
722+
},
723+
Token {
724+
token_type: TokenType::Split,
725+
value: "|".into(),
726+
},
727+
t_name("^"),
728+
Token {
729+
token_type: TokenType::LBrace,
730+
value: "{".into(),
731+
},
732+
t_name("up"),
733+
Token {
734+
token_type: TokenType::RBrace,
735+
value: "}".into(),
736+
},
737+
Token {
738+
token_type: TokenType::Split,
739+
value: "|".into(),
740+
},
741+
Token {
742+
token_type: TokenType::LineTail,
743+
value: "-".into(),
744+
},
745+
];
746+
747+
let mut parser = Parser::new(tokens);
748+
749+
let result = parser.parse(&mut Env::new()).unwrap();
750+
assert_eq!(result.layer.len(), 1);
751+
assert_eq!(
752+
result.layer[0][0].binds,
753+
[(Arc::from("^"), Some(Key::UpArrow)),]
754+
);
755+
}
692756
}

0 commit comments

Comments
 (0)