minor api change and refactoring of pretty_printer.erl
This commit is contained in:
parent
6662a1ee98
commit
5d014bbef8
6 changed files with 58 additions and 43 deletions
|
@ -6,10 +6,14 @@
|
|||
indent = 4
|
||||
}).
|
||||
|
||||
|
||||
print(JSON, Opts) ->
|
||||
Init = init(parse_opts(Opts, #opts{})),
|
||||
{{pretty_printer, Result}, _} = (jsx:decoder({pretty_printer, Init}, []))(JSON),
|
||||
Result.
|
||||
{{_, Result}, Rest} = (jsx:decoder({{pretty_printer, jsx_event}, Init}, []))(JSON),
|
||||
case jsx:tail_clean(Rest) of
|
||||
true -> Result
|
||||
; _ -> exit(badarg)
|
||||
end.
|
||||
|
||||
parse_opts([{indent, Val}|Rest], Opts) ->
|
||||
parse_opts(Rest, Opts#opts{indent = Val});
|
||||
|
@ -17,48 +21,58 @@ parse_opts([], Opts) ->
|
|||
Opts.
|
||||
|
||||
init(Opts) ->
|
||||
{[], Opts#opts.indent, 0, false}.
|
||||
{[], Opts#opts.indent, 0, new}.
|
||||
|
||||
|
||||
|
||||
jsx_event(start_object, {Acc, Indent, Level, value}) ->
|
||||
{Acc ++ "\n" ++ indent(Indent, Level) ++ "{", Indent, Level + 1, new};
|
||||
jsx_event(start_object, {Acc, Indent, Level, _}) ->
|
||||
{Acc ++ "{", Indent, Level + 1, false};
|
||||
{Acc ++ "{", Indent, Level + 1, new};
|
||||
|
||||
jsx_event(start_array, {Acc, Indent, Level, value}) ->
|
||||
{Acc ++ "\n" ++ indent(Indent, Level) ++ "[", Indent, Level + 1, new};
|
||||
jsx_event(start_array, {Acc, Indent, Level, _}) ->
|
||||
{Acc ++ "[", Indent, Level + 1, false};
|
||||
{Acc ++ "[", Indent, Level + 1, new};
|
||||
|
||||
jsx_event({key, Key}, {Acc, Indent, Level, true}) ->
|
||||
{Acc ++ ",\n" ++ indent(Indent, Level) ++ "\"" ++ Key ++ "\": ", Indent, Level, false};
|
||||
jsx_event({key, Key}, {Acc, Indent, Level, false}) ->
|
||||
{Acc ++ "\n" ++ indent(Indent, Level) ++ "\"" ++ Key ++ "\": ", Indent, Level, false};
|
||||
|
||||
jsx_event({number, Number}, {Acc, Indent, Level, true}) ->
|
||||
{Acc ++ ",\n" ++ indent(Indent, Level) ++ Number, Indent, Level, true};
|
||||
jsx_event({number, Number}, {Acc, Indent, Level, false}) ->
|
||||
{Acc ++ "\n" ++ indent(Indent, Level) ++ Number, Indent, Level, true};
|
||||
jsx_event(end_object, {Acc, Indent, Level, value}) ->
|
||||
{Acc ++ "\n" ++ indent(Indent, Level - 1) ++ "}", Indent, Level - 1, value};
|
||||
jsx_event(end_object, {Acc, Indent, Level, new}) ->
|
||||
{Acc ++ "}", Indent, Level - 1, value};
|
||||
|
||||
jsx_event({string, String}, {Acc, Indent, Level, true}) ->
|
||||
{Acc ++ ",\n" ++ indent(Indent, Level) ++ "\"" ++ String ++ "\"", Indent, Level, true};
|
||||
jsx_event({string, String}, {Acc, Indent, Level, false}) ->
|
||||
{Acc ++ "\n" ++ indent(Indent, Level) ++ "\"" ++ String ++ "\"", Indent, Level, true};
|
||||
|
||||
jsx_event({literal, Literal}, {Acc, Indent, Level, true}) ->
|
||||
{Acc ++ ",\n" ++ indent(Indent, Level) ++ atom_to_list(Literal), Indent, Level, true};
|
||||
jsx_event({literal, Literal}, {Acc, Indent, Level, false}) ->
|
||||
{Acc ++ "\n" ++ indent(Indent, Level) ++ atom_to_list(Literal), Indent, Level, true};
|
||||
jsx_event(end_array, {Acc, Indent, Level, value}) ->
|
||||
{Acc ++ "\n" ++ indent(Indent, Level - 1) ++ "]", Indent, Level - 1, value};
|
||||
jsx_event(end_array, {Acc, Indent, Level, new}) ->
|
||||
{Acc ++ "]", Indent, Level - 1, value};
|
||||
|
||||
|
||||
jsx_event({key, Key}, {Acc, Indent, Level, value}) ->
|
||||
{Acc ++ ",\n" ++ indent(Indent, Level) ++ "\"" ++ Key ++ "\": ", Indent, Level, key};
|
||||
jsx_event({key, Key}, {Acc, Indent, Level, _}) ->
|
||||
{Acc ++ "\n" ++ indent(Indent, Level) ++ "\"" ++ Key ++ "\": ", Indent, Level, key};
|
||||
|
||||
|
||||
jsx_event({Type, Value}, {Acc, Indent, Level, value}) ->
|
||||
{Acc ++ ",\n" ++ indent(Indent, Level) ++ format(Type, Value), Indent, Level, value};
|
||||
jsx_event({Type, Value}, {Acc, Indent, Level, new}) ->
|
||||
{Acc ++ "\n" ++ indent(Indent, Level) ++ format(Type, Value), Indent, Level, value};
|
||||
jsx_event({Type, Value}, {Acc, Indent, Level, key}) ->
|
||||
{Acc ++ format(Type, Value), Indent, Level, value};
|
||||
|
||||
|
||||
jsx_event(end_object, {Acc, Indent, Level, true}) ->
|
||||
{Acc ++ "\n" ++ indent(Indent, Level - 1) ++ "}", Indent, Level - 1, true};
|
||||
jsx_event(end_object, {Acc, Indent, Level, false}) ->
|
||||
{Acc ++ "}", Indent, Level - 1, true};
|
||||
|
||||
jsx_event(end_array, {Acc, Indent, Level, true}) ->
|
||||
{Acc ++ "\n" ++ indent(Indent, Level - 1) ++ "]", Indent, Level - 1, true};
|
||||
jsx_event(end_array, {Acc, Indent, Level, false}) ->
|
||||
{Acc ++ "]", Indent, Level - 1, true};
|
||||
|
||||
jsx_event(eof, {Acc, _, _, _}) ->
|
||||
Acc.
|
||||
|
||||
|
||||
format(number, Number) ->
|
||||
Number;
|
||||
format(string, String) ->
|
||||
"\"" ++ String ++ "\"";
|
||||
format(literal, Literal) ->
|
||||
erlang:atom_to_list(Literal).
|
||||
|
||||
|
||||
indent(Indent, Level) ->
|
||||
[ 16#20 || _ <- lists:seq(1, Indent * Level) ].
|
||||
|
14
src/jsx.erl
14
src/jsx.erl
|
@ -1,11 +1,9 @@
|
|||
-module(jsx).
|
||||
|
||||
-export([decoder/0, decoder/2, decode/3]).
|
||||
-export([decoder/0, decoder/2, tail_clean/1]).
|
||||
|
||||
-include("jsx_common.hrl").
|
||||
|
||||
decode(JSON, Callbacks, Opts) ->
|
||||
(decoder(Callbacks, Opts))(JSON).
|
||||
|
||||
decoder() ->
|
||||
decoder(none, []).
|
||||
|
@ -43,8 +41,14 @@ parse_opts([{explicit_termination, Value}|Rest], Opts) ->
|
|||
|
||||
init_callbacks(none) ->
|
||||
{none, []};
|
||||
init_callbacks({M, S}) when is_atom(M) ->
|
||||
{M, S};
|
||||
init_callbacks({{M, F}, S}) when is_atom(M), is_atom(F) ->
|
||||
{{M, F}, S};
|
||||
init_callbacks({F, S}) when is_function(F) ->
|
||||
{F, S}.
|
||||
|
||||
tail_clean(<<X/utf8, Rest/binary>>) when ?is_whitespace(X) ->
|
||||
tail_clean(Rest);
|
||||
tail_clean(<<>>) ->
|
||||
true;
|
||||
tail_clean(_) ->
|
||||
false.
|
||||
|
|
|
@ -433,8 +433,8 @@ callback(eof, {none, Callbacks}) ->
|
|||
lists:reverse(Callbacks);
|
||||
callback(Event, {none, Callbacks}) ->
|
||||
{none, [Event] ++ Callbacks};
|
||||
callback(Event, {Mod, State}) when is_atom(Mod) ->
|
||||
{Mod, Mod:jsx_event(Event, State)};
|
||||
callback(Event, {{Mod, Function}, State}) when is_atom(Mod) ->
|
||||
{{Mod, Function}, Mod:Function(Event, State)};
|
||||
callback(Event, {F, State}) when is_function(F) ->
|
||||
{F, F(Event, State)}.
|
||||
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
[ "arabic letter alef: ", "\u0627" ]
|
|
@ -1,2 +0,0 @@
|
|||
[start_array, {string, "arabic letter alef: "}, {string, [16#0627]}, end_array].
|
||||
[{escaped_unicode, codepoint}].
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
test(Dir) ->
|
||||
Tests = gen_tests(Dir),
|
||||
eunit:test(Tests).
|
||||
eunit:test(Tests, [verbose]).
|
||||
|
||||
gen_tests(Dir) ->
|
||||
TestSpecs = filelib:wildcard("*.test", Dir),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue