사용자:Hsl0/local CGI
보이기
	
	
< 사용자:Hsl0
기존의 CGI는 페이지 단위였지만, 문서 내에서 스코프를 나눠서 각 스코프별로 각자의 CGI 상태를 갖는 로컬 CGI(LCGI)의 초안이다.
각자의 상태를 갖는 SPA 프레임워크의 컴포넌트에서 영감을 얻어, 선언형 언어인 위키텍스트의 특성을 살리고 기존 CGI 개념을 가져와 단순화시켰다.
LCGI는 컴포넌트를 만드는 태그와, 그 틀 내의 CGI 상태를 바꾸는 링크 틀(액션)로 나뉜다.
로컬 CGI 스코프 내부의 상태는 항상 지역변수이다.
<component>
<!-- LCGI 스코프에 대한 설정 -->
{{$/private
|$offset={{$/state}}<!-- 내부 상태 정의 -->
|$aa={{$:DB2|key=aa}}<!-- DB2 등 다른 시스템과 변수를 연동할 수 있음 -->
}}
<!-- 내부 상태는 $로 시작하는 변수를 사용한다. -->
현재 상태: {{{$offset}}}
<!-- @:로 시작하는 링크는 실제 링크가 아닌 액션을 실행하는 버튼 역할을 한다. -->
<!-- $/@set은 컴포넌트 내부 상태를 바꾼다 -->
* [[@:{{$/@set|$offset=1}}|1로 변경]]
* [[@:{{$/@set|$offset=2}}|2로 변경]]
<!-- 컴포넌트는 $:를 앞에 붙인 틀로 실행한다. -->
<!-- 기본적으로 $로 시작하는 변수의 값을 정할 수 없다. 그 대신에, 양방향 데이터 흐름인 model을 $ 인자를 통해 연결할 수 있다. -->
{{$:입력 상자|$inpval=$offset}}
</component>
LCGI는 여러 문서로 분리된 게임에서도 전역 스토어를 사용하면 상태를 공유할 수 있다.
- 어떤 게임/store
 
<!-- singleton 속성은 컴포넌트의 상태가 모든 끼워넣기에 대해 공유된다는 선언이다. -->
<!-- includeonly 속성은 끼워넣기에서만 표시하고, 문서에 직접 접속할 때는 표시하지 않는다. -->
<component singleton includeonly>
<!-- $/members에 정의된 상태는 하위 문서와 공유된다. -->
{{$/members
|$hp={{$/state|100}}
|$xp={{$/state|0}}
|$lv={{$/state|0}}
}}
<!-- 아래 내용은 {{$::어떤 게임/store}}에서 출력되는 내용이다. -->
<!-- {{$::어떤 게임/store|(변수명)}}을 통해 내부 상태를 확인할 수 있는 패턴이다. -->
{{#if:{{{1|}}}|{{{{{{1}}}|{{{2|}}}}}}}}
</component>
- 어떤 게임/store/hp
 
<!-- inherit 속성은 상위 문서의 members 상태를 상속받는다는 선언이다. -->
<!-- 기본적으로 1단계 위의 상위 문서를 상속받는다. -->
<component inherit>
{{{$hp}}}
</component>
- 어떤 게임/store/lv
 
<!-- inherit 속성에 상태를 상속받을 상위 문서를 명시할 수 있다. -->
<component inherit="어떤 게임/store">
{{{$lv}}}
</component>
- 어떤 게임/store/@expup
 
<!-- @로 시작하는 문서는 액션이다. -->
<!-- 상대적 경로도 사용 가능 -->
<component inherit=".." includeonly>
{{@set|$exp={{#expr: {{{$exp}}} + {{{1}}} }}}}
</component>
- 어떤 게임
 
<component>
* 체력: {{$::어떤 게임/store|$hp}}
* 레벨: {{$::어떤 게임/store/lv}}
* [[@:{{$::어떤 게임/store/@expup|10}}|경험치 올리기]]
</component>