diff options
author | sfan5 <sfan5@live.de> | 2017-09-11 16:25:20 +0200 |
---|---|---|
committer | sfan5 <sfan5@live.de> | 2017-09-12 19:33:00 +0200 |
commit | 6fa2f6b4aa42683fc85a6ce4a2a03a4b47c36974 (patch) | |
tree | 3694bada19cc38cc32a5616f7db4e9b0207b3a53 /builtin/common | |
parent | 17fd5fe9358615633a04d7a3941b444a8ce5f199 (diff) | |
download | minetest-6fa2f6b4aa42683fc85a6ce4a2a03a4b47c36974.tar.gz minetest-6fa2f6b4aa42683fc85a6ce4a2a03a4b47c36974.tar.bz2 minetest-6fa2f6b4aa42683fc85a6ce4a2a03a4b47c36974.zip |
Fix core.wrap_text and make its behaviour consistent with the docs
Code based on initial implementation by @dsohler.
Diffstat (limited to 'builtin/common')
-rw-r--r-- | builtin/common/misc_helpers.lua | 66 |
1 files changed, 16 insertions, 50 deletions
diff --git a/builtin/common/misc_helpers.lua b/builtin/common/misc_helpers.lua index 5fc589b72..87561726e 100644 --- a/builtin/common/misc_helpers.lua +++ b/builtin/common/misc_helpers.lua @@ -308,59 +308,25 @@ function core.formspec_escape(text) end -function core.wrap_text(text, charlimit) - local retval = {} - - local current_idx = 1 - - local start,stop = string_find(text, " ", current_idx) - local nl_start,nl_stop = string_find(text, "\n", current_idx) - local gotnewline = false - if nl_start ~= nil and (start == nil or nl_start < start) then - start = nl_start - stop = nl_stop - gotnewline = true - end - local last_line = "" - while start ~= nil do - if string.len(last_line) + (stop-start) > charlimit then - retval[#retval + 1] = last_line - last_line = "" +function core.wrap_text(text, max_length, as_table) + local result = {} + local line = {} + if #text <= max_length then + return as_table and {text} or text + end + + for word in text:gmatch('%S+') do + local cur_length = #table.concat(line, ' ') + if cur_length > 0 and cur_length + #word + 1 >= max_length then + -- word wouldn't fit on current line, move to next line + table.insert(result, table.concat(line, ' ')) + line = {} end - - if last_line ~= "" then - last_line = last_line .. " " - end - - last_line = last_line .. string_sub(text, current_idx, stop - 1) - - if gotnewline then - retval[#retval + 1] = last_line - last_line = "" - gotnewline = false - end - current_idx = stop+1 - - start,stop = string_find(text, " ", current_idx) - nl_start,nl_stop = string_find(text, "\n", current_idx) - - if nl_start ~= nil and (start == nil or nl_start < start) then - start = nl_start - stop = nl_stop - gotnewline = true - end - end - - --add last part of text - if string.len(last_line) + (string.len(text) - current_idx) > charlimit then - retval[#retval + 1] = last_line - retval[#retval + 1] = string_sub(text, current_idx) - else - last_line = last_line .. " " .. string_sub(text, current_idx) - retval[#retval + 1] = last_line + table.insert(line, word) end - return retval + table.insert(result, table.concat(line, ' ')) + return as_table and result or table.concat(result, '\n') end -------------------------------------------------------------------------------- |