1
0

Minoir changes

This commit is contained in:
Jon Michael Aanes 2017-12-11 11:04:11 +01:00
parent 88fa144c9e
commit b0004db70c
3 changed files with 64 additions and 5 deletions

View File

@ -30,6 +30,7 @@ local function iterate_utf8_chars (str)
end end
local function utf8_string_length (str) local function utf8_string_length (str)
assert(type(str) == 'string')
local len = 0 local len = 0
for char in iterate_utf8_chars(str) do for char in iterate_utf8_chars(str) do
if not UNICODE_ZERO_WIDTH_CHARACTERS[char] then if not UNICODE_ZERO_WIDTH_CHARACTERS[char] then

View File

@ -72,12 +72,17 @@ local ERROR_UNKNOWN_TYPE = [[
We are attempting to cover all Lua features, so please report this bug, so we can improve. We are attempting to cover all Lua features, so please report this bug, so we can improve.
]] ]]
local TERMINAL_WIDTH = 80
local MAX_WIDTH_FOR_SINGLE_LINE_TABLE = 38 local MAX_WIDTH_FOR_SINGLE_LINE_TABLE = 38
if io and io.popen then if io and io.popen then
local f = io.popen "tput cols" local f = io.popen "tput cols"
local term_width = f:read '*n' local term_width = f:read '*n'
f:close() f:close()
-- if term_width then MAX_WIDTH_FOR_SINGLE_LINE_TABLE = term_width * 3 / 2 end if term_width then
TERMINAL_WIDTH = term_width
--MAX_WIDTH_FOR_SINGLE_LINE_TABLE = term_width * (2 / 3)
end
end end
local KEY_TYPE_SORT_ORDER = { local KEY_TYPE_SORT_ORDER = {
@ -313,7 +318,7 @@ local function align_into_columns (l, start_i, stop_i)
for nr_items_pr_row = 10, 1, -1 do -- TODO: Do this more intelligently. for nr_items_pr_row = 10, 1, -1 do -- TODO: Do this more intelligently.
local column_width local column_width
column_width, columns = attempt_to_align_into_columns(l, start_i, stop_i, nr_items_pr_row) column_width, columns = attempt_to_align_into_columns(l, start_i, stop_i, nr_items_pr_row)
if column_width <= MAX_WIDTH_FOR_SINGLE_LINE_TABLE then break end if column_width <= l.options.max_width_for_single_line_table then break end
end end
-- Change alignment of columns -- Change alignment of columns
@ -501,12 +506,14 @@ local function format_table (t, display, l, format_value)
-- Decide for short or long table formatting. -- Decide for short or long table formatting.
local table_width = width_of_strings_in_l(l, start_of_table_i) local table_width = width_of_strings_in_l(l, start_of_table_i)
if table_width <= MAX_WIDTH_FOR_SINGLE_LINE_TABLE then
if table_width <= l.options.max_width_for_single_line_table then
-- Is short table: Ignore "width of key". -- Is short table: Ignore "width of key".
l[start_of_table_i][3] = 'inline' l[start_of_table_i][3] = 'inline'
ignore_alignment_info(l, start_of_table_i) ignore_alignment_info(l, start_of_table_i)
elseif table_info.is_leaf_node then elseif table_info.is_leaf_node then
-- Is leaf node: Can format into columns. -- Is leaf node: Can format into columns.
-- Only if long or sequence.
-- NOTE: Currently we only allow leaf-nodes to format into columns, due -- NOTE: Currently we only allow leaf-nodes to format into columns, due
-- to issues with table alignment. -- to issues with table alignment.
align_into_columns(l, start_of_table_i) align_into_columns(l, start_of_table_i)
@ -562,7 +569,6 @@ local TYPE_TO_FORMAT_FUNC = {
local function format_value (value, display, l) local function format_value (value, display, l)
assert(type(display) == 'number' and type(l) == 'table') assert(type(display) == 'number' and type(l) == 'table')
local formatting = TYPE_TO_FORMAT_FUNC[type(value)] local formatting = TYPE_TO_FORMAT_FUNC[type(value)]
--print(value, formatting)
if formatting then if formatting then
formatting(value, display, l, format_value) formatting(value, display, l, format_value)
else else
@ -588,6 +594,8 @@ local KNOWN_OPTIONS = {
_table_addr_comment = { type = 'boolean', default = false, debug = 'debug' }, -- TODO: Maybe automatically display table address when display = 0? _table_addr_comment = { type = 'boolean', default = false, debug = 'debug' }, -- TODO: Maybe automatically display table address when display = 0?
indent = { type = 'string', default = ' ' }, indent = { type = 'string', default = ' ' },
max_output_width = { type = 'number', default = TERMINAL_WIDTH }
} }
local function ensure_that_all_options_are_known (input_options) local function ensure_that_all_options_are_known (input_options)
@ -622,10 +630,36 @@ local function ensure_that_all_options_are_known (input_options)
output_options[option_name] = option_info.default output_options[option_name] = option_info.default
end end
end end
-- Calculate derived settings
output_options.max_width_for_single_line_table = MAX_WIDTH_FOR_SINGLE_LINE_TABLE -- TODO: Make dynamic
-- Returns input_options -- Returns input_options
return output_options return output_options
end end
local function length_of_longest_line_in_text (text)
assert(type(text) == 'string')
local longest_line_len = text:match '([^\n]*)$' : len()
for line in text:gmatch '(.-)\n' do
longest_line_len = math.max(longest_line_len, line:len())
end
return longest_line_len
end
local function internal_warning (fmt, ...)
io.stderr:write('[pretty/internal]: '..string.format(fmt, ...))
end
local function assert_pretty_result (repr, options)
assert(type(repr) == 'string')
assert(type(options) == 'table')
-- Determine length of longest line in output
local max_width = length_of_longest_line_in_text(repr)
if max_width > options.max_output_width then
internal_warning('Internal assertion failed. Width of output was %i, but should be less than %i.', max_width, options.max_output_width)
end
end
local function pretty_format (value, options) local function pretty_format (value, options)
-- Error checking -- Error checking
local options = ensure_that_all_options_are_known(options or {}) local options = ensure_that_all_options_are_known(options or {})
@ -642,7 +676,12 @@ local function pretty_format (value, options)
fix_seperator_info(l, l.options.indent) fix_seperator_info(l, l.options.indent)
ignore_alignment_info(l) ignore_alignment_info(l)
return table.concat(l, '') -- Concat and perform last assertions.
local repr = table.concat(l, '')
assert_pretty_result(repr, options)
-- Return
return repr
end end
return pretty_format return pretty_format

View File

@ -34,6 +34,15 @@ local function format_test (t)
end, { line = debug.getinfo(2).currentline }) end, { line = debug.getinfo(2).currentline })
end end
local function format_parsable_test (t)
local stripped = t.text:match '^%s*(.-)%s*$'
return format_test {
name = t.name,
input = loadstring('return '..stripped)(),
expect = stripped
}
end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- Primitive types -- Primitive types
@ -263,6 +272,16 @@ format_test {
expect = '{\n \'hello\', \'world\', \'how\',\n \'is\', \'it\', \'going?\',\n \'Im\', \'doing great\', \'thanks\',\n \'that\', \'was\', \'what\',\n \'I\'\n}', expect = '{\n \'hello\', \'world\', \'how\',\n \'is\', \'it\', \'going?\',\n \'Im\', \'doing great\', \'thanks\',\n \'that\', \'was\', \'what\',\n \'I\'\n}',
} }
format_parsable_test {
name = 'Column style with aligned numbers',
text = [[
{
200, -522, 423, 516, 523, 126, 2912,
523, -620, 0, 0, 0, -5, 2,
72, 6
}
]] }
format_test { format_test {
name = 'Tabular style with strings left aligned', name = 'Tabular style with strings left aligned',
input = { input = {