diff TextTable.m @ 465:a5cebdaad10b

Implement a simple but general text table
author Jonatan Werpers <jonatan@werpers.com>
date Tue, 01 Aug 2017 12:24:52 +0200
parents textTable.m@fdee7f66a5e9
children 11a39b274260
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextTable.m	Tue Aug 01 12:24:52 2017 +0200
@@ -0,0 +1,122 @@
+classdef TextTable < handle
+    properties
+        data
+        fmtArray
+        vertDiv
+        horzDiv
+
+        nCols
+        nRows
+    end
+
+    methods
+        function obj = TextTable(data, vertDiv, horzDiv);
+            default_arg('vertDiv', []);
+            default_arg('horzDiv', []);
+
+
+            obj.data = data;
+            obj.vertDiv = vertDiv;
+            obj.horzDiv = horzDiv;
+
+            [obj.nRows, obj.nCols] = size(data);
+            obj.fmtArray = cell(size(data));
+            obj.formatAll('%s');
+
+        end
+
+        function formatAll(obj, fmt)
+            obj.fmtArray(:,:) = {fmt};
+        end
+
+        function formatCell(obj, i, j, fmt)
+            obj.fmtArray{i,j} = fmt;
+        end
+
+        function formatRow(obj, i, fmt)
+            obj.fmtArray(i,:) = {fmt};
+        end
+
+        function formatColumn(obj, j, fmt)
+            obj.fmtArray(:,j) = {fmt};
+        end
+
+        function widths = getWidths(obj)
+            strArray = obj.getStringArray();
+
+            widths = zeros(1,obj.nCols);
+            for j = 1:obj.nCols
+                for i = 1:obj.nRows
+                    widths(j) = max(widths(j), length(strArray{i,j}));
+                end
+            end
+        end
+
+        function str = toString(obj)
+            strArray = obj.getStringArray();
+            widths = obj.getWidths();
+
+            str = '';
+
+            % First horzDiv
+            if ismember(0, obj.horzDiv)
+                str = [str, obj.getHorzDiv(widths)];
+            end
+
+            for i = 1:obj.nRows
+                str = [str, TextTable.rowToString(strArray(i,:), widths, obj.vertDiv, obj.horzDiv)];
+
+                % Interior horzDiv
+                if ismember(i, obj.horzDiv)
+                    str = [str, obj.getHorzDiv(widths)];
+                end
+            end
+        end
+
+        function str = getHorzDiv(obj, widths)
+            str = TextTable.rowToString(cell(1,obj.nCols), widths, obj.vertDiv, obj.horzDiv);
+            str(find(' ' == str)) = '-';
+            str(find('|' == str)) = '+';
+        end
+
+        function strArray = getStringArray(obj)
+            strArray = cell(size(obj.data));
+
+            for i = 1:obj.nRows
+                for j = 1:obj.nCols
+                    strArray{i,j} = sprintf(obj.fmtArray{i,j}, obj.data{i,j});
+                end
+            end
+        end
+    end
+
+    methods (Static)
+        function str = rowToString(strs, widths, vertDiv, horzDiv)
+            % First vertDiv
+            if ismember(0, vertDiv)
+                str = '| ';
+            else
+                str = ' ';
+            end
+
+            % Interior cols
+            for j = 1:length(strs) - 1
+                str = [str, sprintf('%*s ', widths(j), strs{j})];
+
+                % Interior vertDiv
+                if ismember(j, vertDiv)
+                    str = [str, '| '];
+                end
+            end
+
+            % Last col
+            str = [str, sprintf('%*s ', widths(end), strs{end})];
+
+            if ismember(length(strs), vertDiv)
+                str = [str, '|'];
+            end
+
+            str = [str, sprintf('\n')];
+        end
+    end
+end
\ No newline at end of file