미디어위키:Gadget-friendlywelcome.js
참고: 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다. 구글 크롬, 파이어폭스, 마이크로소프트 엣지, 사파리: ⇧ Shift 키를 누른 채 "새로 고침" 버튼을 클릭하십시오. 더 자세한 정보를 보려면 위키백과:캐시 무시하기 항목을 참고하십시오.
// <nowiki> (function($) { /* **************************************** *** friendlywelcome.js: Welcome module **************************************** * Mode of invocation: Tab ("Wel"), or from links on diff pages * Active on: Any page with relevant user name (userspace, * contribs, etc.) and diff pages */ Twinkle.welcome = function friendlywelcome() { if (mw.util.getParamValue('friendlywelcome')) { if (mw.util.getParamValue('friendlywelcome') === 'auto') { Twinkle.welcome.auto(); } else { Twinkle.welcome.semiauto(); } } else { Twinkle.welcome.normal(); } }; Twinkle.welcome.auto = function() { if (mw.util.getParamValue('action') !== 'edit') { // userpage not empty, aborting auto-welcome return; } Twinkle.welcome.welcomeUser(); }; Twinkle.welcome.semiauto = function() { Twinkle.welcome.callback(mw.config.get('wgRelevantUserName')); }; Twinkle.welcome.normal = function() { if (mw.util.getParamValue('diff')) { // check whether the contributors' talk pages exist yet var $oList = $('#mw-diff-otitle2').find('span.mw-usertoollinks a.new:contains(talk)').first(); var $nList = $('#mw-diff-ntitle2').find('span.mw-usertoollinks a.new:contains(talk)').first(); if ($oList.length > 0 || $nList.length > 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', 'welcome')); welcomeLink.appendChild(spanTag('Black', ']')); welcomeNode.appendChild(welcomeLink); if ($oList.length > 0) { var oHref = $oList.attr('href'); var oWelcomeNode = welcomeNode.cloneNode(true); oWelcomeNode.firstChild.setAttribute('href', oHref + '&' + $.param({ 'friendlywelcome': Twinkle.getPref('quickWelcomeMode') === 'auto' ? 'auto' : 'norm', 'vanarticle': Morebits.pageNameNorm })); $oList[0].parentNode.parentNode.appendChild(document.createTextNode(' ')); $oList[0].parentNode.parentNode.appendChild(oWelcomeNode); } if ($nList.length > 0) { var nHref = $nList.attr('href'); var nWelcomeNode = welcomeNode.cloneNode(true); nWelcomeNode.firstChild.setAttribute('href', nHref + '&' + $.param({ 'friendlywelcome': Twinkle.getPref('quickWelcomeMode') === 'auto' ? 'auto' : 'norm', 'vanarticle': Morebits.pageNameNorm })); $nList[0].parentNode.parentNode.appendChild(document.createTextNode(' ')); $nList[0].parentNode.parentNode.appendChild(nWelcomeNode); } } } if (mw.config.get('wgRelevantUserName')) { Twinkle.addPortletLink(function() { Twinkle.welcome.callback(mw.config.get('wgRelevantUserName')); }, '환영', 'friendly-welcome', '사용자를 환영합니다'); } }; Twinkle.welcome.welcomeUser = function welcomeUser() { Morebits.status.init(document.getElementById('mw-content-text')); $('#catlinks').remove(); var params = { template: Twinkle.getPref('quickWelcomeTemplate'), article: mw.util.getParamValue('vanarticle') || '', mode: 'auto' }; var userTalkPage = mw.config.get('wgFormattedNamespaces')[3] + ':' + mw.config.get('wgRelevantUserName'); Morebits.wiki.actionCompleted.redirect = userTalkPage; Morebits.wiki.actionCompleted.notice = '환영을 완료했습니다. 수 초 안에 토론 문서를 다시 불러옵니다'; var wikipedia_page = new Morebits.wiki.page(userTalkPage, 'User talk page modification'); wikipedia_page.setFollowRedirect(true); wikipedia_page.setCallbackParameters(params); wikipedia_page.load(Twinkle.welcome.callbacks.main); }; Twinkle.welcome.callback = function friendlywelcomeCallback(uid) { if (uid === mw.config.get('wgUserName') && !confirm('자기 자신에게 환영하시겠습니까?...')) { return; } var Window = new Morebits.simpleWindow(600, 420); Window.setTitle('사용자 환영'); Window.setScriptName('트윙클'); Window.addFooterLink('환영위원회', '위키백과:환영위원회'); Window.addFooterLink('트윙클 도움말', ':en:WP:TW/DOC#welcome'); var form = new Morebits.quickForm(Twinkle.welcome.callback.evaluate); form.append({ type: 'select', name: 'type', label: '환영 종류: ', event: Twinkle.welcome.populateWelcomeList, list: [ { type: 'option', value: 'standard', label: '표준 환영', selected: true } ] }); form.append({ type: 'div', id: 'welcomeWorkArea', className: 'morebits-scrollbox' }); var previewlink = document.createElement('a'); $(previewlink).click(function() { Twinkle.welcome.callbacks.preview(result); // |result| is defined below }); previewlink.style.cursor = 'pointer'; previewlink.textContent = '미리 보기'; form.append({ type: 'div', name: 'welcomepreview', label: [ previewlink ] }); form.append({ type: 'submit' }); var result = form.render(); Window.setContent(result); Window.display(); // initialize the welcome list var evt = document.createEvent('Event'); evt.initEvent('change', true, true); result.type.dispatchEvent(evt); }; Twinkle.welcome.populateWelcomeList = function(e) { var type = e.target.value; var container = new Morebits.quickForm.element({ type: 'fragment' }); if ((type === 'standard' || type === 'anonymous') && Twinkle.getPref('customWelcomeList').length) { container.append({ type: 'header', label: '사용자 지정 환영 틀' }); container.append({ type: 'radio', name: 'template', list: Twinkle.getPref('customWelcomeList'), event: function() { e.target.form.article.disabled = false; } }); } var sets = Twinkle.welcome.templates[type]; $.each(sets, function(label, templates) { container.append({ type: 'header', label: label }); container.append({ type: 'radio', name: 'template', list: $.map(templates, function(properties, template) { return { value: template, label: '{{' + template + '}}: ' + properties.description + (properties.linkedArticle ? '\u00A0*' : ''), // U+00A0 NO-BREAK SPACE tooltip: properties.tooltip // may be undefined }; }), event: function(ev) { ev.target.form.article.disabled = !templates[ev.target.value].linkedArticle; } }); }); var rendered = container.render(); $(e.target.form).find('div#welcomeWorkArea').empty().append(rendered); var firstRadio = e.target.form.template[0]; firstRadio.checked = true; var vals = sets[Object.keys(sets)[0]]; e.target.form.article.disabled = vals[firstRadio.value] ? !vals[firstRadio.value].linkedArticle : true; }; // A list of welcome templates and their properties and syntax // The four fields that are available are "description", "linkedArticle", "syntax", and "tooltip". // The three magic words that can be used in the "syntax" field are: // - $USERNAME$ - replaced by the welcomer's username, depending on user's preferences // - $ARTICLE$ - replaced by an article name, if "linkedArticle" is true // - $HEADER$ - adds a level 2 header (most templates already include this) Twinkle.welcome.templates = { 'standard': { '일반 환영 틀': { '환영합니다': { description: '표준 환영', linkedArticle: false, syntax: '{{환영합니다}} ~~~~' } } } }; Twinkle.welcome.getTemplateWikitext = function(type, template, article) { // the iteration is required as the type=standard has two groups var properties; $.each(Twinkle.welcome.templates[type], function(label, templates) { properties = templates[template]; if (properties) { return false; // break } }); if (properties) { return properties.syntax. replace('$USERNAME$', Twinkle.getPref('insertUsername') ? mw.config.get('wgUserName') : ''). replace('$ARTICLE$', article ? article : ''). replace(/\$HEADER\$\s*/, '== 환영합니다 ==\n\n'). replace('$EXTRA$', ''); // EXTRA is not implemented yet } return '{{subst:' + template + (article ? '|art=' + article : '') + '}}' + (Twinkle.getPref('customWelcomeSignature') ? ' ~~~~' : ''); }; Twinkle.welcome.callbacks = { preview: function(form) { var previewDialog = new Morebits.simpleWindow(750, 400); previewDialog.setTitle('환영합니다 틀 미리 보기'); previewDialog.setScriptName('사용자 환영'); previewDialog.setModality(true); var previewdiv = document.createElement('div'); previewdiv.style.marginLeft = previewdiv.style.marginRight = '0.5em'; previewdiv.style.fontSize = 'small'; previewDialog.setContent(previewdiv); var previewer = new Morebits.wiki.preview(previewdiv); var input = Morebits.quickForm.getInputData(form); previewer.beginRender(Twinkle.welcome.getTemplateWikitext(input.type, input.template, input.article), '사용자토론:' + mw.config.get('wgRelevantUserName')); // Force wikitext/correct username var submit = document.createElement('input'); submit.setAttribute('type', 'submit'); submit.setAttribute('value', '닫기'); previewDialog.addContent(submit); previewDialog.display(); $(submit).click(function() { previewDialog.close(); }); }, main: function(pageobj) { var params = pageobj.getCallbackParameters(); var text = pageobj.getPageText(); // abort if mode is auto and form is not empty if (pageobj.exists() && params.mode === 'auto') { Morebits.status.info('경고', '사용자 토론 문서가 비어있지 않습니다. 자동 환영을 중단합니다'); Morebits.wiki.actionCompleted.event(); return; } var welcomeText = Twinkle.welcome.getTemplateWikitext(params.type, params.template, params.article); if (Twinkle.getPref('topWelcomes')) { text = welcomeText + '\n\n' + text; } else { text += '\n' + welcomeText; } var summaryText = '위키백과에 오신 것을 환영합니다!'; pageobj.setPageText(text); pageobj.setEditSummary(summaryText + Twinkle.getPref('summaryAd')); pageobj.setWatchlist(Twinkle.getPref('watchWelcomes')); pageobj.setCreateOption('recreate'); pageobj.save(); } }; Twinkle.welcome.callback.evaluate = function friendlywelcomeCallbackEvaluate(e) { var form = e.target; var params = Morebits.quickForm.getInputData(form); // : type, template, article params.mode = 'manual'; Morebits.simpleWindow.setButtonsEnabled(false); Morebits.status.init(form); var userTalkPage = mw.config.get('wgFormattedNamespaces')[3] + ':' + mw.config.get('wgRelevantUserName'); Morebits.wiki.actionCompleted.redirect = userTalkPage; Morebits.wiki.actionCompleted.notice = '환영을 완료했습니다. 수 초 안에 토론 문서를 다시 불러옵니다'; var wikipedia_page = new Morebits.wiki.page(userTalkPage, '사용자 토론 문서 수정'); wikipedia_page.setFollowRedirect(true); wikipedia_page.setCallbackParameters(params); wikipedia_page.load(Twinkle.welcome.callbacks.main); }; Twinkle.addInitCallback(Twinkle.welcome, 'welcome'); })(jQuery); // </nowiki>