Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fix core.wrap_text and make its behaviour consistent with the docs
Code based on initial implementation by @dsohler.
  • Loading branch information
sfan5 committed Sep 12, 2017
1 parent 17fd5fe commit 6fa2f6b
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 54 deletions.
66 changes: 16 additions & 50 deletions builtin/common/misc_helpers.lua
Expand Up @@ -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

--------------------------------------------------------------------------------
Expand Down
2 changes: 1 addition & 1 deletion builtin/mainmenu/common.lua
Expand Up @@ -250,7 +250,7 @@ end

--------------------------------------------------------------------------------
function text2textlist(xpos, ypos, width, height, tl_name, textlen, text, transparency)
local textlines = core.wrap_text(text, textlen)
local textlines = core.wrap_text(text, textlen, true)
local retval = "textlist[" .. xpos .. "," .. ypos .. ";" .. width ..
"," .. height .. ";" .. tl_name .. ";"

Expand Down
2 changes: 1 addition & 1 deletion builtin/mainmenu/tab_mods.lua
Expand Up @@ -66,7 +66,7 @@ local function get_formspec(tabview, name, tabdata)
if error == nil then
local descriptiontext = descriptionfile:read("*all")

descriptionlines = core.wrap_text(descriptiontext, 42)
descriptionlines = core.wrap_text(descriptiontext, 42, true)
descriptionfile:close()
else
descriptionlines = {}
Expand Down
6 changes: 4 additions & 2 deletions doc/lua_api.txt
Expand Up @@ -2158,9 +2158,11 @@ Helper functions
* e.g. `string:split("a,b", ",") == {"a","b"}`
* `string:trim()`
* e.g. `string.trim("\n \t\tfoo bar\t ") == "foo bar"`
* `minetest.wrap_text(str, limit)`: returns a string
* Adds new lines to the string to keep it within the specified character limit
* `minetest.wrap_text(str, limit, [as_table])`: returns a string or table
* Adds newlines to the string to keep it within the specified character limit
Note that returned lines may be longer than the limit since it only splits at word borders.
* limit: Maximal amount of characters in one line
* as_table: optional, if true return table of lines instead of string
* `minetest.pos_to_string({x=X,y=Y,z=Z}, decimal_places))`: returns string `"(X,Y,Z)"`
* Convert position to a printable string
Optional: 'decimal_places' will round the x, y and z of the pos to the given decimal place.
Expand Down

0 comments on commit 6fa2f6b

Please sign in to comment.