mirror of
https://github.com/storytold/effectcraft.git
synced 2026-10-24 10:09:32 -06:00
Merge pull request #849 from Ni-zav/fix/840-extendscript-substr-20261011
fix(script): implement ExtendScript String.substr compatibility # Conflicts: # crates/script/src/tests.rs
This commit is contained in:
@@ -27,6 +27,25 @@ function __str(v) {
|
||||
return String(v);
|
||||
}
|
||||
|
||||
// ExtendScript includes the ES3 String.substr(start, length) method, which Boa
|
||||
// does not currently provide. Follow its legacy length (not end-index) semantics.
|
||||
if (typeof String.prototype.substr !== "function") {
|
||||
Object.defineProperty(String.prototype, "substr", {
|
||||
value: function (start, length) {
|
||||
if (this === null || this === undefined) throw new TypeError("String.substr called on null or undefined");
|
||||
var text = String(this), n = text.length;
|
||||
var from = Number(start);
|
||||
if (isNaN(from)) from = 0;
|
||||
// ToIntegerOrInfinity, then clamp positive or negative offsets.
|
||||
from = from < 0 ? Math.max(n + Math.ceil(from), 0) : Math.min(Math.floor(from), n);
|
||||
var count = length === undefined ? n - from : Number(length);
|
||||
if (isNaN(count) || count <= 0) return "";
|
||||
return text.slice(from, from + count);
|
||||
},
|
||||
writable: true, configurable: true
|
||||
});
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------ enums
|
||||
|
||||
function __enum(name, keys, base) {
|
||||
|
||||
@@ -879,3 +879,25 @@ fn script_av_layer_transform_shortcuts_return_live_properties() {
|
||||
let restored = ok(&mut s, "app.project.item(1).layer(1).rotation.numKeys");
|
||||
assert_eq!(restored.result, json!(0));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn extendscript_substr_keeps_start_and_length_semantics() {
|
||||
let mut s = session();
|
||||
let o = ok(
|
||||
&mut s,
|
||||
r#"[
|
||||
"abcdef".substr(0, 2),
|
||||
"abcdef".substr(2, 3),
|
||||
"abcdef".substr(-2),
|
||||
"abcdef".substr(-20, 2),
|
||||
"abcdef".substr(2, 0),
|
||||
"abcdef".substr(2, -3),
|
||||
"abcdef".substr(2.9, 2.9),
|
||||
"abcdef".substr(3),
|
||||
"abcdef".substr(30, 2),
|
||||
"abcdef".substr(NaN, 2),
|
||||
"abcdef".substr(2, NaN)
|
||||
]"#,
|
||||
);
|
||||
assert_eq!(o.result, json!(["ab", "cde", "ef", "ab", "", "", "cd", "def", "", "ab", ""]));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user