Module:Escape/doc: Difference between revisions

Content deleted Content added
Fixed doc for non-fully implemented feature
dark mode
 
(10 intermediate revisions by 6 users not shown)
Line 1:
{{Module rating |release<!-- Values: pre-alpha • alpha • beta • release • protected -- If a rating not needed/relevant, delete this template call -->}}
{{High use}}
<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) -->
== Usage ==
Line 5 ⟶ 6:
 
From another module:
{{codett|2=lua|1=local esc = require('Module:Escape')}}
esc:char({{green|''escape char (or sequence)''}})
{{codett|2=lua|1=local to_escape = esc:text}}({{green|''string''}})
{{green|''code that replaces or removes unescaped chars''}}
{{codett|2=lua|1=local result = esc:undo(to_escape)}}
 
From a template:
<nowiki>{{invoke:mlx|Escape|main|mode{{=</nowiki>}}{{green|''function''}}|char{{=}}{{green|''escape char (or sequence)''}}|{{green|''text''}}}}
 
In a template, the most useful function is {{code|kill}}.
 
 
This module is primarily intended to be used by other modules. However all functions can be called in template space using {{para|mode|the function you want to call}} followed by arguments.
 
All module functions (i.e. any func. other than {{code|main()}}) should be called using a colon ({{char|:}}), e.g. {{code|esc:char('%')|lua}} or <{{code>|<nowiki>esc:kill{'{{example|\\}}}', '}'} == '{{example|}'</nowiki></code>|lua}}
 
{|- class='"wikitable'"
 
{|class='wikitable' style='background:#fff'
|-
!style='"vertical-align:top;width:7em';font-family:monospace;"|{{TOC tab|escape:text()}}
|This function takes only one argument: A string. All characters in this string which are preceded by the sequence set by {{code|escape:char()}} will be replaced with placeholders that can be converted back into that char by escape:undo()
|-
!style='"vertical-align:top;width:5em';font-family:monospace;"|{{TOC tab|escape:undo()}}
|Takes two arguments:
# The string that may contain placeholders set by {{code|escape:text()}}
# Optional, a char to be placed in front of any characters that have been de-escaped. (i.e. if you need to re-escape those string with a different char)
|-
!style='"vertical-align:top;width:5em';font-family:monospace;"|{{TOC tab|escape:kill()}}
|This is basically equivalent to calling {{code|string.gsub()}} on the string returned by {{code|escape:text()}} and feeding that result into {{code|escape:undo()}} in a single step. Takes three arguments:
# A string
# A sequence of characters to be removed from that string. (May use a {{code|string.gsub()}} pattern)
# Optional, a char to be placed in front of any characters that have been de-escaped.
|-
!style='"vertical-align:top';font-family:monospace;"|{{TOC tab|escape:char()}}
|This function's primary use is to initialize the patterns to scan a string for an escape/escaped sequence. It takes two arguments, the first being the escape character and the second being a table of arguments (optional). By default, this module will escape the {{code|\}} char. To escape the {{code|{}} char instead, you can do {{code|require('Module:Escape'):char('{')|lua}} (or {{code|esc:char('{')|lua}} (presuming you stored the table returned by this module in the local variable {{code|esc}}).
 
When called without the second argument, char() will return a table containing the functions. This allows, for example, <{{code>|escape:char('*'):kill('1*23', '%d')</code>|lua}} which would return '{{samp|2}}'.
 
For the most part, there is very little reason to set {{para|mode}} in template space since the patterns it stores are not shared with other invokations of this module. Templates should instead use the {{para|char}} if a new escape sequence is desired.
 
====Shortcut (not fully implemented)====
If provided a second argument that is a table containing a <code>{key = value}</code> pair, such that the key is {{code|text}}, {{code|undo}}, or {{code|kill}} and the value is a table containing the arguments that would have been passed to those functions. For example, {{code|escape:char('\\', {text {{=}} 'string'})|lua}} is equivalent to {{code|escape:char('\\'):text('string')|lua}}.
 
Currently, if multiple key-value pairs are provided, only one may execute. It was planned so that {{code|escape:char('\\', {text {{=}} 'string', undo {{=}} '{{=}}'})}} would be a shorthand for:
{{pre|
temp{{=}}escape:char('\\'):text('string')
escape:undo(temp, '{{=}}')
}}
 
In the planned implementation, the ''text'' function would be called first, followed by ''undo'' or ''kill''. (If both ''undo'' and ''kill'' are included as keys in the table, ''kill'' would be ignored.)
 
Currently,Note that if multiple key-value pairs are provided, only one may execute. It{{code|kill}} wasis plannedignored soif thateither {{code|escape:char('\\', {text}} or {{=code|undo}} 'string',are undopresent. {{=code|undo}} 'is ignored if {{=}}'})code|text}} wouldis be a shorthand for:present.
|}
<span id='functions doc'></span>
 
===Caveats===
* When using a multi-character escape sequence, this module only marks it using the byte value of the first character. Thus, {{code|2=lua|escape:undo()}} will unescape, for example, all characters escaped with {{code|'e'}} and {{code|'esc'}} if both were used. In practice however this shouldn't be a problem as multiple escape sequences are pretty rare unless you're transitioning between multiple code languages. (Multiple multi-char escape sequences beginning with the same character are simply bad practice anyhow.)
* Since byte values are stored as numbers, it is not recommended for you to use a number as an escape sequence (though it may work just fine).
* Placeholder byte values separated with return ({{code|'\r'}}) characters--chosen because they are seldom used at all, and virtually never used unpaired with {{code|'\n'}}; moreover, it is distinct from the markers generated by {{tag|nowiki}} or {{code|mw.text.nowiki()}} (which use the delete char). To set a different separator char, include the key-value pair <code>{safeChr = {{green|alternate character}}}</code> in the table that you pass to escape:char().
 
==Speed==
Line 78 ⟶ 70:
</syntaxhighlight>
'''{{#invoke:Escape/testcases|test_kill500}}'''
 
 
when repeating the following line 500 times in a template:
 
{{code|<nowiki>{{#invoke:Escape|main|mode=kill|{{#invoke:Escape/testcases|test_string2}}|test}}</nowiki>|wikitext}}
 
'''0.767'''<!--
Line 105 ⟶ 96:
{{Module talk:Escape/testcases}}
===Module===
Here's some sample output from the debug consolconsole below the module editor:
{{pre|
{|- class='wikitable'
|
{{blue|'''local escape {{=}} require('Module:Escape')<br>test {{=}} '{{#invoke:Escape/testcases|test_string_module}}'<br><br>test2 {{=}} escape:char('{'):text(test)<br>{{=}}test2'''}}<br>
{{#invoke:Escape|main
Line 229 ⟶ 219:
'''{{blue|local tk0 {{=}} escape:kill(t, '{')<br>{{=}}tk0 {{=}}{{=}} t4}}<br>'''
true
}}
 
|}
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | |
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Modules that manipulate strings|Escape]]
[[Category:Template metamodules|Escape]]
}}</includeonly><noinclude>
[[Category:Module documentation pages]]
</noinclude>