1063: name the companion properties of text animators (Track Type, Skew Axis, X / Y Rotation)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RDvxCS8xcR28VArjzn1x7U
This commit is contained in:
Claude
2026-10-29 11:22:49 +00:00
parent 55761e226f
commit 942b478472
2 changed files with 47 additions and 1 deletions
+24 -1
View File
@@ -118,6 +118,16 @@ pub const TEXT_ANIMATOR_PROPERTIES: &[(&str, &str)] = &[
("blur", "ADBE Text Blur"),
];
/// Companion properties that exist below an animator but are not kinds `addProperty` accepts:
/// they come with Tracking (Track Type), Skew (Skew Axis) and per-character 3D Rotation
/// (X and Y Rotation). Lookup and `.matchName` know them; `addProperty` does not.
pub const TEXT_ANIMATOR_COMPANIONS: &[(&str, &str)] = &[
("trackingType", "ADBE Text Track Type"),
("skewAxis", "ADBE Text Skew Axis"),
("rotationX", "ADBE Text Rotation X"),
("rotationY", "ADBE Text Rotation Y"),
];
const TEXT_SELECTORS: &[(&str, &str)] =
&[("rangeSelector", "ADBE Text Selector"), ("wigglySelector", "ADBE Text Wiggly Selector"), ("expressionSelector", "ADBE Text Expressible Selector")];
@@ -516,7 +526,7 @@ pub fn node(chain: &[&Node]) -> String {
"text" if pid == "selectors" => find(TEXT_SELECTORS, id).map(str::to_string).unwrap_or_else(own),
"text" if pid == "rangeSelector" => find(TEXT_RANGE_SELECTOR, id).map(str::to_string).unwrap_or_else(own),
"text" if pid == "properties" && chain.len() == 5 && chain.get(1).is_some_and(|n| n.match_id() == "animators") => {
find(TEXT_ANIMATOR_PROPERTIES, id).map(str::to_string).unwrap_or_else(own)
find(TEXT_ANIMATOR_PROPERTIES, id).or_else(|| find(TEXT_ANIMATOR_COMPANIONS, id)).map(str::to_string).unwrap_or_else(own)
}
"text" if grand.map(|g| g.match_id()) == Some("animators") => find(TEXT_ANIMATOR, id).map(str::to_string).unwrap_or_else(own),
"cameraOptions" => find(CAMERA, id).map(str::to_string).unwrap_or_else(own),
@@ -579,6 +589,19 @@ mod tests {
}
}
/// #1063: the companions an animator property brings (Track Type, Skew Axis, X / Y Rotation)
/// have their After Effects names too, though `addProperty` does not accept them.
#[test]
fn text_animator_companions_have_after_effects_names() {
let n = |m: &str| Node::from(effectcraft_project::PropGroup::new(1, m, m));
let (text, animators, animator, properties) = (n("text"), n("animators"), n("animator"), n("properties"));
for (id, name) in TEXT_ANIMATOR_COMPANIONS {
let prop = n(id);
assert_eq!(node(&[&text, &animators, &animator, &properties, &prop]), *name);
assert!(!TEXT_ANIMATOR_PROPERTIES.iter().any(|(k, m)| k == id || m == name), "{id} is not an addProperty kind");
}
}
#[test]
fn text_range_selector_names() {
let n = |m: &str| Node::from(effectcraft_project::PropGroup::new(1, m, m));
+23
View File
@@ -1740,6 +1740,29 @@ fn scripted_text_animator_property_is_the_one_asked_for() {
assert_eq!(o.result, json!(["Tracking Amount", 20, "Tracking Amount", "ADBE Text Tracking Amount", 2]));
}
/// The companion properties added with Tracking and Skew are found by their After Effects names,
/// but cannot be added on their own (#1063).
#[test]
fn text_animator_companion_properties_resolve_by_name() {
let mut s = session();
let o = ok(
&mut s,
r#"
var c = app.project.items.addComp("Track", 960, 300, 1, 3, 30);
var t = c.layers.addText("MOVARA");
var props = t.property("ADBE Text Properties").property("ADBE Text Animators").addProperty("ADBE Text Animator").property("ADBE Text Animator Properties");
props.addProperty("ADBE Text Tracking Amount");
props.addProperty("ADBE Text Skew");
var type = props.property("ADBE Text Track Type");
var axis = props.property("ADBE Text Skew Axis");
var added = "";
try { props.addProperty("ADBE Text Track Type"); added = "added"; } catch (e) { added = "refused"; }
[type ? type.matchName : null, axis ? axis.matchName : null, added]
"#,
);
assert_eq!(o.result, json!(["ADBE Text Track Type", "ADBE Text Skew Axis", "refused"]));
}
/// #1936: an array whose length doesn't match the property's dimension is an error in After
/// Effects, not a value to truncate or broadcast. Two values for a 3-D property stay legal.
#[test]