| ... | ... | @@ -369,7 +369,15 @@ fn parse_class_name_shorthand<'a>( |
| 369 | 369 | Some(b' ' | b'\n' | b'\t' | b'\r' | b'.' | b'#' | b'>' | b'<' | b'(' | b'|') | None => { |
| 370 | 370 | break |
| 371 | 371 | } |
| 372 | | Some(b'$') => todo!(), |
| 372 | Some(b'$') => { |
| 373 | if l.peek_rest().starts_with("${") { |
| 374 | l.advance(2); |
| 375 | parse_expr(l)?; |
| 376 | l.expect("}")?; |
| 377 | } else { |
| 378 | l.offset += 1; |
| 379 | } |
| 380 | } |
| 373 | 381 | _ => l.offset += 1, |
| 374 | 382 | } |
| 375 | 383 | } |
| ... | ... | @@ -1285,10 +1293,51 @@ mod tests { |
| 1285 | 1293 | } |
| 1286 | 1294 | |
| 1287 | 1295 | #[test] |
| 1288 | | #[ignore = "NOT IMPLEMENTED: Dynamic class/id with $ interpolation hits todo!()"] |
| 1289 | 1296 | fn test_shorthand_dynamic_class() { |
| 1290 | 1297 | let result = parse_open("<div.color-${iconName}/>"); |
| 1291 | 1298 | assert!(result.is_ok()); |
| 1299 | let open = result.unwrap(); |
| 1300 | assert_eq!(open.content, "<div.color-${iconName}/>"); |
| 1301 | } |
| 1302 | |
| 1303 | #[test] |
| 1304 | fn test_shorthand_dynamic_id() { |
| 1305 | let result = parse_open("<div#${myId}>"); |
| 1306 | assert!(result.is_ok()); |
| 1307 | let open = result.unwrap(); |
| 1308 | assert_eq!(open.content, "<div#${myId}>"); |
| 1309 | } |
| 1310 | |
| 1311 | #[test] |
| 1312 | fn test_shorthand_dynamic_mixed() { |
| 1313 | let result = parse_open("<button.variant-${meow}#${id}>"); |
| 1314 | assert!(result.is_ok()); |
| 1315 | let open = result.unwrap(); |
| 1316 | assert_eq!(open.content, "<button.variant-${meow}#${id}>"); |
| 1317 | } |
| 1318 | |
| 1319 | #[test] |
| 1320 | fn test_shorthand_dynamic_multiple_classes() { |
| 1321 | let result = parse_open("<div.class1.${dynamic}.class3>"); |
| 1322 | assert!(result.is_ok()); |
| 1323 | let open = result.unwrap(); |
| 1324 | assert_eq!(open.content, "<div.class1.${dynamic}.class3>"); |
| 1325 | } |
| 1326 | |
| 1327 | #[test] |
| 1328 | fn test_shorthand_template_expression() { |
| 1329 | let result = parse_open("<div.class-${a + b}>"); |
| 1330 | assert!(result.is_ok()); |
| 1331 | let open = result.unwrap(); |
| 1332 | assert_eq!(open.content, "<div.class-${a + b}>"); |
| 1333 | } |
| 1334 | |
| 1335 | #[test] |
| 1336 | fn test_shorthand_template_with_dollar() { |
| 1337 | let result = parse_open("<div.class-$value>"); |
| 1338 | assert!(result.is_ok()); |
| 1339 | let open = result.unwrap(); |
| 1340 | assert_eq!(open.content, "<div.class-$value>"); |
| 1292 | 1341 | } |
| 1293 | 1342 | |
| 1294 | 1343 | #[test] |