사용자:Anomie/ajaxpreview.jsjs
User:Anomie/ajaxpreview.< 사용자:아노미에
이 페이지에 삽입한 코드는 계정을 손상시킬 수 있는 악의적인 내용을 포함할 수 있다. "importScript" 또는 "iuscript"가 있는 다른 페이지에서 스크립트를 가져오는 경우 다른 사용자가 변경할 수 있는 원격 스크립트를 동적으로 로드하게 된다는 점에 유의하십시오. 이 페이지에 추가하는 코드가 안전한지 확실하지 않으면 해당 마을 펌프에 문의하십시오. 이 페이지를 미리 볼 때 코드가 실행될 것이다. |
이 사용자 스크립트는 User:에 문서 페이지가 있는 것 같다.아노미/아약스프리뷰. |
/* 이 스크립트를 사용하려면 다음 줄을 모노북에 추가하십시오.js: importScript('사용자:Anomie/ajaxpreview.js'; // 링크백: [[사용자:Anomie/ajaxpreview.js]] * (이거 몇 명이 사용하는지 알 수 있도록 댓글로 남겨주십시오.) */ 시합을 하다 AJAXPreview={ 마디를 짓다:무효의, txt:무효의, 타이머를 치다:무효의, idx:0, 스피너:기능을 하다(){ 바꾸다(AJAXPreview.idx++){ 케이스 0: AJAXPreview.마디를 짓다.innerHTML='<center style="size:50pt"> </중앙>; 부숴뜨리다; 케이스 1: AJAXPreview.마디를 짓다.innerHTML='[center style="size:50pt"]/[중앙]; 부숴뜨리다; 케이스 2: AJAXPreview.마디를 짓다.innerHTML='[center style="size:50pt"–[중앙]; 부숴뜨리다; 케이스 3: AJAXPreview.마디를 짓다.innerHTML='[center style="size:50pt"\\[/중앙]'; AJAXPreview.idx=0; 부숴뜨리다; } AJAXPreview.마디를 짓다.문체를 하다.전시하다='블록'; }, 콜백:기능을 하다(r){ 만일(AJAXPreview.타이머를 치다) 창문의.클리어인터벌(AJAXPreview.타이머를 치다); AJAXPreview.타이머를 치다=무효의; 만일(!r.파스를 치다 !r.파스를 치다.문자 메시지를 보내다 !r.파스를 치다.문자 메시지를 보내다['*']){ AJAXPreview.마디를 짓다.innerHTML='<div style="경계:1px 솔리드 #f00;백그라운드-컬러:#fcc;컬러:#f00;텍스트-알라인:중앙")>불량 응답.; 던지다 새로운 오류('반응 불량'); } AJAXPreview.마디를 짓다.innerHTML=r.파스를 치다.문자 메시지를 보내다['*']+'[<</>]; AJAXPreview.마디를 짓다.문체를 하다.전시하다='블록'; // 브라우저가 내부를 구문 분석할 수 있도록 시간 초과 설정HTML 창문의.setTimeout(기능을 하다(){ mw.갈고리를 걸다( 'contentage.content' ).불( $( AJAXPreview.마디를 짓다 ) ); 을 위해(시합을 하다 i=AJAXPreview.$OnLoadHooks.길이-1; i>=0; i--) AJAXPreview.$OnLoadHooks[i].부르다(창문의, AJAXPreview.마디를 짓다); }, 250); }, DoError:기능을 하다(xhr,textStatus,에러던){ 만일(AJAXPreview.타이머를 치다) 창문의.클리어인터벌(AJAXPreview.타이머를 치다); AJAXPreview.타이머를 치다=무효의; 하는 동안에(AJAXPreview.마디를 짓다.첫째 아이) AJAXPreview.마디를 짓다.제거차일드(AJAXPreview.마디를 짓다.첫째 아이); 시합을 하다 d=문서화하다.createElement('DIV'); d.문체를 하다.테두리를 두르다='1px 솔리드 #f00'; d.문체를 하다.배경색='#fcc'; d.문체를 하다.색을 칠하다='#f00'; d.문체를 하다.textAlign='중앙'; d.부록차일드(문서화하다.CreateTextNode('AJAX 오류: '+textStatus+' '+에러던)); AJAXPreview.마디를 짓다.부록차일드(d); AJAXPreview.마디를 짓다.문체를 하다.전시하다='블록'; 던지다 새로운 오류('AJAX 오류: '+textStatus+' '+에러던); }, doPreview:기능을 하다(에브){ 만일(!에브) 에브=창문의.사건; 시합을 하다 txt=AJAXPreview.getTextContent(); 시합을 하다 리프스=AJAXPreview.getRefs(txt); 시합을 하다 필요하다=[]; 시합을 하다 무리={}; 을 위해(시합을 하다 g 에 리프스){ 무리[g]=''; 을 위해(시합을 하다 n 에 리프스[g]){ 만일(리프스[g][n].문자 메시지를 보내다===무효의) 필요하다.밀다([g,n]); } } 시합을 하다 doPreview2=기능을 하다(위키텍스트,스스,xhr){ 만일(위키텍스트){ 리프스=AJAXPreview.getRefs(위키텍스트); 을 위해(시합을 하다 i=필요하다.길이-1; i>=0; i--){ 시합을 하다 x=리프스[필요하다[i][0]][필요하다[i][1]]; 만일(!x) 계속하다; 만일(x.타자를 치다=='태그'){ 무리[필요하다[i][0]]+='\x7b\x7b#tag:ref.'+x.문자 메시지를 보내다+'이름='+필요하다[i][1]+'집단='+필요하다[i][0]+'\x7d\x7d'; } 다른 { 무리[필요하다[i][0]]+='\x3cref name="+필요하다[i][1]+'''그룹="'+필요하다[i][0]+'\x3e'+x.문자 메시지를 보내다+'\x3c/ref\x3e'; } } } txt+='\n\n\x7b\x7b-\x7d\x7d\n--\n'; 을 위해(시합을 하다 g 에 무리){ txt+='\n;'+(g?'그룹'+g:'참조')+'\n\x7b\x7breflist 2 그룹='+g+'refs='+무리[g]+'\x7d\x7d'; } jQuery.아약스({ url:mw.이용하다.위키스크립트('api'), dataType:'json', 타자를 치다:'POST', 자료:{ 형식을 갖추다:'json', 액션:'파스', pst:1, 문자 메시지를 보내다:txt, 칭호를 붙이다:mw.구성.얻다('wgPageName'), 받침대:'텍스트', 편집 사용 안 함:1, 미리보기:1, 템플릿과 박시틀:mw.구성.얻다('wgPageName'), 템플리트 및 상자 텍스트:txt }, 성공:AJAXPreview.콜백, 착오:AJAXPreview.DoError }); }; mw.짐을 싣다.사용.('mediawiki.util', 기능을 하다(){ 만일(필요하다.길이>0){ jQuery.아약스({ url:mw.이용하다.위키스크립트('지수'), dataType:'텍스트', 타자를 치다:'GET', 자료:{ 액션:'raw', 칭호를 붙이다:mw.구성.얻다('wgPageName') }, 성공:doPreview2, 착오:AJAXPreview.DoError }); } 다른 { doPreview2(무효의,무효의,무효의); } }); 시합을 하다 x=문서화하다.GetElementBy아이디('위키디프'); 만일(x) x.parentNode.제거차일드(x); 만일(AJAXPreview.타이머를 치다) 창문의.클리어인터벌(AJAXPreview.타이머를 치다); AJAXPreview.타이머를 치다=창문의.setInterval(AJAXPreview.스피너, 250); 이.흐릿하게 하다(); 창문의.스크롤토(0,0); 만일(에브){ // OOUI는 여기에 이벤트를 가지고 있지 않을 수 있음 만일(에브.preventDefault) 에브.preventDefault(); 만일(에브.스톱프로포메이션) 에브.스톱프로포메이션(); 에브.반환 값=거짓의; 에브.취소버블=진실의; } 돌아오다 거짓의; }, getRefs:기능을 하다(txt){ 시합을 하다 g; 시합을 하다 리프스={}; // 새로운 "list-defined reference"는 특별히 처리되어야 한다. // 그 말은 우리가 그들을 위키텍스트에서 끌어내야 한다는 뜻이지. 재미 // 먼저 XML 스타일 태그를 수행하십시오. txt=txt.대체하다(/<<<<<\s+[^]]**[^\/]]]?)>(?:\/>>(?:[\r\n])***(<\/b)/ig, 기능을 하다(x,p,t,c){ p=p.대체하다(/\s+$/g,''); g=p.짝을 맞추다(/\sgroup="[^\x22]*"/i); 만일(!g) g=p.짝을 맞추다(/\sgroup='[^\x27]*]/i); 만일(!g) g=p.짝을 맞추다(/\sgroup=(\S*)/i); g=g?g[1]:''; 리프스=AJAXPreview.getRefs2(t,g,리프스); 돌아오다 ''; }); // 다음, reflist 및 #tag:참조 txt=AJAXPreview.process_process(txt,기능을 하다(n,p,o){ 시합을 하다 c=무효의, g=''; 만일(n=='참조'){ 을 위해(시합을 하다 j=0; j<p.길이; j++){ 시합을 하다 m=p[j].짝을 맞추다(/^\s*refs\s*=\s*(?:[\r\n])*?\s*$/); 만일(m) c=m[1]; 시합을 하다 m=p[j].짝을 맞추다(/^\s*group\s*=\s*([\x22\x27]?)([^\x22\x27]+?)1\s*$/); 만일(m) g=m[2]; } 만일(c===무효의) c=''; } 다른 만일(/^#tag:\s*references$/i.시험하다(n)){ c=p.길이 ? p.교대시키다() : ''; 을 위해(시합을 하다 j=0; j<p.길이; j++){ 시합을 하다 m=p[j].짝을 맞추다(/^\s*group\s*=\s*([\x22\x27]?)([^\x22\x27]+?)1\s*$/); 만일(m) g=m[2]; } } 다른 { 돌아오다 무효의; } 리프스=AJAXPreview.getRefs2(c,g,리프스); 돌아오다 ''; }); 돌아오다 AJAXPreview.getRefs2(txt,'',리프스); }, getRefs2:기능을 하다(txt,무리를 짓다,리프스){ 시합을 하다 g,n; // 먼저 규칙적인 <refs>를 뽑아낸다. 우리는 이것을 레그스로 할 수 있다. txt.대체하다(/<ref(?:\s+\S+=(?)?:"[^\x22]*" '[^\x27]*' \S*?)*)\s**(?:\/> >(?:[\r\n]*)*?)<\/ref>/ig, 기능을 하다(x,p,t){ g=p.짝을 맞추다(/\sgroup="[^\x22]*"/i); 만일(!g) g=p.짝을 맞추다(/\sgroup='[^\x27]*]/i); 만일(!g) g=p.짝을 맞추다(/\sgroup=(\S*)/i); g=g?g[1]:무리를 짓다; 만일(활자의(리프스[g])=='정의되지 않음') 리프스[g]={}; n=p.짝을 맞추다(/\sname="[^\x22]*)"/i); 만일(!n) n=p.짝을 맞추다(/\sname='[^\x27]*]/i); 만일(!n) n=p.짝을 맞추다(/\sname=(\S*)/i); 만일(!n) 돌아오다 무효의; n=n[1]; 만일(활자의(리프스[g][n])=='정의되지 않음') 리프스[g][n]={문자 메시지를 보내다:무효의,타자를 치다:'?'}; 만일(리프스[g][n].문자 메시지를 보내다===무효의 && 활자의(t)!='정의되지 않음' && t!=='' && t!==무효의){ 리프스[g][n].문자 메시지를 보내다=t; 리프스[g][n].타자를 치다='ref' } 돌아오다 무효의; }); // 둘째, #태그 ref가 있는 것처럼 보이면, 그것들도 구문 분석한다. AJAXPreview.process_process(txt,기능을 하다(nm,p,o){ 만일(!/^#tag:\s*ref$/i.시험하다(nm)) 돌아오다 무효의; g=무리를 짓다; n=무효의; 을 위해(시합을 하다 j=p.길이-1; j>=1; j--){ 시합을 하다 m=p[j].짝을 맞추다(/^\s*group\s*=\s*([\x22\x27]?)([^\x22\x27]+?)1\s*$/); 만일(m) g=m[2]; 시합을 하다 m=p[j].짝을 맞추다(/^\s*name\s*=\s*([\x22\x27]?)([^\x22\x27]+?)1\s*$/); 만일(m) n=m[2]; } 만일(활자의(리프스[g])=='정의되지 않음') 리프스[g]={}; 만일(n!==무효의){ 만일(활자의(리프스[g][n])=='정의되지 않음') 리프스[g][n]={문자 메시지를 보내다:무효의,타자를 치다:'?'}; 만일(리프스[g][n].문자 메시지를 보내다===무효의 && p[0]!==''){ 리프스[g][n].문자 메시지를 보내다=p[0]; 리프스[g][n].타자를 치다='태그' } } 돌아오다 무효의; }); 돌아오다 리프스; }, process_process:기능을 하다(txt,cb,자료){ 시합을 하다 쌓다=[], i=0; 하는 동안에(i<txt.길이){ 시합을 하다 x=쌓다.길이?쌓다[쌓다.길이-1]:무효의; 시합을 하다 xb=무효의; 을 위해(시합을 하다 j=0; j<쌓다.길이; j++){ 만일(쌓다[j].마를 뜨다=='\x5b') xb=쌓다[j]; } 만일(txt.기판을 달다(i,2)=='\x7b\x7b'){ 시합을 하다 ct; 을 위해(ct=2; txt.기판을 달다(i+ct,1)=='\x7b'; ct++); 쌓다.밀다({마를 뜨다:'\x7b',출발하다:i,수를 세다:ct,시동이 걸리다:i+ct,모조품:[]}); i+=ct; } 다른 만일(txt.기판을 달다(i,2)=='\x5b\x5b'){ 시합을 하다 ct; 을 위해(ct=2; txt.기판을 달다(i+ct,1)=='\x5b'; ct++); 쌓다.밀다({마를 뜨다:'\x5b',출발하다:i,수를 세다:ct,시동이 걸리다:i+ct,모조품:[]}); i+=ct; } 다른 만일(x && x.마를 뜨다=='\x7b' && txt.기판을 달다(i,2)=='\x7d\x7d'){ 시합을 하다 ct; 을 위해(ct=2; txt.기판을 달다(i+ct,1)=='\x7d'; ct++); 만일(ct>x.수를 세다) ct=x.수를 세다; i+=ct; x.모조품.밀다(txt.하위 문자열(x.시동이 걸리다,i-ct)); // 먼저 변수를 구문 분석 하는 동안에(ct>=3){ x.수를 세다-=3; ct-=3; 시합을 하다 s=x.출발하다-x.수를 세다; x.모조품=[txt.하위 문자열(s,i-x.수를 세다)]; } // 왼쪽은 템플릿 하는 동안에(ct>=2){ x.수를 세다-=2; ct-=2; 시합을 하다 s=x.출발하다+x.수를 세다; 시합을 하다 종이접기=txt.하위 문자열(s,i-ct); 시합을 하다 이름을 붙이다=x.모조품.교대시키다(); 시합을 하다 오나메=이름을 붙이다; 이름을 붙이다=이름을 붙이다.대체하다(/_/g,' '); 이름을 붙이다=이름을 붙이다.대체하다(/^\s+ \s+ \s+$/g,''); 이름을 붙이다=이름을 붙이다.대체하다(/ +/g,' '); 이름을 붙이다=이름을 붙이다.대체하다(/^템플릿\s*:\s*/ig,''); 이름을 붙이다=이름을 붙이다.기판을 달다(0,1).토퍼케이스()+이름을 붙이다.기판을 달다(1); 시합을 하다 되받아치다=cb(이름을 붙이다, x.모조품, 종이접기, 자료, 오나메); 만일(되받아치다===무효의){ x.모조품=[종이접기]; } 다른 { 되받아치다=""+되받아치다; 시합을 하다 d=(되받아치다=='' && (s==0 txt.기판을 달다(s-1,1)=='\n') && txt.기판을 달다(i-ct,1)=='\n')?1:0; txt=txt.기판을 달다(0,s)+되받아치다+txt.기판을 달다(i-ct+d); i=s+되받아치다.길이+ct; x.모조품=[되받아치다]; } } 만일(x.수를 세다<2){ 쌓다.펑펑 터지다(); } 다른 { // 방금 완료한 것이 마지막이 아닐 수도 있다. // 매개 변수, 따라서 매개 변수 배열 및 pstart 재설정 x.모조품=[]; x.시동이 걸리다=x.출발하다+x.수를 세다; } } 다른 만일(xb && txt.기판을 달다(i,2)=='\x5d\x5d'){ // 보류 중인 템플릿 삭제, 실제 템플릿이 아님 하는 동안에(쌓다[쌓다.길이-1]!=xb) 쌓다.펑펑 터지다(); 시합을 하다 ct; 을 위해(ct=2; txt.기판을 달다(i+ct,1)=='\x5d'; ct++); 만일(ct>xb.수를 세다) ct=xb.수를 세다; i+=ct; xb.수를 세다-=ct; 만일(xb.수를 세다<2){ 쌓다.펑펑 터지다(); } 다른 { // 방금 완료한 것이 마지막이 아닐 수도 있다. // 매개 변수, 따라서 매개 변수 배열 및 pstart 재설정 xb.모조품=[]; xb.시동이 걸리다=xb.출발하다+xb.수를 세다; } } 다른 만일(x && txt.기판을 달다(i,1)==' '){ x.모조품.밀다(txt.하위 문자열(x.시동이 걸리다,i)); x.시동이 걸리다=++i; } 다른 { i++; } } 돌아오다 txt; }, 온로드:기능을 하다(){ 시합을 하다 액션=mw.구성.얻다('wgAction'); 만일(액션!='편집' && 액션!='submit') 돌아오다; 시합을 하다 편집 양식=문서화하다.GetElementBy아이디('편집 양식'); 만일(!편집 양식) 돌아오다; 시합을 하다 섹션필드 = 편집 양식.요소들['wp섹션']; 시합을 하다 issection=(섹션필드 && 섹션필드.가치를 매기다!=""); 시합을 하다 p=편집 양식.요소들["wpPreview"]; 만일(!p) 돌아오다; AJAXPreview.마디를 짓다=문서화하다.GetElementBy아이디('wikiPreview'); 만일(!AJAXPreview.마디를 짓다) 돌아오다; AJAXPreview.txt=편집 양식.요소들["wpTextbox1"]; 만일(!AJAXPreview.txt) 돌아오다; mw.짐을 싣다.사용.( [ 'oojs-ui-core' ] ).끝냈다( 기능을 하다 () { 시합을 하다 b = 새로운 OO.ui.버튼위젯( { 라벨을 붙이다: '아약스 프리뷰'+(issection?'ref 포함':''), tabIndex: p.tabIndex } ); b.에 관하여( '딸깍', AJAXPreview.doPreview ); $( p ).전에( b.달러화, ' ' ); } ); p.가치를 매기다='미리보기'; // 표준 기능에 대한 후크 만일(활자의(창문의.CollapseButton 생성) == '기능') AJAXPreview.AddOnLoad Hook(CollapseButton 생성); 만일(활자의(창문의.CreateNavigationBarToggleButton) == '기능') AJAXPreview.AddOnLoad Hook(CreateNavigationBarToggleButton); }, getTextContent:기능을 하다(){ 돌아오다 AJAXPreview.txt.가치를 매기다; }, // 콜백 기능을 여기에 추가하십시오. AddOnLoad Hook:기능을 하다(f){ AJAXPreview.$OnLoadHooks.밀다(f); }, $OnLoadHooks:[] }; $(문서화하다).준비가 되어 있는(AJAXPreview.온로드);