跳转到内容

User:A2569875-sandbox/blib-preview.js:修订间差异

维基百科,自由的百科全书
删除的内容 添加的内容
无编辑摘要
无编辑摘要
第171行: 第171行:
};
};
$mw_content_text = $("#mw-content-text").find(".mw-parser-output"); //抓取條目主體
$mw_content_text = $("#mw-content-text").find(".mw-parser-output"); //抓取條目主體
$mw_content_text.prepend($($notice_loading));
$(($mw_content_text[0])||{prepend:()=>0}).prepend($($notice_loading));
mwapi.post(params).done(function (data) { //送交wikitext解析
mwapi.post(params).done(function (data) { //送交wikitext解析
if (!data || !data.parse || !data.parse.text || !data.parse.text['*']) return; //解析失敗
if (!data || !data.parse || !data.parse.text || !data.parse.text['*']) return; //解析失敗

2023年12月14日 (四) 15:34的版本

$(()=>{(async ()=>{
	const mw_data = window["mw"];
	var mwapi = new mw_data.Api({ajax: {headers: {'Api-User-Agent': 'BluedeckLibraryPreview/1.0 (' + mw_data.config.get('wgWikiID') + ')'}}});
	var _addText = "{{Doc}}";
	const page_name = mw_data.config.values.wgPageName;
	const page_name_lower = page_name.toLowerCase();
	let blib_content_class = "blib-mw-content-text";
	var $notice_loading = '<div id="mw-bluedecklibrary-preview-loading"><div class="quotebox" style="margin: auto; width: 50%; padding: 6px; border: 1px solid #aaa; font-size: 88%; background-color: #F9F9F9;"><div id="mw-_addText-preview-loading-content" style="background-color: #F9F9F9; color: black; text-align: center; font-size: larger;"><img src="/upwiki/wikipedia/commons/d/de/Ajax-loader.gif" decoding="async" data-file-width="32" data-file-height="32" width="32" height="32"> Loading... </div></div></div>';
	let blib_link_script = "https://zh.wikipedia.org/zhwiki/w/index.php?title=User:Bluedeck/serve/blib-link.js&action=raw&ctype=text/javascript";
	
	function getLanguage(){
		var lang = mw_data.config.get('wgUserLanguage');
		if(lang.indexOf('zh') > -1) return mw_data.config.get('wgUserVariant');
		return lang;
	}

	async function get_this_page_wikitext() {
		const request_uri = `/zhwiki/w/index.php?title=${encodeURIComponent(page_name)}&action=raw`;
		const response = await fetch(request_uri);
		const response_text = await response.text();
		return response_text;
	}

	function blib_inverse_workload(incoming_text) { //修改自[[user:bluedeck/serve/blib-inverse.js]]
		var card_start = incoming_text.toLowerCase().indexOf("{{user:bluedeck/infr/library.card.js");
		var card_end = incoming_text.substr(card_start).indexOf("}}") + card_start;

		if(card_start !== -1 && card_end !== -1)
			incoming_text = incoming_text.substr(0, card_start) + incoming_text.substr(card_end + 2);

		return incoming_text
			.replace(/<\s*nowiki\s*>\s*(\[\[\s*\:?\s*(cat(egory)?|分[類类])\:(.|[\s])*)<\s*\/\s*nowiki\s*>/ig, "$1")
			.replace(/\[\[\s*\:?\s*(cat(egory)?|分[類类])\s*\:/ig,"[[$1:")
			//.replace(/\{\{\(\(\}\}\s*([^#][^\{\}\n]*)\}\}/g, "{{#invoke:沙盒/a2569875/BluedeckLibraryTemplate|build_template|@&$$$$~~!_template_name_!~~$$$$&@=$1}}")
			//.replace(/\{\{\(\(\}\}\s*\#/g, "{{#")
			//.replace(/\{\{\(\(\}\}/g, "{{#invoke:沙盒/a2569875/BluedeckLibraryTemplate|build_template|@&$$$$~~!_template_name_!~~$$$$&@=")
			.replace(/\{\{\(\(\}\}/g, "{{")
			;
	}
	
	//讓功能可以由按鈕觸發
	async function parse_blib_wikitext(put_back) {
		//有圖書館卡才開始運行
		let page_divs = $(".mw-parser-output > div .NavFrame, .mw-parser-output > div > div .NavFrame, .blib-preview-card > div .NavFrame"); //從條目主體裡的div中尋找圖書館卡
		console.log("藍桌圖書館預覽:進入藍桌圖書館");
		let library_card_meta = ({})[0];
		let library_card = ({})[0];
		let library_before = $("<span></span>");
		for (let i = 0; i < page_divs.length; ++i) {  //尋找圖書館卡
			let it = page_divs[i];
			let check_text = $(it).text().trim().replace(/\s+/g,"").toLowerCase();
			if ( check_text.startsWith("bluedecklibrary圖書館卡") || //找到圖書館卡
				check_text.startsWith("bluedecklibrary图书馆卡")) {
					library_card_meta = it.parentElement;
					break;
			}
		}
		if(!($(library_card_meta.parentElement).hasClass("mw-parser-output"))) { //外層有別的東西
			let packet = $("<div></div>"); //空的最內層子物件
			//for迴圈:從圖書館卡向外搜索; 搜索到.mw-parser-output停止; 每次往外搜索一層
			for (let pptr = library_card_meta; !!pptr && !($(pptr||"<span></span>").hasClass("mw-parser-output")); pptr = (pptr||{}).parentElement) {
				if((($(pptr).parent()||{prop:()=>""}).prop("tagName")||"").toLowerCase() === "main") break; //例外狀況的停止條件
				let pptr_parent = pptr.parentElement;
				let child_items = $("<div></div>"); //包裝子物件的容器
				for (let i = 0; i < pptr_parent.childNodes.length; ++i) { //包裝子物件
					if (pptr_parent.childNodes[i] === pptr) break; //包到目前的物件為止(不含目前的物件)
					child_items.append($(pptr_parent.childNodes[i])); //包裝進子物件容器
				}
				child_items.append($(packet)); //子物件容器裝進來自上一層迴圈(底層)的容器
				packet = $("<div></div>").append($(child_items)); //容器更新為,包裝了剛剛那些子物件的容器
			}
			library_before = packet;
		}
		if (library_card_meta !== undefined) { //如果圖書館卡本體存在
			let lib_flag = library_card_meta.nextSibling; //嘗試搜尋圖書館卡flag
			while(((lib_flag||{}).nodeName||"").toLowerCase() != "div") {
				if ((lib_flag||{}).nextSibling) {
					lib_flag = lib_flag.nextSibling;
				} else break;
			}
			if (((lib_flag||{}).nodeName||"").toLowerCase() == "div") { //取到了有效的圖書館卡
				console.log("藍桌圖書館預覽:取得圖書館卡...");
				$(lib_flag).after($($notice_loading));
				const this_page_wikitext = await get_this_page_wikitext(); //取得原始維基代碼
				const text_after_blib_inverse = blib_inverse_workload(this_page_wikitext); //還原藍桌圖書館代碼
				
				console.log(text_after_blib_inverse)
				
				let params = { //解析藍桌圖書館頁面原碼解的API參數
					action: 'parse',
					uselang: getLanguage(),
					useskin: mw_data.config.get('skin'),
					title: (/User:Bluedecklibrary[\\\/]([^\n]+)$/i.exec(page_name)||[])[1]||page_name,
					text: text_after_blib_inverse, //已還原的藍桌圖書館代碼
					contentmodel: "wikitext",
					prop: "text|categorieshtml|categories", //包含原始結果與分類
					format: 'json'
				};
				mwapi.post(params).done(function (data) { //送交wikitext解析
					if (!data || !data.parse || !data.parse.text || !data.parse.text['*']) return; //解析失敗
					console.log("藍桌圖書館預覽:藍桌圖書館頁面原碼解析完畢。");
					let parsed_wiki = (data.parse.text['*'] || '').toString().trim(); //解析後的wikitext
					let cat_list = data.parse.categories || []; //解析後的分類列表
					let parsed_cats = (data.parse.categorieshtml['*'] || '').toString().trim(); //解析後的分類HTML元素
					if (parsed_wiki !== '') {
						console.log("藍桌圖書館預覽:正在部署藍桌圖書館預覽...");
						library_card = $('<div class="blib-preview-card"></div>'); //圖書館卡的容器
						library_card.append(library_before);
						library_card.append(library_card_meta); //裝入圖書館卡本體
						library_card.append(lib_flag); //裝入圖書館卡flag
						$mw_content_text = $("#mw-content-text").find(".mw-parser-output"); //抓取條目主體
						let $ptr = $mw_content_text; //搜尋條目主體節點
						while((($ptr.parent()||{prop:()=>""}).prop("tagName")||"").toLowerCase()!=="main") {
							$ptr = $ptr.parent();
							if ($ptr.length <= 0){ 
								$ptr = $($("#content.mw-body")[0].firstChild || document.querySelector("#bodyContent") || $mw_content_text);
								break;
							}
						}
						let $page_main = $ptr.parent(); //條目主體節點
						let $content_container = $page_main.parent() || $(".mw-content-container"); //條目內容容器節點
						let $footer_container = $(($content_container[0]||{nextElementSibling:"<span>"}).nextElementSibling); //條目底部節點
						let $parsed_wiki = $(parsed_wiki);
						
						$parsed_wiki.addClass(blib_content_class);
						let body = $mw_content_text[0]; //條目主體的HTML element
						body.innerHTML = ""; //先清空,等待替換
						body = $(body);
						body.append(library_card); //補回圖書館卡
						body.append($parsed_wiki); //貼進解析完的條目內容
						if (cat_list.length > 0) { //加入分類
							let $parsed_cats = $(parsed_cats);
							if ($("#catlinks").hasClass("catlinks-allhidden") && !$parsed_cats.hasClass("catlinks-allhidden")) {
								$("#catlinks").removeClass("catlinks-allhidden"); //如果有分類,且原始分類欄位被隱藏 就取消隱藏
							}
							$("#catlinks")[0].innerHTML = $parsed_cats[0].innerHTML || ''; //替換分類顯示欄位的內容為解析後的分類
							$footer_container.css("padding-top",0); //分類下方的空格移除
						}
						let $blib_content_class = $('.'+blib_content_class);
						mw_data.hook('wikipage.content').fire($blib_content_class);
						$.getScript(blib_link_script
						).done(function( script, textStatus ) {
							setTimeout(function(){
								$blib_preview_card = $(".blib-preview-card");
								if ($blib_preview_card.length > 0) //移除圖書館卡中的重複元素
									$blib_preview_card.find(".bldk_dom_id_fbc2343a21e23222a82b9891f175532b8").html("");
								if (put_back) {
									$mw_content_text.prepend( '<button onclick="mw.blib.blib_putback()">還原圖書館文章預覽</button>');
								}
							}, 500);
						    console.log("藍桌圖書館預覽:成功預覽藍桌圖書館!");
						});
					}
				}).fail(function () {});
			}
		}
	}
	
	async function blib_putback() {
		const request_uri = `/zhwiki/w/index.php?title=${encodeURIComponent(page_name)}&action=raw`;
		const response = await fetch(request_uri);
		let params = {
			action: 'parse',
			uselang: getLanguage(),
			useskin: mw_data.config.get('skin'),
			title: page_name,
			text: await response.text(),
			contentmodel: "wikitext",
			prop: "text",
			format: 'json'
		};
		$mw_content_text = $("#mw-content-text").find(".mw-parser-output"); //抓取條目主體
		$(($mw_content_text[0])||{prepend:()=>0}).prepend($($notice_loading));
		mwapi.post(params).done(function (data) { //送交wikitext解析
			if (!data || !data.parse || !data.parse.text || !data.parse.text['*']) return; //解析失敗
			let parsed_wiki = (data.parse.text['*'] || '').toString().trim(); //解析後的wikitext
			if (parsed_wiki !== '') {
				$mw_content_text.html(parsed_wiki);
				mw_data.hook('wikipage.content').fire($mw_content_text);
				$mw_content_text.prepend('<button onclick="mw.blib.parse_blib_wikitext(true)">顯示圖書館文章預覽</button>');
			}
		});
	}

	mw.blib = mw.blib || {};
	mw.blib.parse_blib_wikitext = parse_blib_wikitext;
	mw.blib.blib_putback = blib_putback;
	//只有藍桌圖書館頁面才要運作
	if (page_name_lower.trim().startsWith("user:bluedecklibrary/")){
		//只有 "view" 模式才要運作
		if(mw_data.config.values.wgAction !== "view") {
			if(mw_data.config.values.wgAction === "submit" && ($("#wikiPreview").length||0) > 0) {
				$("#mw-content-text").find(".mw-parser-output").prepend( '<button onclick="mw.blib.parse_blib_wikitext(true)">顯示圖書館文章預覽</button>');
			}
			return;
		}
		parse_blib_wikitext();
	}
})();});