Mercurial > repos > public > sbplib
comparison TextTable.m @ 659:11a39b274260 feature/grids
Make data more flexible, add print method, allow negative devider index
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Sat, 11 Nov 2017 13:56:15 -0800 |
parents | a5cebdaad10b |
children | f30eafd6d4dc |
comparison
equal
deleted
inserted
replaced
658:1201eb16557e | 659:11a39b274260 |
---|---|
2 properties | 2 properties |
3 data | 3 data |
4 fmtArray | 4 fmtArray |
5 vertDiv | 5 vertDiv |
6 horzDiv | 6 horzDiv |
7 | |
8 nCols | |
9 nRows | |
10 end | 7 end |
11 | 8 |
12 methods | 9 methods |
13 function obj = TextTable(data, vertDiv, horzDiv); | 10 function obj = TextTable(data, vertDiv, horzDiv) |
14 default_arg('vertDiv', []); | 11 default_arg('vertDiv', []); |
15 default_arg('horzDiv', []); | 12 default_arg('horzDiv', []); |
16 | |
17 | 13 |
18 obj.data = data; | 14 obj.data = data; |
19 obj.vertDiv = vertDiv; | 15 obj.vertDiv = vertDiv; |
20 obj.horzDiv = horzDiv; | 16 obj.horzDiv = horzDiv; |
21 | 17 |
22 [obj.nRows, obj.nCols] = size(data); | |
23 obj.fmtArray = cell(size(data)); | 18 obj.fmtArray = cell(size(data)); |
24 obj.formatAll('%s'); | 19 obj.formatAll('%s'); |
25 | 20 |
26 end | 21 end |
27 | 22 |
23 function n = nRows(obj) | |
24 n = size(obj.data, 1); | |
25 end | |
26 | |
27 function n = nCols(obj) | |
28 n = size(obj.data, 2); | |
29 end | |
30 | |
31 function print(obj) | |
32 disp(obj.toString()); | |
33 end | |
34 | |
28 function formatAll(obj, fmt) | 35 function formatAll(obj, fmt) |
36 obj.fmtArray = cell(size(obj.data)); | |
29 obj.fmtArray(:,:) = {fmt}; | 37 obj.fmtArray(:,:) = {fmt}; |
30 end | 38 end |
31 | 39 |
32 function formatCell(obj, i, j, fmt) | 40 function formatCell(obj, i, j, fmt) |
33 obj.fmtArray{i,j} = fmt; | 41 obj.fmtArray{i,j} = fmt; |
56 strArray = obj.getStringArray(); | 64 strArray = obj.getStringArray(); |
57 widths = obj.getWidths(); | 65 widths = obj.getWidths(); |
58 | 66 |
59 str = ''; | 67 str = ''; |
60 | 68 |
69 N = size(strArray, 2); | |
70 | |
61 % First horzDiv | 71 % First horzDiv |
62 if ismember(0, obj.horzDiv) | 72 if isDiv(0, obj.horzDiv, N); |
63 str = [str, obj.getHorzDiv(widths)]; | 73 str = [str, obj.getHorzDiv(widths)]; |
64 end | 74 end |
65 | 75 |
66 for i = 1:obj.nRows | 76 for i = 1:obj.nRows |
67 str = [str, TextTable.rowToString(strArray(i,:), widths, obj.vertDiv, obj.horzDiv)]; | 77 str = [str, TextTable.rowToString(strArray(i,:), widths, obj.vertDiv)]; |
68 | 78 |
69 % Interior horzDiv | 79 % Interior horzDiv |
70 if ismember(i, obj.horzDiv) | 80 if isDiv(i, obj.horzDiv, N) |
71 str = [str, obj.getHorzDiv(widths)]; | 81 str = [str, obj.getHorzDiv(widths)]; |
72 end | 82 end |
73 end | 83 end |
74 end | 84 end |
75 | 85 |
76 function str = getHorzDiv(obj, widths) | 86 function str = getHorzDiv(obj, widths) |
77 str = TextTable.rowToString(cell(1,obj.nCols), widths, obj.vertDiv, obj.horzDiv); | 87 str = TextTable.rowToString(cell(1,obj.nCols), widths, obj.vertDiv); |
78 str(find(' ' == str)) = '-'; | 88 str(find(' ' == str)) = '-'; |
79 str(find('|' == str)) = '+'; | 89 str(find('|' == str)) = '+'; |
80 end | 90 end |
81 | 91 |
82 function strArray = getStringArray(obj) | 92 function strArray = getStringArray(obj) |
93 assert(all(size(obj.data) == size(obj.fmtArray)), 'Sizes of format matrix and data matrix do not match.') | |
83 strArray = cell(size(obj.data)); | 94 strArray = cell(size(obj.data)); |
84 | 95 |
85 for i = 1:obj.nRows | 96 for i = 1:obj.nRows |
86 for j = 1:obj.nCols | 97 for j = 1:obj.nCols |
87 strArray{i,j} = sprintf(obj.fmtArray{i,j}, obj.data{i,j}); | 98 strArray{i,j} = sprintf(obj.fmtArray{i,j}, obj.data{i,j}); |
89 end | 100 end |
90 end | 101 end |
91 end | 102 end |
92 | 103 |
93 methods (Static) | 104 methods (Static) |
94 function str = rowToString(strs, widths, vertDiv, horzDiv) | 105 function str = rowToString(strs, widths, vertDiv) |
106 N = length(strs); | |
107 | |
95 % First vertDiv | 108 % First vertDiv |
96 if ismember(0, vertDiv) | 109 if isDiv(0, vertDiv, N) |
97 str = '| '; | 110 prefix = '| '; |
98 else | 111 else |
99 str = ' '; | 112 prefix = ' '; |
100 end | 113 end |
101 | 114 |
102 % Interior cols | 115 % Pad strings |
103 for j = 1:length(strs) - 1 | 116 for i = 1:N |
104 str = [str, sprintf('%*s ', widths(j), strs{j})]; | 117 strs{i} = sprintf('%*s', widths(i), strs{i}); |
118 end | |
105 | 119 |
106 % Interior vertDiv | 120 % Column delimiters |
107 if ismember(j, vertDiv) | 121 delims = cell(1,N-1); |
108 str = [str, '| ']; | 122 for i = 1:length(delims) |
123 if isDiv(i, vertDiv, N); | |
124 delims{i} = '| '; | |
125 else | |
126 delims{i} = ' '; | |
109 end | 127 end |
110 end | 128 end |
111 | 129 |
112 % Last col | 130 if isDiv(N, vertDiv, N); |
113 str = [str, sprintf('%*s ', widths(end), strs{end})]; | 131 suffix = '|'; |
114 | 132 else |
115 if ismember(length(strs), vertDiv) | 133 suffix = ''; |
116 str = [str, '|']; | |
117 end | 134 end |
118 | 135 |
119 str = [str, sprintf('\n')]; | 136 str = [prefix, strjoin(strs, delims), suffix, sprintf('\n')]; |
120 end | 137 end |
121 end | 138 end |
122 end | 139 end |
140 | |
141 function b = isDiv(i, div, N) | |
142 b = ismember(i, div) || ismember(i, N+div+1); | |
143 end |