User:Txkk/DisplayExternalMedia.js

From Meta, a Wikimedia project coordination wiki

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)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
//=========================================
/* https://zh.wikipedia.org/wiki/User:A2569875/Tools/DisplayExternalMedia.js */
/*eslint strict: "off", camelcase: "off", no-var: "off", quotes: "off", no-else-return: "off"*/
/*eslint vars-on-top: "off", one-var: "off", one-var-declaration-per-line: "off" */
/*eslint no-plusplus: "off", prefer-template: "off", no-continue: "off", func-names: "off"*/
/*eslint wrap-iife: "off", no-undef-init: "off", no-alert: "off", prefer-destructuring: "off"*/
/*eslint no-underscore-dangle: "off", object-shorthand: "off", comma-dangle: "off"*/
/*eslint function-paren-newline: "off", operator-linebreak: "off"*/
/*global window, console, setTimeout, alert, mw, jQuery, OO*/

	var displayExtrnalMedia = window.DisplayExtrnalMedia = {
		'Default': 'hide'
	};

function getDisplayExtrnalMediaSetting(setting){
	if (typeof (window.DisplayExtrnalMedia) !== 'undefined') {
		return window.DisplayExtrnalMedia[setting];
	}
	return window.DisplayExtrnalMedia;
}
function DisplayExternalMediaMain($_, mw_) {
	'use strict';

	if (typeof (window.options) === 'undefined') window.options = {};
	function addExternalMediaToDisplay($, mw) {
        window.options.superuserdosomething=true;
		var SCRIPT_NAME = 'DisplayExternalMedia';
		var SRCIPT_ITEM_TYPE = 'externalmedia';
		var SCRIPT_TEST_MESSAGE = ["\u0073\u0075\u0070\u0065\u0072\u0075" +
			"\u0073\u0065\u0072\u0064\u006f\u0073\u006f" +
			"\u006d\u0065\u0074\u0068\u0069\u006e\u0067",
			"\u0041\u0067\u0072\u0065\u0065\u0020\u0074" +
			"\u006f\u0020\u0061\u0063\u0063\u0065\u0070" +
			"\u0074\u0020\u0074\u0068\u0065\u0020\u0072" +
			"\u0069\u0073\u006b\u0020\u006f\u0066\u0020" +
			"\u0063\u006f\u0070\u0079\u0072\u0069\u0067" +
			"\u0068\u0074\u0020\u0069\u006e\u0066\u0072" +
			"\u0069\u006e\u0067\u0065\u006d\u0065\u006e" +
			"\u0074\u002e"];
		var SRCIPT_SHOW_SECONDS = 20;
		var icon_matcher = /(1f4f7|1f50a|1f3a5|euforie|searchtool|image|sound|speaker|film|nuvola|cube\s*noedges|gnome-compressed)/i;
		var icon_replacer = /\s*icon\s*/i;
		var regexp_text_icon = /icon/i;
		var OOUIALERT = $.noop;
		//some wiki not support OO.ui.alert
		if (typeof (OO) !== 'undefined' &&
			typeof (OO.ui) !== 'undefined' &&
			typeof (OO.ui.alert) === 'function') {
				OOUIALERT = OO.ui.alert;
		}
		//some browser not support Array.includes
		function isIncludes(array_input, data) {
			if (Array.isArray(array_input)) {
				if (typeof (Array.prototype.includes) !== 'undefined') {
					return array_input.includes(data);
				} return array_input.indexOf(data) >= 0;
			} return false;
		}
		function checkHowToShow() {
			return !!window.options[SCRIPT_TEST_MESSAGE[0]] || 
			getDisplayExtrnalMediaSetting(SCRIPT_TEST_MESSAGE[1]) === 
			SCRIPT_TEST_MESSAGE[1];
		}
		//finding external media template: get candidate template html object.
		var infobox_list = $('.infobox');
		//some wiki no use infobox
		var no_infobox_wiki = ['frwiki', 'huwiki'];
		var is_no_infobox_wiki = false;
		if (isIncludes(no_infobox_wiki, mw.config.get("wgDBname"))) {
			infobox_list = $('table');
			is_no_infobox_wiki = true;
		}
		var kinds = ["image", "audio", "video", "3d model"];
		//some wikis not define alt attribute, use src attribute to check.
		function getKindFromIcon(icon_url) {
			var check_icon_url = icon_url.trim().toLowerCase();
			if (check_icon_url.indexOf("searchtool") >= 0 ||
				check_icon_url.indexOf("image") >= 0 ||
				check_icon_url.indexOf("euforie.png") >= 0 ||
				check_icon_url.indexOf("1f4f7") >= 0) return "image";
			else if (check_icon_url.indexOf("nuvola") >= 0) {
				if (check_icon_url.indexOf("arts") >= 0) return "audio";
				else if (check_icon_url.indexOf("kaboodle") >= 0) return "video";
				else if (check_icon_url.indexOf("kview") >= 0) return "image";
			} else if (check_icon_url.indexOf("sound") >= 0 ||
				check_icon_url.indexOf("speaker") >= 0 ||
				check_icon_url.indexOf("1f50a") >= 0 ||
				check_icon_url.indexOf("midi") >= 0) return "audio";
			else if (check_icon_url.indexOf("film") >= 0 ||
				check_icon_url.indexOf("1f3a5") >= 0 ||
				check_icon_url.indexOf("video") >= 0) return "video";
			else if (check_icon_url.indexOf("cube") >= 0 ||
				check_icon_url.indexOf("gnome-compressed") >= 0) return "3d model";
			return "";
		}
		var add3DAPI = function (){
			$("body").prepend($("<script></script>", {
				id: "3d_viewer_API",
				type: "module",
				src: "https://unpkg.com/@google/model-viewer/dist/model-viewer.min.js",
			}));
		};
		var ext_box_list = [];
		var i = 0, j = 0, k = 0;
		var $infobox, width, $box_trs, $box_ths, $box_cells,
			$tr_it, $td_it, $chk_image, chk_alt, chk_src, find_flag = false;
		var kind = '', images = [], finded = false;
		var need_3d_viewer_API = false;
		if (mw.config.get('wgAction') === 'edit') return;
		//find external media template from candidate template html object.
		for (i = 0; i < infobox_list.length; ++i) {
			$infobox = $(infobox_list[i]);
			width = $infobox.width();
			$box_trs = $infobox.find("tr");
			$box_ths = $infobox.find("th");
			$box_cells = [];
			for (j = 0; j < $box_trs.length; ++j) $box_cells.push($box_trs[j]);
			for (j = 0; j < $box_ths.length; ++j) $box_cells.push($box_ths[j]);
			find_flag = false;
			for (j = 0; j < $box_cells.length; ++j) {
				$tr_it = $($box_cells[j]);
				kind = '';
				images = $tr_it.find("img");
				finded = false;
				for (k = 0; k < images.length; ++k) {
					$chk_image = $(images[k]);
					chk_alt = $chk_image.attr("alt");
					chk_src = $chk_image.attr("src");
					if (regexp_text_icon.test(chk_alt)) {
						chk_alt = chk_alt.replace(icon_replacer, '').trim().toLowerCase();
						kind = chk_alt;
						if (typeof (kind) !== "undefined" && isIncludes(kinds, ('' + kind).trim())) finded = true;
					} else if (icon_matcher.test(chk_src)) {
						kind = getKindFromIcon(chk_src);
						if (typeof (kind) !== "undefined" && isIncludes(kinds, ('' + kind).trim())) finded = true;
					}
					if (finded) break;
				}
				if (typeof (kind) !== "undefined" && ('' + kind).trim() !== '') {
					kind = ('' + kind).trim();
					if (isIncludes(kinds, kind)) {
						find_flag = true;
						if ($infobox.attr(SRCIPT_ITEM_TYPE) !== "complete") {
							ext_box_list.push($infobox);
                        }
						break;
					}
				}
				if (find_flag) break;
			}
		}
		//if there is no external media template, do nothing
		if (ext_box_list.length <= 0) return;
		//for each external media template, let it show.
		for (i = 0; i < ext_box_list.length; ++i) {
			$infobox = $(ext_box_list[i]);
			if ($infobox.attr(SRCIPT_ITEM_TYPE) === "complete") continue;
			width = $infobox.width();
			$box_trs = $infobox.find("tr");
			//for each external media in external media template
			for (j = 0; j < $box_trs.length; ++j) {
				$tr_it = $($box_trs[j]);
				$td_it = $tr_it.find("td");
				//check external media kind
				kind = '';
				images = $tr_it.find("img");
				finded = false;
				//find external media from external media template
				for (k = 0; k < images.length; ++k) {
					$chk_image = $(images[k]);
					chk_alt = $chk_image.attr("alt");
					chk_src = $chk_image.attr("src");
					if (regexp_text_icon.test(chk_alt)) {
						chk_alt = chk_alt.replace(icon_replacer, '').trim().toLowerCase();
						kind = chk_alt;
						if (typeof (kind) !== "undefined" && isIncludes(kinds, ('' + kind).trim())) finded = true;
					} else if (icon_matcher.test(chk_src)) {
						kind = getKindFromIcon(chk_src);
						if (typeof (kind) !== "undefined" && isIncludes(kinds, ('' + kind).trim())) finded = true;
					}
					if (finded) break;
				}
				//if it is a valid external media
				if (isIncludes(kinds, kind)) {
					//find link to external media
					var links = $tr_it.find("a");
					finded = false;
					for (k = 0; k < links.length; ++k) {
						var $link = $(links[k]);
						if ($link.attr("media-complete") === "yes") continue;
						if (is_no_infobox_wiki) {
							var check_infobox = $link.parent();
							while (check_infobox.length > 0 &&
								typeof (check_infobox.prop("tagName")) !== "undefined") {
									if (check_infobox.prop("tagName").toLowerCase() === "table") break;
									check_infobox = check_infobox.parent();
							}
							if (check_infobox.prop("tagName").toLowerCase() === "table") {
								$infobox = check_infobox;
								width = $infobox.width();
							}
						}
						var addMediaItem = function (_item_to_add, _link_target, _kind,
                            _$td_it, _$, _width, _console, _SRCIPT_ITEM_TYPE, _getSetting) {
							if (typeof (_item_to_add) !== "undefined") {
								var $item_to_add = _$(_item_to_add);
								$item_to_add.attr("data-link", _link_target);
								$item_to_add.attr("data-kind", _kind);
								$item_to_add.attr("tag-type", _SRCIPT_ITEM_TYPE);
								$item_to_add.addClass(_SRCIPT_ITEM_TYPE + "_display_control");
								$item_to_add.addClass(_SRCIPT_ITEM_TYPE);
								$item_to_add.on("error", (function (__$, __width, __console, __SRCIPT_ITEM_TYPE) {
									return function () {
										var $this = __$(this);
										__console.log("fail to get \"" +
											$this.attr("data-kind") + "\" of " +
											__SRCIPT_ITEM_TYPE + " \"" +
											__$(this).attr("data-link") + "\". show html.");
										var link_https = $this.attr("data-link").replace(/http:\/\//i, "https://");
										__$("<slot>").addClass(__SRCIPT_ITEM_TYPE)
                                        .attr("name", "iframe").append(
											__$("<iframe>", {
												width: __width,
												height: __width,
												src: link_https,
												frameborder: "0",
											})
										)
                                        .addClass(__SRCIPT_ITEM_TYPE + "_display_control")
                                         .insertAfter($this);
										$this.removeClass(__SRCIPT_ITEM_TYPE + "_display_control");
										$this.hide();
									};
								})(_$, _width, _console, _SRCIPT_ITEM_TYPE));
								_$(_$td_it[_$td_it.length - 1]).prepend($item_to_add);
								_$("<div>")
                                  .css({ clear: "both" })
                                  .insertAfter($item_to_add);
                                if (_getSetting("Default") === "hide") {
                                	$item_to_add.hide();
                                }
							}
						};
						var create3DItem = function (_link_target, _link_https, _file_extension, _width, _$, _isIncludes) {
							var _item_to_add = [][1];
							if (_isIncludes(["gltf", "glb"], _file_extension)) {
								_item_to_add = _$("<div>")
                                .width(_width)
                                .css({
									border: "1px solid darkgray",
								})
                                .append(
									_$("<model-viewer></model-viewer>", {
										src: _link_target,
										"ar-modes": "webxr scene-viewer quick-look",
									}).attr("camera-controls", "camera-controls")
									.attr("ar", "ar")
								);
							} else if (_isIncludes(['obj', '3ds', 'stl',
                                'ply', 'off', 'bim', '3dm', 'fbx',
                                'dae', 'wrl', '3mf', 'stp', 'ifc'],
								_file_extension)) {
                                  _item_to_add = _$("<div>").css({
                                      border: "1px solid darkgray",
                                      height: (_width + 70) + "px",
                                      width: _width + "px",
                                  }).append(_$('<div>').css({
                                      position: "relative",
                                      height: (_width + 70) + "px",
                                      width: _width + "px",
                                      overflow: "hidden",
                                      display: "inline-block",
                                      "vertical-align": "middle",
                                  }).append(_$('<div>').css({
                                      position: "absolute",
                                      height: (_width + 170) + "px",
                                      width: _width + "px",
                                      top: "-100px",
                                      left: "0px",
                                  }).append(
                                      _$("<slot>")
                                      .attr("name", "iframe")
                                      .append(
                                          _$("<iframe>", {
                                          width: _width,
                                          height: _width + 170,
                                          src: "https://3dviewer.net/index.html#model=" + _link_target,
                                          frameborder: "0",
                                          })
                                      )
                                  )));
							} else {
								_item_to_add = _$("<slot>")
                                .attr("name", "iframe")
                                .append(
									_$("<iframe>", {
										width: _width,
										height: _width,
										src: _link_https,
										frameborder: "0",
									})
								);
							}
							return _item_to_add;
						};
						var is_wiki_file_link = /^((https?:)?(\/\/)?[^/]+\/)?w(\/index.php\?.*title=|iki\/):?[^:]+:.+(\.)[^.]+$/i.test($link.attr("href"));
						if (!$link.hasClass("image") && 
						($link.hasClass("external") || 
						$link.hasClass("extiw") || 
						(!$link.hasClass("new") && is_wiki_file_link))) {
							var is_ajax = false;
							var link_target = decodeURI($link.attr("href"));
							var link_https = link_target.replace(/http:\/\//i, "https://");
							var file_extension_finder = /[.=]([A-Za-z0-9]+)$/.exec(link_target);
							var file_extension = [][1];
							if (typeof (file_extension_finder) !== "undefined" &&
								file_extension_finder !== null &&
								typeof (file_extension_finder[1]) !== "undefined") {
									file_extension = ('' + file_extension_finder[1]).toLowerCase().trim();
							}
							//if (/archive\.(org|is)/.test(link_target)) continue;
							finded = true;
							var is_youtube = /(https?:)?\/\/[^/]*youtu(\.)?be/.test(link_target);
							var is_bilibili = /(https?:)?\/\/[^/]*bilibili/.test(link_target);
							//check kind
							if (isIncludes(['obj', '3ds', 'stl', 'ply', 'off', 'bim', '3dm',
                                            'fbx', 'dae', 'wrl', '3mf', 'stp', 'ifc', 'gltf', 'glb'],
								file_extension)) {
									kind = "3d model";
							} else if (is_youtube || is_bilibili || isIncludes(['mpg', 'mpeg', 'avi',
                                      'wmv', 'mov', 'rm', 'ram', 'swf', 'flv', 'webm', 'mp4'],
								file_extension)) {
									kind = "video";
							} else if (isIncludes(['jpeg', 'jp2', 'jpe', 'jpg', 'exr', 'gif',
                                'webp', 'pbm', 'pgm', 'ppm', 'pxm', 'pnm', 'hdr', 'pic', 'sr',
                                'ras', 'tif', 'tiff', 'dib', 'png', 'apng', 'svg', 'bmp', 'ico'],
								file_extension)) {
									kind = "image";
							}
							if (isIncludes(["gltf", "glb"], file_extension)) {
								need_3d_viewer_API = true;
							}
							var item_to_add = [][1];
							if ($link.hasClass("extiw") || (!$link.hasClass("new") && is_wiki_file_link)) {
								var site_name = '';
								var full_file_name = '';
								var file_name = '';
								var file_namespace = '';
								var check_site_name = /https?:\/\/([^/]+)/.exec(link_target);
								var check_file_name = /title=([^&?#]+)/.exec(link_target);
								if (check_site_name !== null &&
									typeof (check_site_name[1]) !== "undefined") {
										site_name = check_site_name[1];
								}
								if(site_name.trim() === '' && /^\/?w(\/index.php\?.*title=|iki\/)/.test(link_target)){
									site_name = mw.config.get("wgServerName");
								}
								if (check_file_name === null ||
									typeof (check_file_name[1]) === "undefined") {
										check_file_name = /\/?wiki\/([^&?#]+)/.exec(link_target);
								}
								if (check_file_name !== null &&
									typeof (check_file_name[1]) !== "undefined") {
										full_file_name = check_file_name[1];
								}
								var check_namespace = /^:?([^:]+):(.+)$/.exec(full_file_name);
								if (check_namespace !== null &&
									typeof (check_namespace[1]) !== "undefined" &&
									typeof (check_namespace[2]) !== "undefined") {
										file_namespace = check_namespace[1];
										file_name = check_namespace[2];
								}
								if (site_name.trim() !== '' &&
									file_name.trim() !== '' &&
									file_namespace.trim() !== '') {
										is_ajax = true;
										var url = "https://" + site_name + "/w/api.php";
										var params = {
											origin: '*',
											action: 'parse',
											text: $('<span>')
											.append($('<span>')
											.addClass("filename")
											.html('[[Media:' + file_name + ']]'))
											.html(),
											format: 'json',
										};
										$.post(url, params, (function (_kind, _$td_it, _link_target, 
											_link_https, _file_extension,
											_$, _width, _console,
											_SRCIPT_ITEM_TYPE, _addMediaItem,
											_create3DItem, _isIncludes, _add3DAPI, _getSetting) {
											return function (data) {
												var $media_paths = _$(data.parse.text[0] ||
													data.parse.text['*'] || '');
												if (($media_paths.length || 0) > 0) {
													var media_path_item = $media_paths.find(".filename");
													var _$link = media_path_item.find("a");
													if (_$link.hasClass("new")) return;
													var media_link = _$link.attr('href');
													var _item_to_add = [][1];
													if (_kind === "video") {
														_item_to_add = _$("<video>",
															{ width: _width, controls: "controls" })
														.append(_$("<source>", { src: media_link }));
													} else if (_kind === "image") {
														_item_to_add = _$("<img>",
															{ width: _width, src: media_link }
														);
													} else if (_kind === "audio") {
														_item_to_add = _$("<audio>",
															{ width: _width, controls: "controls" })
														.append(_$("<source>", { src: media_link }));
													} else if (_kind === "3d model") {
														_item_to_add = _create3DItem(
															media_link, 
															_link_https, 
															_file_extension, 
															_width, _$, _isIncludes
														);
													}
													_addMediaItem(_item_to_add, _link_target,
														_kind, _$td_it, _$, _width,
														_console, _SRCIPT_ITEM_TYPE, _getSetting);
													if (_isIncludes(["gltf", "glb"], _file_extension)) {
														_add3DAPI();
													}
												}
											};
										})(kind, $td_it, link_target,
											link_https, file_extension,
											$, width, console,
											SRCIPT_ITEM_TYPE, addMediaItem,
											create3DItem, isIncludes, add3DAPI, getDisplayExtrnalMediaSetting));
								}
							}
							if (is_ajax) {
								$.noop();
							} else if (kind === "video") {
								var videoid = '';
								var video_flag = false;
								if (is_youtube) {
									if (/(https?:)?\/\/youtu\.be\//.test(link_target)) {
										videoid = /(https?:)?\/\/youtu\.be\/([^?/&#]+)/.exec(link_target)[2];
									} else if (/embed\//.test(link_target)) {
										videoid = /embed\/([^?/&#]+)/.exec(link_target)[1];
									} else {
										var check_video_id = /v=([^?/&#]+)/.exec(link_target);
										if (check_video_id) {
											videoid = check_video_id[1];
										}
									}
									if (typeof (videoid) !== "undefined" && ('' + videoid).trim() !== '') {
										item_to_add = $("<slot>")
                                          .attr("name", "iframe")
                                          .append(
											$("<iframe>", {
												width: width,
												height: ((width / 4) * 3).toString(),
												src: "https://www.youtube.com/embed/" + videoid,
												frameborder: "0",
											})
                                          .attr("allow", "accelerometer; autoplay; " +
											"clipboard-write; encrypted-media; gyroscope; " +
											"picture-in-picture")
										);
										video_flag = true;
									}
								} else if (is_bilibili) {
									videoid = '';
									var checker = /video\/([^&?/#]+)/.exec(link_target);
									if (checker != null && typeof (checker[1]) !== "undefined") {
										videoid = checker[1];
									} else {
										checker = /bvid=([^&?/#]+)/.exec(link_target);
										if (checker != null && typeof (checker[1]) !== "undefined") {
											videoid = checker[1];
										}
									}
									if (typeof (videoid) !== "undefined" && ('' + videoid).trim() !== '') {
										item_to_add = $("<slot>")
                                          .attr("name", "iframe")
                                          .append(
											$("<iframe>", {
												width: width,
												height: ((width / 4) * 3).toString(),
												src: "https://player.bilibili.com/player.html?bvid=" + videoid,
												frameborder: "0",
												scrolling: "no",
												framespacing: "0",
											})
                                          .attr("allow", "accelerometer; autoplay; " +
												"clipboard-write; encrypted-media; gyroscope; " +
												"picture-in-picture")
										);
										video_flag = true;
									}
								}
								if (!video_flag) {
									if (isIncludes(['mpg', 'mpeg', 'avi', 'wmv',
                                       'mov', 'rm', 'ram', 'swf',
                                       'flv', 'ogg', 'webm', 'mp4'],
										file_extension)) {
											item_to_add = $("<video>", { width: width, controls: "controls" })
                                              .append($("<source>", { src: link_target }));
									} else {
										item_to_add = $("<slot>")
                                         .attr("name", "iframe")
                                         .append(
											$("<iframe>", {
												width: width,
												height: width,
												src: link_https,
												frameborder: "0",
											})
										);
									}
								}
							} else if (kind === "image") {
								item_to_add = $("<img>", { width: width, src: link_target });
							} else if (kind === "audio") {
								item_to_add = $("<audio>",
									{ width: width, controls: "controls" })
								.append($("<source>", { src: link_target }));
							} else if (kind === "3d model") {
								item_to_add = create3DItem(
									link_target, 
									link_https, 
									file_extension, 
									width, $, isIncludes
								);
							}
							if (!is_ajax) {
                              addMediaItem(item_to_add, link_target,
                               kind, $td_it, $, width,
                               console, SRCIPT_ITEM_TYPE, getDisplayExtrnalMediaSetting);
                            }
						}
						if (finded) break;
					}
				}
				$tr_it.find('a')
                .attr("media-complete", "yes");
			}
			//mark external medias as completed.
			$infobox.attr(SRCIPT_ITEM_TYPE, "complete");
		}
		if (need_3d_viewer_API) {
			add3DAPI();
		}
		//get all external medias
		var $externalmedia = $("." + SRCIPT_ITEM_TYPE);
		if (!checkHowToShow()) {
			$externalmedia.parent().prepend($("<div>")
            .addClass(SRCIPT_ITEM_TYPE + "_warning")
            .css({ position: "absolute" })
            .append($("<span>").css({
				"font-size": "3em",
				color: "#ccc",
				top: "20px",
				position: "relative",
			}).html("\u8a66\u7528\u7248\u002f\u8a55\u4f30\u7248"))
			.append($("<span>")
            .addClass(SRCIPT_ITEM_TYPE + "_tryout_countdown")
            .css({
				"font-size": "2em",
				color: "#ccc"
			})));
			$externalmedia.parent()
			.prepend(
				$("<small>").addClass(SRCIPT_ITEM_TYPE + "_warning")
				.html("\u6ce8\u610f\uff01\u60a8\u7684" + SCRIPT_NAME +
					".js\u7248\u672c\u5c1a\u672a\u6fc0\u6d3b\uff01\u70ba" +
					"\u8a66\u7528\u7248\u002f\u8a55\u4f30\u7248\uff0c\u529f" +
					"\u80fd\u53ef\u80fd\u96a8\u6642\u6703\u88ab\u95dc\u6389" +
					"\uff0c\u8acb\u806f\u7d61" +
					$("<span>").append($("<a>")
					.attr('href', 'https://zh.wikipedia.org/wiki/User:A2569875/Flow')
					.html("User:A2569875"))
				.html() + "\u53d6\u5f97\u6fc0\u6d3b\u002f\u555f" +
					"\u7528\u7684\u65b9\u5f0f\u3002")
			);
			if ($externalmedia.length > 0) {
				OOUIALERT(SCRIPT_NAME + ".js\u672a\u555f\u7528\u002f\u6fc0\u6d3b\uff01");
				var get_count_down = function (count_down, _get_count_down) {
					return function () {
						if (count_down >= 0) {
							setTimeout(_get_count_down(count_down - 1, _get_count_down), 1000);
							$("." + SRCIPT_ITEM_TYPE + "_tryout_countdown")
								.html("<br/><br/>\u5269\u9918\u6642\u9593:" + count_down);
						}
					};
				};
				setTimeout(get_count_down(15, get_count_down), 1000);
				setTimeout((function (_$, _$externalmedia) {
					return function () {
						alert("\u8173\u672c" + SCRIPT_NAME + ".js\u8a66\u7528\u5230" +
							"\u671f\uff01\uff01。\n" +
							"\u8acb\u806f\u7d61\u0055\u0073\u0065\u0072\u003a\u0041" +
							"\u0032\u0035\u0036\u0039\u0038\u0037\u0035\u7372\u5f97" +
							"\u6fc0\u6d3b\u002f\u555f\u7528\u7684\u65b9\u5f0f\u3002"
						);
						_$("." + SRCIPT_ITEM_TYPE).hide();
						_$("." + SRCIPT_ITEM_TYPE + "_warning").hide();
						_$externalmedia.parent()
						.prepend(
							$("<p>")
							.append($("<small>")
							.html("\u8173\u672c\u0020\u0044\u0069\u0073\u0070\u006c" +
								"\u0061\u0079\u0045\u0078\u0074\u0065\u0072\u006e\u0061" +
								"\u006c\u004d\u0065\u0064\u0069\u0061.js" +
								"\u0020\u555f\u7528\u5931\u6557\u3002"))
						);
					};
				})($, $externalmedia), SRCIPT_SHOW_SECONDS * 1000);
			}
		}
		//add portlet link to hide/show the external medias
		if ($externalmedia.length > 0 &&
			$('t-' + SCRIPT_NAME).length <= 0 &&
			!!checkHowToShow()) {
				var portletLinkText = "隱藏外部媒體";
				var portletLinkTip = "將條目中的外部媒體隱藏";
				if (getDisplayExtrnalMediaSetting("Default") === "hide") {
					portletLinkText = "顯示外部媒體";
					portletLinkTip = "將條目中的外部媒體顯示出來";
				}
				var $portletLink = $(mw.util.addPortletLink('p-cactions',
					'#', portletLinkText, 't-' + SCRIPT_NAME,
					portletLinkTip));
				if (getDisplayExtrnalMediaSetting("Default") === "hide") {
					$portletLink.addClass(SCRIPT_NAME + "_hide");
				} else {
					$portletLink.addClass(SCRIPT_NAME + "_show");
				}
				$portletLink.click(function (e) {
					e.preventDefault();
					var $this = $(this);
					if ($this.hasClass(SCRIPT_NAME + "_show")) {
						$this.removeClass(SCRIPT_NAME + "_show");
						$this.addClass(SCRIPT_NAME + "_hide");
						$this.find("span").html("顯示外部媒體");
						$this.find("a").attr("title",
							"將條目中的外部媒體顯示出來");
						$("." + SRCIPT_ITEM_TYPE + "_display_control").hide();
					} else if ($this.hasClass(SCRIPT_NAME + "_hide")) {
						$this.removeClass(SCRIPT_NAME + "_hide");
						$this.addClass(SCRIPT_NAME + "_show");
						$this.find("span").html("隱藏外部媒體");
						$this.find("a").attr("title",
							"將條目中的外部媒體隱藏");
						$("." + SRCIPT_ITEM_TYPE + "_display_control").show();
					}
				});
		}
	}
	function externalMediaToDisplayHook(_$, _mw) {
		return function () {
			addExternalMediaToDisplay(_$, _mw);
		};
	}
	function externalMediaToDisplayDelayHook(_$, _mw, delay_time) {
		return function () {
			setTimeout((function (__$, __mw) {
				return function () {
                  addExternalMediaToDisplay(__$, __mw);
                };
			})(_$, _mw), delay_time);
		};
	}
	mw_.hook('ve.activationComplete').add(externalMediaToDisplayDelayHook($_, mw_, 100));
	mw_.hook('wikipage.content').add(externalMediaToDisplayHook($_, mw_));
	$_((function (_$, _mw, _externalMediaToDisplayDelayHook, _externalMediaToDisplayHook) {
		return function () {
			//_$(".mw-headline").on("click", _externalMediaToDisplayDelayHook(_$, _mw, 500));
			var $mwheadline = _$(".mw-headline");
			for (var i=0; i<$mwheadline.length; ++i) {
				$mwheadline[i].addEventListener("click", _externalMediaToDisplayDelayHook(_$, _mw, 500));
			}
			_externalMediaToDisplayHook(_$, _mw);
		};
	})($_, mw_, externalMediaToDisplayDelayHook, externalMediaToDisplayHook));
}
DisplayExternalMediaMain(jQuery, mw);