| ... | @@ -369,7 +369,15 @@ fn parse_class_name_shorthand<'a>( | ... | @@ -369,7 +369,15 @@ fn parse_class_name_shorthand<'a>( |
| 369 | Some(b' ' | b'\n' | b'\t' | b'\r' | b'.' | b'#' | b'>' | b'<' | b'(' | b'|') | None => { | 369 | Some(b' ' | b'\n' | b'\t' | b'\r' | b'.' | b'#' | b'>' | b'<' | b'(' | b'|') | None => { |
| 370 | break | 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 | _ => l.offset += 1, | 381 | _ => l.offset += 1, |
| 374 | } | 382 | } |
| 375 | } | 383 | } |
| ... | @@ -1285,10 +1293,51 @@ mod tests { | ... | @@ -1285,10 +1293,51 @@ mod tests { |
| 1285 | } | 1293 | } |
| 1286 | | 1294 | |
| 1287 | #[test] | 1295 | #[test] |
| 1288 | #[ignore = "NOT IMPLEMENTED: Dynamic class/id with $ interpolation hits todo!()"] | | |
| 1289 | fn test_shorthand_dynamic_class() { | 1296 | fn test_shorthand_dynamic_class() { |
| 1290 | let result = parse_open("<div.color-${iconName}/>"); | 1297 | let result = parse_open("<div.color-${iconName}/>"); |
| 1291 | assert!(result.is_ok()); | 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 | #[test] | 1343 | #[test] |