/* * Created by PyramIDE. * User: フランスのトトロ aka (David RENÉ) * Date: 02/10/2021 * Time: 23:53 * © David RENÉ */ read tools/basis.anubis read tools/printable_tree.anubis transmit web/mime.anubis transmit xlib/extensions/json.anubis public type JSMember:... public type JSValue: js_object(List(JSMember)), js_array(List(JSValue)), js_int(Int value), js_float(Float value, Int precision), js_string(String value), js_bool(Bool value), js_code(String code), js_undefined. public type JSMember: js_member(String name, JSValue value). public define Printable_tree _format_js ( JSValue js_object ). //public define Printable_tree // _format_js // ( // Library json_lib, // JsonValue json // ). //------------------------------- // helpers //public define JSValue // js_object // ( // List(JSMember) members // )= // js_object([js_member("obj_type", js_string(type_name)) . members]). public define JSMember js_member ( String name, List(JSMember) value, ) = js_member(name, js_object(value)). public define JSMember js_member ( String name, List(JSValue) value, ) = js_member(name, js_array(value)). public define JSMember js_member ( String name, Int value, ) = js_member(name, js_int(value)). public define JSMember js_member ( String name, Float value, Int precision, ) = js_member(name, js_float(value, precision)). public define JSMember js_member ( String name, String value, ) = js_member(name, js_string(value)). public define JSMember js_member ( String name, Bool value, ) = js_member(name, js_bool(value)). //public define JSMember // json_null // ( // String name, // ) = // js_member(name, json_null). public define JSValue to_js_array ( List(String) list_str )= js_array(map((String str) |-> js_string(str), list_str)) . //------------------------------------------- // Outputing Js to Printable_tree define List(Word8) _format_js_esc ( List(Word8) original, List(Word8) new_string, ) = if original is { [] then ['\'' . new_string], //add trailing quote [h . t] then if (h >=+ 32 & h +=< 33) | (h >=+ 35 & h +=< 91) | h >=+ 93 then // Allowed characters for JSON see RFC4627 + " ' " Why ' ??? _format_js_esc(t, [h . new_string]) else if h = '\n' then _format_js_esc(t, ['n', '\\' . new_string]) else if h = '\r' then _format_js_esc(t, ['r', '\\' . new_string]) else if h = '\t' then _format_js_esc(t, ['t', '\\' . new_string]) else if h = 0x08 then _format_js_esc(t, ['b', '\\' . new_string]) //Backspace else _format_js_esc(t, [h, '\\' . new_string]) }. public define String format_js_esc ( String original, ) = implode(reverse(_format_js_esc(explode(original), ['\''],))). public define Printable_tree format_js ( JSValue jsv ). public define Printable_tree to_javascript ( JSValue jsv ). public define Printable_tree format_js_member ( JSMember member ) = if member is js_member(name, value) then [ name, ":" . _format_js(value) ]. //public define Printable_tree // js_member_to_js // ( // JSMember member // ) = // if member is js_member(name, value) then // [ "\"", name, "\":" . to_javascript(value) ]. define Printable_tree format_js_object ( List(JSMember) members ) = if members is { [] then [], [h . t] then [ format_js_member(h), (if t is [] then "" else ",") . format_js_object(t) ] }. //define Printable_tree // js_object_to_js // ( // List(JsonMember) members // ) = // if members is // { // [] then [], // [h . t] then [ json_member_to_js(h), (if t is [] then "" else ",") . json_object_to_js(t) ] // }. define Printable_tree format_js_array ( List(JSValue) values ) = if values is { [] then [], [h . t] then [ _format_js(h), (if t is [] then "" else ",") . format_js_array(t) ] }. //public define Printable_tree // _format_json // ( // Library json_lib, // JsonValue json // ) = // if json is // { // json_object(members) then [ "{", format_json_object(json_lib, members), "}" . [] ], // json_array(values) then [ "[", format_json_array(json_lib, values), "]" . [] ], // json_int(i) then int_pt(i, []), // json_float(f, p) then str_pt(float_to_string(f, p), []), // json_string(s) then if s ="" then str_pt("\"\"", []) else str_pt(to_JSON_String(json_lib, s), []), // json_bool(b) then str_pt(if b then "true" else "false", []), // json_null then str_pt("null", []) // }. public define Printable_tree _format_js ( JSValue jsv ) = if jsv is { js_object(members) then [ "{", format_js_object(members), "}" . [] ], js_array(values) then [ "[", format_js_array(values), "]" . [] ], js_int(i) then int_pt(i, []), js_float(f, p) then str_pt(float_to_string(f, p), []), js_string(s) then if s ="" then str_pt("''", []) else str_pt(format_js_esc(s), []), js_bool(b) then str_pt(if b then "true" else "false", []), js_code(c) then str_pt(c, []), js_undefined then str_pt("undefined", []) }. //public define Printable_tree // format_js // ( // JSValue json // ) = // //try to use adl version of json escape string // if load_library("json") is // { // error(err) then // println("load lib error:"); // println("--> can't load extension lib. Hence use anubis version"); // _format_json(json) // ok(json_lib) then // _format_json(json_lib, json), //// with start = unow, //// result = _format_json(json_lib, json), //// println(show_duration_string("format_json with extension ",start)); //// result // }. //public define String // to_JS_String // ( // String str // ) = // //try to use adl version of json escape string // if load_library("json") is // { // error(err) then // println("load lib error:"); // println("--> can't load extension lib. Hence use anubis version"); // format_json_esc(str) // ok(json_lib) then // to_JSON_String(json_lib, str) // }. public define String format_js ( JSValue jsv ) = to_String(_format_js(jsv)).