사용자:토끼군/customized.js
위키백과 ― 우리 모두의 백과사전.
< 사용자:토끼군
참고: 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 갱신해야 합니다. 모질라 / 파이어폭스 / 사파리: ‘시프트’ 키를 누르면서 ‘새로 고침’을 클릭하거나, Ctrl-F5를 입력; 컨커러: 단순히 '새로고침'을 클릭하거나 F5를 입력; 오페라 사용자는 ‘도구→설정’에서 캐시를 완전히 비워야 합니다.
<!-- // --> <pre> /******************************************************************************* customized javascript for [[사용자:토끼군]]. all scripts here is distributed under MIT license, unless explicitly specified. USAGE: 1. copy and paste the following lines to [[사용자:(your user name)/monobook.js]]. you can uncomment oldid argument to url for avoiding problem during development. document.write('<script type="text/javascript" src="http://ko.wikipedia.org/w/' + 'index.php?title=User:%ED%86%A0%EB%81%BC%EA%B5%B0/customized.js&' + 'action=raw&ctype=text/javascript&dontcountme=s' + // '&oldid=(OLDID HERE)' + '"></'+'script>'); 2. add appropriate activation code ABOVE them. it is explained in a comment of each module, but normally like the following: $ModuleName = {option1: 'value1', option2: 'value2'}; *******************************************************************************/ //////////////////////////////////////////////////////////////////////////////// // COMMON JAVASCRIPT LIBRARY // make quoted string like 'asdf\'asdf' String.prototype.$escape = function() { return "'" + this.replace(/'/g, "\\'").replace(/\\n/g, "\\n") + "'"; }; // prefix/suffix test String.prototype.$prefix = function(s) { return (this.substring(0, s.length) == s); }; String.prototype.$suffix = function(s) { return (this.substring(this.length - s.length) == s); }; //------------------------------------------------------------------------------ // copied from [[en:User:Lupin/popups.js]] var $$nscanonical = ['Media', 'Special', 'Talk', 'User', 'User talk', 'Wikipedia', 'Wikipedia talk', 'Image', 'Image talk', 'MediaWiki', 'MediaWiki talk', 'Template', 'Template talk', 'Help', 'Help talk', 'Category', 'Category talk', 'Portal', 'Portal talk']; var $$nslocalized = { 'de': ['Media', 'Spezial', 'Diskussion', 'Benutzer', 'Benutzer Diskussion', 'Wikipedia', 'Wikipedia Diskussion', 'Bild', 'Bild Diskussion', 'MediaWiki', 'MediaWiki Diskussion', 'Vorlage', 'Vorlage Diskussion', 'Hilfe', 'Hilfe Diskussion', 'Kategorie', 'Kategorie Diskussion', 'Portal', 'Portal Diskussion'], 'fr': ['Media', 'Special', 'Discuter', 'Utilisateur', 'Discussion Utilisateur', 'Wikipédia', 'Discussion Wikipédia', 'Image', 'Discussion Image', 'MediaWiki', 'Discussion MediaWiki', 'Modèle', 'Discussion Modèle', 'Aide', 'Discussion Aide', 'Catégorie', 'Discussion Catégorie', 'Portail', 'Discussion Portail'], 'ja': ['Media', '特別', 'ノート', '利用者', '利用者‐会話', 'Wikipedia', 'Wikipedia‐ノート', '画像', '画像‐ノート', 'MediaWiki', 'MediaWiki‐ノート', 'Template', 'Template‐ノート', 'Help', 'Help‐ノート', 'Category', 'Category‐ノート'], 'ko': ['Media', '특수기능', '토론', '사용자', '사용자토론', '위키백과', '위키백과토론', '그림', '그림토론', 'MediaWiki', 'MediaWiki talk', '틀', '틀토론', '도움말', '도움말토론', '분류', '분류토론'], }; // returns default language used by given site function $siteLang(site) { // TODO -- guess out language from site name var pos = site.lastIndexOf('.'); return (pos < 0 ? 'en' : site.substring(0, pos)); } // returns localized namespace prefix for given site function $nsToPrefix(site, ns) { var langlist = $$nslocalized[$siteLang(site)] || $$nscanonical; return (ns == 0 ? '' : langlist[ns < 0 ? ns + 2 : ns + 1] + ':'); } // splits namespace prefix from full pagename function $splitPrefix(site, pagename) { pagename = pagename.replace(/_/g, ' '); var nsmap = [-2, -1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]; for (var i = 0; i < $$nscanonical.length; ++i) { if (pagename.$prefix($$nscanonical[i] + ':')) { return [nsmap[i], pagename.substring($$nscanonical[i].length+1)]; } } var sitelang = $siteLang(site); if (sitelang != 'en') { var prefixes = $$nslocalized[sitelang]; for (var i = 0; i < prefixes.length; ++i) { if (pagename.$prefix(prefixes[i] + ':')) { return [nsmap[i], pagename.substring(prefixes[i].length+1)]; } } } return [0, pagename]; } //------------------------------------------------------------------------------ // $Page class // constructor $Page = function(site, pagename) { this.site = site; this.pagename = pagename; this.query = arguments[2] || {}; this.fragment = arguments[3] || ''; this._cache = null; }; $Page.prototype = { // get namespace and real page name split: function() { if (this._cache == null) this._cache = $splitPrefix(this.site, this.pagename); return this._cache; }, // make copy of itself except query string action: function(action) { var query = arguments[1] || {}; query.action = action; return new $Page(this.site, this.pagename, query); }, // make URL from page object toURL: function() { var pos = this.site.lastIndexOf('.'); var path; if (pos < 0) { switch (this.site) { case 'meta': path = 'http://meta.wikimedia.org/wiki/'; break; case 'commons': path = 'http://commons.wikimedia.org/wiki/'; break; case 'sep11': path = 'http://sep11.wikipedia.org/wiki/'; break; case 'foundation': path = 'http://wikimediafoundation.org/wiki/'; break; case 'mediawiki': path = 'http://mediawiki.org/wiki/'; break; case 'source': case 'wikisource': path = 'http://wikisource.org/wiki/'; break; case 'species': case 'wikispecies': path = 'http://species.wikimedia.org/wiki/'; break; default: return null; } } else { var lang = this.site.substring(0, pos); switch (this.site.substring(pos+1)) { case 'wp': case 'wikipedia': path = 'http://' + lang + '.wikipedia.org/wiki/'; break; case 'wikt': case 'wiktionary': path = 'http://' + lang + '.wiktionary.org/wiki/'; break; case 'books': case 'wikibooks': path = 'http://' + lang + '.wikibooks.org/wiki/'; break; case 'news': case 'wikinews': path = 'http://' + lang + '.wikinews.org/wiki/'; break; case 'quote': case 'wikiquote': path = 'http://' + lang + '.wikiquote.org/wiki/'; break; case 'source': case 'wikisource': path = 'http://' + lang + '.wikisource.org/wiki/'; break; case 'wikiversity': path = 'http://' + lang + '.wikiversity.org/wiki/'; break; default: return null; } } path += encodeURIComponent(this.pagename).replace(/%20/g, '_'); if (this.query) { var delim = '?'; for (var x in this.query) { path += delim + x + '=' + this.query[x]; delim = '&'; } } if (this.fragment) { path += '#' + this.fragment; } return path; }, }; // parse given URL into page object $Page.fromURL = function(url) { var pos = url.substring(8).indexOf('/') + 8; var hostname = url.substring(0, pos), path = url.substring(pos); var site, pagename; if (hostname == 'https://secure.wikimedia.org') { // special case for SSL var m = path.match(/^\/([a-z]+)\/([a-z-]+)\/(.*)$/); if (m == null) return null; switch (m[1]) { case 'wikipedia': site = (m[2] == 'meta' || m[2] == 'commons' || m[2] == 'foundation' || m[2] == 'mediawiki' ? m[2] : m[2] + '.wp'); break; case 'wiktionary': site = m[2] + '.wikt'; break; case 'wikibooks': site = m[2] + '.books'; break; case 'wikinews': site = m[2] + '.news'; break; case 'wikiquote': site = m[2] + '.quote'; break; case 'wikisource': site = m[2] + '.source'; break; default: return null; } path = '/' + m[3]; } else if (hostname == 'http://wikimediafoundation.org') { site = 'foundation'; } else if (hostname == 'http://mediawiki.org') { site = 'mediawiki'; } else { var m = hostname.match(/^http:\/\/(?:([a-z-]+)\.)?(wiki(?:media|pedia|books|quote|source|news|versity)|wiktionary)\.org$/); if (m == null) return null; switch (m[2]) { case 'wikimedia': site = m[1]; break; case 'wikipedia': site = (m[1] == 'sep11' ? m[1] : m[1] + '.wp'); break; case 'wiktionary': site = m[1] + '.wikt'; break; case 'wikibooks': site = m[1] + '.books'; break; case 'wikinews': site = m[1] + '.news'; break; case 'wikiquote': site = m[1] + '.quote'; break; case 'wikisource': site = (m[1] ? m[1] + '.source' : 'source'); break; case 'wikiversity': site = m[1] + '.wikiversity'; break; default: return null; } } var m = path.match(/^(.*?)(?:\?(.*?))?(?:#(.*?))?$/); var queries = (m[2] || '').split(/&/), query = {}; for (var i = 0; i < queries.length; ++i) { var pos = queries[i].indexOf('='); if (pos >= 0) { var key = decodeURIComponent(queries[i].substring(0, pos)); var value = decodeURIComponent(queries[i].substring(pos+1)); query[key] = value; } } if (m[1].$prefix('/wiki/')) { pagename = decodeURIComponent(m[1].substring(6)); } else if (m[1] == '/w/index.php') { pagename = query.title; delete query.title; } return new $Page(site, pagename.replace(/_/g, ' '), query, decodeURIComponent(m[3] || '')); }; // current page $Page.current = $Page.fromURL(document.location.href); //////////////////////////////////////////////////////////////////////////////// // REDESIGNING EDIT PAGE // usage: $EditPageRedesign = {chartable: [...]}; // - remove toolbar and character table // - add new customized character table if (typeof $EditPageRedesign == 'object') { var $EditPageRedesign = { /* chartable: customizable character table. * * each entry consists of: * - accesskey (optional), normally inputed with alt * one of: 1234567890~`!@#$%^&*()-_\|[]{};:'"<>/? * - link text, which will be displayed * - replacement (text or [open, close] array), or a function returning it (or null) * it also could be object like {text: REPLACEMENT, deftext: DEFAULT VALUE, * prompt: PROMPT TEXT, mark: MARK (default '$')} */ label: $EditPageRedesign.label || '특수 문자 입력:', chartable: $EditPageRedesign.chartable || [ ['', '·', '·'], ['', '…', '…'], ['', '〈〉', ['〈', '〉']], ['', '《》', ['《', '》']], ['', '‘’', ['‘', '’']], ['', '“”', ['“', '”']], ['', '[[]]', ['[[', ']]']], ['', '¹', '¹'], ['', '²', '²'], ['', '³', '³'], ], //------------------------------ _insert: function(k) { repl = $EditPageRedesign.chartable[k][2]; if (typeof repl == 'function') { repl = repl(); if (repl == null) return; } if (typeof repl == 'string') { // TODO: it should replace selected text if any. insertTags(repl, '', ''); } else { insertTags(repl[0], repl[1], ''); } }, _entrywrapper: function(entry, value, message, mark) { filter = function(str, needle, repl) { str = str.split(needle); repr = str[0].$escape(); for (i = 1; i < str.length; ++i) repr += ' + ' + repl + ' + ' + str[i].$escape(); return repr; }; prev = value; body = 'l = prompt(' + message.$escape() + ', prev); if (!l) return null; prev = l; return '; if (typeof entry == 'string') body += filter(entry, replacement, 'l'); else body += '[' + filter(entry[0], mark, 'l') + ', ' + filter(entry[1], mark, 'l') + ']'; return new Function('', body); }, process: function() { // ensure this page is edit page var textarea = document.getElementById('wpTextbox1'); if (!textarea) textarea = document.getElementById('wpUploadDescription'); if (!textarea) return; // remove useless toolbar and character table var toolbar = document.getElementById('toolbar'); if (toolbar) toolbar.parentNode.removeChild(toolbar); var chartables = document.getElementById('editpage-specialchars'); if (chartables) chartables.parentNode.removeChild(chartables); // insert new character table var chartables = document.createElement('DIV'); chartables.id = 'editpage-specialchars'; var delim = $EditPageRedesign.label + ' '; var entry, link, shortcut; for (var i = 0; i < $EditPageRedesign.chartable.length; ++i) { entry = $EditPageRedesign.chartable[i]; if (entry[2].text) { $EditPageRedesign.chartable[i][2] = $EditPageRedesign._entrywrapper( entry[2].text, entry[2].deftext, entry[2].prompt, entry[2].mark || '$'); } link = document.createElement('A'); link.href = '#'; link.accessKey = entry[0]; link.onclick = new Function('', '$EditPageRedesign._insert(' + i + '); return false;'); link.appendChild(document.createTextNode(entry[1])); chartables.appendChild(document.createTextNode(delim)); chartables.appendChild(link); if (entry[0]) { shortcut = document.createElement('SMALL'); shortcut.appendChild(document.createTextNode(entry[0])); chartables.appendChild(shortcut); } delim = ' '; } textarea.parentNode.insertBefore(chartables, textarea); }, }; addOnloadHook($EditPageRedesign.process); } // end if (typeof == 'object') //////////////////////////////////////////////////////////////////////////////// // JAVASCRIPT CONSOLE // usage: $JavascriptConsole = {}; // - attach simple javascript console below document (double-click footer to show) if (typeof $JavascriptConsole == 'object') { $JavascriptConsole = { _toggleform: function() { var node = document.getElementById('z-console'); if (node.style.display == 'none') { node.style.display = 'block'; document.location.href = '#console'; } else { node.style.display = 'none'; } return false; }, _objdump: function(obj) { // TODO - better inspection is needed var tmp; var output = 'typeof = ' + typeof(obj) + '\n\n'; for (var x in obj) { if (x[0] == '$') continue; // ignore $-prefixed internal property tmp = ((x >= '0' && x < ':') || x[0] == '-' ? 'obj[' + x + ']' : 'obj.' + x); output += x + ' = ' + eval(tmp) + '\n'; } return output; }, _execute: function(flag) { var res = document.getElementById('z-console-res'); var obj = eval(document.getElementById('z-console-cmd').value); if (flag) { res.value += this._objdump(obj); } else if (typeof obj != 'undefined') { res.value += obj + '\n'; } return false; }, process: function() { var footer = document.getElementById('footer'); var evalhtml = '<form id="console" name="console" onsubmit="return $JavascriptConsole._execute(false);">' + '<textarea id="z-console-cmd" style="width:59%" cols="60" rows="25" tabindex="1000"></textarea>' + '<textarea id="z-console-res" style="width:39%" cols="40" rows="25"></textarea>' + '<br /><input type="button" id="z-console-exec" value="Execute" tabindex="1001" ' + 'onclick="return $JavascriptConsole._execute(false);" /> ' + '<input type="button" id="z-console-dump" value="Execute w/ objdump" tabindex="1002" ' + 'onclick="return $JavascriptConsole._execute(true);" /> ' + '<input type="button" id="z-console-clear" value="Clear" tabindex="1003" ' + 'onclick="document.getElementById(\'z-console-res\').value=\'\'; return false;" />' + '</form>'; var evalnode = document.createElement('div'); evalnode.id = 'z-console'; evalnode.style.display = 'none'; evalnode.innerHTML = evalhtml; footer.parentNode.insertBefore(evalnode, footer); footer.ondblclick = $JavascriptConsole._toggleform; // utility function for console window.$debug = function(obj) { document.getElementById('z-console-res').value += obj + '\n'; }; window.$dump = function(obj) { document.getElementById('z-console-res').value += $JavascriptConsole._objdump(obj); }; }, }; addOnloadHook($JavascriptConsole.process); } // end if (typeof == 'object') //////////////////////////////////////////////////////////////////////////////// // SIMPLE INTERWIKI // usage: $SimpleInterwiki = {targets: {...}, targetmap: {document: [...], media: [...]}, skipcurrent: true}; // - shows selected interwikis with title below title if (typeof $SimpleInterwiki == 'object') { $SimpleInterwiki = { targets: $SimpleInterwiki.targets || {0: 'document', 2: 'user', 4: 'document', 6: 'media', 8: 'system', 10: 'document', 12: 'system', 14: 'document'}, targetmap: $SimpleInterwiki.targetmap || {document: ['ko.wp', 'en.wp', 'ja.wp'], media: ['ko.wp', 'en.wp', 'ja.wp', 'commons']}, site: $SimpleInterwiki.site || $Page.current.site, skipcurrent: $SimpleInterwiki.skipcurrent || true, //------------------------------ _harvestlinks: function() { var result = {}; // search for known interwikis var node = document.getElementById('p-lang'); if (node) { var nodes = document.getElementsByTagName('li'); for (var i = 0; i < nodes.length; ++i) { if (nodes[i].className.substring(0, 10) != 'interwiki-') continue; var parsed = $Page.fromURL(nodes[i].firstChild.href); if (parsed == null) continue; // TODO result[parsed.site] = parsed.pagename; } } return result; }, process: function() { var targets = $SimpleInterwiki.targetmap[$SimpleInterwiki.targets[wgNamespaceNumber] || 'misc']; if (!targets) return; var links = $SimpleInterwiki._harvestlinks(); var info = document.createElement('div'); info.id = 'infoSub'; var pagename, anchor, node, flag = false; for (var i = 0; i < targets.length; ++i) { pagename = $nsToPrefix(targets[i], wgNamespaceNumber) + wgTitle; if (targets[i] == $SimpleInterwiki.site) { if ($SimpleInterwiki.skipcurrent) continue; anchor = document.createElement('strong'); anchor.className = 'selflink'; } else { anchor = document.createElement('a'); if (links[targets[i]]) pagename = links[targets[i]]; else anchor.className = 'new'; } anchor.href = new $Page(targets[i], pagename).toURL(); anchor.appendChild(document.createTextNode(pagename)); node = document.createElement('span'); node.className = 'site-' + targets[i].replace(/\./g, '-'); node.appendChild(document.createTextNode(targets[i] + ': ')); node.appendChild(anchor); if (flag) { info.appendChild(document.createTextNode(' / ')); } else { flag = true; } info.appendChild(node); } var body = document.getElementById('bodyContent'); body.insertBefore(info, body.firstChild); }, }; addOnloadHook($SimpleInterwiki.process); } // end if (typeof == 'object') //////////////////////////////////////////////////////////////////////////////// // PURGE BUTTON // usage: $PurgeButton = {label: '... (optional)'}; // - adds purge button to all pages except special namespace if (typeof $PurgeButton == 'object') { $PurgeButton = { label: $PurgeButton.label || '새로고침', //------------------------------ process: function() { // do not show purge button in special pages if ($Page.current.split()[0] < 0) return; var node = document.getElementById('p-cactions'); for (var i = 0; i < node.childNodes.length; ++i) { if (node.childNodes[i].tagName == 'DIV') { node = node.childNodes[i]; break; } } for (var i = 0; i < node.childNodes.length; ++i) { if (node.childNodes[i].tagName == 'UL') { var anchor = document.createElement('A'); anchor.href = $Page.current.action('purge').toURL(); anchor.appendChild(document.createTextNode($PurgeButton.label)); var item = document.createElement('LI'); item.id = 'ca-purge'; item.appendChild(anchor); node.childNodes[i].appendChild(item); } } }, }; addOnloadHook($PurgeButton.process); } // end if (typeof == 'object') //////////////////////////////////////////////////////////////////////////////// </pre>