美国虚拟主机Hostease

Mediawiki中文技术论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4650|回复: 0

MediaWiki的AutoEdit扩展功能

[复制链接]
发表于 2011-5-28 15:54:33 | 显示全部楼层 |阅读模式
美国主机侦探
在安装使用MediaWiki平台的时候,进行一些细节应用需要用到URL点击来编辑、预置、保存页面,有的时候希望能更自动化一些,以前就有过使用JavaScript扩展来实现自动编辑保存的功能,尝试详细了解、安装会发现用起来还是比较方便的,记录如下:
扩展使用说明
这是一个让用户使用JavaScript来实现通过URL自动编辑的功能。
可以在对整个网站所有用户的MediaWiki:Common.js中加入代码,也可以为单独个人增加这段JavaScript代码。
变量
?title=Article
&action=edit
&autoedit=s~...~...~g;s~...~...~g
&autoclick=wpDiff
&autominor=false
&autosummary=Summary
说明
?title=... – article title
&action=edit – action
&autoedit=... – autoedit script
s~ – begin of replace command
... – it will be replaced by next text (may be a regular expression); cannot contain ~ chars, for enter text to empty page (or new section in existing one) keep it empty
~
... – next text ;); cannot contain ~ chars
~g – end of replace command
Script can contain multiple commands, separated by ;
&autoclick=... – button pressed after autoedit (wpDiff, wpSave, wpPreview)
&autominor=... – is change minor
&autosummary=... – summary of edit
JavaScript代码
/* 此处的JavaScript将载入于所有用户每一个页面。 */ /*
*/
function getParamValue(paramName) {
  var cmdRe=RegExp('[&?]'+paramName+'=([^&]*)');
  var h=document.location;
  var m;
  if (m=cmdRe.exec(h)) {
    try {
      return decodeURI(m[1]);
    } catch (someError) {}
  }
  return null;
};
function substitute(data,cmdBody) {
  // alert('sub\nfrom: '+cmdBody.from+'\nto: '+cmdBody.to+'\nflags: '+cmdBody.flags);
  var fromRe=RegExp(cmdBody.from, cmdBody.flags);
  return data.replace(fromRe, cmdBody.to);
};
function execCmds(data, cmdList) {
  for (var i=0; i<cmdList.length; ++i) {
    data=cmdList[i].action(data, cmdList[i]);
  }
  return data;
}
function parseCmd(str) {
  // returns a list of commands
  if (!str.length) return [];
  var p=false;
  switch (str.charAt(0)) {
  case 's':
    p=parseSubstitute(str);
    break;
  case 'j':
    p=parseJavascript(str);
    break;
  default:
    return false;
  }
  if (p) return [p].concat(parseCmd(p.remainder));
  return false;
};
function unEscape(str, sep) {
  return str.split('\\\\').join('\\')
        .split('\\'+sep).join(sep)
        .split('\\n').join('\n');
};

function runJavascript(data, argWrapper) {
  // flags aren't used (yet)
  // from the user's viewpoint,
  // data is a special variable may appear inside code
  // and gets assigned the text in the edit box
  // alert('eval-ing '+argWrapper.code);
  return eval(argWrapper.code);
};
function parseJavascript(str) {
  // takes a string like j/code/;othercmds and parses it
  var tmp,code,flags;
  if (str.length<3) return false;
  var sep=str.charAt(1);
  str=str.substring(2);
  
  tmp=skipOver(str,sep);
  if (tmp) { code=tmp.segment.split('\n').join('\\n'); str=tmp.remainder; }
  else return false;
  flags='';
  if (str.length) {
    tmp=skipOver(str,';') || skipToEnd(str, ';');
    if (tmp) {flags=tmp.segment; str=tmp.remainder; }
  }
  return { action: runJavascript, code: code, flags: flags, remainder: str };
};
function parseSubstitute(str) {
  // takes a string like s/a/b/flags;othercmds and parses it
  var from,to,flags,tmp;
  if (str.length<4) return false;
  var sep=str.charAt(1);
  str=str.substring(2);
  tmp=skipOver(str,sep);
  if (tmp) { from=tmp.segment; str=tmp.remainder; }
  else return false;
  tmp=skipOver(str,sep);
  if (tmp) { to=tmp.segment; str=tmp.remainder; }
  else return false;
  flags='';
  if (str.length) {
    tmp=skipOver(str,';') || skipToEnd(str, ';');
    if (tmp) {flags=tmp.segment; str=tmp.remainder; }
  }
  
  return {action: substitute, from: from, to: to, flags: flags, remainder: str};
};
function skipOver(str,sep) {
  var endSegment=findNext(str,sep);
  if (endSegment<0) return false;
  var segment=unEscape(str.substring(0,endSegment), sep);
  return {segment: segment, remainder: str.substring(endSegment+1)};
}
function skipToEnd(str,sep) {
  return {segment: str, remainder: ''};
}
function findNext(str, ch) {
  for (var i=0; i<str.length; ++i) {
    if (str.charAt(i)=='\\') i+=2;
    if (str.charAt(i)==ch) return i;
  }
  return -1;
};
function runOnLoad(f) {
  if (window.addEventListener) {
    window.addEventListener("load",f,false);
  }
  else if (window.attachEvent) {
    window.attachEvent("onload",f);
  }
  else {
    window._old_popup_autoedit_onload = window.onload;
    window.onload = function() {
      window._old_popup_autoedit_onload();
      f();
    }
  }
};
window.autoEdit=function() {
  if (window.autoEdit.alreadyRan) return false;
  window.autoEdit.alreadyRan=true;
  var cmdString=getParamValue('autoedit');
  if (cmdString) {
    try {
      var editbox=document.editform.wpTextbox1;
    } catch (dang) { return; }
    var cmdList=parseCmd(cmdString);
    var input=editbox.value;
    var output=execCmds(input, cmdList);
    editbox.value=output;
  }
  var summary=getParamValue('autosummary');
  if (summary) document.editform.wpSummary.value=summary;
  var minor=getParamValue('autominor');
  if (minor) {
    switch (minor) {
    case '1':
    case 'yes':
    case 'true':
      document.editform.wpMinoredit.checked=true;
      break;
    case '0':
    case 'no':
    case 'false':
      document.editform.wpMinoredit.checked=false;
    }
  }
  var btn=getParamValue('autoclick');
  if (btn) {
    if (document.editform && document.editform[btn]) {
      var headings=document.getElementsByTagName('h1');
      if (headings) {
        var div=document.createElement('div');
        var button=document.editform[btn];
        div.innerHTML='<font size=+1><b>"' + button.value +
          '" 按钮已经被自动点击。' +
          ' 请等待载入下一个页面。</b></font>';
        document.title='('+document.title+')';
        headings[0].parentNode.insertBefore(div, headings[0]);
        button.click();
      }
    } else {
      alert('autoedit.js\n\nautoclick: 找不到按钮 "'+ btn +'".');
    }  
  }
};
runOnLoad(autoEdit);
/*

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

美国HostEase虚拟主机一年198元

Archiver|手机版|小黑屋|Mediawiki中文技术论坛

GMT+8, 2024-12-26 19:56 , Processed in 0.039985 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表