diff --git a/web/js_object.anubis b/web/js_object.anubis new file mode 100644 index 0000000..2fa7c09 --- /dev/null +++ b/web/js_object.anubis @@ -0,0 +1,289 @@ +/* + * 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)). + -- libgit2 0.21.4