js_object.anubis 6.3 KB
/*
 * 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)).