1:- module(serializer, [
    2                       serialize/2      % +PL, -YAML
    3                      ]).

YAML serializer.

The serialized result is fully YAML compatible although not utilizing every feature of YAML spec.

author
- Hongxin Liang
license
- Apache License Version 2.0 */
 serialize(+PL, -YAML) is semidet
Serialize given Prolog term to YAML atom.
   17serialize(PL, YAML) :-
   18    serialize0('', PL, '', YAML).
   19
   20serialize0(LeadingSpaces, PL, YAML0, YAML) :-
   21    is_dict(PL), !,
   22    newline(YAML0, YAML1),
   23    dict_pairs(PL, _, Pairs),
   24    (   Pairs = []
   25    ->  atomic_list_concat([YAML0, '{}\n'], YAML)
   26    ;   serialize_pairs(LeadingSpaces, Pairs, YAML1, YAML)
   27    ).
   28
   29serialize0(LeadingSpaces, PL, YAML0, YAML) :-
   30    is_list(PL), !,
   31    newline(YAML0, YAML1),
   32    (   PL = []
   33    ->  atomic_list_concat([YAML0, '[]\n'], YAML)
   34    ;   serialize_list(LeadingSpaces, PL, YAML1, YAML)
   35    ).
   36
   37serialize0(_, PL, YAML0, YAML) :-
   38    once((number(PL); PL = true; PL = false)), !,
   39    atomic_list_concat([YAML0, PL, '\n'], YAML).
   40
   41serialize0(LeadingSpaces, PL, YAML0, YAML) :-
   42    atom(PL), !,
   43    atomic_list_concat(List, '\n', PL),
   44    (   List = [_]
   45    ->  atomic_list_concat([YAML0, PL, '\n'], YAML)
   46    ;   atom_concat(YAML0, '| ', YAML1),
   47        indent(LeadingSpaces, LeadingSpaces1),
   48        serialize_atom_with_line_separator(LeadingSpaces1, List, YAML1, YAML)
   49    ).
   50
   51serialize0(_, PL, YAML0, YAML) :-
   52    string(PL), !,
   53    atom_string(Atom, PL),
   54    atomic_list_concat([YAML0, '"', Atom, '"', '\n'], YAML).
   55
   56serialize0(_, PL, YAML0, YAML) :-
   57    compound(PL), !,
   58    format_time(atom(Atom), '%FT%T%z', PL), % iso_8601
   59    atomic_list_concat([YAML0, Atom, '\n'], YAML).
   60
   61serialize_pairs(_, [], YAML, YAML) :- !.
   62serialize_pairs(LeadingSpaces, [K-V|T], YAML0, YAML) :-
   63    atomic_list_concat([YAML0, LeadingSpaces, K, ': '], YAML1),
   64    indent(LeadingSpaces, LeadingSpaces1),
   65    serialize0(LeadingSpaces1, V, YAML1, YAML2),
   66    serialize_pairs(LeadingSpaces, T, YAML2, YAML).
   67
   68serialize_list(_, [], YAML, YAML) :- !.
   69serialize_list(LeadingSpaces, [H|T], YAML0, YAML) :-
   70    atomic_list_concat([YAML0, LeadingSpaces, '- '], YAML1),
   71    indent(LeadingSpaces, LeadingSpaces1),
   72    atom_concat(LeadingSpaces1, ' ', LeadingSpaces2),
   73    serialize0(LeadingSpaces2, H, YAML1, YAML2),
   74    serialize_list(LeadingSpaces, T, YAML2, YAML).
   75
   76serialize_atom_with_line_separator(LeadingSpaces, [H], YAML0, YAML) :- !,
   77    atomic_list_concat([YAML0, '\n', LeadingSpaces, H, '\n'], YAML).
   78
   79serialize_atom_with_line_separator(LeadingSpaces, [H|T], YAML0, YAML) :-
   80    atomic_list_concat([YAML0, '\n', LeadingSpaces, H], YAML1),
   81    serialize_atom_with_line_separator(LeadingSpaces, T, YAML1, YAML).
   82
   83newline(YAML0, YAML) :-
   84    atom_concat(YAML0, '\n', YAML).
   85
   86indent(LeadingSpaces0, LeadingSpaces) :-
   87    atom_concat(LeadingSpaces0, '  ', LeadingSpaces)