Jump to content

Module:Ustring

From Wikimedia Commons, the free media repository
Lua

CodeDiscussionEditHistoryLinksLink count Subpages:DocumentationTestsResultsSandboxLive code All modules

This module directly imports all functions from the Template:Luaref library. Documentation for each function can be found there.

The module takes an indefinite number of arguments. Arguments given as |s1=, |s2=, etc, are read first, and are used as strings. All remaining numerical arguments are coerced to number type if possible, and remain strings if not. If you wish for a numerical (i.e. unnamed or "|1=", "|2=") to remain a string, you can simply escape it by inserting \ at the beginning of the string.

Note that MediaWiki will always trim whitespace from named arguments; to give arguments with surrounding whitespace you must use unnamed parameters starting with \.

How to pass inconvenient strings
To pass this... Write this Explanation
" 0123 " |\ 123 To get surrounding whitespace must use unnamed, but must precede with \ to indicate that it isn't a number.
"0123" |s1=0123 If you don't need to preserve whitespace use |s1= etc.
"0123" |1=\0123 If you don't need to preserve whitespace explicitly use |1= etc.
In another template, to pass its parameter {{{1}}}, preserving whitespace |\{{{1}}} Must provide the \ with unknown string input.
In another template, to pass its parameter {{{1}}}, stripping whitespace |s1={{{1}}}
In another template, to pass its parameter {{{1}}}, stripping whitespace |1=\{{#if:1|{{{1}}}}}

You can also wrap results in tags. All other unused arguments will be passed to Template:Luaref

Usage

[edit]

{{#invoke:Ustring|function_name|arg1|arg2|...}} is equivalent to Template:Luaref

Example using mw.ustring.sub

[edit]

{{#invoke:Ustring|sub|s1=abcde|2|4}}

produces:

bcd

Example using mw.ustring.gsub

[edit]

{{#invoke:Ustring|gsub|s1=1234|23|}}

produces:

14

Example using mw.ustring.char

[edit]

&#{{#invoke:ustring|char|49|48|59}}

produces:




Example using mw.ustring.match

[edit]

{{#invoke:Ustring|match|s1=abcde|s2=(c%w)}}

produces:

cd

Note: Only the first match is returned. Additional returns are omitted because mw.ustring.gsub's second return value is generally undesirable.

Example using tag arguments

[edit]
{{#invoke:Ustring|match |s1={{Module:Ustring}}|%s%s%sif%snot%s[^%s]+%sthen.+% <!--enter an actual newline character to match '\n'-->%s%s%send |tag=syntaxhighlight|lang=lua}}

produces:

if not fargs.tag then return (what(unpack(args)))-- Outside parens truncate to first result avoiding tail call end local tagargs = {} for x, y in pairs(fargs) do if not fargsused[x] then tagargs[x] = y end end 

Note that:

<syntaxhighlight lang="lua">{{#invoke:Ustring|match |s1={{Module:Ustring}}|%s%s%sif%snot%s[^%s]+%sthen.+% <!--enter an actual newline character to match '\n'-->%s%s%send}}</syntaxhighlight>

produces:

{{#invoke:Ustring|match |s1={{Module:Ustring}}|%s%s%sif%snot%s[^%s]+%sthen.+% <!--enter an actual newline character to match '\n'-->%s%s%send}} 

Errors

[edit]

Errors from accessing Template:Luaref should be maintained, e.g.:

{{#invoke:Ustring|xyzzy}}

should produce:

Template:Script error

and

{{#invoke:Ustring|maxPatternLength}}

should produce:

Template:Script error

See also

[edit]

Trimming templates:

  • {{Trunc}} – To trim down to a specified number of characters.
  • {{Trim}} — To trim any leading or trailing whitespace.
  • {{Str left}} – To trim down to a specified number of characters, or duplicate the string to a specified number.
  • {{Str right}}
  • {{Strip}} – To strip (remove) a given number of characters from the beginning/end of the string

Analyzing templates:

  • {{Str endswith}} – To check if a string ends with a given string.
  • {{Str find}} – Returns the numerical location of a given string in a string, up to 50 characters.
  • {{Str len}} – Returns a string's length. Can count up to 500 characters.

String length comparison templates:

  • {{Str ≤ len}} – To check if a string is "shorter or equally long" or "longer" than a given length.

Sandboxes and test cases:

Technical stuff:

Code

require('strict') return setmetatable({}, { __index = function(t, k) local what = mw.ustring[k] if type(what) ~= "function" then return what end return function(frame) local fargs = frame.args local fargsused = { tag = true } local args = {} local str_i = 1 while fargs['s' .. str_i] do fargsused['s' .. str_i] = true args[str_i] = fargs['s' .. str_i] str_i = str_i + 1 end for i, v in ipairs(fargs) do fargsused[i] = true args[i + str_i - 1] = tonumber(v) or v:gsub("^\\", "", 1) end if not fargs.tag then return (what(unpack(args)))-- Outside parens truncate to first result avoiding tail call end local tagargs = {} for x, y in pairs(fargs) do if not fargsused[x] then tagargs[x] = y end end return frame:extensionTag{name = fargs.tag, content = what(unpack(args)), args = tagargs} end end })