summaryrefslogtreecommitdiff
path: root/post_fsd_wiki.phantomjs
diff options
context:
space:
mode:
Diffstat (limited to 'post_fsd_wiki.phantomjs')
-rw-r--r--post_fsd_wiki.phantomjs318
1 files changed, 222 insertions, 96 deletions
diff --git a/post_fsd_wiki.phantomjs b/post_fsd_wiki.phantomjs
index 29b3424..7c18925 100644
--- a/post_fsd_wiki.phantomjs
+++ b/post_fsd_wiki.phantomjs
@@ -1,29 +1,32 @@
-var BLACKLIST_DATA_FILE = './blacklist-testdata.json' ;
-var WIKI_BASE_URL = 'http://localhost/mediawiki/index.php' ;
+var BLACKLIST_DATA_FILE = './blacklist-testdata.json' ;
+var WIKI_TEMPLATE_FILE = './wiki-template.json' ;
+var WIKI_BASE_URL = 'http://localhost/mediawiki/index.php' ;
// var WIKI_BASE_URL = 'https://directory.fsf.org/wiki?title=' ;
-// var LOGIN_URL = WIKI_URL + '/index.php?title=Special:Userlogin&action=submitlogin' ;
-var LOGIN_URL = WIKI_BASE_URL + '?title=Special:UserLogin' ;
-var EDIT_URL = WIKI_BASE_URL + '?title=_TITLE_&action=edit&redlink=1' ;
-var USAGE_MSG = "USAGE: phantomjs ./post_fsd_wiki.phantomjs <WIKI_LOGIN> <WIKI_PASS>" ;
-var TITLE_URL_REGEX = /_TITLE_/ ;
-var WIKI_TEXT_BEGIN = '<!-- PARABOLA BLACKLIST BEGIN (DO NOT EDIT) -->Parabola Blacklist Description:' ;
-var WIKI_TEXT_END = '<!-- PARABOLA BLACKLIST END -->' ;
-var WIKI_TEXT_REGEX = RegExp(WIKI_TEXT_BEGIN + '.*' + WIKI_TEXT_END) ;
-var LOGIN_IMPUT_ID = 'wpName1' ;
-var PASS_IMPUT_ID = 'wpPassword1' ;
-var SUBMIT_IMPUT_ID = 'wpLoginAttempt' ;
-var USERNAME_LI_ID = 'pt-userpage' ;
-var WIKITEXT_INPUT_ID = 'wpTextbox1' ;
-var EDIT_FORM_ID = 'editform' ;
-var PACKAGE_NAME_KEY = 'original_package' ; // BLACKLIST_DATA_FILE per blacklist SYNTAX
-var REPLACEMENT_KEY = 'libre_replacement' ; // BLACKLIST_DATA_FILE per blacklist SYNTAX
-var REFERENCE_KEY = 'ref' ; // BLACKLIST_DATA_FILE per blacklist SYNTAX
-var ENTRY_ID_KEY = 'id' ; // BLACKLIST_DATA_FILE per blacklist SYNTAX
-var DESCRIPTION_KEY = 'short_description' ; // BLACKLIST_DATA_FILE per blacklist SYNTAX
-var BLACKLIST_TAGS_KEY = 'blacklist_tags' // BLACKLIST_DATA_FILE
-var STEP_FUNCTION_KEY = 'step-function' ;
-var PAGELOAD_WAIT_KEY = 'wait-for-pageload' ;
-var STEP_TIMEOUT = 3000 ; var StepTimeout ;
+var LOGIN_URL = WIKI_BASE_URL + '?title=Special:UserLogin' ;
+var EDIT_URL = WIKI_BASE_URL + '?title=_TITLE_&action=edit' ;
+var USAGE_MSG = "USAGE: phantomjs ./post_fsd_wiki.phantomjs <WIKI_LOGIN> <WIKI_PASS>" ;
+var TITLE_URL_REGEX = /_TITLE_/ ;
+var PARABOLA_ENTRY_HEADER = '== Parabola Blacklist Description ==\n' ;
+var WIKI_TEXT_BEGIN = '<!-- PARABOLA BLACKLIST BEGIN (DO NOT EDIT) -->' + PARABOLA_ENTRY_HEADER ;
+var WIKI_TEXT_END = '\n<!-- PARABOLA BLACKLIST END -->\n' ;
+var WIKI_TEXT_REGEX = RegExp(WIKI_TEXT_BEGIN.replace(/\((.*)\)/ , '\\($1\\)') + '.*' + WIKI_TEXT_END) ;
+var LOGIN_IMPUT_ID = 'wpName1' ;
+var PASS_IMPUT_ID = 'wpPassword1' ;
+var LOGIN_SUBMIT_IMPUT_ID = 'wpLoginAttempt' ;
+var USERNAME_LI_ID = 'pt-userpage' ;
+var EDIT_TEXT_INPUT_ID = 'wpTextbox1' ;
+var EDIT_SUBMIT_INPUT_ID = 'wpSave' ;
+var WIKI_TITLE_H1_ID = 'firstHeading' ;
+var WIKI_TEXT_DIV_ID = 'mw-content-text' ;
+var PACKAGE_NAME_KEY = 'original_package' ; // BLACKLIST_DATA_FILE JSON per ./SYNTAX CSV[0]
+var REPLACEMENT_KEY = 'libre_replacement' ; // BLACKLIST_DATA_FILE JSON per ./SYNTAX CSV[1]
+var REFERENCE_KEY = 'ref' ; // BLACKLIST_DATA_FILE JSON per ./SYNTAX CSV[2]
+var ENTRY_ID_KEY = 'id' ; // BLACKLIST_DATA_FILE JSON per ./SYNTAX CSV[3]
+var DESCRIPTION_KEY = 'short_description' ; // BLACKLIST_DATA_FILE JSON per ./SYNTAX CSV[4]
+var BLACKLIST_TAGS_KEY = 'blacklist_tags' // BLACKLIST_DATA_FILE JSON
+var STEP_FUNCTION_KEY = 'step-function' ;
+var PAGELOAD_WAIT_KEY = 'wait-for-pageload' ;
+var STEP_TIMEOUT = 3000 ; var StepTimeout ;
var System = require('system') ;
var Args = System.args ;
@@ -38,12 +41,12 @@ var ShouldWait = false ;
var ShouldQuit = false ;
-if (WIKI_LOGIN == '' || WIKI_PASS == '') { DBG(USAGE_MSG) ; phantom.exit() ; }
+if (WIKI_LOGIN == '' || WIKI_PASS == '') { LOG(USAGE_MSG) ; phantom.exit() ; } LOG('') ;
/* steps */
-function prepare()
+function Prepare()
{
LOG("loading BLACKLIST_DATA_FILE") ; var blacklist_data = require(BLACKLIST_DATA_FILE) ;
@@ -53,24 +56,25 @@ function prepare()
blacklist_data.forEach(function(package_data)
{
- var page_title = package_data[PACKAGE_NAME_KEY] ;
- var page_text = package_data[DESCRIPTION_KEY ] ;
+ var page_title = package_data[PACKAGE_NAME_KEY].trim() ;
+ var page_text = package_data[DESCRIPTION_KEY ].trim() ;
if (!page_title || !IsA(page_title , String) ||
!page_text || !IsA(page_text , String) )
{ ForceQuit("invalid package data: " + JSON.stringify(package_data)) ; return ; }
LOG("found package: " + page_title) ;
- var wiki_page = {} ;
- wiki_page[PACKAGE_NAME_KEY] = page_title.trim().replace(' ' , '_') ;
- wiki_page[DESCRIPTION_KEY ] = page_text .trim() ;
+
+ var wiki_page = {} ;
+ wiki_page[PACKAGE_NAME_KEY] = page_title.toLowerCase().replace(/ /g , '_') ;
+ wiki_page[DESCRIPTION_KEY ] = page_text ;
WikiPages.push(wiki_page) ;
}) ;
IsReady = true ;
}
-function loadLoginPage()
+function LoadLoginPage()
{
if (WikiPages.length == 0) { ForceQuit("no WikiPages to consider") ; return ; }
@@ -86,101 +90,199 @@ function loadLoginPage()
LOG("loaded package data: " + page_title) ;
}
- OpenUrl(LOGIN_URL) ;
+ GetUrl(LOGIN_URL) ;
}
-function submitLogin()
+function SubmitLogin()
{
- QuitOnErr(Page.evaluate(function(login_input_id , pass_input_id , submit_input_id ,
+ EvalQuitOnErr(Page.evaluate(function(login_input_id , pass_input_id , submit_input_id ,
wiki_login , wiki_pass )
{
- var login_input = document.getElementById(login_input_id ) ;
- var pass_input = document.getElementById(pass_input_id ) ;
- var submit_input = document.getElementById(submit_input_id) ;
- var login_form = submit_input.form ;
+ var login_input = document.getElementById(login_input_id ) ;
+ var pass_input = document.getElementById(pass_input_id ) ;
+ var submit_button = document.getElementById(submit_input_id) ;
+ var login_form = submit_button.form ;
- if (!login_input || !login_input || !submit_input || !login_form)
- return "invalid login page" ;
+ if (!login_input || login_input.nodeName != 'INPUT' ||
+ !pass_input || pass_input.nodeName != 'INPUT' ||
+ !submit_button || submit_button.nodeName != 'BUTTON' ||
+ !login_form || login_form.nodeName != 'FORM' )
+ return "ERROR: invalid login page" ;
login_input.value = wiki_login ;
pass_input.value = wiki_pass ;
login_form.submit() ;
- } , LOGIN_IMPUT_ID , PASS_IMPUT_ID , SUBMIT_IMPUT_ID , WIKI_LOGIN , WIKI_PASS)) ;
+ } , LOGIN_IMPUT_ID , PASS_IMPUT_ID , LOGIN_SUBMIT_IMPUT_ID , WIKI_LOGIN , WIKI_PASS)) ;
}
-function verifyLogin()
+function VerifyLogin()
{
- QuitOnErr(Page.evaluate(function(username_li_id , wiki_login)
+ EvalQuitOnErr(Page.evaluate(function(username_li_id , wiki_login)
{
var username_li = document.getElementById(username_li_id) ;
+ var username = !!username_li && username_li.textContent.toLowerCase() ;
- if (!username_li || username_li.textContent.lowercase != wiki_login.lowercase)
- return "login failed" ;
+ if (!username_li || username_li.nodeName != 'LI' ||
+ username != wiki_login.toLowerCase() )
+ return "ERROR: login failed" ;
- console.info("signed in as: " + username_li.textContent) ;
+ console.info("signed in as: " + username) ;
} , USERNAME_LI_ID , WIKI_LOGIN)) ;
}
-function loadEditPage()
+function LoadWikiData()
+{
+ LOG(WikiPages.length + " remaining") ;
+
+ if (!!(WikiPage = WikiPages.shift())) IsReady = true ; else Done() ;
+}
+
+function LoadEditPage()
{
- WikiPage = WikiPages.shift() ;
var page_title = WikiPage[PACKAGE_NAME_KEY] ;
- OpenUrl(EDIT_URL.replace(TITLE_URL_REGEX , page_title)) ;
+ GetUrl(EditPageUrl(page_title)) ;
}
-function submitEdit()
+function SubmitEdit()
{
-if (DEBUG_VB) DBG("in") ;
+if (DEBUG) DBG("in") ;
var page_title = WikiPage[PACKAGE_NAME_KEY] ;
var wiki_text = WikiPage[DESCRIPTION_KEY ] ;
- QuitOnErr(Page.evaluate(function(wiki_text_input_id , edit_form_id ,
- wiki_text_regex , new_wiki_text)
+ if (Page.url != EditPageUrl(page_title)) { ForceQuit("edit page load failed") ; return ; }
+
+ var post_wiki_text = EvalQuitOnErr(Page.evaluate(function(wiki_text_input_id , wiki_submit_button_id ,
+ wiki_text_regex , new_wiki_text )
{
- var wiki_text_input = document.getElementById(wiki_text_input_id) ;
- var edit_form = wiki_text_input.form ;
- var existing_wiki_text = wiki_text_input.value ;
+ var wiki_text_input = document.getElementById(wiki_text_input_id ) ;
+ var wiki_submit_button = document.getElementById(wiki_submit_button_id) ;
+ var existing_wiki_text = !!wiki_text_input && wiki_text_input.value ;
+
+// console.log("submitEdit() wiki_text_input=" + wiki_text_input ) ;
+// console.log("submitEdit() wiki_text_input .nodeName" + wiki_text_input .nodeName) ;
+// console.log("submitEdit() wiki_submit_button" + wiki_submit_button) ;
+// console.log("submitEdit() wiki_submit_button.nodeName" + wiki_submit_button.nodeName) ;
- if (!wiki_text_input || !edit_form) return "invalid edit page" ;
+ if (!wiki_text_input || wiki_text_input .nodeName != 'TEXTAREA' ||
+ !wiki_submit_button || wiki_submit_button.nodeName != 'INPUT' )
+ return "ERROR: invalid edit page" ;
- var modified_wiki_text = existing_wiki_text.replace(wiki_text_regex , new_wiki_text) ;
- var concatenated_wiki_text = existing_wiki_text + new_wiki_text ;
+ var modified_wiki_text = existing_wiki_text.replace(wiki_text_regex , new_wiki_text) ;
+ var concat_wiki_text = existing_wiki_text + new_wiki_text ;
+ var post_wiki_text = (!wiki_text_regex.test(existing_wiki_text)) ? concat_wiki_text :
+ (modified_wiki_text != existing_wiki_text ) ? modified_wiki_text : '' ;
-console.log("submitEditPage() new_wiki_text=" + new_wiki_text) ;
-console.log("submitEditPage() wiki_text_input.value IN=" + wiki_text_input.value) ;
-console.log("submitEditPage() (modified_wiki_text == existing_wiki_text)=" + (modified_wiki_text == existing_wiki_text)) ;
-console.log("submitEditPage() wiki_text_regex.test(existing_wiki_text)=" + wiki_text_regex.test(existing_wiki_text)) ;
+// console.log("submitEdit() new_wiki_text=" + new_wiki_text) ;
+// console.log("submitEdit() existing_wiki_text=" + existing_wiki_text) ;
+// console.log("submitEdit() modified_wiki_text=" + modified_wiki_text) ;
+// console.log("submitEdit() (modified_wiki_text == existing_wiki_text)=" + (modified_wiki_text == existing_wiki_text)) ;
+// console.log("submitEdit() wiki_text_regex.test(existing_wiki_text)=" + wiki_text_regex.test(existing_wiki_text)) ;
+// console.log("submitEdit() post_wiki_text=" + post_wiki_text) ;
- if (!wiki_text_regex.test(existing_wiki_text)) wiki_text_input.value = concatenated_wiki_text ;
- else if (modified_wiki_text != existing_wiki_text ) wiki_text_input.value = modified_wiki_text ;
- else return '' ;
+ if (!!post_wiki_text) { wiki_text_input.value = post_wiki_text ; wiki_submit_button .click() ; }
-console.log("submitEditPage() wiki_text_input.value OUT=" + wiki_text_input.value) ;
+ return post_wiki_text ;
- edit_form.submit() ;
+ } , EDIT_TEXT_INPUT_ID , EDIT_SUBMIT_INPUT_ID ,
+ WIKI_TEXT_REGEX , WIKI_TEXT_BEGIN + wiki_text + WIKI_TEXT_END)) ;
- } , WIKITEXT_INPUT_ID , EDIT_FORM_ID ,
- WIKI_TEXT_REGEX , WIKI_TEXT_BEGIN + wiki_text + WIKI_TEXT_END)) ;
+// DBG("returned post_wiki_text=" + post_wiki_text) ;
-if (DEBUG_VB) DBG("out") ;
+ if (!post_wiki_text) { LOG("wiki text has not changed - skipping") ; NextPage() ; return ; }
+
+/*
+console.log("edit_form.action=" + edit_form.action) ;
+var edit_form_fields = edit_form.getElementsByTagName('input') ;
+for (child_node_n in edit_form_fields)
+{
+ if (!edit_form.hasOwnProperty(child_node_n)) continue ;
+
+ var child_node = edit_form_fields[child_node_n] ;
+ var field_key = child_node.name ;
+ var field_value = child_node.value ;
+
+ if (child_node.type != 'hidden' || !field_key || !field_value) continue ;
+
+// field_key=wpStarttime field_value=20180121060903
+// field_key=wpEdittime field_value=20180121060903
+// field_key=wpAutoSummary field_value=d41d8cd98f00b204e9800998ecf8427e
+// field_key=oldid field_value=0
+// field_key=parentRevId field_value=0
+// field_key=format field_value=text/x-wiki
+// field_key=model field_value=wikitext
+// field_key='wpEditToken field_value=d70645952b36fc2f29c73a665bb3acf45a642e80+\'
+// field_key=wpUltimateParam field_value=1
+console.log("child_node=" + child_node + " field_key=" + field_key + " field_value=" + field_value) ;
+}
+*/
+/*
+ var xhr = new XMLHttpRequest() ;
+var url = edit_form.action ;
+ var params = "lorem=ipsum&name=binny" ;
+ xhr.open('POST' , url , true) ;
+ xhr.setRequestHeader('Content-type' , 'application/x-www-form-urlencoded') ;
+
+ xhr.onreadystatechange = function()
+ {
+ if (xhr.readyState == 4 && xhr.status == 200)
+ {
+console.log(xhr.responseText) ;
+ }
+ }) ;
+ xhr.send(params) ;
+*/
+/*
+ var post_body = 'wpTextbox1=' + post_wiki_text +
+ '&wpSave=' + 'Save page' +
+ '&wpEditToken=' + edit_token ;
+ PostUrl(edit_form_action , post_body) ;
+*/
+if (DEBUG) DBG("out") ;
}
-function verifyEdit()
+function VerifyEdit()
{
- QuitOnErr(Page.evaluate(function(wiki_text_input_id , edit_form_id , new_wiki_text)
- {
- var wiki_text_input = document.getElementById(wiki_text_input_id) ;
- var existing_wiki_text = wiki_text_input.value ;
- var wiki_text_regex = RegExp(new_wiki_text) ;
+if (DEBUG) DBG("in") ;
+
+ var page_title = WikiPage[PACKAGE_NAME_KEY] ;
+ var wiki_text = WikiPage[DESCRIPTION_KEY ] ;
+ var expected_url = WIKI_BASE_URL + '/' + page_title ;
+ page_title = page_title.replace(/_/g , ' ') ;
+ wiki_text = PARABOLA_ENTRY_HEADER.replace(/=/g , '').trim() + '\n' + wiki_text ;
+
+// DBG("Page.url=" + Page.url.toLowerCase()) ; DUMPFILE(Page.content) ;
- if (!wiki_text_input || !wiki_text_regex.test(existing_wiki_text))
- return "edit failed" ;
+ if (Page.url.toLowerCase() != expected_url) { ForceQuit("edit post failed") ; return ; }
- } , WIKITEXT_INPUT_ID , EDIT_FORM_ID , WIKI_TEXT_BEGIN + wiki_text + WIKI_TEXT_END)) ;
+ var err = EvalQuitOnErr(Page.evaluate(function(wiki_title_h1_id , wiki_text_div_id ,
+ page_title , new_wiki_text )
+ {
+ var wiki_title_h1 = document.getElementById(wiki_title_h1_id) ;
+ var wiki_text_div = document.getElementById(wiki_text_div_id) ;
+ var existing_wiki_title = !!wiki_title_h1 && wiki_title_h1.textContent.toLowerCase() ;
+ var existing_wiki_text = !!wiki_text_div && wiki_text_div.textContent.trim() ;
+ var wiki_text_regex = RegExp(new_wiki_text) ;
+
+console.log("wiki_title_h1=" + wiki_title_h1 + " wiki_title_h1.nodeName=" + wiki_title_h1.nodeName) ;
+console.log("wiki_text_div=" + wiki_text_div + " wiki_text_div.nodeName=" + wiki_text_div.nodeName) ;
+console.log("existing_wiki_title=" + existing_wiki_title) ;
+console.log("page_title=" + page_title) ;
+console.log("existing_wiki_text=" + existing_wiki_text) ;
+console.log("new_wiki_text=" + new_wiki_text) ;
+console.log("(existing_wiki_title == page_title )=" + (existing_wiki_title == page_title)) ;
+console.log("wiki_text_regex.test(existing_wiki_text)=" + wiki_text_regex.test(existing_wiki_text)) ;
+
+ if (!wiki_title_h1 || wiki_title_h1.nodeName != 'H1' || existing_wiki_title != page_title ||
+ !wiki_text_div || wiki_text_div.nodeName != 'DIV' || !wiki_text_regex.test(existing_wiki_text))
+ return "ERROR: edit post failed" ;
+
+ } , WIKI_TITLE_H1_ID , WIKI_TEXT_DIV_ID , page_title , wiki_text)) ;
+
+ if (!err) LOG("successfully updated: " + page_title) ; NextPage() ;
}
@@ -205,7 +307,7 @@ if (DEBUG_VB) DBG("ShouldQuit=" + ShouldQuit + " IsReady=" + IsReady) ;
clearTimeout(StepTimeout) ;
StepTimeout = setTimeout(function() { ForceQuit("timeout executing step") ; } , STEP_TIMEOUT) ;
- var step_data = Steps.shift() ;
+ var step_data = Steps[StepN++] ;
var step = step_data && step_data[STEP_FUNCTION_KEY] ;
ShouldWait = step_data && step_data[PAGELOAD_WAIT_KEY] ;
IsReady = false ;
@@ -218,19 +320,37 @@ function PumpMainLoop() { setTimeout(MainLoop , 250) ; }
function ForceQuit(quit_msg) { ShouldQuit = quit_msg ; PumpMainLoop() ; }
-function Done() { LOG("done") ; phantom.exit() ; }
+function Done() { LOG("done") ; phantom.exit() ; LOG('') ; }
/* helpers */
-function OpenUrl(url)
+function GetUrl(get_url)
{
-DBG("url=" + url) ;
+DBG("get_url=" + get_url) ;
- Page.open(url , function(status) { if (status != 'success') ForceQuit("status: " + status) ; }) ;
+ Page.open(get_url , function(status) { if (status != 'success') ForceQuit("status: " + status) ; }) ;
}
-function QuitOnErr(error_msg) { if (!!error_msg) ForceQuit(error_msg) ; else IsReady = !ShouldWait ; }
+function PostUrl(post_url , post_body)
+{
+DBG("post_url=" + post_url) ;
+
+ Page.open(post_url , 'POST' , post_body , function(status)
+ {
+ if (status != 'success') ForceQuit("status: " + status) ;
+ }) ;
+}
+
+function EvalQuitOnErr(result)
+{
+ if (typeof result == 'string' && !result.indexOf('ERROR:')) ForceQuit(result) ;
+ else IsReady = !ShouldWait ;
+
+ return result ;
+}
+
+function NextPage() { StepN = NEXT_PAGE_STEP ; IsReady = true ; }
function IsA(an_object , expected_type)
{
@@ -243,6 +363,8 @@ function IsA(an_object , expected_type)
return (Object.prototype.toString.call(an_object) === expected_type) ;
}
+function EditPageUrl(page_title) { return EDIT_URL.replace(TITLE_URL_REGEX , page_title) ; }
+
/* event hendlers */
@@ -257,7 +379,7 @@ Page.onUrlChanged = function() { ARGS.apply("Page.onUrlChang
Page.onConsoleMessage = function(msg) { LOG(msg) ; } ;
-var DEBUG = true ; var DEBUG_EVS = DEBUG && false ; var DEBUG_VB = DEBUG && false ;
+var DEBUG = false ; var DEBUG_EVS = DEBUG && false ; var DEBUG_VB = DEBUG && false ;
function LOG (log , color) { console.log((color || '\033[00;32m') + log + '\033[00m' ) ; }
function LOG_STEP(name) { LOG("Step: " + name , '\033[01;32m') ; }
function ERR (err) { LOG("ERROR: " + err , '\033[00;31m') ; }
@@ -267,15 +389,19 @@ function DBG (dbg) { if (!DEBUG) return ;
function ARGS () { if (!DEBUG_EVS) return ;
LOG("EVENT: " + this) ; var args = arguments ;
for (arg in args) LOG(" arg: " + JSON.stringify(args[arg])) ; }
+function DUMPFILE(content) { require('fs').write('dump.txt' , content , 'w') ; }
/* main entry */
-DefineStep(prepare , false) ;
-DefineStep(loadLoginPage , true ) ;
-DefineStep(submitLogin , true ) ;
-DefineStep(verifyLogin , false) ;
-DefineStep(loadEditPage , true ) ;
-DefineStep(submitEdit , true ) ;
-DefineStep(verifyEdit , false) ;
+DefineStep(Prepare , false) ;
+DefineStep(LoadLoginPage , true ) ;
+DefineStep(SubmitLogin , true ) ;
+DefineStep(VerifyLogin , false) ;
+DefineStep(LoadWikiData , false) ;
+DefineStep(LoadEditPage , true ) ;
+DefineStep(SubmitEdit , true ) ;
+DefineStep(VerifyEdit , false) ;
+for (step_n in Steps) if (Steps[step_n][STEP_FUNCTION_KEY].name == 'LoadWikiData') NEXT_PAGE_STEP = step_n ;
+
MainLoop() ;