Wikipedia:WikiProject User scripts/preferences
- A working example of a cookie based preference schema for MediaWiki's Gadgets extension (currently installed on Wikipedia). See the talk page for discussions. Edit the script on this page for now.
- Ideally, this should be completely replaced by some sort of ajax based variable definition system?
Main module
For example, could be placed at MediaWiki:Gadget-jsprefs.js
// array definitions
if(!window.jsprefsLoaded) {
var jsprefsLoaded = true; //load once
var jsPrefs = []; //associative array
var jsPrefsSettable = []; //indexed array of associative elements
addOnloadHook(function() { addPortletLink('p-tb','javascript:jsPrefsPanel()','Script preferences','t-jsprefs','You are using scripts with settable preferences.'); });
}
// prefs panel (crude UI, needs rewriting and cross-browser checking)
function jsPrefsPanel() {
if(jsPrefsSettable.length==0) return;
var bod = document.getElementsByTagName('body')[0];
var prefsdiv = document.createElement('div');
prefsdiv.setAttribute('style','font-size:120%;position:absolute;top:0;left:0;width:50%;height:90%;border:2px solid black;z-index:10;background-color:#ffffff;padding:.5em;margin:2em;display:block;overflow:auto;');
prefsdiv.setAttribute('id','jsPrefsWindow');
var phead = document.createElement('h2');
phead.setAttribute('style','border-bottom:1px solid black;text-align:center;margin:0;');
var kill = document.createElement('a');
kill.setAttribute('style','float:right;font-size:66%')
kill.setAttribute('href','javascript:closePrefs();')
kill.appendChild(document.createTextNode('Close'));
phead.appendChild(kill);
phead.appendChild(document.createTextNode('Javascript/Gadget User Preferences'));
var caveat = document.createElement('div');
caveat.setAttribute('style','border:1px solid black;font-style:italic;text-align:center;margin:8px;');
caveat.appendChild(document.createTextNode('Note: These are cookie-settable user prefernces for various user scripts loaded via the MediaWiki gadgets extension. You can set these more permanently by editing your skin.js file. See [insert link] for more details. \n--example caveat--'))
prefsdiv.appendChild(phead);
prefsdiv.appendChild(caveat);
bod.appendChild(prefsdiv);
for (var i = 0; i < jsPrefsSettable.length; i++) {
var pdiv = document.createElement('div');
pdiv.appendChild(document.createTextNode(jsPrefsSettable[i].name));
pdiv.setAttribute('style','border:1px solid black;margin:5px;background-color:#ddffdd;');
var inp = document.createElement('input');
inp.setAttribute('id','pref-' + jsPrefsSettable[i].name);
inp.setAttribute('name','pref-' + jsPrefsSettable[i].name);
if(getjsPref(jsPrefsSettable[i].name)) {
inp.setAttribute('style','color:black;margin:1px 10px;');
} else {
inp.setAttribute('style','color:#888888;margin:1px 10px;');
}
var btn = document.createElement('input');
btn.setAttribute('type','button');
btn.setAttribute('value','Save');
btn.setAttribute('style','margin-right:.5em;');
switch (jsPrefsSettable[i].type) {
case 'boolean':
inp.setAttribute('type','checkbox');
if(getjsPref(jsPrefsSettable[i].name)) inp.checked = 'true'
btn.setAttribute('onclick','setjsPref("' + jsPrefsSettable[i].name + '",document.getElementById("' + 'pref-' + jsPrefsSettable[i].name + '").checked)');
break;
default: //string/number
inp.setAttribute('type','text');
if(getjsPref(jsPrefsSettable[i].name)) {
inp.setAttribute('value',getjsPref(jsPrefsSettable[i].name));
} else {
inp.setAttribute('value',jsPrefsSettable[i].defval);
}
btn.setAttribute('onclick','setjsPref("' + jsPrefsSettable[i].name + '",document.getElementById("' + 'pref-' + jsPrefsSettable[i].name + '").value)');
break;
}
var def = document.createElement('input');
def.setAttribute('type','button');
def.setAttribute('value','Default');
def.setAttribute('style','margin-right:.5em;');
def.setAttribute('onclick','setjsPref("' + jsPrefsSettable[i].name + '","' + jsPrefsSettable[i].defval + '")');
pdiv.appendChild(inp);
pdiv.appendChild(btn);
pdiv.appendChild(def);
pdiv.appendChild(document.createTextNode(jsPrefsSettable[i].desc));
prefsdiv.appendChild(pdiv);
}
}
// kill the prefs window
function closePrefs() {
var bod = document.getElementsByTagName('body')[0];
bod.removeChild(document.getElementById('jsPrefsWindow'));
}
// pref get/set/del functions
function getjsPref(nam) {
// return global variable if exists, else return cookie (unless 'false'), else fail
if(window.jsPrefs[nam]) {
return jsPrefs[nam];
} else if(getCookie(nam)) {
if(getCookie(nam) != 'false') {
return getCookie(nam);
} else {
return false;
}
} else {
return false;
}
}
function setjsPref(nam,val) {
setCookie(nam,val);
var checkval = (val==false) ? 'false' : val
if(val==true) checkval = 'true'
if(getCookie(nam)==checkval) {
alert('The preference\n => ' + nam + '\n has been set to\n=> ' + val);
} else {
alert('Cookies seem to be disabled in your browser.\nYou can still set this via your user/skin.js)');
}
}
// Cookie helpers, modified from en.wiktionary
function setCookie(cookieName, cookieValue) {
var today = new Date();
var expire = new Date();
var nDays = 365;
expire.setTime(today.getTime() + (3600000 * 24 * nDays));
document.cookie = cookieName + '=' + escape(cookieValue)
+ ';path=/'
+ ';expires='+expire.toGMTString();
}
function getCookie(cookieName) {
var start = document.cookie.indexOf(cookieName + '=');
if (start == -1) return '';
var len = start + cookieName.length + 1;
if ((!start) &&
(cookieName != document.cookie.substring(0, cookieName.length)))
{
return '';
}
var end = document.cookie.indexOf(';', len);
if(end == -1) end = document.cookie.length;
return unescape(document.cookie.substring(len, end));
}
Example usage
document.write('<script type="text/javascript" src="http://en.wikipedia.org/w/index.php?title=MediaWiki:Gadget-jsprefs.js&action=raw&ctype=text/javascript"></script>');
addOnloadHook(function() {
if (window.jsPrefsSettable) {
jsPrefsSettable[jsPrefsSettable.length] = {
'name': 'test2-gogglebutton',
'desc': 'add a google link?',
'type': 'boolean',
'defval': true};
jsPrefsSettable[jsPrefsSettable.length] = {
'name': 'test2-gogglelinktitle',
'desc': 'the text of the google search link',
'type': 'string',
'defval': 'Gewgihl'};
}
if(getjsPref('test2-gogglebutton')) {
var googtitle = (!getjsPref('test2-gogglelinktitle')) ? 'Gewgihl' : getjsPref('test2-gogglelinktitle')
addPortletLink('p-cactions','http://www.google.com/search?q=' + encodeURIComponent(mw.config.get('wgTitle')),googtitle,'ca-jsprefs','Google this page');
}
});
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.