모듈:논쟁들
Module| 이 Lua 모듈은 시스템 메시지 및 약 31,700,000 페이지, 즉 전체 페이지의 약 54%에 사용됩니다. 변경하면 Wikipedia 사용자 인터페이스가 즉시 변경될 수 있습니다. 큰 중단과 서버 로드를 방지하려면 모듈의 /sandbox 또는 /testcase 하위 페이지 또는 자체 모듈 샌드박스에서 변경 사항을 테스트해야 합니다.테스트된 변경 사항은 한 번의 편집으로 이 페이지에 추가할 수 있습니다.변경 사항을 구현하기 전에 대화 페이지에서 변경 사항에 대해 논의하십시오. |
| 이 모듈은 페이지 보호 대상입니다.매우 많은 페이지에서 사용 중이거나 매우 자주 교체되는 가시성이 높은 모듈입니다.파괴 행위나 실수는 많은 페이지에 영향을 미치고 사소한 편집도 서버에 상당한 부하를 줄 수 있으므로 편집으로부터 보호됩니다. |
이 모듈은 에서 전달된 인수를 쉽게 처리할 수 있습니다.#invoke이 모듈은 다른 모듈에서 사용하기 위한 메타 모듈이므로 호출해서는 안 됩니다.#invoke직접(템플릿으로 직접 호출할 수 있는 모듈의 경우 {{#params:params}}).기능은 다음과 같습니다.
- 인수를 쉽게 트리밍하고 빈 인수를 제거할 수 있습니다.
- 인수는 현재 프레임과 상위 프레임 모두에서 동시에 전달할 수 있습니다.(자세한 내용은 아래에 있습니다.)
- 인수는 다른 Lua 모듈 또는 디버그 콘솔에서 직접 전달할 수 있습니다.
- 대부분의 기능을 사용자 지정할 수 있습니다.
기본사용
먼저 모듈을 로드해야 합니다.이름이 지정된 하나의 함수를 포함합니다.getArgs.
현지의 args를 얻다 = 요구하다('모듈:인수').args를 얻다 가장 기본적인 시나리오에서는 주요 기능 내에서 getArgs를 사용할 수 있습니다.변수args는 #vmdk의 인수를 포함하는 테이블입니다.(자세한 내용은 아래를 참조하십시오.)
현지의 args를 얻다 = 요구하다('모듈:인수').args를 얻다 현지의 p = {} 기능. p.주된(틀) 현지의 논병아리 = args를 얻다(틀) 메인 모듈 코드는 여기에 있습니다. 끝. 돌아가다 p 권장 프랙티스
그러나 #invoke의 인수를 처리하는 데만 함수를 사용하는 것이 좋습니다.즉, 다른 Lua 모듈에서 사용자의 모듈을 호출하는 경우 프레임 개체를 사용할 필요가 없으므로 성능이 향상됩니다.
현지의 args를 얻다 = 요구하다('모듈:인수').args를 얻다 현지의 p = {} 기능. p.주된(틀) 현지의 논병아리 = args를 얻다(틀) 돌아가다 p._본(논병아리) 끝. 기능. p._본(논병아리) 메인 모듈 코드는 여기에 있습니다. 끝. 돌아가다 p 템플릿에서 호출되는 방법은 다음과 같습니다.{{#invoke:Example main}}(선택적으로 다음과 같은 일부 매개변수를 사용합니다.{{#invoke:Example main arg1=value1 arg2=value2}}), 모듈에서 호출되는 방법은require('Module:Example')._main({arg1 = 'value1', arg2 = value2, 'spaced arg3' = 'value3'})이 두 번째 방법은 인수가 포함된 테이블을 구성한 다음 해당 테이블을 p._main(args) 함수에 제공하며, 이 함수는 이를 기본적으로 사용합니다.
다중 함수
여러 함수가 인수를 사용하고 #invoke에서 액세스할 수 있도록 하려면 래퍼 함수를 사용할 수 있습니다.
현지의 args를 얻다 = 요구하다('모듈:인수').args를 얻다 현지의 p = {} 현지의 기능. 호출 기능 만들기(funcName) 돌아가다 기능. (틀) 현지의 논병아리 = args를 얻다(틀) 돌아가다 p[funcName](논병아리) 끝. 끝. p.func1 = 호출 기능 만들기('_func1') 기능. p._func1(논병아리) 첫 번째 함수의 코드는 여기에 표시됩니다. 끝. p.func2 = 호출 기능 만들기('_func2') 기능. p._func2(논병아리) 두 번째 기능의 코드는 여기에 표시됩니다. 끝. 돌아가다 p 옵션들
다음 옵션을 사용할 수 있습니다.아래 섹션에 설명되어 있습니다.
현지의 논병아리 = args를 얻다(틀, { 다듬다 = 거짓의, 공백 제거 = 거짓의, valueFunc = 기능. (열쇠, 가치) 하나의 인수를 처리하기 위한 코드 끝., 프레임 전용 = 진실의, 상위 항목만 = 진실의, 부모 우선 = 진실의, 포장지 = { '템플릿:래퍼 템플릿', '템플릿:다른 래퍼 템플릿' }, 읽기 전용 = 진실의, 덮어쓰기 안 함 = 진실의 }) 블랭크 트리밍 및 제거
공백 인수는 종종 MediaWiki 템플릿을 Lua로 변환하는 데 익숙하지 않은 코더를 넘어뜨립니다.템플릿 구문에서 공백 문자열과 공백으로만 구성된 문자열은 거짓으로 간주됩니다.그러나 Lua에서는 공백으로 구성된 빈 문자열과 문자열이 참으로 간주됩니다.이는 Lua 모듈을 작성할 때 이러한 인수에 주의를 기울이지 않으면 실제로 거짓으로 처리되어야 하는 것을 진실로 처리할 수 있다는 것을 의미합니다.이 문제를 방지하기 위해 기본적으로 이 모듈은 빈 인수를 모두 제거합니다.
마찬가지로, 공백은 위치 인수를 처리할 때 문제를 일으킬 수 있습니다.#invoke에서 오는 명명된 인수에 대해서는 공백이 잘리지만 위치 인수에 대해서는 유지됩니다.대부분의 경우 추가 공백은 필요하지 않으므로 이 모듈은 기본적으로 공백을 잘라냅니다.
그러나 빈 인수를 입력으로 사용하고 추가 공백을 유지하려는 경우도 있습니다.이 작업은 일부 템플릿을 작성된 대로 정확하게 변환하는 데 필요할 수 있습니다.이 작업을 수행하려면 다음을 설정할 수 있습니다.trim그리고.removeBlanks에 대한 주장.false.
현지의 논병아리 = args를 얻다(틀, { 다듬다 = 거짓의, 공백 제거 = 거짓의 }) 사용자 지정 인수 형식 지정
때때로 빈 인수는 제거하고 다른 인수는 제거하지 않거나 모든 위치 인수를 소문자로 표시할 수도 있습니다.이러한 작업을 수행하려면 다음을 사용할 수 있습니다.valueFunc선택.이 옵션에 대한 입력은 두 가지 매개 변수를 사용하는 함수여야 합니다.key그리고.value단일 값을 반환합니다.이 값은 필드에 액세스할 때 얻을 수 있는 값입니다.key에서args테이블.
예제 1: 이 함수는 첫 번째 위치 인수의 값에 대한 공백을 유지하지만 다른 모든 인수의 값을 잘라내고 다른 모든 빈 인수를 제거합니다.
현지의 논병아리 = args를 얻다(틀, { valueFunc = 기능. (열쇠, 가치) 한다면 열쇠 == 1 그리고나서 돌아가다 가치 그렇지 않으면 가치 그리고나서 가치 = mw.본문.다듬다(가치) 한다면 가치 ~= '' 그리고나서 돌아가다 가치 끝. 끝. 돌아가다 영의 끝. }) 예제 2: 이 함수는 빈 인수를 제거하고 모든 인수 값을 소문자로 변환하지만 위치 매개 변수에서 공백을 자르지는 않습니다.
현지의 논병아리 = args를 얻다(틀, { valueFunc = 기능. (열쇠, 가치) 한다면 것은 아니다. 가치 그리고나서 돌아가다 영의 끝. 가치 = mw.ustring.더 낮게(가치) 한다면 mw.ustring.찾아내다(가치, '%S') 그리고나서 돌아가다 가치 끝. 돌아가다 영의 끝. }) 참고: 유형이 아닌 입력을 전달하면 위의 기능이 실패합니다.string또는nil이것은 당신이 사용하는 경우에 해당할 수 있습니다.getArgs모듈의 주요 기능에서 기능하고, 해당 기능은 다른 Lua 모듈에 의해 호출됩니다.이 경우 입력 유형을 확인해야 합니다.만약 당신이 #invoke의 인수를 위해 특별히 함수를 사용한다면 이것은 문제가 되지 않습니다.p.main그리고.p._main함수 또는 유사한 것).
유형 검사를 사용한 예 1 및 2 |
|---|
| 예 1: 현지의 논병아리 = args를 얻다(틀, { valueFunc = 기능. (열쇠, 가치) 한다면 열쇠 == 1 그리고나서 돌아가다 가치 그렇지 않으면 유형(가치) == '끈' 그리고나서 가치 = mw.본문.다듬다(가치) 한다면 가치 ~= '' 그리고나서 돌아가다 가치 또 다른 돌아가다 영의 끝. 또 다른 돌아가다 가치 끝. 끝. }) 예 2: 현지의 논병아리 = args를 얻다(틀, { valueFunc = 기능. (열쇠, 가치) 한다면 유형(가치) == '끈' 그리고나서 가치 = mw.ustring.더 낮게(가치) 한다면 mw.ustring.찾아내다(가치, '%S') 그리고나서 돌아가다 가치 또 다른 돌아가다 영의 끝. 또 다른 돌아가다 가치 끝. 끝. }) |
또한, 주의할 점은valueFunc함수는 인수가 요청될 때마다 다소 호출됩니다.args테이블, 따라서 성능에 관심이 있다면 코드로 비효율적인 작업을 수행하지 않도록 해야 합니다.
프레임 및 상위 프레임
의 인수args테이블은 현재 프레임 또는 해당 상위 프레임에서 동시에 전달될 수 있습니다.이것이 무엇을 의미하는지 이해하려면, 예를 들어보는 것이 가장 쉽습니다.예를 들어 다음과 같은 모듈이 있습니다.Module:ExampleArgs이 모듈은 전달된 처음 두 개의 위치 인수를 인쇄합니다.
모듈:Args 코드 예 |
|---|
현지의 args를 얻다 = 요구하다('모듈:인수').args를 얻다 현지의 p = {} 기능. p.주된(틀) 현지의 논병아리 = args를 얻다(틀) 돌아가다 p._본(논병아리) 끝. 기능. p._본(논병아리) 현지의 첫번째 = 논병아리[1] 또는 '' 현지의 둘째 = 논병아리[2] 또는 '' 돌아가다 첫번째 .. ' ' .. 둘째 끝. 돌아가다 p |
Module:ExampleArgs그러면 에 의해 호출됩니다.Template:ExampleArgs코드를 포함하는 것.{{#invoke:ExampleArgs main firstInvokeArg}}이렇게 하면 "firstInvokeArg"라는 결과가 생성됩니다.
이제 우리가 전화를 한다면,Template:ExampleArgs다음과 같은 상황이 발생할 수 있습니다.
| 코드 | 결과 |
|---|---|
{{ExampleArgs}} | 첫 번째 호출 Arg |
{{ExampleArgs firstTemplateArg}} | 첫 번째 호출 Arg |
{{ExampleArgs firstTemplateArg secondTemplateArg}} | 첫 번째 InvokeArg 두 번째 TemplateArg |
이 동작을 변경하기 위해 설정할 수 있는 세 가지 옵션이 있습니다.frameOnly,parentOnly그리고.parentFirst설정하는 경우frameOnly그러면 현재 프레임에서 전달된 인수만 허용됩니다. 설정한 경우parentOnly그러면 상위 프레임에서 전달된 인수만 허용됩니다. 그리고 설정한 경우parentFirst그러면 현재 프레임과 상위 프레임 모두에서 인수가 전달되지만 상위 프레임이 현재 프레임보다 우선합니다.다음과 같은 측면에서 결과가 있습니다.Template:ExampleArgs:
- 프레임 전용
| 코드 | 결과 |
|---|---|
{{ExampleArgs}} | 첫 번째 호출 Arg |
{{ExampleArgs firstTemplateArg}} | 첫 번째 호출 Arg |
{{ExampleArgs firstTemplateArg secondTemplateArg}} | 첫 번째 호출 Arg |
- 상위 항목만
| 코드 | 결과 |
|---|---|
{{ExampleArgs}} | |
{{ExampleArgs firstTemplateArg}} | 첫 번째 템플릿 Arg |
{{ExampleArgs firstTemplateArg secondTemplateArg}} | 첫 번째 TemplateArg 두 번째 TemplateArg |
- 부모 우선
| 코드 | 결과 |
|---|---|
{{ExampleArgs}} | 첫 번째 호출 Arg |
{{ExampleArgs firstTemplateArg}} | 첫 번째 템플릿 Arg |
{{ExampleArgs firstTemplateArg secondTemplateArg}} | 첫 번째 TemplateArg 두 번째 TemplateArg |
주의:
- 둘 다 설정하는 경우
frameOnly그리고.parentOnly옵션, 모듈이 #module에서 인수를 전혀 가져오지 않습니다.이것은 아마도 당신이 원하는 것이 아닐 것입니다. - getArgs가 현재 프레임이 아닌 부모 프레임을 통과하는 경우와 같이 일부 상황에서는 부모 프레임을 사용할 수 없습니다.이 경우 frame 인수만 사용됩니다(parentOnly가 설정되지 않은 경우, 이 경우 인수는 사용되지 않습니다).
parentFirst그리고.frameOnly옵션은 적용되지 않습니다.
포장지
래퍼 옵션은 제한된 수의 템플릿을 래퍼 템플릿으로 지정하는 데 사용됩니다. 즉, 모듈 호출만 목적으로 하는 템플릿입니다.모듈이 래퍼 템플릿에서 호출되는 것을 감지하면 상위 프레임의 인수만 검사하고, 그렇지 않으면 getArgs로 전달된 프레임의 인수만 검사합니다.이를 통해 #invoke 또는 래퍼 템플릿을 통해 모듈을 호출할 수 있으며 각 인수 조회에 대해 프레임과 부모 프레임을 모두 확인해야 하는 것과 관련된 성능 손실이 없습니다.
예를 들어, 템플릿의 유일한 내용은 다음과 같습니다.사이드 박스(의 내용 제외)<noinclude>...</noinclude>태그)는{{#invoke:Side box main}}이 템플릿에 대해 #invoke 문으로 직접 전달된 인수를 확인하는 것은 의미가 없습니다. 이 템플릿에는 인수가 지정되지 않기 때문입니다.parentOnly 옵션을 사용하여 #invoke에 전달된 인수를 확인하지 않아도 되지만 이렇게 하면 #invoke는 다른 페이지에서도 작동하지 않습니다.만약 이것이 사실이라면, text=Some text암호상{{#invoke:Side box main text=Some text}}사용된 페이지에 관계없이 완전히 무시됩니다.를 사용하여wrappers'템플릿'을 지정하는 옵션:'사이드 박스'는 포장지로, 우리는 만들 수 있습니다.{{#invoke:Side box main text=Some text}}모듈이 템플릿에서 인수를 확인할 필요는 없지만 대부분의 페이지에서 작동합니다.사이드 박스 페이지 자체입니다.
래퍼는 문자열 또는 문자열 배열로 지정할 수 있습니다.
현지의 논병아리 = args를 얻다(틀, { 포장지 = '템플릿:래퍼 템플릿' })
현지의 논병아리 = args를 얻다(틀, { 포장지 = { '템플릿:포장지 1', '템플릿:포장지 2', 여기에는 원하는 수의 래퍼 템플릿을 추가할 수 있습니다. } }) 주의:
- 모듈은 래퍼 템플릿의 /sandbox 하위 페이지에서 호출되는지 여부를 자동으로 감지하므로 샌드박스 페이지를 명시적으로 지정할 필요가 없습니다.
- 래퍼 옵션은 frameOnly 및 parentOnly 옵션의 기본값을 효과적으로 변경합니다.예를 들어 parentOnly가 래퍼가 설정된 상태에서 0으로 명시적으로 설정된 경우 래퍼 템플릿을 통한 호출은 프레임과 부모 변수가 모두 로드되지만 래퍼 템플릿을 통한 호출은 프레임 인수만 로드됩니다.
- 래퍼 옵션이 설정되어 있고 상위 프레임을 사용할 수 없는 경우 모듈은 항상 프레임에서 다음으로 전달된 인수를 가져옵니다.
getArgs.
Args 테이블에 쓰기
때때로 새 값을 인수 테이블에 쓰는 것이 유용할 수 있습니다.이는 이 모듈의 기본 설정에서 가능합니다.그러나 일반적으로 새 값으로 새 테이블을 만들고 필요에 따라 인수 테이블에서 인수를 복사하는 것이 더 나은 코딩 스타일입니다.
논병아리.푸 = '어느 정도의 가치' 이 동작을 변경할 수 있습니다.readOnly그리고.noOverwrite옵션. 만약readOnly이 설정되면 args 테이블에 값을 쓸 수 없습니다. 만약noOverwrite이 설정되면 테이블에 새 값을 추가할 수 있지만 #vmdk에서 전달된 인수를 덮어쓸 경우 값을 추가할 수 없습니다.
참조 태그
이 모듈은 메타테이블을 사용하여 #invoke에서 인수를 가져옵니다.이를 통해 프레임 인수와 부모 프레임 인수 모두에 액세스할 수 있습니다.pairs()기능.이는 모듈이 통과될 수 있는 경우 도움이 될 수 있습니다.<ref>...</ref>태그를 입력합니다.
하자마자<ref>...</ref>태그는 Lua에서 액세스되며 MediaWiki 소프트웨어에 의해 처리되며 참조는 기사 하단의 참조 목록에 나타납니다.모듈이 계속해서 출력에서 기준 태그를 생략하면 참조 목록에 표시되지만 연결된 번호가 없는 참조인 팬텀 참조가 표시됩니다.이 문제는 다음을 사용하는 모듈에서 발생했습니다.pairs()이러한 모듈이 사용 가능한 모든 인수를 자동으로 처리하므로 프레임의 인수를 사용할지 또는 상위 프레임의 인수를 사용할지 탐지합니다.
이 모듈은 프레임 및 상위 프레임 인수에 대한 액세스를 허용하는 동시에 필요할 때만 해당 인수를 가져오는 방식으로 이 문제를 해결합니다.사용해도 문제가 계속 발생합니다.pairs(args)그러나 모듈의 다른 위치에 있습니다.
알려진 제한 사항
메타테이블을 사용하는 것도 단점이 있습니다.다음을 포함하여 대부분의 일반적인 Lua 테이블 도구는 Args 테이블에서 제대로 작동하지 않습니다.#연산자, 더next()함수 및 테이블 라이브러리의 함수입니다.모듈에서 이러한 변수를 사용하는 것이 중요한 경우 이 모듈 대신 자체 인수 처리 기능을 사용해야 합니다.
참고 항목
이 모듈은 Scribunto에 전달된 인수를 쉽게 처리할 수 있습니다. #1987년다른 Lua 모듈에서 사용하도록 설계되었으며, 사용해서는 안 됩니다. #vmdk에서 직접 호출되었습니다. 현지의 라이브러리유틸 = 요구하다('라이브러리유틸') 현지의 checkType = 라이브러리유틸.checkType 현지의 논쟁들 = {} 4개의 tridVal 함수를 생성하여 다음을 확인할 필요가 없습니다. 우리가 그것을 부를 때마다 옵션. 현지의 기능. tridy ValDefault(열쇠, 발) 한다면 유형(발) == '끈' 그리고나서 발 = 발:경기('^%s*(.)%s*