원문 보기: https://dawoum.duckdns.org/wiki/Help:Substitution
대체(Substitution)는 위키텍스트가 하나 이상의 템플릿, 변수, 또는 파서 함수를 참조하는 경우에서, 페이지가 저장될 때 해당 페이지의 위키텍스트의 자동 변환입니다.
템플릿 대체의 경우에서, 템플릿 호출은 매개변수의 대체를 통해 템플릿 컨텐츠로 대체됩니다. 따라서 템플릿은 매크로로 사용되고 페이지는, 보통 발생하는, 페이지를 볼 때와 달리 페이지가 저장될 때 매크로 확장됩니다.
변수나 파서 함수를 대체하는 경우에서, 그것에 대한 참조는 결과 값으로 대체됩니다.
대체는 {{subst:FULLPAGENAME}} 및 {{safesubst:FULLPAGENAME}} 예제와 같이 간섭하는 공백 없이 이중 여는 중괄호 뒤에 마법 단어 subst: 또는 safesubst:를 넣음으로써 수행됩니다. 코드 safesubst:는 다중 레벨 대체에 유용하며, 아래를 참조하십시오.
결과 (저장된 위키텍스트와의 차이 형식)는 "Show changes"를 누름으로써 저장하기 전 (또는 저장 없이)에 볼 수 있습니다. 어쨌든, 텍스트가 두 개 이상의 문단을 포함하면, 이 diff 페이지는 여백에 더하기 기호가 있기 때문에 결과를 복사하기에 적합하지 않습니다 (예를 들어, 모든 각 단계를 저장하지 않고 단계별 대체).
Applications
템플릿의 대체:
- 템플릿과 독립적인 렌더링된 페이지를 만듭니다:
- 템플릿을 편집해도 렌더링된 페이지는 변경되지 않습니다.
- 템플릿을 복사하지 않고도 다른 미디어위키 위키로 페이지를 복사할 수 있습니다.
- 따라서 서버에 대해 페이지를 더 쉽고 빠르게 렌더링되게 만듭니다.
- 템플릿의 작동을 분석하고 설명합니다. 어쨌든, 어떤 경우에는 대체가 다르게 작동합니다.
- 위키텍스트와 렌더링된 페이지 사이의 대응관계를 이해하기 쉽게 만듭니다 (이것이 적용될 수도 있고, 그 반대의 경우도 적용될 수 있습니다).
시간-종속 변수의 대체:
- 시간과 독림적인 렌더링된 페이지를 만듭니다.
페이지-종속 변수의 대체:
- 페이지 이름을 바꾸거나 위키 텍스트를 다른 페이지로 복사하지 않아도 렌더링된 페이지가 독립적으로 실행되도록 합니다 (페이지 자체를 포함하기 위해 페이지의 no-include 부분에서 PAGENAME 변수를 사용하는 경우에는 그 반대가 적용됩니다).
일부 미디어위키 확장은 매개변수가 있는 템플릿에서 사용하면, 템플릿을 대체하는 경우에만 작동한다는 제한이 있습니다.
Overview
대체에 대한 논의를 위해, "보통의 템플릿(ordinary template)"은 {{subst:pagename }} 패턴 (템플릿 이름공간의 페이지) 또는 {{subst:fullpagename }} (다른 이름공간의 페이지)에서 참조되는 페이지입니다. "사전-정의된 템플릿(predefined template)"은 유사하게 대체되는 변수 또는 파서 함수입니다.
대체는 대체되지 않은 템플릿, 변수, 파서 함수, 또는 매개변수의 확장 전에 수행되는 별도의 과정입니다.
대체 호출에는 그것에 삽입된 다른 대체 호출을 가질 수 있습니다. 마찬가지로 대체의 대체된 템플릿에는 다른 대체 호출을 포함할 수 있습니다. 템플릿 또는 파서 함수의 이름에 대한 표현, 대체된 템플릿 또는 파서 함수의 매개변수 정의 및 대체된 템플릿의 본문에서 대체가 먼저 수행됩니다.
확장은 나중에 수행되므로, 대체에 사용된 임의의 표현 중 이중 중괄호 쌍이 포함된 표현은 중괄호를 일반 텍스트로 처리할 것입니다. 따라서 대체 중에 대체 호출에 중괄호를 갖는 매개변수 이름 (예를 들어, {{subst:foo|a{{bc}}d=...}} )이 템플릿 본문에 있는 같은 이름의 매개변수 (예를 들어, {{{a{{bc}}d}}})와 일치할 수 있습니다.
존재하지 않는 템플릿 등에 대체를 적용하려고 하면 대체가 존재하지 않으며, 위키텍스트에 "subst:" 접두사가 유지됩니다.
대체 과정 후, 템플릿 등의 확장과 결과 위키텍스트의 다른 처리가 평소와 같이 작동합니다. 대체가 끝났으므로, 이것은 대체 중에 발생했던 매개변수 이름의 불일치는 취소할 수 없습니다 (아래의 "Partial substitution" 섹션도 참조하십시오).
다음 사항이 완전히 평가된 경우에만 대체가 가능합니다:
- 템플릿, 변수, 또는 파서 함수의 이름
- 템플릿의 경우에서: 템플릿 호출 및 템플릿 자체의 매개변수 이름
- if, #ifexpr, #ifexist, 및 #iferror의 경우에서, 콜론 뒤의 매개변수
- ifeq의 경우에서, 콜론 뒤의 매개변수와 그 다음 매개변수
- switch의 경우에서, 콜론 뒤의 매개변수와 등호 왼쪽의 표현식
앞서 말했듯이, 대체는 다른 확장보다 먼저 이루어지므로, 표현에 대체되지 않은 확장이 포함되면 위에서 언급한 필수 평가가 수행되지 않습니다.
언급된 것 외의 다른 파서 함수의 경우에도, 콜론 뒤에 있는 완전히 평가되지 않은 매개변수로 인해 파서 함수가 중괄호가 붙은 위키텍스트에 적용되고 확장된 위키텍스트에는 적용되지 않아 결과에 영향을 미칩니다.
예제:
- Template:MwTc를 사용하여 {{subst:Help:L{{tc}}k}}는 대체를 수행하지 않는데, 왜냐하면 Help:L{{tc}}k는 기존 페이지가 아니지만, Help:L{{tc}}k는 Help:Link로 렌더링됩니다. 따라서 결과 위키텍스트는 원본 위키텍스트와 같고 {{subst:Help:Link}}로 렌더링됩니다.
- {{#if:{{void|abc}}|yes|no}} (Template:void를 사용)는 "no"로 렌더링되고, 따라서 {{subst:#if:{{subst:void|abc}}|yes|no}}는 비슷하게 위키텍스트 "no"를 제공합니다. 다른 한편, {{subst:#if:{{void|abc}}|yes|no}}는 위키텍스트 "yes"를 제공하는데, 왜냐하면 Template:void는 대체 후에야 해결되기 때문입니다.
원칙적으로, 완전 대체를 통해 생성된 위키텍스트는, 즉시 뒤에, 보통의 포함을 갖는 위키텍스트와 같게 변환됩니다.
어쨌든, 파서 함수의 대체에서, 기본값을 갖는 정의되지 않은 매개변수는, 매개변수 값에 사용되며, 기본값으로 대체되지 않고 (영어 위키피디아), 예를 들어 #expr의 대체에서 평가되는 수치 표현식에서는 허용되지 않습니다:
- {{#expr:2*{{{p|3}}}}}는 6을 제공하고, 반면에 {{subst:#expr:2*{{{p|3}}}}}는 다음을 제공합니다: Expression error: unrecognised punctuation character "{"
이를 포함하는 템플릿의 대체에서, {{{p|3}}}은 {{{p}}}의 값이나 3으로 대체되므로, 그 때에 복잡함은 없습니다.
t2|a<noinclude>[[Category:Help:Templates templates]]</noinclude>를 포함하는 Template:T6를 사용하여 {{ {{t6}} }}는 {{ t2|a }}로 렌더링됩니다. {{subst:{{subst:t6}} }}는 위키텍스트 {{ t2demo|a }}를 제공하며, 같게 렌더링된 위키텍스트 {{subst:t2demo|a }}를 제공하고, 다음 편집/저장 시 start-a -middle-{{{2}}}-end로 변경됩니다. {{ {{subst:t6}} }}는 위키텍스트 {{ t2demo|a }}를 제공하며, start-a -middle-{{{2}}}-end로 렌더링됩니다. 이것은 대체가 없는 경우와 전체 대체의 경우 모두, 템플릿 호출에서 파이프 문자가 내부 템플릿 호출, 템플릿 매개변수, 링크, 및 이미지 태그 내부의 파이프 문자를 제외하고, 매개변수 정의를 서로 분리하고 템플릿 이름과 분리하기 때문입니다. 이 분리는 템플릿 이름과 매개변수 정의의 확장된 형식에 있는 여분의 파이프 문자에 따라 달라지지 않습니다. 어쨌든, 내부의 템플릿의 대체 후 파이프 문자가 외부 템플릿 호출에 있으면, 임의의 다른 것과 같은 것이고 분리를 결정하는 데 역할을 합니다. 다시 말해, 구문 분석은 대체를 위해 먼저 한 번 수행되고, 그런-다음 렌더링을 위해 한 번 수행되지만, 두 경우 모두에서 사이에 여분의 시간이 없습니다. 내부 템플릿만 대체하는 경우에서, 두 번의 후속 구문 분석이 효과적입니다.
{{{p|q}}} (기본값을 갖는 매개변수 태그)를 포함하는 템플릿을 대체할 때, 이것은 정의되면 p의 값을 반환하고 그렇지 않으면 q를 반환됩니다. 예를 들어, {{timc|t pd}} (영어 위키피디아)를 사용하여, {{subst:t pd}}는 위키텍스트 2를 제공합니다. 페이지가 자체적으로 대체되면 (예를 들어, 템플릿 페이지의 noinclude-part), 그것은 이전 버전을 대체합니다.
Usage considerations
앞서 언급했듯이, 대체 후에 보통의 템플릿이 변경되어도 대체된 페이지에는 영향을 미치지 않고, 시간에 따라 달라지는 대체 변수는 더 이상 시간에 따라 달라지지 않습니다. 어쨌든, 예를 들어 {{#expr:2*3}}의 대체는 렌더링에 전혀 영향을 미치지 않습니다.
페이지의 위키텍스트와 그것의 렌더링 사이의 관계는 대체 후에 더 쉽게 이해할 수 있는데, 왜냐하면 모든 위키텍스트가 함께 있고 매개변수 대체가 수행되었기 때문입니다.
그것은 더 복잡해질 수도 있습니다. 템플릿 호출을 이해하고 템플릿 컨텐츠를 이해하는 데 별도로 집중하는 것이 더 쉬울 수 있습니다. 대체 후의 위키텍스트는 필요한 위키텍스트를 직접 작성했을 때보다 종종 더 복잡합니다.
템플릿 호출과 달리 (템플릿에 대해 알고 있다면), 대체 후의 위키텍스트는 비슷한 결과를 어떻게 생성할 수 있는지 보여주지 않습니다. 위키텍스트는 길고 복잡할 수 있고, 따라서 직접 작성하기 번거로울 수 있거나, 예를 들어 계산에서 나온 숫자처럼 간단할 수 있지만, 직접 찾기는 번거로울 수 있습니다. 페이지의 위키텍스트를 연구할 때, 이 위키텍스트가 직접 작성하여 결과를 얻기 위해 찾아야 할 내용이라고 생각할 수 있으며, 매우 비실용적인 경우에도 마찬가지입니다.
그러한 경우에서, 템플릿 호출에 대한 문서화가 유용합니다. 컴퓨터 프로그래밍에서와 마찬가지로, 소스 코드 및/또는 데이터를 변경하여 새로운 결과를 생성하고, 대상 파일을 직접 변경하지 않으며, 여기서는 대체에서 발생하는 위키 텍스트를 직접 변경하는 대신 템플릿 호출 및/또는 템플릿을 변경합니다.
Ordinary templates
보통의 템플릿을 대체하는 경우에서, 템플릿 태그는 템플릿의 위키텍스트로 대체되며, 매개변수는 매개변수 값으로 대체됩니다.
예제: m:Template:t2 (backlinks edit), containing start-{{{1}}}-middle-{{{2}}}-end and called as {{subst:t2|[[a]]|{{tc}}}} (see {{tc}}) gives the wikitext: start-[[a]]-middle-{{tc}}-end, rendering as start-a-middle-in-end.
대체는 noinclude 부분과 includeonly 태그를 제거합니다.
매개변수:
- p=r를 갖는 대체는 r에 의해 {{{p}}}와 {{{p|q}}}를 대체합니다. 이것은 r이 {{{s}}} 또는 {{{s|t}}}의 형식인 경우를 포함합니다.
- 정의되지 않은 p를 갖는 대체는 {{{p}}}를 보존하고 기본값 q에 의해 {{{p|q}}}를 대체합니다 (영어 위키피디아).
subst:와 함께, 템플릿 태그를 위키텍스트로 대체하는 것은 재귀적으로 작동하지 않습니다. 전체 재귀적 대체에 대해, Special:ExpandTemplates를 사용합니다. 역시 아래의 substall, 및 multilevel substitution를 참조하십시오.
더 많은 템플릿 등을 포함하는 다른 템플릿을 단계적으로 대체하는 것은 복잡한 템플릿의 동작을 분석하고 문서화하는 데 유용할 수 있습니다.
어쨌든, 대체 후에는 페이지가 다르게 렌더링될 수 있습니다. 예를 들어, 템플릿이 대체 후에 다른 템플릿의 확장을 결정하는 중괄호, 파이프, 및/또는 등호를 생성하지만, 대체 없이 일반 텍스트로 처리됩니다.
매개변수가 없는 경우, 템플릿 대체는 위키텍스트를 복사하거나 미리 보거나 저장된 {{ msgnw:pagename }} 포함을 렌더링하는 것과 비교될 수 있습니다. 어쨌든, 템플릿 대체는 <noinclude> 부분을 제외하고, <includeonly> 태그를 제거하고, 정의되지 않은 매개변수를 기본값으로 대체합니다.
Predefined templates
미리 정의된 템플릿을 대체하는 경우에서, 다른 템플릿에 의존하는 매개변수 없이, 태그는 결과로 대체됩니다.
변수에 subst를 적용하는 것은 템플릿에 적용하는 것과 같습니다. 예를 들어, 타임스탬프:
{{subst:CURRENTYEAR}}-{{subst:CURRENTMONTH}}-{{subst:CURRENTDAY}} T {{subst:CURRENTTIME}} [[w:UTC|]]
위는 다음 위키텍스트를 제공하며
2010-04-10 T 06:30 [[w:UTC|UTC]]
다음과 같이 렌더링됩니다:
2010-04-10 T 06:30 UTC
또 다른 템플릿에 의존하는 매개변수를 갖는 미리 정의된 템플릿을 대체하는 경우에서, 별도의 subst: 수정자로 해당 템플릿도 대체되어야 하며, 그렇지 않으면 결과가 정의되지 않습니다.
- {{subst:UC:{{subst:tc}}}} - gives IN, the same wikitext as {{UC:{{tc}}}} is expanded to; UC: is applied to the output "in" of Tc.
- {{subst:ns:{{subst:#expr:2*3}}}} - 파일을 제공합니다.
- {{ns:{{subst:#expr:2*3}}}} - File로 렌더링되는 위키텍스트 {{ns:6}}를 제공합니다.
- {{subst:t1|{{subst:NAMESPACE}}}} - 위키텍스트 startHelpend를 제공합니다 ({{t1}}를 참조)
- {{subst:t1|{{subst:#expr:3*4}}}} - 위키텍스트 start12end를 제공합니다
- {{subst:t1|{{subst:uc:AbCdEf}}}} - 위키텍스트 startABCDEFend를 제공합니다
- {{subst:#expr:{{subst:3X|11*}}1}} - 위키텍스트 1331를 제공합니다
- {{subst:UC:{{subst:3X|abc}}}} - 위키텍스트 ABCABCABC를 제공합니다
- {{subst:LC:{{subst:#expr:1/100000}}}} - 위키텍스트 1e-05를 제공합니다
- {{subst:#expr:2*{{subst:CURRENTDAY}}}} - (글을 쓸 당시) 위키텍스트 30을 제공합니다
- {{subst:UC:{{subst:CURRENTDAYNAME}}}} - (글을 쓸 당시) 위키텍스트 THURSDAY를 제공합니다
어쨌든:
- {{subst:UC:{{tc}}}} - Template:TC로 렌더링되는 위키텍스트 {{TC}}를 제공합니다.
- {{subst:ns:{{#expr:2*3}}}} - {{subst:ns:{{#expr:2*3}}}}로 유지되며, {{subst:ns:6}}로 렌더링됩니다.
이전에 언급했듯이, 대체에서, 템플릿, 변수, 및 파서 함수의 대체 없이 모든 호출은 일반 텍스트로 처리됩니다. 결과로서, 중첩된 {{ x:...{{ y:...}} }}에서 외부 x:의 대체는 모든 내부 y:도 대체되는 경우에만 적합한 경우가 많습니다.
미리 정의된 템플릿을 대체하는 경우에서, 매개변수 중 하나에 대한 표현이 정의되지 않은 p를 갖는 {{{p|3}}}을 포함하고 있으면, 이 코드는 3으로 축소됩니다. 어쨌든, 페이지 자체에서, {{{p|3}}}는 3이 아니라 그대로 처리됩니다.
예제:
- {{#expr:2*{{{p}}}}} → Expression error: Unrecognized punctuation character "{".
- {{#expr:2*{{{p|3}}}}} → 6
- {{subst:#expr:2*{{{p|3}}}}} → Expression error: Unrecognized punctuation character "{".
- {{<includeonly>subst:</includeonly>#expr:2*{{{p|3}}}}}를 포함하는 템플릿을 대체하는 것은 p에 값을 지정하지 않으면 6을 제공하고, 값을 지정하면 숫자 p를 두 배합니다.
- 같은 결과는 대체 호출이 "subst=subst:"의 매개변수를 가지면 {{{{{subst}}}#expr:2*{{{p|3}}}}}를 포함하는 템플릿에서 얻을 수 있습니다.
비교:
- {{uc:2*{{{p}}}}} → 2*{{{P}}}
- {{uc:2*{{{p|q}}}}} → 2*Q
- {{subst:uc:2*{{{p|q}}}}} → 위키텍스트 2*{{{P|Q}}}이며 2*Q로 렌더링됩니다
그리고 (위에서) 역시:
- {{subst:UC:{{subst:tc}}}} - {{UC:{{tc}}}}가 하는 것과 마찬가지로 IN를 제공합니다; UC는 Tc의 출력 "in"에 적용됩니다.
- {{subst:UC:{{tc}}}} - 위키텍스트 {{TC}}를 제공하며 Template:TC로 렌더링됩니다.
UC의 대체에서, 포함 태그 {{tc}}는 {{{p|q}}}와 마찬가지로 문자열로 처리됩니다.
Partial substitution
보통의 템플릿 내부에서, 매개변수를 포함하는 보통의 템플릿 호출에 대체를 적용하여, 매개변수를 포함하는 직접 위키텍스트에 의해 그것을 대체할 수 있습니다. 그것은 두 템플릿을 자동으로 병합하는 것과 같습니다 (합성 함수와 같은 "합성 템플릿"을 만듬). 내부 및/또는 외부 템플릿이 미리 정의된 경우에는 불가능합니다. (어쨌든, 예를 들어, 또 다른 템플릿 내부에서 #expr의 호출을 수동으로 병합하는 것은 12 자릿수로 중간 반올림하는 것을 피함으로써 결과의 정확도를 높이는 데 유용합니다.)
이 방법을 사용하면 아래에 설명된 선택적 대체 기술을 사용하지 않고 간단히 subst:를 사용함으로써 생성된 외부 템플릿의 대체를 적용할 수 있습니다(중첩 수준이 더 많은 경우가 아닌 한).
예제:
- {{subst:t}} - 위키텍스트 start-{{{1|pqr}}}-end를 제공합니다, 바로 m:Template:t (backlinks edit)의 그것, noinclude 부분과 includeonly 태그 없음.
- {{subst:t|a{{{p|q}}}b}} - 위키텍스트 start-a{{{p|q}}}b-end를 제공합니다
이중 대체를 갖는 예제:
- {{subst:3X|{{subst:t}}}} - 위키텍스트 start-{{{1|pqr}}}-endstart-{{{1|pqr}}}-endstart-{{{1|pqr}}}-endstart-{{{1|q}}}-end를 제공합니다
- {{subst:3X|{{subst:t|{{{1|q}}}}}}} - 위키텍스트 start-{{{1|q}}}-endstart-{{{1|q}}}-endstart-{{{1|q}}}-end를 제공합니다
Multilevel substitution
템플릿을 대체할 때 템플릿 내부에서도 대체를 수행하는 것이 바람직할 수 있습니다. 이것은 템플릿에서 safesubst:로 수행할 수 있습니다. 조기 대체 (즉, 템플릿이 저장될 때)를 방지하기 위해, 대체 지시문, 즉, safesubst:<noinclude / 위에 지시문 <noinclude />을 덧붙일 수 있습니다. 또 다른 해결책은 사용되지 않는 매개변수의 기본값을 사용하는 것입니다. 종종 빈 문자열 (예를 들어, safesubst:)이 작동하지만, 때로는 템플릿을 호출하거나 주석을 삽입하는 모듈에서 사용됩니다.
subst:<noinclude /와의 차이점은 safesubst:<noinclude /가 safesubst:로 평가될 때 다중-레벨 대체뿐만 아니라 다중 레벨 전달-삽입도 허용한다는 것인데, 왜냐하면 전달-삽입에서는 무시되기 때문입니다. 템플릿을 만들어서 이들 두 가지 옵션과 단일-레벨 대체 (그리고 더 많은 템플릿, 변수, 및/또는 파서 함수가 관련되면 더 많은 선택) 중에서 선택할 수 있도록 하려면 하나 이상의 매개변수가 필요합니다. 아래를 참조하십시오.
Multilevel substitution with independent control of each substitution separately
매개변수 subst (또는 그 이상, 각각 고유한 이름을 가짐)는 safesubst:와 빈 문자열을 가능한 값으로 사용할 수 있습니다. 따라서 예를 들어 외부 템플릿이 대체될 때 내부 템플릿도 대체되는지 여부를 제어할 수 있습니다. 두 가지 가능성 모두 기본값으로 만들 수 있습니다.
매개변수를 갖는 내부 템플릿은 같은 방식으로 추가적인 내부 대체를 제어할 수 있습니다; 이들 매개변수는 내부 템플릿의 대체를 제어하는 대체 매개변수에 따라 달라질 수 있는데, 왜냐하면 해당 템플릿이 대체되지 않으면, 해당 템플릿 내에서의 내부 대체가 불가능하기 때문입니다.
마찬가지로, 내부 템플릿에 여러 개의 템플릿, 변수, 및/또는 파서 함수가 있으면, 다른 매개변수를 사용함으로써 독립적으로 또는 일부 또는 모두에 같은 매개변수를 사용함으로써 모든 대체를 제어할 수 있습니다.
예를 들어, 템플릿 T가 매개변수 subst1를 사용하면:
- 기본값으로 빈 문자열을 가짐, T는 이름에 {{{subst1|}}} 접두사를 붙여 내부 템플릿과 파서 함수를 호출합니다; T를 호출하기 위해 다음을 사용할 수 있습니다:
- {{t|..}} - 대체 없음
- {{subst:t|..}} - 단일-수준 대체
- {{subst:t|subst1=subst:|..}} - 두-수준 대체
- {{subst:t|subst1=safesubst:|..}} - 같게
- 기본값 "safesubst:"을 가짐, T는 이름에 {{{subst1|safesubst:}}} 접두사를 붙여 내부 템플릿과 파서 함수를 호출합니다; T를 호출하기 위해 다음을 사용할 수 있습니다:
- {{t|..}} - 대체 없음
- {{subst:t|subst1=|..}} - 단일-수준 대체
- {{subst:t|..}} - 두-수준 대체
T의 내부 템플릿 내부에서 호출되는 템플릿과 파서 함수에 대체할지 말지 선택을 전달하기 위해, 이들 내부 템플릿의 호출에 각각 subst2={{{subst1|}}} 또는 subst2={{{subst1|safesubst:}}} 형식의 것을 추가할 수 있습니다 (변수와 파서 함수는 추가 매개변수를 얻지 못합니다).
Partial substitution
오직 보통의 대체를 갖는 선택적 subst=subst:를 위해 준비된 템플릿을 사용하여, 매개변수 값을 지정 없이, 복사 및 붙여넣기와 같이 또 다른 템플릿에 코드를 삽입할 수 있지만, 모든 <noinclude> 부분과 <includeonly> 키워드는 자동으로 제거됩니다. 삽입된 코드를 호출하는 대신 실행하는 것이 서버에 더 효율적일 수 있습니다.
이 기술에 대해 전형적인 예제는 m:Template:len (backlinks edit)와 같은 #switch:에서 테스트 표현식으로 사용되는 템플릿을 또 다른 템플릿 내에서 확장하는 것입니다:
- 개발 코드:
{{parameter tag}} - 표준 해결책:
{{parameter tag}} - 더 좋은 해결책: 이 위키텍스트를 사용하여 대체를 적용함으로써 템플릿 코드를 생성:
{{parameter tag}}
m:Template:len (backlinks edit)는 선택적 대체가 가능하고, 따라서 두 해결책 모두 작동하지만, 후자의 해결책은 코드를 대체하는 것이 더 간단하고 효율적입니다.
Template:len가 이런 방식으로 대체되었던 경우에 대해 m:Template:csn (backlinks edit) 및 m:Template:lz12 (backlinks edit)를 참조하십시오.
만약 템플릿이 템플릿이나 파서 함수를 포함하는 표현식의 이름을 매개변수로 사용하고, (매개변수의 최종 이름의 관점에서) 해당 매개변수 정의로 템플릿을 호출하면, 템플릿 확장 시 매개변수 이름의 표현식이 평가되거나 평가된 경우에만 적절하게 확장됩니다. 따라서, 표현식을 매개변수 이름으로 대체하지 않고 템플릿을 대체하면, 매개변수 정의가 "손실"되므로, 매개변수가 정의되지 않습니다. 그러므로, 그러한 경우에서 대체를 전혀 하지 않아도 전체 대체와 동일한 렌더링된 결과를 얻을 수 있지만, 부분 대체는 다른 결과를 제공합니다. 예를 들어 m:Template:ts1 (backlinks edit)을 참조하십시오.
Composite operations
{{A|{{B|p}}}}에 의해, 템플릿 A는 매개변수 p를 갖는 템플릿 B의 호출을 매개변수로 하여 호출됩니다. 그러한 템플릿 호출을 매개변수 p를 갖는 "합성 템플릿" C의 단일 호출 {{C|p}}에 통합할 수 있습니다.
- 템플릿 C에 대한 위키텍스트는 {{A|{{B|{{{1}}}}}}}가 되거나, 선택적 대체와 함께 다음 구조 :가 됩니다
- {{ Template:(((subst|Template:))) A|{{ Template:(((subst|Template:))) B|{{{1}}} |subst=Template:(((subst|Template:))) }} |subst=Template:(((subst|Template:))) }}
- subst={{{subst|}}}는 위에서 설명한 대로 재귀적 대체에만 필요합니다.
{{subst|subst:}}를 지정하는 것은 유용하지 않은데 왜냐하면 대체 단계에서 이 태그는 기본 subst:로 축소되지 않기 때문입니다.
A 및/또는 B가 미리 정의되면, 구성은 비슷하지만, 해당 템플릿에 대한 subst={{{subst|}}}가 없습니다.
includeonly
조기 대체를 방지하기 위한 대체 방법은, "includeonly subst magic"으로 알려져 있으며, includeonly 태그 쌍을 사용하는 것입니다. 대체는 이들 태그 내부에 템플릿 호출을 가짐으로써 방지됩니다. 대체는 역시 매개변수 정의 내부를 제외한 템플릿 호출에서 어느 곳에나 하나 또는 두 태그를 가짐으로써 방지됩니다. 따라서 태그는 safesubst: 또는 subst: 앞, 내부, 또는 뒤에 있거나, 템플릿 이름 내부 또는 뒤에 있을 수 있습니다. 두 태그의 위치는 템플릿 페이지 자체의 렌더링에만 영향을 미칩니다.
{{<includeonly>safesubst:</includeonly>something}} 형식은 페이지 자체에서 safesubst:를 삭제함으로써 대체가 방지되는 것처럼 보이지만, 실제로는 태그에 의해 safesubst-구문이 방해를 받기 때문에 대체가 방지됨을 제안합니다.
관련 템플릿을 생성할 당시에는 "something"를 대체하지 않지만, 템플릿이 대체될 때 원하는 효과가 나타납니다.
예를 들어, Extension:InputBox에서 "preload"와 Help:Magic words에서 "substitution"를 참조하십시오.
Creating a page which applies substitution on the next save
Manual:Recursive conversion of wikitext를 참조하십시오.
Forced substitution
일부 템플릿은 대체 없이는 의도적으로 작동을 거부합니다. 예를 들어 w:Template:En를 참조하십시오. 이 기술은 w:Template:En와 같이 일종의 타임스탬프를 생성하는 템플릿에 필수적입니다. 예를 들어 날짜가 있는 카테고리에 페이지를 추가합니다.
다음 코드는 subst=subst:를 갖는 재귀적 대체가 적용되지 않는 한 임의의 템플릿 T에서 경고를 출력합니다: {{{{{subst|}}}ifdef|{{{{{subst|subst:}}}ns:0}}|'''Warning'''}}.
- Output for {{T}} or {{subst:T}} - Warning
- Output for {{T|subst=subst:}} - Template:Ifdef
- Output for {{subst:T|subst=subst:}} - nothing (no remaining wikitext)
이것은 ifdef를 #if:로 대체하는 것이 직접적으로 작동하지 않는 드문 경우입니다.
Substitution of part of the parameters
템플릿 Feelings가 매개변수 1과 2를 사용한다고 놓습니다. 매개변수 1이 하나 있고, Feelings에 대응하며 매개변수 2의 주어진 값 love를 갖는 템플릿 Emotions를 만드는 것을 생각해 보십시오. {{Feelings|2=love}}와 {{Feelings|1={{{1}}}|2=love}}를 비교해 보십시오. 그것들은 템플릿 페이지에서는 동일하게 보입니다. 예를 들어 m:Template:t ps (backlinks edit)를 참조하십시오. 하지만 첫 번째는 {{{1}}}가 매개변수가 아닌 텍스트로 처리되기 때문에 작동하지 않습니다.
어쨌든, 대체 (subst: 또는 Special:Expandtemplates를 사용)를 사용하면 결과 위키텍스트는 같고, 텍스트 {{{1}}}와 매개변수를 구별하지 않습니다. 어쨌든 그것이 매개변수이므로, 1={{{1}}}가 필요하지 않습니다.
예를 들어 Feelings에 두 매개변수를 모두 포함하는 표현식을 갖는 #expr이 들어 있으면, 같은 것이 적용됩니다. 단, 파서 함수가 아닌 가장 높은 수준 (Feelings)만 대체할 수 있으므로, Special:Expandtemplates를 사용해서는 안됩니다.
일반적으로, 매개변수를 대체하고 템플릿이나 파서 함수를 적용하면 템플릿이나 파서 함수를 3중-중괄호 매개변수 코드로 대체하고 그런-다음 매개변수를 대체하는 것과 같은 결과가 나올 때도 있습니다.
기본값 없이 (모든 것이 대체 없이 한 단계 대체로 동일하게 렌더링됨):
등호를 갖는 예제:
- Feelings template containing With {{{1}}} one can {{{2}}}
- When substituted with 1=love, 2=help, it gives With love one can help.
- When substituted with 2=help, it gives With {{{1}}} one can help. This itself, when substituted with 1=compassion, it gives With compassion one can help.
- Two-level substitution of a template containing {{#if:{{{4}}}|{{{3}}}p}}.
- When substituted with 3=u, 4=v, it gives up.
- When substituted with 4=v, it gives {{{3}}}p. This itself, when substituted with 3=u, it gives up.
등호 없는 예제:
- Two-level substitution of a template containing {{#if:{{{3}}}|{{{4}}}p}}
- When substituted with 3=, 4=v, it gives the empty string.
- When substituted with 4=v, it gives vp. This itself, when substituted with 3=u, it remains vp.
- Two-level substitution of a template containing {{#if:{{{2}}}|{{{1}}}p}}
- When substituted with 1=u, 2=v, it gives up.
- When substituted with 2=v, it gives {{{1}}}pp (the bug). This itself, when substituted with 3=u, it gives upp.
- Two-level substitution of a template containing {{#expr:{{{1}}}*{{{2}}}}}
- When substituted with 1=7, 2=8, it gives 56.
- When substituted with 2=8, it gives Expression error: Unrecognised punctuation character "{". This itself, when substituted with 1=7, it remains the same.
따라서 등호 없이 오류 메시지가 나타날 수도 있고 나타나지 않을 수도 있습니다.
한 가지 예는 위에서 언급한 버그로 인해 한 매개변수의 대체가 영향을 받을 수 있음을 보여줍니다. 어쨌든, 예를 들어 {{{1}}}을 {{{1{{{{{substvoid|}}}void}}}}}로 대체하고 전체 대체를 수행할 수 있지만, substvoid는 정의되지 않아 버그가 발생하지 않습니다. 결과는 전달-삽입으로 이미 올바르게 작동합니다. 그 이후에 substvoid=subst:로 대체하여 일반 {{{1}}}을 얻을 수 있습니다.
기본값과 함께:
대체 없이 동일하게 렌더링됨:
- Two-level substitution of a template containing With {{{1|love}}} one can {{{2}}} with 2=help gives With {{{1|love}}} one can help.
- Two-level substitution of a template containing {{#if:{{{4}}}|{{{3|d}}}p}} with 4=v gives dp.
대체 없이 동일하게 렌더링되지 않음:
- Two-level substitution of a template containing {{#if:{{{3|}}}|{{{4}}}p}} with 4=v gives vp.
- Two-level substitution of a template containing {{#if:{{{2}}}|{{{1|d}}}p}} with 2=v gives dpp (the bug).
- Two-level substitution of a template containing {{#expr:{{{1|6}}}*{{{2}}}}} with 2=8 gives: Expression error: Unrecognised punctuation character "{"
매개변수 정의로 대체한 후:
- {{subst:#if:{{{3|}}}|vp}} → vp
- {{subst:#if:v|{{{1|d}}}p}} → dpp (the bug)
- {{subst:#expr:{{{1|6}}}*8}} → Expression error: Unrecognised punctuation character "{"
다시-씀:
- {{subst:#if:{{subst:#ifeq:{{{3|+}}}|{{{3|-}}}|vp}}}} → the empty string
- {{subst:#if:v|{{subst:#ifeq:{{{1|+}}}|{{{1|-}}}|{{{1}}}|d}}p}} → dp
- {{subst:#expr:{{subst:#ifeq:{{{1|+}}}|{{{1|-}}}|{{{1}}}|6}}*8}} → 48
Limitations
대체는 <ref>...</ref> 및 <gallery>...</gallery>와 같은 파서 태그 내부에서는 유용하지 않습니다. 만약 {{subst:foo}}를 작성하면, 그것이 대체되지도 않고 전달-삽입되지 않지만, 그대로 유지됩니다.
Documenting substitution
subst:를 통한 템플릿 사용은 페이지 역사에 자동으로 표시되지 않습니다. 그러므로, 편집 요약에 "subst:"를 포함하는 위키텍스트 줄을 제공하는 것이 특히 유용합니다.
역시 대체된 템플릿이 있는 페이지는 백링크에 표시되지 않고, 템플릿은 편집 페이지에서 전달-삽입된 템플릿 목록에 표시되지 않습니다. 템플릿은 대체를 추적하기 위해 페이지를 카테고리에 추가할 수 있지만, 페이지에 이 카테고리를 나열하는 것은 페이지가 속한 컨텐츠-기반 카테고리 목록을 어지럽힐 수 있습니다. 역시, noinclude 태그 외부의 주석은 위키텍스트에 포함됩니다. 따라서 주석을 사용하여 템플릿을 언급할 수 있습니다. 그것은 매개변수의 값을 포함할 수도 있는데, 매개변수 대체는 주석에서도 작동하기 때문입니다.
See also
- Help:Substitution/tl;dr – tl;dr
- w:Help:Substitution#The safesubst: modifier
- w:Wikipedia:Template substitution – partly technical, partly policy
- Phabricator:T4003 – feature request to allow marking a template as being substituted without subst:
- Templates containing a call to itself with subst: and producing a similar call with updated info, either replacing or adding to the previous info:
- The pipe trick, which behaves similarly to template substitution