LLWiki正在建设中,欢迎加入我们

“User:Bhsd/tool.js”的版本间差异

来自LLWiki
跳转到导航 跳转到搜索
(// 使用Wikiplus小工具快速编辑)
标签移动版网页编辑 移动版编辑
 
(未显示同一用户的22个中间版本)
第1行: 第1行:
// 由[[Special:Mypage/common.js]]调用,可以使用ES6语法
// 由[[Special:Mypage/common.js]]调用,可以使用ES6语法
/**
// 生成JS文件大小
* @Description: 自用的工具函数
* @Author: [[User:Bhsd]]
*/
"use strict";
"use strict";
// jshint varstmt: true
/*global mw, $*/
/**
mw.myCopyright = function(cmtitle = mw.config.get('wgTitle')) {
* @Function: 批量添加文件授权协议,只能处理不超过500个文件的分类
mw.loader.using( 'mediawiki.api' ).then(() => {
* @Dependencies: mediawiki.api, ext.gadget.site-lib
const api = new mw.Api();
* @Param {String} cmtitle 分类名,默认为当前所在分类页
console.log('API request: 查询分类下的文件');
*/
let timerStart = mw.now();
mw.myCopyright = (cmtitle = mw.config.get( 'wgTitle' )) => {
api.get({action: 'query',
const cats = ['原作者保留权利的文件', '可自由使用的文件', 'LLWiki版权所有的文件', '使用CC Zero协议的文件'],
list: 'categorymembers',
api = new mw.Api();
cmtitle: 'Category:' + cmtitle,
mw.timedQuery(api, { prop: 'categories', generator: 'categorymembers', gcmtitle: `Category:${cmtitle}`,
cmprop: 'ids',
gcmtype: 'file', gcmlimit: 'max', clcategories: cats.map(ele => `Category:${ele}`).join( '|' ), cllimit: 'max'
cmtype: 'file',
}, '分类下无授权协议的文件').then(res => {
cmlimit: 'max',
res.query.pages.filter(ele => !ele.categories).forEach(ele => {
formatversion: 2
api.postWithToken('csrf', {action: 'edit', pageid: ele.pageid, minor: 1, bot: 1,
}).then(data => {
prependtext: '==授权协议==\n{{copyright}}\n', summary: '使用API批量添加授权协议',
console.log(`End API request: 已获得分类下的文件,用时 ${mw.now() - timerStart} ms`);
console.log('API request: 查询无授权协议的文件');
}).catch(reason => { console.error( `页面${ele.pageid}法添加授权协议,错误原因:${reason}` ); });
});
timerStart = mw.now();
}, () => {});
api.get({action: 'query',
prop: 'categories',
pageids: data.query.categorymembers.map(ele => ele.pageid).join('|'),
clcategories: 'Category:原作者保留权利的文件|Category:可自由使用的文件|Category:LLWiki版权所有的文件|使用CC Zero协议的文件',
cllimit: 'max',
formatversion: 2
}).then(res => {
console.log(`End API request: 已获得无授权协议的文件,用时 ${mw.now() - timerStart} ms`);
res.query.pages.filter(ele => !ele.categories).forEach(ele => {
api.postWithToken('csrf', {action: 'edit',
pageid: ele.pageid,
prependtext: '==授权协议==\n{{copyright}}\n',
summary: '使用API批量添加授权协议',
minor: 1,
bot: 1
}).then(() => false,
reason => { console.error(`页面${ele.pageid}无法添加授权协议,错误原因:${reason}`); });
});
}, reason => { console.error(`Failed API request: 无法获得无授权协议的文件。错误原因:${reason}`); });
}, reason => { console.error(`Failed API request: 无法获得分类下的文件。错误原因:${reason}`); });
});
};
};


/**
mw.myJsSize = function(table) {
* @Function: 查询JS页面大小
const items = table.find( 'td:first-child' ),
* @Dependencies: mediawiki.api, ext.gadget.site-lib
titles = items.children( 'a' ).map(function() { return this.title; }).toArray();
*/
mw.loader.using( 'mediawiki.api' ).then(() => {
mw.myJsSize = () => {
console.log( 'API request: 查询JS页面大小' );
const $table = $('.jsTable'), // 总是获取当前页面中的表格
const timerStart = mw.now();
$items = $table.find( 'tr:nth-child(n+1)' ),
new mw.Api().get({ action:'query', prop:'info', titles:titles.join( '|' ), formatversion:2 })
titles = $items.find( 'a' ).toArray().map(ele => ele.title);
.then(data => {
mw.timedQuery(new mw.Api(), {prop: 'info', titles: titles.join( '|' )}, 'JS页面大小').then(data => {
console.log( `End API request: 已获得JS页面大小,用时 ${mw.now() - timerStart} ms` );
table.find( 'th:last-child' ).show();
$table.toggleClass( 'jsTable jsTable2' );
// 注意返回的结果可能顺序不同
const lengths = Object.fromEntries( data.query.pages.map(ele => [ele.title, ele.length]) );
const lengths = Object.fromEntries( data.query.pages.map(ele => [ele.title, ele.length]) );
items.parent().append(i => { return $('<td>').addClass( 'video-link' ).css('text-align', 'right')
.text( (lengths[ titles[i] ] / 1024).toFixed(1) ); });
$items.children( 'td:last-child' ).text(i => (lengths[ titles[i] ] / 1024).toFixed(1));
}, () => { $('#myJsSize').off( 'click' ).one('click', mw.myJsSize); });
}, reason => {
console.error(`Failed API request: 无法获得JS页面大小。错误原因:${reason}`);
$('#myJsSize').off( 'click' ).one('click', () => { mw.myJsSize( $(this).parent('p').next( 'table' ) ); });
});
});
};
};


mw.hook( 'wikipage.content' ).add($content => {
(function() {
const $btn = $content.find( '#myJsSize' ).one('click', mw.myJsSize);
const timerStart = mw.now();
if ($btn.length === 0) { return; }
$('#myJsSize').one('click', () => { mw.myJsSize( $(this).parent('p').next( 'table' ) ); });
mw.hook( 'wikipage.content' ).add(() => {
console.log('Hook: wikipage.content, 开始添加JS大小查询按钮');
});
console.log(`Hook: wikipage.content after ${mw.now() - timerStart} ms`);

});
(() => {
mw.hook( 'wikipage.collapsibleContent' ).add(() => {
/**
console.log(`Hook: wikipage.collapsibleContent after ${mw.now() - timerStart} ms`);
* @Function: 记录所有触发的Hook
});
*/
mw.hook( 'wikipage.categories' ).add(() => {
const start = mw.now();
console.log(`Hook: wikipage.categories after ${mw.now() - timerStart} ms`);
['postEdit', 'wikipage.content', 'wikipage.collapsibleContent', 'wikipage.categories', 'wikipage.diff',
});
'wikipage.editform', 'structuredChangeFilters.ui.initialized', 'codeEditor.configure', // MW原生Hook
mw.hook( 'wikipage.diff' ).add(() => {
'code.prettify', 'wikiplus.dialog', 'local.comments', 'hotcat.ready',
console.log(`Hook: wikipage.diff after ${mw.now() - timerStart} ms`);
'settings.dialog', 'to.bottom' // 小工具Hook
});
].forEach(ele => {
mw.hook( 'wikipage.editform' ).add(() => {
mw.hook( ele ).add(x => {
console.log(`Hook: wikipage.editform after ${mw.now() - timerStart} ms`);
console.log(`Hook: ${ele} after ${mw.now() - start} ms`);
});
if (x) { console.info(x); }
mw.hook( 'structuredChangeFilters.ui.initialized' ).add(() => {
});
console.log(`Hook: structuredChangeFilters.ui.initialized after ${mw.now() - timerStart} ms`);
});
});
mw.hook( 'codeEditor.configure' ).add(() => {
console.log(`Hook: codeEditor.configure after ${mw.now() - timerStart} ms`);
});
mw.hook( 'code.prettify' ).add($content => {
console.log(`Hook: code.prettify after ${mw.now() - timerStart} ms`);
});
mw.hook( 'wikiplus.dialog' ).add($content => {
console.log(`Hook: wikiplus.dialog after ${mw.now() - timerStart} ms`);
});
mw.hook( 'transclusion.preview' ).add(() => {
console.log(`Hook: transclusion.preview after ${mw.now() - timerStart} ms`);
});
}) ();
}) ();

2023年3月17日 (五) 13:30的最新版本

// 由[[Special:Mypage/common.js]]调用,可以使用ES6语法
/**
 * @Description: 自用的工具函数
 * @Author: [[User:Bhsd]]
 */
"use strict";
// jshint varstmt: true
/**
 * @Function: 批量添加文件授权协议,只能处理不超过500个文件的分类
 * @Dependencies: mediawiki.api, ext.gadget.site-lib
 * @Param {String} cmtitle 分类名,默认为当前所在分类页
 */
mw.myCopyright = (cmtitle = mw.config.get( 'wgTitle' )) => {
	const cats = ['原作者保留权利的文件', '可自由使用的文件', 'LLWiki版权所有的文件', '使用CC Zero协议的文件'],
		api = new mw.Api();
	mw.timedQuery(api, { prop: 'categories', generator: 'categorymembers', gcmtitle: `Category:${cmtitle}`,
		gcmtype: 'file', gcmlimit: 'max', clcategories: cats.map(ele => `Category:${ele}`).join( '|' ), cllimit: 'max'
	}, '分类下无授权协议的文件').then(res => {
		res.query.pages.filter(ele => !ele.categories).forEach(ele => {
			api.postWithToken('csrf', {action: 'edit', pageid: ele.pageid, minor: 1, bot: 1,
				prependtext: '==授权协议==\n{{copyright}}\n', summary: '使用API批量添加授权协议',
			}).catch(reason => { console.error( `页面${ele.pageid}无法添加授权协议,错误原因:${reason}` ); });
		});
	}, () => {});
};

/**
 * @Function: 查询JS页面大小
 * @Dependencies: mediawiki.api, ext.gadget.site-lib
 */
mw.myJsSize = () => {
	const $table = $('.jsTable'), // 总是获取当前页面中的表格
		$items = $table.find( 'tr:nth-child(n+1)' ),
		titles = $items.find( 'a' ).toArray().map(ele => ele.title);
	mw.timedQuery(new mw.Api(), {prop: 'info', titles: titles.join( '|' )}, 'JS页面大小').then(data => {
		$table.toggleClass( 'jsTable jsTable2' );
		// 注意返回的结果可能顺序不同
		const lengths = Object.fromEntries( data.query.pages.map(ele => [ele.title, ele.length]) );
		$items.children( 'td:last-child' ).text(i => (lengths[ titles[i] ] / 1024).toFixed(1));
	}, () => { $('#myJsSize').off( 'click' ).one('click', mw.myJsSize); });
};

mw.hook( 'wikipage.content' ).add($content => {
	const $btn = $content.find( '#myJsSize' ).one('click', mw.myJsSize);
	if ($btn.length === 0) { return; }
	console.log('Hook: wikipage.content, 开始添加JS大小查询按钮');
});

(() => {
	/**
	 * @Function: 记录所有触发的Hook
	 */
	const start = mw.now();
	['postEdit', 'wikipage.content', 'wikipage.collapsibleContent', 'wikipage.categories', 'wikipage.diff',
		'wikipage.editform', 'structuredChangeFilters.ui.initialized', 'codeEditor.configure', // MW原生Hook
		'code.prettify', 'wikiplus.dialog', 'local.comments', 'hotcat.ready',
		'settings.dialog', 'to.bottom' // 小工具Hook
	].forEach(ele => {
		mw.hook( ele ).add(x => {
			console.log(`Hook: ${ele} after ${mw.now() - start} ms`);
			if (x) { console.info(x); }
		});
	});
}) ();