From 31f07d2adf6f8b041dec8f7f7947cc47ac7b4343 Mon Sep 17 00:00:00 2001
From: Qianqian Fang <fangq@nmr.mgh.harvard.edu>
Date: Tue, 18 Nov 2014 20:53:31 +0000
Subject: [PATCH] jsonlab compact output polish

git-svn-id: http://svn.code.sf.net/p/iso2mesh/code/trunk/jsonlab@450 786e58fb-9377-0410-9ff7-e4ac0ac0635c
---
 ChangeLog.txt               |  5 +++
 README.txt                  |  2 +-
 examples/jsonlab_selftest.m |  6 +--
 savejson.m                  | 74 ++++++++++++++++++-------------------
 4 files changed, 45 insertions(+), 42 deletions(-)

diff --git a/ChangeLog.txt b/ChangeLog.txt
index 2c6290d..cf7f8f8 100644
--- a/ChangeLog.txt
+++ b/ChangeLog.txt
@@ -6,6 +6,11 @@
 
 JSONlab ChangeLog (key features marked by *):
 
+== JSONlab 1.0.0-RC2 (codename: Optimus - RC2), FangQ <fangq (at) nmr.mgh.harvard.edu> ==
+
+ 2014/11/17 add Compact option in savejson to output compact JSON format
+ 2014/11/17 add FastArrayParser in loadjson to specify fast parser applicable levels
+
 == JSONlab 1.0.0-RC1 (codename: Optimus - RC1), FangQ <fangq (at) nmr.mgh.harvard.edu> ==
 
  2014/09/17  fix several compatibility issues when running on octave versions 3.2-3.8
diff --git a/README.txt b/README.txt
index 0085019..63e001e 100644
--- a/README.txt
+++ b/README.txt
@@ -5,7 +5,7 @@
 
 *Copyright (c) 2011-2014  Qianqian Fang <fangq at nmr.mgh.harvard.edu>
 *License: BSD or GNU General Public License version 3 (GPL v3), see License*.txt
-*Version: 1.0.0-RC1 (Optimus - RC1)
+*Version: 1.0.0-RC1 (Optimus - RC2)
 
 -------------------------------------------------------------------------------
 
diff --git a/examples/jsonlab_selftest.m b/examples/jsonlab_selftest.m
index ab2c038..27aee24 100644
--- a/examples/jsonlab_selftest.m
+++ b/examples/jsonlab_selftest.m
@@ -8,6 +8,7 @@ for i=1:4
     fprintf(1,'===============================================\n>> %s\n',fname);
     json=savejson('data',loadjson(fname));
     fprintf(1,'%s\n',json);
+    fprintf(1,'%s\n',savejson('data',loadjson(fname),'Compact',1));
     data=loadjson(json);
     savejson('data',data,'selftest.json');
     data=loadjson('selftest.json');
@@ -19,9 +20,8 @@ for i=1:4
     fprintf(1,'===============================================\n>> %s\n',fname);
     json=saveubjson('data',loadjson(fname));
     fprintf(1,'%s\n',json);
-    data=loadubjson(json)
-    savejson('',data)
-i
+    data=loadubjson(json);
+    savejson('',data);
     saveubjson('data',data,'selftest.ubj');
     data=loadubjson('selftest.ubj');
 end
diff --git a/savejson.m b/savejson.m
index eafafca..54bcaed 100644
--- a/savejson.m
+++ b/savejson.m
@@ -109,11 +109,17 @@ end
 if((isstruct(obj) || iscell(obj))&& isempty(rootname) && forceroot)
     rootname='root';
 end
-nl=sprintf('\n');
+
+whitespaces=struct('tab',sprintf('\t'),'newline',sprintf('\n'),'sep',sprintf(',\n'));
 if(jsonopt('Compact',0,opt)==1)
-    nl='';
+    whitespaces=struct('tab','','newline','','sep',',');
+end
+if(~isfield(opt,'whitespaces_'))
+    opt.whitespaces_=whitespaces;
 end
 
+nl=whitespaces.newline;
+
 json=obj2json(rootname,obj,rootlevel,opt);
 if(rootisarray)
     json=sprintf('%s%s',json,nl);
@@ -164,12 +170,10 @@ if(ndims(squeeze(item))>2) % for 3D or higher dimensions, flatten to 2D for now
     dim=size(item);
 end
 len=numel(item);
-padding0=repmat(sprintf('\t'),1,level);
-padding2=repmat(sprintf('\t'),1,level+1);
-nl=sprintf('\n');
-if(jsonopt('Compact',0,varargin{:})==1)
-    padding0='';padding2='';nl='';
-end
+ws=jsonopt('whitespaces_',struct('tab',sprintf('\t'),'newline',sprintf('\n'),'sep',sprintf(',\n')),varargin{:});
+padding0=repmat(ws.tab,1,level);
+padding2=repmat(ws.tab,1,level+1);
+nl=ws.newline;
 if(len>1)
     if(~isempty(name))
         txt=sprintf('%s"%s": [%s',padding0, checkname(name,varargin{:}),nl); name=''; 
@@ -207,13 +211,12 @@ if(ndims(squeeze(item))>2) % for 3D or higher dimensions, flatten to 2D for now
     dim=size(item);
 end
 len=numel(item);
-padding0=repmat(sprintf('\t'),1,level);
-padding2=repmat(sprintf('\t'),1,level+1);
-padding1=repmat(sprintf('\t'),1,level+(dim(1)>1)+(len>1));
-nl=sprintf('\n');
-if(jsonopt('Compact',0,varargin{:})==1)
-    padding0='';padding1='';padding2='';nl='';
-end
+ws=struct('tab',sprintf('\t'),'newline',sprintf('\n'));
+ws=jsonopt('whitespaces_',ws,varargin{:});
+padding0=repmat(ws.tab,1,level);
+padding2=repmat(ws.tab,1,level+1);
+padding1=repmat(ws.tab,1,level+(dim(1)>1)+(len>1));
+nl=ws.newline;
 
 if(~isempty(name)) 
     if(len>1) txt=sprintf('%s"%s": [%s',padding0,checkname(name,varargin{:}),nl); end
@@ -253,15 +256,12 @@ if(~ischar(item))
 end
 item=reshape(item, max(size(item),[1 0]));
 len=size(item,1);
-nl=sprintf('\n');
-padding1=repmat(sprintf('\t'),1,level);
-padding0=repmat(sprintf('\t'),1,level+1);
-if(jsonopt('Compact',0,varargin{:})==1)
-    padding0='';
-    padding1='';
-    nl='';
-end
-sep=sprintf(',%s',nl);
+ws=struct('tab',sprintf('\t'),'newline',sprintf('\n'),'sep',sprintf(',\n'));
+ws=jsonopt('whitespaces_',ws,varargin{:});
+padding1=repmat(ws.tab,1,level);
+padding0=repmat(ws.tab,1,level+1);
+nl=ws.newline;
+sep=ws.sep;
 
 if(~isempty(name)) 
     if(len>1) txt=sprintf('%s"%s": [%s',padding1,checkname(name,varargin{:}),nl); end
@@ -297,13 +297,12 @@ function txt=mat2json(name,item,level,varargin)
 if(~isnumeric(item) && ~islogical(item))
         error('input is not an array');
 end
-nl=sprintf('\n');
-padding1=repmat(sprintf('\t'),1,level);
-padding0=repmat(sprintf('\t'),1,level+1);
-if(jsonopt('Compact',0,varargin{:})==1)
-    padding0='';padding1='';nl='';
-end
-sep=sprintf(',%s',nl);
+ws=struct('tab',sprintf('\t'),'newline',sprintf('\n'),'sep',sprintf(',\n'));
+ws=jsonopt('whitespaces_',ws,varargin{:});
+padding1=repmat(ws.tab,1,level);
+padding0=repmat(ws.tab,1,level+1);
+nl=ws.newline;
+sep=ws.sep;
 
 if(length(size(item))>2 || issparse(item) || ~isreal(item) || ...
    isempty(item) ||jsonopt('ArrayToStruct',0,varargin{:}))
@@ -369,13 +368,12 @@ txt=sprintf('%s%s%s',txt,padding1,'}');
 
 %%-------------------------------------------------------------------------
 function txt=matdata2json(mat,level,varargin)
-if(jsonopt('Compact',0,varargin{:})==1)
-    tab='';
-    nl='';
-else
-    tab=sprintf('\t');
-    nl=sprintf('\n');    
-end
+
+ws=struct('tab',sprintf('\t'),'newline',sprintf('\n'),'sep',sprintf(',\n'));
+ws=jsonopt('whitespaces_',ws,varargin{:});
+tab=ws.tab;
+nl=ws.newline;
+
 if(size(mat,1)==1)
     pre='';
     post='';
-- 
GitLab