User:Wcam/friendlywelcome.js

维基百科,自由的百科全书

注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。

// <nowiki>
// If FriendlyConfig aint exist.
if( typeof( FriendlyConfig ) == 'undefined' ) {
    FriendlyConfig = {};
}

/**
 預設摘要後 
 */
if( typeof( FriendlyConfig.summaryAd ) == 'undefined' ) {
    FriendlyConfig.summaryAd = "";
}

/**
 預設摘要前
 */
if( typeof( FriendlyConfig.summaryPre ) == 'undefined' ) {
    FriendlyConfig.summaryPre = "";
}

/**
 FriendlyConfig.topWelcomes ( boolean )
 */
if( typeof( FriendlyConfig.topWelcomes ) == 'undefined' ) {
    FriendlyConfig.topWelcomes = true;
}

/**
 FriendlyConfig.watchWelcomes ( boolean )
 */
if( typeof( FriendlyConfig.watchWelcomes ) == 'undefined' ) {
    FriendlyConfig.watchWelcomes = false;
}

/**
 FriendlyConfig.insertHeadings ( boolean )
 */
if( typeof( FriendlyConfig.insertHeadings ) == 'undefined' ) {
    FriendlyConfig.insertHeadings = false;
}

/**
 FriendlyConfig.welcomeHeading ( string )
 */
if( typeof( FriendlyConfig.welcomeHeading ) == 'undefined' ) {
    FriendlyConfig.welcomeHeading = "== 欢迎 ==";
}

/**
 FriendlyConfig.insertUsername ( boolean )
 */
if( typeof( FriendlyConfig.insertUsername ) == 'undefined' ) {
    FriendlyConfig.insertUsername = false;
}

/**
 FriendlyConfig.insertSignature ( boolean )
 */
if( typeof( FriendlyConfig.insertSignature ) == 'undefined' ) {
    FriendlyConfig.insertSignature = false;
}

/**
 FriendlyConfig.markWelcomesAsMinor ( boolean )
 */
if( typeof( FriendlyConfig.markWelcomesAsMinor ) == 'undefined' ) {
    FriendlyConfig.markWelcomesAsMinor = true;
}

/**
 FriendlyConfig.quickWelcomeMode ( String )
 */
if( typeof( FriendlyConfig.quickWelcomeMode ) == 'undefined' ) {
    FriendlyConfig.quickWelcomeMode = "auto";
}

/**
 FriendlyConfig.quickWelcomeTemplate ( String )
 */
if( typeof( FriendlyConfig.quickWelcomeTemplate ) == 'undefined' ) {
    FriendlyConfig.quickWelcomeTemplate = "Welcome";
}

/**
 FriendlyConfig.maskTemplateInSummary ( boolean )
 */
if( typeof( FriendlyConfig.maskTemplateInSummary ) == 'undefined' ) {
    FriendlyConfig.maskTemplateInSummary = true;
}

friendlywelcome = {
    auto: function() {
        if( QueryString.get( 'action' ) != 'edit' ) {
            // userpage not empty, aborting auto-welcome
            return;
        }
        
        return friendlywelcome.welcome();
    },
    semiauto: function()  {
        friendlywelcome.callback( wgTitle.split( '/' )[0].replace( /\"/, "\\\"") );
    },
    normal: function() {
        if( QueryString.exists( 'diff' ) ) {
            var oXPath = '//div[@id="mw-diff-otitle2"]/span[@class="mw-usertoollinks"]/a[1][@class="new"]';
            var nXPath = '//div[@id="mw-diff-ntitle2"]/span[@class="mw-usertoollinks"]/a[1][@class="new"]';
            var oList = document.evaluate( oXPath, document, null,  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );
            var nList = document.evaluate( nXPath, document, null,  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );
            
            if( oList.snapshotLength > 0 || nList.snapshotLength > 0 ) {
                var spanTag = function( color, content ) {
                    var span = document.createElement( 'span' );
                    span.style.color = color;
                    span.appendChild( document.createTextNode( content ) );
                    return span;
                }

                var welcomeNode = document.createElement('strong');
                var welcomeLink = document.createElement('a');
                welcomeLink.appendChild( spanTag( 'Black', '[' ) );
                welcomeLink.appendChild( spanTag( 'Goldenrod', wgULS("欢迎","歡迎") ) );
                welcomeLink.appendChild( spanTag( 'Black', ']' ) );
                welcomeNode.appendChild(welcomeLink);

                if( oList.snapshotLength > 0 ) {
                    var oTalkNode = oList.snapshotItem(0);
                    
                    var oHref = document.evaluate( '@href', oTalkNode, null, XPathResult.STRING_TYPE, null ).stringValue;
                    
                    var oWelcomeNode = welcomeNode.cloneNode( true );
                    oWelcomeNode.firstChild.setAttribute( 'href', oHref + '&' + QueryString.create( { 'friendlywelcome': 'norm' } ) + '&' + QueryString.create( { 'vanarticle': wgPageName.replace(/_/g, ' ') } ) );
                    oTalkNode.parentNode.parentNode.appendChild( document.createTextNode( ' ' ) );
                    oTalkNode.parentNode.parentNode.appendChild( oWelcomeNode );
                }
                
                if( nList.snapshotLength > 0 ) {
                    var nTalkNode = nList.snapshotItem(0);
                    
                    var nHref = document.evaluate( '@href', nTalkNode, null, XPathResult.STRING_TYPE, null ).stringValue;
                    
                    var nWelcomeNode = welcomeNode.cloneNode( true );
                    nWelcomeNode.firstChild.setAttribute( 'href', nHref + '&' + QueryString.create( { 'friendlywelcome': 'norm' } ) + '&' + QueryString.create( { 'vanarticle': wgPageName.replace(/_/g, ' ') } ) );
                    nTalkNode.parentNode.parentNode.appendChild( document.createTextNode( ' ' ) );
                    nTalkNode.parentNode.parentNode.appendChild( nWelcomeNode );
                }
            }
        }
        if( wgNamespaceNumber == 3 ) {
            var username = wgTitle.split( '/' )[0].replace( /\"/, "\\\""); // only first part before any slashes

            mw.util.addPortletLink( 'p-cactions', "javascript:friendlywelcome.callback(\"" + username + "\")", wgULS("欢迎","歡迎"), "friendly-welcome", "欢迎用户","歡迎用戶", "");
        }
    }
}

friendlywelcome.welcome = function welcomeUser() {
    Status.init( document.getElementById('bodyContent') );

    var params = {
        value: FriendlyConfig.quickWelcomeTemplate,
        article: QueryString.exists( 'vanarticle' ) ? QueryString.get( 'vanarticle' ) : '',
        mode: 'auto'
    };

    var query = { 
        'title': wgPageName, 
        'action': 'submit'
    };
    Wikipedia.actionCompleted.redirect = wgPageName;
    Wikipedia.actionCompleted.notice = "Welcoming complete, reloading talk page in some seconds";
    var wikipedia_wiki = new Wikipedia.wiki( 'User talk page modification', query, friendlywelcome.callbacks.main );
    wikipedia_wiki.params = params;
    wikipedia_wiki.get();
}

friendlywelcome.callback = function friendlywelcomeCallback( uid ) {
    if( uid == wgUserName ){
        alert( wgULS("您不用欢迎您自己吧,是吗?","您不用歡迎您自己吧,是嗎?") );
        return;
    }

    var Window = new SimpleWindow( 600, 400 );
    Window.setTitle( wgULS("请选以下任何一个欢迎模板","請選以下任何一個歡迎模板") ); 
    var form = new QuickForm( friendlywelcome.callback.evaluate, 'change' );

    form.append( {
            type: 'input',
            name: 'article',
            label: wgULS("相关条目\(若模板支持\)","相關條目\(若模板支援\)"),
            value:( QueryString.exists( 'vanarticle' ) ? QueryString.get( 'vanarticle' ) : '' ),
            tooltip: 'An article might be linked to the welcome if the template supports it. Leave empty for no artice to be linked.  Templates that support a linked article are marked with an asterisk.  Ignored for templates that do not support a linked article.',
            event: function( event ) {
                event.stopPropagation();
            }
        }
    );

    form.append( { type:'header', label:wgULS("简单模板","簡單模板") } );
    form.append( { type: 'radio', name: 'simple', list: friendlywelcome.standardList } );

    if( typeof( FriendlyConfig.customWelcomeList ) == 'object' ) {
        form.append( { type:'header', label:'Custom templates' } );
        form.append( { type: 'radio', name: 'custom', list: FriendlyConfig.customWelcomeList } );
    }

    form.append( { type:'header', label:'Welcoming committee templates' } );
    form.append( { type: 'radio', name: 'welcomingCommittee', list: friendlywelcome.welcomingCommitteeList } );

    form.append( { type:'header', label:'Potential problem user templates' } );
    form.append( { type: 'radio', name: 'problem', list: friendlywelcome.problemList } );

    form.append( { type:'header', label:'匿名用户模板' } );
    form.append( { type: 'radio', name: 'anonymous', list: friendlywelcome.anonymousList } );

    var result = form.render();
    Window.setContent( result );
    Window.display();
}

friendlywelcome.standardList = [
	{
		label: '{{Welcome}}: 标准欢迎模板*',
		value: 'Welcome' },
	//{ 
	//	label: '{{Welcomeshort}}: short welcome',
	//	value: 'Welcomeshort',
	//	tooltip: 'Includes section heading.' },
	{ 
		label: '{{Welcome plain}}: 纯文本欢迎模板',
		value: 'Welcome plain',
		tooltip: '纯文本欢迎模板' }
	//{
	//	label: '{{Welcom}}: very short and simple welcome',
	//	value: 'Welcom',
	//	tooltip: 'Shortest welcome template available.  Includes section heading and signature.' },
	//{
	//	label: '{{Welcome-personal}}: includes a plate of cookies',
	//	value: 'Welcome-personal',
	//	tooltip: 'A personal welcome with an introduction from you and a plate of cookies.  Includes section heading and signature.' },
	//{ 
	//	label: '{{WelcomeMenu}}: welcome with menu of links',
	//	value: 'WelcomeMenu',
	//	tooltip: 'Contains a welcome message and many useful links broken up into different sections.  Includes signature.' },
	//{ 
	//	label: '{{Welcomeg}}: similar to {{WelcomeMenu}}',
	//	value: 'Welcomeg',
	//	tooltip: 'Contains a welcome message and many useful links broken up into different sections.  Includes signature.' },
	//{ 
	//	label: '{{Welcomeh}}: same as {{Welcomeg}} but with a section heading',
	//	value: 'Welcomeh',
	//	tooltip: 'Contains a section heading, a welcome message and many useful links broken up into different sections.  Includes section heading and signature.' }
]

//friendlywelcome.welcomingCommitteeList = [
	//{ 
	//	label: '{{Wel}}: similar to {{Welcome}}, but automatically identifies anonymous and registered users*',
	//	value: 'Wel',
	//	tooltip: 'This template checks whether the username contains any letters. If there are any, {{Welcome-reg}} will be shown. If there are none, {{Welcome-anon}} will be shown.' },
	//{ 
	//	label: '{{W-basic}}: standard template, similar to {{Welcome}} with additional options',
	//	value: 'W-basic',
	//	tooltip: 'This template is similar to {{Welcome}} but supports many different options.  Includes a signature.' },
	//{ 
	//	label: '{{W-shout}}: extroverted message with bold advice',
	//	value: 'W-shout',
	//	tooltip: 'This template is similar to {{WelcomeShout}} but spports many different options.  Includes a signature.' },
	//{ 
	//	label: '{{W-short}}: concise; won\'t overwhelm',
	//	value: 'W-short',
	//	tooltip: 'This template is similar to {{Welcomeshort}} but supports many different options.  Includes a signature.' },
	//{ 
	//	label: '{{W-link}}: shortest greeting, links to Welcoming committee\'s greetings page',
	//	value: 'W-link',
	//	tooltip: 'This template is similar to {{Welcom}} but supports many different options.  Includes a signature.' },
	//{ 
	//	label: '{{W-graphical}}: graphical menu format to ease transition from the graphic-heavy web',
	//	value: 'W-graphical',
	//	tooltip: 'This template is similar to {{Welcomeg}} but has fewer links.  Supports many different options.  Includes a signature.' },
	//{ 
	//	label: '{{W-screen}}: graphical; designed to fit the size of the user\'s screen',
	//	value: 'W-screen',
	//	tooltip: 'This template is a nice graphical welcome with many different options.  Includes a signature.' }
//]

friendlywelcome.problemList = [
	//{ 
	//	label: '{{Welcomelaws}}: welcome with information about copyrights, npov, the sandbox, and vandalism',
	//	value: 'Welcomelaws' },
	{ 
		label: '{{Firstarticle}}: 用户的第一篇条目不符合方针*',
		value: 'Firstarticle' },
	{ 
		label: '{{Welcomevandal}}: 用户的初始动作像是破坏*',
		value: 'Welcomevandal' }
	//{ 
	//	label: '{{Welcomenpov}}: for someone whose initial efforts do not adhere to the neutral point of view policy*',
	//	value: 'Welcomenpov' },
	//{ 
	//	label: '{{Welcomespam}}: welcome with additional discussion of anti-spamming polices*',
	//	value: 'Welcomespam' },
	//{ 
	//	label: '{{Welcomeunsourced}}: for someone whose initial efforts are uncited*',
	//	value: 'Welcomeunsourced' },
	//{ 
	//	label: '{{Welcomeauto}}: for someone who created an autobiographical article*',
	//	value: 'Welcomeauto' }
]

friendlywelcome.anonymousList = [
	{
		label: '{{Welcome-anon}}: 匿名用户*',
		value: 'Welcome-anon' }
	//{
	//	label: '{{Welcomeanon2}}: similar to {{Welcome-anon}} but with hints and tips*',
	//	value: 'Welcomeanon2',
	//	tooltip: 'Includes section heading.' },
	//{
	//	label: '{{Welc-anon}}: similar to {{Welcome-anon}} but with a border and section heading',
	//	value: 'Welc-anon',
	//	tooltip: 'Includes section heading.' },
	//{
	//	label: '{{Welcome-anon-vandalism-fighter}}: for anonymous users who fight vandalism, urging them to create an account*',
	//	value: 'Welcome-anon-vandalism-fighter' },
	//{
	//	label: '{{Welcome-anon-vandal}}: for anonymous users who have vandalized a page*',
	//	value: 'Welcome-anon-vandal',
	//	tooltip: 'Includes a section heading and signature.' }
]

friendlywelcome.projectList = [
	{
		label: '{{WelcomeACG}}: ACG',
		value: 'WelcomeACG' },
	{
		label: '{{WelcomeBIO}}: 生物学',
		value: 'WelcomeBIO' },
	{
		label: '{{WelcomeCHEM}}: 化学',
		value: 'WelcomeCHEM' },
	{
		label: '{{WelcomeCVG}}: 电子游戏',
		value: 'WelcomeCVG' },
	{
		label: '{{WelcomeMED}}: 医药',
		value: 'WelcomeMED' },
	{
		label: '{{Welcomefl}}: 电影',
		value: 'Welcomefl' },
	{
		label: '{{Welcomepl}}: 心理学',
		value: 'Welcomepl' }
]

friendlywelcome.regionList = [
	{
		label: '{{WelcomeTW}}: 台湾',
		value: 'WelcomeTW' },
	{
		label: '{{Welcomegd}}: 广东',
		value: 'Welcomegd' },
	{
		label: '{{Welcomegx}}: 广西',
		value: 'Welcomegx' },
	{
		label: '{{Welcomehk}}: 香港',
		value: 'Welcomehk' },
	{
		label: '{{WelcomePRC}}: 中华人民共和国',
		value: 'WelcomePRC' },
	{
		label: '{{Welcomeshanxi}}: 山西',
		value: 'Welcomeshanxi' },
	{
		label: '{{Welcomexa}}: 西安',
		value: 'Welcomexa' }
]

// Set to true if template does not already have heading
friendlywelcome.headingHash = {
    'Welcome': true,
    'Welcomeshort': false,
    'WelcomeSimple': false,
    'Welcom': false,
    'Welcome-personal': false,
    'WelcomeMenu': true,
    'Welcomeg': true,
    'Welcomeh': false,
    'Wel': false,
    'W-basic': true,
    'W-shout': true,
    'W-short': true,
    'W-link': true,
    'W-graphical': true,
    'W-screen': true,
    'Welcomelaws': true,
    'Firstarticle': true,
    'Welcomevandal': false,
    'Welcomenpov': true,
    'Welcomespam': true,
    'Welcomeunsourced': true,
    'Welcomeauto': false,
    'Welcome-anon': true,
    'Welcomeanon2': false,
    'Welc-anon': false,
    'Welcomeunclesam': true,
    'Welcome-anon-vandalism-fighter': false,
    'Welcome-anon-vandal': false
}

// Set to true if template already has signature
friendlywelcome.signatureHash = {
    'Welcome': false,
    'Welcomeshort': false,
    'WelcomeSimple': false,
    'Welcom': true,
    'Welcome-personal': false,
    'WelcomeMenu': true,
    'Welcomeg': true,
    'Welcomeh': true,
    'Wel': false,
    'W-basic': true,
    'W-shout': true,
    'W-short': true,
    'W-link': true,
    'W-graphical': true,
    'W-screen': true,
    'Welcomelaws': false,
    'Firstarticle': true,
    'Welcomevandal': true,
    'Welcomenpov': false,
    'Welcomespam': false,
    'Welcomeunsourced': false,
    'Welcomeunsourced': false,
    'Welcome-anon': false,
    'Welcomeanon2': false,
    'Welc-anon': false,
    'Welcomeunclesam': false,
    'Welcome-anon-vandalism-fighter': false,
    'Welcome-anon-vandal': true
}

/* Set to true if template supports article
 * name from art template parameter 
 */
friendlywelcome.artHash = {
    'Welcome': true,
    'Welcomeshort': false,
    'WelcomeSimple': false,
    'Welcom': false,
    'Welcome-personal': false,
    'WelcomeMenu': false,
    'Welcomeg': false,
    'Welcomeh': false,
    'Wel': true,
    'W-basic': false,
    'W-shout': false,
    'W-short': false,
    'W-link': false,
    'W-graphical': false,
    'W-screen': false,
    'Welcomelaws': false,
    'Firstarticle': false,
    'Welcomevandal': false,
    'Welcomenpov': false,
    'Welcomespam': false,
    'Welcomeunsourced': false,
    'Welcomeauto': true,
    'Welcome-anon': true,
    'Welcomeanon2': true,
    'Welc-anon': false,
    'Welcomeunclesam': true,
    'Welcome-anon-vandalism-fighter': true,
    'Welcome-anon-vandal': false
}

/* Set to true if template supports article
 * name from vanarticle template parameter 
 */
friendlywelcome.vandalHash = {
    'Welcome': false,
    'Welcomeshort': false,
    'WelcomeSimple': false,
    'Welcom': false,
    'Welcome-personal': false,
    'WelcomeMenu': false,
    'Welcomeg': false,
    'Welcomeh': false,
    'Wel': false,
    'W-basic': false,
    'W-shout': false,
    'W-short': false,
    'W-link': false,
    'W-graphical': false,
    'W-screen': false,
    'Welcomelaws': false,
    'Firstarticle': true,
    'Welcomevandal': true,
    'Welcomenpov': true,
    'Welcomespam': true,
    'Welcomeunsourced': true,
    'Welcomeauto': false,
    'Welcome-anon': false,
    'Welcomeanon2': false,
    'Welc-anon': false,
    'Welcomeunclesam': false,
    'Welcome-anon-vandalism-fighter': false,
    'Welcome-anon-vandal': true
}

friendlywelcome.callbacks = {
    main: function( self ) {
        var form = self.responseXML.getElementById( 'editform' );
        
        // abort if mode is auto and form is not empty
        if( form.wpTextbox1.value != '\n' && self.params.mode == 'auto' ) {
            Status.info( 'Warning', 'User talk page not empty; aborting automatic welcome' );
            Wikipedia.actionCompleted.event();
            return;
        }
        
        var text = '';
        Status.info( 'Info', 'Will add the welcome template to the '
                + ( FriendlyConfig.topWelcomes ? 'top' : 'bottom' )
                + ' of the user\'s talk page.' );
        if( !FriendlyConfig.topWelcomes ) {
            text += form.wpTextbox1.value + '\n\n';
        }
        
        if( friendlywelcome.headingHash[ self.params.value ] && FriendlyConfig.insertHeadings ) {
            Status.info( 'Info', 'Will create a new heading for the welcome' );
            text += FriendlyConfig.welcomeHeading + "\n";
        }
        
        Status.info( 'Info', 'Will substitute the {{' + self.params.value + '}} welcome template' );
        text += '\{\{subst:' + self.params.value;
        
        if( friendlywelcome.artHash[ self.params.value ] ) {
            if( FriendlyConfig.insertUsername && self.params.value.substring(2,0) != 'W-' ) {
                Status.info( 'Info', 'Will add your username to the template' );
                text += '|' + wgUserName;
            }
            
            if( self.params.article != '' ) {
                Status.info( 'Info', 'Will add article link to the template' );
                text += '|art=' + self.params.article;
            }
        } else if( friendlywelcome.vandalHash[ self.params.value ] ) {
            if( self.params.article != '' ) {
                Status.info( 'Info', 'Will add vandalized article link to the template' );
            }
            text += '|' + self.params.article;
            
            if( FriendlyConfig.insertUsername ) {
                Status.info( 'Info', 'Will add your username to the template' );
                text += '|' + wgUserName;
            }
        } else if( FriendlyConfig.insertUsername ) {
            Status.info( 'Info', 'Will add your username to the template' );
            text += '|' + wgUserName;
        } 
        
        text += '\}\}';
        
        if( !friendlywelcome.signatureHash[ self.params.value ] && FriendlyConfig.insertSignature ) {
            Status.info( 'Info', 'Will add your signature after the welcome' );
            text += ' \n\~\~\~\~';
        }
        
        if( FriendlyConfig.topWelcomes ) {
            text += '\n\n' + form.wpTextbox1.value;
        }
        
        var postData = {
            'wpMinoredit': FriendlyConfig.markWelcomesAsMinor ? 1 : undefined,
            'wpWatchthis': form.wpWatchthis.checked ? 1 : (FriendlyConfig.watchWelcomes ? 1 : undefined),
            'wpStarttime': form.wpStarttime.value,
            'wpEdittime': form.wpEdittime.value,
            'wpAutoSummary': form.wpAutoSummary.value,
            'wpEditToken': form.wpEditToken.value,
            'wpSummary': FriendlyConfig.summaryPre + wgULS("欢迎用户","歡迎用戶") + FriendlyConfig.summaryAd,
            'wpTextbox1': text
        };
 
        self.post( postData );
    }
}

friendlywelcome.callback.evaluate = function friendlywelcomeCallbackEvaluate(e) {
    // Ignore if a change to the text field triggered this event
    if( e.target.name == 'article' ) {
        return;
    }
    
    var params = {
        value: e.target.value,
        article: e.target.form.article.value,
        mode: 'manual'
    };

    Status.init( e.target.form );
    
    var query = { 
        'title': wgPageName, 
        'action': 'submit'
    };
    Wikipedia.actionCompleted.redirect = wgPageName;
    Wikipedia.actionCompleted.notice = "Welcoming complete, reloading talk page in some seconds";
    var wikipedia_wiki = new Wikipedia.wiki( 'User talk page modification', query, friendlywelcome.callbacks.main );
    wikipedia_wiki.params = params;
    wikipedia_wiki.get();
}

$( function() {
        if( QueryString.exists( 'friendlywelcome' ) ) {
            if( QueryString.get( 'friendlywelcome' == 'auto' ) ) {
                friendlywelcome.auto();
            } else {
                friendlywelcome.semiauto();
            }
        } else {
            friendlywelcome.normal();
        }
    }
);
// </nowiki>