Skip to content

Instantly share code, notes, and snippets.

@asa-taka
Last active December 29, 2021 17:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save asa-taka/e757b2145fba61de97f30b447e99ead2 to your computer and use it in GitHub Desktop.
Save asa-taka/e757b2145fba61de97f30b447e99ead2 to your computer and use it in GitHub Desktop.
JSON.stringify for ExtendScript(ES3)
const jsonStringify = (() => {
const q = (s: string) => '"' + s + '"'
const sp = (indent: number, lv: number) => (indent ? '\n' : '') + Array(lv * indent + 1).join(' ')
const printObj = (lp: string, tokens: string[], rp: string, indent: number, lv: number) => {
if (!tokens.length) return lp + rp
return lp + sp(indent, lv + 1) + tokens.join(',' + sp(indent, lv + 1)) + sp(indent, lv) + rp
}
const stringify = (v: JsonValue, indent: number, lv: number, path: any[]): string => {
if (!(v instanceof Object)) return typeof v === 'string' ? q(v) : '' + v
for (let o of path) if (v === o) return q('[CIRCULAR]')
if (v instanceof Function) return q('[Function: ' + v.name + ']')
const sv: string[] = []
if (v instanceof Array) {
for (let e of v) sv.push(stringify(e, indent, lv + 1, path.concat([v])))
return printObj('[', sv, ']', indent, lv)
}
for (let k in v) sv.push(q(k) + ': ' + stringify(v[k], indent, lv + 1, path.concat([v])))
return printObj('{', sv, '}', indent, lv)
}
return (v: JsonValue, indent?: number) => stringify(v, indent || 0, 0, [])
})()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment