Module:TextUtil

-- Source for gsplit, split, and trim: https://phabricator.wikimedia.org/diffusion/ELUA/browse/master/includes/engines/LuaCommon/lualib/mw.text.lua

local p = {}

function p.gsplit( text, pattern, plain ) if not pattern then pattern = ',' end if not plain then pattern = '%s*' .. pattern .. '%s*' end local s, l = 1, text:len return function if s then local e, n = text:find( pattern, s, plain ) local ret if not e then ret = text:sub( s ) s = nil elseif n < e then -- Empty separator! ret = text:sub( s, e ) if e < l then s = e + 1 else s = nil end else ret = e > s and text:sub( s, e - 1 ) or '' s = n + 1 end return ret end end, nil, nil end

function p.splitNonempty(text, pattern, plain) if text == '' then return {} end return p.split(text, pattern, plain) end

function p.splitOrNil(text, pattern, plain) if text == '' or not text then return nil end return p.split(text, pattern, plain) end

function p.split(text, pattern, plain) if not text then return {} end local ret = {} for m in p.gsplit(text, pattern, plain) do		ret[#ret+1] = m	end return ret end

function p.splitIfString(str, sep, plain) if type(str) == 'table' then return str end return p.split(str, sep, plain) end

function p.trim( s, charset ) charset = charset or '\t\r\n\f ' s = s:gsub( '^[' .. charset .. ']*(.-)[' .. charset .. ']*$', '%1' ) return s end

function p.escape(link) link = link or '' -- because of gsub not letting you have - unescaped link = string.gsub(link,'%-','%%%-') link = string.gsub(link,'%(','%%%(') link = string.gsub(link,'%)','%%%)') link = string.gsub(link,'%+','%%%+') return link end

function p.escapeCustom(link, tbl) for _, row in pairs(tbl) do		link = link:gsub(row.find, row.replace) end return link end

function p.nextLetter(char) return string.char(char:byte + 1) end

function p.extLink(link, text) if link == '' then link = nil end if not link then return end return ('[%s %s]'):format(link, text or 'Link') end

function p.intLink(link, text) if link == '' then link = nil end if not link and not text then return end return ('%s'):format(link or text, text or 'Link') end

function p.fileLink(file, target) if file == '' then file = nil end if not file then return nil end file = file:gsub('File:', '') return (''):format(file, target) end

function p.link(link, text) if not link then return p.intLink(link, text) end if link:find('http') then return p.extLink(link, text) else return p.intLink(link, text) end end

function p.ambiguousLink(link, text) if not link then return p.intLink(link, text) end if link:find('http') then return p.extLink(link, text) else return (' %s '):format(p.intLink(link, text)) end end

function p.extLinkOrText(link, text) if link == '' then link = nil end if not link then return text end return ('[%s %s]'):format(link, text or link) end

function p.intLinkOrText(link, text) if link == '' then link = nil end if not link then return text end return ('%s'):format(link, text or link) end

function p.linkOrText(link, text) if link:find('http') then return p.extLinkOrText(link, text) else return p.intLinkOrText(link, text) end end

function p.ucFirstOnly(str) if not str then return end return mw.getLanguage('en'):ucfirst(str:lower) end

function p.ucfirst(str) if not str then return end return mw.getLanguage('en'):ucfirst(str) end

function p.lcfirst(str) if not str then return end return mw.getLanguage('en'):lcfirst(str) end

function p.possessive(str, literal) if (literal or str):find('s$') then return str .. "'"	end return str .. "'s" end

return p