Jump to content

Module:Unindent

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Awesome Aasim (talk | contribs) at 18:39, 25 February 2025 (rmv MIT license causing problems with autodoc). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

-- <nowiki>
--- Unindent resets the indentation level of mulitline strings.
--  It is useful for multiline strings inside functions and large tables.
--  This module serves as a utility function for string parsing, [[Global
--  Lua Modules/Testharness|Testharness]] test suites, [[Global Lua
--  Modules/I18n|I18n]] datastores.
--  
--  Lua supports multiline strings in the format `[[\n...\n]]`. In general,
--  Lua does not outdent indented multiline strings out of the box. Though
--  Lua supports variable indentation in multiline strings, custom logic is
--  necessary to reset the string's indentation. This module adopts a
--  flexible approach based on string scanning.
--  
--  Unlike Penlight's `pl.text.dedent` behaviour where every line has the
--  indentation of the first line removed, the line prefixed with the least
--  non-tab whitespace is reset to zero indentation. Thus, the opening line
--  of the string may retain some indentation *if* there are lines of less
--  indentation terminating the string.
--  
--  @script             unindent
--  @license            MIT
--  @release            stable
--  @author             [[wikia:c:User:8nml|8nml]]
--  @attribution        [https://github.com/kikito @kikito] ([https://github.com/kikito/inspect.lua/blob/master/spec/unindent.lua GitHub])
--  @param              {string} str Multiline string indented consistently.
--  @return             {string} Unindented string.
return function(str)
    str = str:gsub(' +$', ''):gsub('^ +', '') -- remove spaces at start and end
    local level = math.huge
    local minPrefix = ''
    local len
    for prefix in str:gmatch('\n( +)') do
        len = #prefix
        if len < level then
            level = len
            minPrefix = prefix
        end
    end
    return (str:gsub('\n' .. minPrefix, '\n'):gsub('\n$', ''))
end