MediaWiki:Gadget-Wyckibaat.js

From Khyentse Lineage - A Tsadra Foundation Project
Revision as of 10:41, 3 June 2024 by Jeremi (talk | contribs) ((by SublimeText.Mediawiker))

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
if ( mw.config.get( 'wgPageName' ) === 'Wyckibaat' ) {

// Welcome to the main Wyckibaat JS script.
// This code creates the interface for processing 
// wiki pages of unicode text into structured pages 
// with metadata for a particular Tibetan collection. 
//          __
//  _(\    |@@|
// (__/\__ \--/ __
//    \___|----|  |   __
//        \ }{ /\ )_ / _\ 
//        /\__/\ \__O (__
//       (--/\--)    \__/
//       _)(  )(_
//       ---''---



// Define api functions to use throughout
function createPage(page, content) {
	var createPageParams = {
			action: 'edit',
			title: page,
			text: content,
			format: 'json',
			createonly: true
		},
		createPageApi = new mw.Api();
	createPageApi.postWithToken( 'csrf', createPageParams ).done( function (data) {
		$('#alerts').append('<div class="col-lg-6"><div class="alert alert-success mt-2 mb-0 py-1 px-2" role="alert">Created: <a href="/index.php/' + page + '" title="' + page + '">' + page + '</a>.</div></div>');
		purgePage(page);
	});
};



function createFinalPage(page, content) {
	var createPageParams = {
			action: 'edit',
			title: page,
			text: content,
			format: 'json'
		},
		createPageApi = new mw.Api();
	createPageApi.postWithToken( 'csrf', createPageParams ).done( function (data) {
		$('#alerts').append('<div class="col-lg-6"><div class="alert alert-success mt-2 mb-0 py-1 px-2" role="alert">Created: <a href="/index.php/' + page + '" title="' + page + '">' + page + '</a>.</div></div>');
		purgePage(page);
	});
};



function purgePage(page) {
	var purgeParams = {
			action: 'purge',
			titles: page,
			forcelinkupdate: true,
			format: 'json'
		},
		purgeApi = new mw.Api();
	purgeApi.post( purgeParams ).done( function ( data ) {
		console.log(page + ' purged.');
	} );
};

   

// Get unicode content:
function getUnicode(pagename) {
	var paramsPageParse = {
			action: 'parse',
			page: pagename,
			prop: 'wikitext',
			formatversion: 2
		},
		parsePageApi = new mw.Api();
	parsePageApi.get(paramsPageParse).done( function (data) {
		// Storing parsed unicode from existing text page into variable
		var unicodeContent = data.parse.wikitext;
		getTemplateContent(pagename, unicodeContent);
	});
};



// Get template content
function getTemplateContent(pagename, unicodeContent){
	var paramsTemplateParse = {
			action: 'parse',
			page: 'WB-Text-Stub',
			prop: 'wikitext',
			formatversion: 2
		},
		parseTemplateApi = new mw.Api();
	parseTemplateApi.get(paramsTemplateParse).done( function (data) {
		// Storing parsed template content into variable
		var templateContent = data.parse.wikitext ;
		buildPage(pagename, unicodeContent, templateContent);
	});
};



// Build final page
function buildPage(pagename, unicodeContent, templateContent){

	// Splitting pagename into individual chunks to be reused later: 
	// wiki ID, collection ID, volume number, and text number.
	
	if ( namingScheme === 'noVolume' ) {	
		var pageNameChunk = pagename.match(/^([a-zA-Z0-9]+)-([a-zA-Z0-9]+)-([0-9]+)$/),
			wikiID = pageNameChunk[1],
			colID = pageNameChunk[2],
			textNum = pageNameChunk[3],
			volumePageName = wikiID + "-" + colID
	} else if ( namingScheme === 'volNumOnly' ) {	
		var pageNameChunk = pagename.match(/^([a-zA-Z0-9]+)-([a-zA-Z0-9]+)-([0-9]+)-([a-zA-Z0-9]+)$/),
			wikiID = pageNameChunk[1],
			colID = pageNameChunk[2],
			volNum = pageNameChunk[3],
			textNum = pageNameChunk[4],
			volumePageName = wikiID + "-" + colID + "-Volume-" + volNum
	} else if ( namingScheme === 'volNumAndLet' ) {
		var pageNameChunk = pagename.match(/^([a-zA-Z0-9]+)-([a-zA-Z0-9]+)-([0-9]+)-([a-zA-Z]+)-([a-zA-Z0-9]+)$/),
			wikiID = pageNameChunk[1],
			colID = pageNameChunk[2],
			volNum = pageNameChunk[3],
			volumeLetter = pageNameChunk[4],
			textNum = pageNameChunk[5],
			volumePageName = wikiID + "-" + colID + "-Volume-" + volNum + "-" + volumeLetter
	}
	var subclass;


	if ( textNum === 'Karchag') {
		subclass = 'Karchags';
	} else {
		subclass = 'Tibetan Texts';
	};

	// Build final page content by replacing strings in 
	// template content with actual page values and adding 
	// the unicode to the body of the page.
	var pageContent = templateContent
		.replace( '%subclass%', subclass )
		.replace( '%collectiontitle%', collectionName.value )
		.replace( '%collectiontitletib%', collectionNameTib.value )
		.replace( '%totalvolumes%', totalVolumes.value )
		.replace( '%author%', author.value )
		.replace( '%authortib%', authorTib.value )
		.replace( '%citation%', citation.value )
		.replace( '%volumenumber%', volNum )
		.replace( '%volumeLetter%', volumeLetter )
		.replace( '%textnuminvol%', textNum )
		.replace( '%pagename%', pagename )
		.replace( '%InitCategories%', projectName.value + "; " + volumePageName )
		.replace( '%pagecontent%', unicodeContent )
		.replace( '[[Cate' + 'gory:Wyckibaat]]' , '' );

	// Create final page
	createFinalPage(pagename, pageContent);
};






// Building input elements for processing existing basic unicode pages:
var projectName = new OO.ui.TextInputWidget( {
		icon: 'tag',
		placeholder: 'Project name',
		value: 'Khyentse Lineage Project'
	} ),
	collectionName = new OO.ui.TextInputWidget( {
		icon: 'tag',
		placeholder: 'Collection name',
		value: "mdo mkhyen brtse 'dzin grol"
	} ),
	collectionNameTib = new OO.ui.TextInputWidget( {
		icon: 'tag',
		placeholder: 'Collection name in Tibetan',
		value: 'མདོ་མཁྱེན་བརྩེ་འཛིན་གྲོལ།'
	} ),
	totalVolumes = new OO.ui.NumberInputWidget( {
		placeholder: 'Total volumes in collection',
		value: '1'
	}),
	author = new OO.ui.TextInputWidget( {
		icon: 'tag',
		placeholder: 'Author pagename',
		value: 'Mdo mkhyen brtse'
	} ),
	authorTib = new OO.ui.TextInputWidget( {
		icon: 'tag',
		placeholder: 'Author name in Tibetan',
		value: 'མདོ་མཁྱེན་བརྩེ་'
	} ),
	citation = new OO.ui.TextInputWidget( {
		icon: 'tag',
		placeholder: 'Full citation for collection',
		value: "[[Mdo mkhyen brtse]]. ''''. In ''Mdo mkhyen brtse ye shes rdo rje'i dgongs gter gcod 'dzin pa rang grol gyi 'don chog gi skor'',  (''The Natural Liberation of Grasping, The Chod Teaching of Do Khyentse Yeshe Dorje''): . Delhi: Shechen Publications, 2020."
	} ),
	namingScheme = new OO.ui.RadioSelectInputWidget( {
		value: 'volNumAndLet',
		options: [
			{
				data: 'noVolume',
				label: 'No volume specified. E.g. DKYD-DZINDROL-001.'
			},
			{
				data: 'volNumOnly',
				label: 'Volume number only, no letter specified. E.g. LCP-KABUM-06-002.'
			},
			{
				data: 'volNumAndLet',
				label: 'Volume number and letter specified. E.g. DJYD-KABUM-01-KA-001.'
			}
		]
	} ),
	dryRunButton = new OO.ui.ButtonWidget( {
		label: 'Dry Run',
		flags: [
			'primary',
			'progressive'
		]
	} ),
	processButton = new OO.ui.ButtonWidget( {
		label: 'Process Pages',
		flags: [
			'primary',
			'progressive'
		]
	} );

// Placing input elements on the page:
$( '#wyckibaat' ).append( [
	projectName.$element,
	collectionName.$element, 
	collectionNameTib.$element, 
	totalVolumes.$element, 
	author.$element,
	authorTib.$element,
	citation.$element,
	'<div class="my-2">Text files naming scheme:</div>',
	namingScheme.$element,
	'<div class="mb-3"></div>',
	dryRunButton.$element,
	processButton.$element,
	'<div id="alerts" class="row mt-3"></div>'
] );



// DRY RUN
// Click action for main process button:
dryRunButton.on('click', function dryRunPages() {

	// Check for existence of project pages:
	new mw.Api().get( {
	    action: "query",
	    titles: [ 
	    	'Category:' + projectName.value, 
	    	collectionName.value,
	    	'Category:' + collectionName.value,
	    	author.value,
	    	'Category:' + author.value
	    ],
	} ).then( function( data ) {
	    $.each( data.query.pages, function() {
	        if ( this.missing !== "" ) {} else {
	        	$('#alerts').append('<div class="col-lg-6"><div class="alert alert-info mt-2 mb-0 py-1 px-2" role="alert">Will create: <a class="new" href="/index.php/' + this.title + '" title="' + this.title + '">' + this.title + '</a>.</div></div>');
	        }
	    } );
	}, function( error ) {
	    console.log('Error testing for page existence.')
	});

	// List pages to process
	var queryUrl = 'https://' + mw.config.get( 'wgServerName' ) + '/api.php?action=query&list=categorymembers&cmtitle=Category:Wyckibaat&cmlimit=max&format=json'
	var jsonData = queryUrl;
	$.getJSON(jsonData, function(data){
		$.each(data.query.categorymembers, function(work, field){
			// console.log(field.title);
			$('#alerts').append('<div class="col-lg-6"><div class="alert alert-info mt-2 mb-0 py-1 px-2" role="alert">Will process: <a href="/index.php/' + field.title + '" title="' + field.title + '">' + field.title + '</a> and <a href="/index.php/Category:' + field.title + '" title="Category:' + field.title + '">Category:' + field.title + '</a>.</div></div>');
		});
	});
});



// Click action for main process button:
processButton.on('click', function processPages() {

	// Creation of project's main category page
	var projectCatPageName = 'Category:' + projectName.value,
		projectCatPageContent = "This the project's main category page.";
	createPage(projectCatPageName, projectCatPageContent);

	// Creation of collection page and collection category page
	var collectionPageName = collectionName.value,
		collectionPageContent = '{{Collection\n|author=' + author.value + '\n|title=' + collectionName.value + '\n}}';
	createPage(collectionPageName, collectionPageContent);
	var collectionCatPageName = 'Category:' + collectionName.value,
		collectionCatPageContent = 'This is the category for the collection: {{PAGENAME}}';
	createPage(collectionCatPageName, collectionCatPageContent);

	// Creation of author page and author category page
	var authorPageName = author.value,
		authorPageContent = '{{PersonCall}}';
	createPage(authorPageName, authorPageContent);
	var authorCatPageName = 'Category:' + author.value,
		authorCatPageContent = 'This is the category page for  {{PAGENAME}}';
	createPage(authorCatPageName, authorCatPageContent);

	// Fetching pages using SMW's API's "ask" action, with result formatted in JSON:
	var queryUrl = 'https://' + mw.config.get( 'wgServerName' ) + '/api.php?action=query&list=categorymembers&cmtitle=Category:Wyckibaat&cmlimit=max&format=json'
	var jsonData = queryUrl;

	// Extracting JSON data from file and parsing:
	$.getJSON(jsonData, function(data){

		// Defining what to do for each page returned by the query.
		$.each(data.query.categorymembers, function(pagename, field){

			// Splitting pagename into individual chunks to be reused later: 
			// wiki ID, collection ID, volume number, and text number.
			var pagename = field.title

			// Create volume pages
			if ( namingScheme === 'noVolume' ) {	
				var pageNameChunk = pagename.match(/^([a-zA-Z0-9]+)-([a-zA-Z0-9]+)-([0-9]+)$/),
					wikiID = pageNameChunk[1],
					colID = pageNameChunk[2],
					volumePageName = wikiID + "-" + colID
			} else if ( namingScheme === 'volNumOnly' ) {	
				var pageNameChunk = pagename.match(/^([a-zA-Z0-9]+)-([a-zA-Z0-9]+)-([0-9]+)-([a-zA-Z0-9]+)$/),
					wikiID = pageNameChunk[1],
					colID = pageNameChunk[2],
					volNum = pageNameChunk[3],
					volumePageName = wikiID + "-" + colID + "-Volume-" + volNum
			} else if ( namingScheme === 'volNumAndLet' ) {
				var pageNameChunk = pagename.match(/^([a-zA-Z0-9]+)-([a-zA-Z0-9]+)-([0-9]+)-([a-zA-Z]+)-([a-zA-Z0-9]+)$/),
					wikiID = pageNameChunk[1],
					colID = pageNameChunk[2],
					volNum = pageNameChunk[3],
					volumeLetter = pageNameChunk[4],
					volumePageName = wikiID + "-" + colID + "-Volume-" + volNum + "-" + volumeLetter
			}
			var volumeStub = '{{VolumePage\n|collectiontitle=' + collectionName.value + '\n|collectiontitletib=' + collectionNameTib.value + '\n|volumenumber=' + volNum + '\n}}';
			createPage(volumePageName, volumeStub);
			var volumeCatPage = 'Category:' + volumePageName,
				volumeCatPageContent = '{{VolumeCategoryPage}}';
			createPage(volumeCatPage, volumeCatPageContent);

			// Create category page
			var catPageName = 'Category:' + field.title,
				catPageContent = '{{TextCategoryPage}}';
			createPage(catPageName, catPageContent);

			// Build and process text page
			getUnicode(field.title);

		});
	});
});

};