<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://shanghaidc1.gaoice.run/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3APD-intro.js</id>
	<title>MediaWiki:PD-intro.js - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://shanghaidc1.gaoice.run/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3APD-intro.js"/>
	<link rel="alternate" type="text/html" href="https://shanghaidc1.gaoice.run/index.php?title=MediaWiki:PD-intro.js&amp;action=history"/>
	<updated>2026-11-01T06:26:13Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://shanghaidc1.gaoice.run/index.php?title=MediaWiki:PD-intro.js&amp;diff=58089&amp;oldid=prev</id>
		<title>Gaoice：​创建页面，内容为“(function () {     &#039;use strict&#039;;     function init() {         var marker = document.querySelector(&#039;.pd-intro-marker&#039;);         if (!marker || marker.dataset.pdIntroReady) { return; }         marker.dataset.pdIntroReady = &#039;1&#039;;         var engine = window.PDIntroEngine;         if (!engine) { return; }         marker.dataset.pdIntroVersion = engine.version || &#039;original&#039;;         var test = marker.dataset.pdIntroTest === &#039;1&#039;;         var key = &#039;pd-intro-seen-v1&#039;,…”</title>
		<link rel="alternate" type="text/html" href="https://shanghaidc1.gaoice.run/index.php?title=MediaWiki:PD-intro.js&amp;diff=58089&amp;oldid=prev"/>
		<updated>2026-10-08T15:10:21Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“(function () {     &amp;#039;use strict&amp;#039;;     function init() {         var marker = document.querySelector(&amp;#039;.pd-intro-marker&amp;#039;);         if (!marker || marker.dataset.pdIntroReady) { return; }         marker.dataset.pdIntroReady = &amp;#039;1&amp;#039;;         var engine = window.PDIntroEngine;         if (!engine) { return; }         marker.dataset.pdIntroVersion = engine.version || &amp;#039;original&amp;#039;;         var test = marker.dataset.pdIntroTest === &amp;#039;1&amp;#039;;         var key = &amp;#039;pd-intro-seen-v1&amp;#039;,…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;(function () {&lt;br /&gt;
    &amp;#039;use strict&amp;#039;;&lt;br /&gt;
    function init() {&lt;br /&gt;
        var marker = document.querySelector(&amp;#039;.pd-intro-marker&amp;#039;);&lt;br /&gt;
        if (!marker || marker.dataset.pdIntroReady) { return; }&lt;br /&gt;
        marker.dataset.pdIntroReady = &amp;#039;1&amp;#039;;&lt;br /&gt;
        var engine = window.PDIntroEngine;&lt;br /&gt;
        if (!engine) { return; }&lt;br /&gt;
        marker.dataset.pdIntroVersion = engine.version || &amp;#039;original&amp;#039;;&lt;br /&gt;
        var test = marker.dataset.pdIntroTest === &amp;#039;1&amp;#039;;&lt;br /&gt;
        var key = &amp;#039;pd-intro-seen-v1&amp;#039;, active = null, attempted = false;&lt;br /&gt;
        var reduced = window.matchMedia(&amp;#039;(prefers-reduced-motion: reduce)&amp;#039;);&lt;br /&gt;
        var controls = document.createElement(&amp;#039;div&amp;#039;); controls.className = &amp;#039;pd-intro-controls&amp;#039;;&lt;br /&gt;
        marker.appendChild(controls);&lt;br /&gt;
        function staticPreview() {&lt;br /&gt;
            if (!test || controls.querySelector(&amp;#039;.pd-intro-static&amp;#039;)) { return; }&lt;br /&gt;
            var box = document.createElement(&amp;#039;div&amp;#039;); box.className = &amp;#039;pd-intro-static&amp;#039;;&lt;br /&gt;
            var canvas = document.createElement(&amp;#039;canvas&amp;#039;); canvas.width = 900; canvas.height = 360;&lt;br /&gt;
            canvas.setAttribute(&amp;#039;role&amp;#039;, &amp;#039;img&amp;#039;); canvas.setAttribute(&amp;#039;aria-label&amp;#039;, &amp;#039;静态字符矩阵，中央白底黑字 PROJECT DIVIDE&amp;#039;);&lt;br /&gt;
            box.appendChild(canvas); controls.appendChild(box);&lt;br /&gt;
            var ctx = canvas.getContext(&amp;#039;2d&amp;#039;); if (ctx) { engine.draw(ctx, engine.create(12345), 5, 900, 360, 1); }&lt;br /&gt;
        }&lt;br /&gt;
        function start(forceMotion) {&lt;br /&gt;
            if (active) { return; }&lt;br /&gt;
            if (reduced.matches &amp;amp;&amp;amp; !forceMotion) { staticPreview(); return; }&lt;br /&gt;
            attempted = true;&lt;br /&gt;
            try { sessionStorage.setItem(key, &amp;#039;1&amp;#039;); } catch (ignored) { /* Storage is optional. */ }&lt;br /&gt;
            var overlay, raf = 0, watchdog = 0, finished = false, observer;&lt;br /&gt;
            var oldFocus = document.activeElement, sx = window.scrollX, sy = window.scrollY;&lt;br /&gt;
            var saved = [], styles = [], inerted = new Set(), timings = [], previousFrame = 0;&lt;br /&gt;
            function finish(reason) {&lt;br /&gt;
                if (finished) { return; } finished = true;&lt;br /&gt;
                cancelAnimationFrame(raf); clearTimeout(watchdog);&lt;br /&gt;
                if (observer) { observer.disconnect(); }&lt;br /&gt;
                window.removeEventListener(&amp;#039;resize&amp;#039;, resize);&lt;br /&gt;
                window.removeEventListener(&amp;#039;pagehide&amp;#039;, pagehide);&lt;br /&gt;
                window.removeEventListener(&amp;#039;beforeprint&amp;#039;, beforeprint);&lt;br /&gt;
                document.removeEventListener(&amp;#039;keydown&amp;#039;, keydown, true);&lt;br /&gt;
                document.removeEventListener(&amp;#039;visibilitychange&amp;#039;, visibility);&lt;br /&gt;
                reduced.removeEventListener(&amp;#039;change&amp;#039;, preference);&lt;br /&gt;
                if (overlay) { overlay.remove(); }&lt;br /&gt;
                saved.forEach(function (item) { item[0].inert = item[1]; });&lt;br /&gt;
                styles.forEach(function (item) {&lt;br /&gt;
                    if (item[2]) { item[0].style.setProperty(item[1], item[2], item[3]); }&lt;br /&gt;
                    else { item[0].style.removeProperty(item[1]); }&lt;br /&gt;
                });&lt;br /&gt;
                active = null;&lt;br /&gt;
                if (oldFocus &amp;amp;&amp;amp; oldFocus.isConnected &amp;amp;&amp;amp; oldFocus.focus) { oldFocus.focus({preventScroll:true}); }&lt;br /&gt;
                window.scrollTo(sx, sy);&lt;br /&gt;
                marker.dataset.pdIntroLastExit = reason;&lt;br /&gt;
                marker.dataset.pdIntroRuns = String(Number(marker.dataset.pdIntroRuns || 0)+1);&lt;br /&gt;
                if (test &amp;amp;&amp;amp; timings.length) {&lt;br /&gt;
                    marker.dataset.pdIntroTiming = JSON.stringify({frames:timings.length,&lt;br /&gt;
                        drawMeanMs:timings.reduce(function(sum,r){return sum+r.draw;},0)/timings.length,&lt;br /&gt;
                        maxDrawMs:Math.max.apply(null,timings.map(function(r){return r.draw;})),&lt;br /&gt;
                        maxIntervalMs:Math.max.apply(null,timings.map(function(r){return r.interval;}))});&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            function saveStyle(el, prop, value) {&lt;br /&gt;
                styles.push([el, prop, el.style.getPropertyValue(prop), el.style.getPropertyPriority(prop)]);&lt;br /&gt;
                el.style.setProperty(prop, value, &amp;#039;important&amp;#039;);&lt;br /&gt;
            }&lt;br /&gt;
            function inertChild(el) {&lt;br /&gt;
                if (el === overlay || !(el instanceof HTMLElement) || inerted.has(el)) { return; }&lt;br /&gt;
                inerted.add(el);&lt;br /&gt;
                saved.push([el, el.inert]); el.inert = true;&lt;br /&gt;
            }&lt;br /&gt;
            function keydown(e) {&lt;br /&gt;
                if (e.key === &amp;#039;Escape&amp;#039;) { e.preventDefault(); finish(&amp;#039;escape&amp;#039;); }&lt;br /&gt;
                else if (e.key === &amp;#039;Tab&amp;#039;) { e.preventDefault(); skip.focus(); }&lt;br /&gt;
            }&lt;br /&gt;
            function visibility() { if (document.hidden) { finish(&amp;#039;hidden&amp;#039;); } }&lt;br /&gt;
            function preference() { if (reduced.matches) { finish(&amp;#039;reduced-motion&amp;#039;); staticPreview(); } }&lt;br /&gt;
            function pagehide() { finish(&amp;#039;pagehide&amp;#039;); }&lt;br /&gt;
            function beforeprint() { finish(&amp;#039;print&amp;#039;); }&lt;br /&gt;
            var canvas, ctx, skip, width, height, dpr, model, began;&lt;br /&gt;
            function resize() {&lt;br /&gt;
                width = window.innerWidth; height = window.innerHeight;&lt;br /&gt;
                dpr = Math.min(window.devicePixelRatio || 1, 2);&lt;br /&gt;
                canvas.width = Math.round(width*dpr); canvas.height = Math.round(height*dpr);&lt;br /&gt;
            }&lt;br /&gt;
            function tick(now) {&lt;br /&gt;
                if (finished) { return; }&lt;br /&gt;
                try {&lt;br /&gt;
                    var time = (now-began)/1000;&lt;br /&gt;
                    if (time &amp;gt;= 7.3) { finish(&amp;#039;complete&amp;#039;); return; }&lt;br /&gt;
                    var drawStart = test ? performance.now() : 0;&lt;br /&gt;
                    var frame = engine.draw(ctx, model, time, width, height, dpr);&lt;br /&gt;
                    if (test) {&lt;br /&gt;
                        timings.push({draw:performance.now()-drawStart,interval:previousFrame ? now-previousFrame : 0});&lt;br /&gt;
                        previousFrame = now;&lt;br /&gt;
                    }&lt;br /&gt;
                    overlay.style.opacity = String(frame.opacity);&lt;br /&gt;
                    if (test) {&lt;br /&gt;
                        overlay.dataset.time = time.toFixed(3); overlay.dataset.locked = frame.locked;&lt;br /&gt;
                        overlay.dataset.aligned = frame.aligned; overlay.dataset.scale = frame.scale.toFixed(4);&lt;br /&gt;
                    }&lt;br /&gt;
                    raf = requestAnimationFrame(tick);&lt;br /&gt;
                } catch (error) { finish(&amp;#039;render-error&amp;#039;); console.error(&amp;#039;Project Divide intro:&amp;#039;, error); }&lt;br /&gt;
            }&lt;br /&gt;
            try {&lt;br /&gt;
                overlay = document.createElement(&amp;#039;div&amp;#039;); overlay.className = &amp;#039;pd-intro-overlay&amp;#039;;&lt;br /&gt;
                overlay.setAttribute(&amp;#039;role&amp;#039;, &amp;#039;dialog&amp;#039;); overlay.setAttribute(&amp;#039;aria-modal&amp;#039;, &amp;#039;true&amp;#039;);&lt;br /&gt;
                overlay.setAttribute(&amp;#039;aria-label&amp;#039;, &amp;#039;Project Divide 开场动画&amp;#039;);&lt;br /&gt;
                canvas = document.createElement(&amp;#039;canvas&amp;#039;); canvas.className = &amp;#039;pd-intro-canvas&amp;#039;;&lt;br /&gt;
                canvas.setAttribute(&amp;#039;aria-hidden&amp;#039;, &amp;#039;true&amp;#039;); overlay.appendChild(canvas);&lt;br /&gt;
                ctx = canvas.getContext(&amp;#039;2d&amp;#039;); if (!ctx) { throw new Error(&amp;#039;Canvas 2D unavailable&amp;#039;); }&lt;br /&gt;
                skip = document.createElement(&amp;#039;button&amp;#039;); skip.type = &amp;#039;button&amp;#039;; skip.className = &amp;#039;pd-intro-skip&amp;#039;;&lt;br /&gt;
                skip.textContent = &amp;#039;跳过开场 · Esc&amp;#039;; skip.addEventListener(&amp;#039;click&amp;#039;, function () { finish(&amp;#039;skip&amp;#039;); });&lt;br /&gt;
                overlay.appendChild(skip);&lt;br /&gt;
                active = { finish: finish };&lt;br /&gt;
                // A loading/error stylesheet must never leave an invisible input trap.&lt;br /&gt;
                document.body.appendChild(overlay);&lt;br /&gt;
                if (getComputedStyle(overlay).position !== &amp;#039;fixed&amp;#039;) { finish(&amp;#039;missing-styles&amp;#039;); return; }&lt;br /&gt;
                Array.from(document.body.children).forEach(inertChild);&lt;br /&gt;
                observer = new MutationObserver(function (records) {&lt;br /&gt;
                    records.forEach(function (r) { r.addedNodes.forEach(inertChild); });&lt;br /&gt;
                });&lt;br /&gt;
                observer.observe(document.body, { childList: true });&lt;br /&gt;
                saveStyle(document.documentElement, &amp;#039;overflow&amp;#039;, &amp;#039;hidden&amp;#039;);&lt;br /&gt;
                saveStyle(document.body, &amp;#039;overflow&amp;#039;, &amp;#039;hidden&amp;#039;);&lt;br /&gt;
                saveStyle(document.body, &amp;#039;position&amp;#039;, &amp;#039;fixed&amp;#039;);&lt;br /&gt;
                saveStyle(document.body, &amp;#039;top&amp;#039;, -sy+&amp;#039;px&amp;#039;); saveStyle(document.body, &amp;#039;left&amp;#039;, -sx+&amp;#039;px&amp;#039;);&lt;br /&gt;
                saveStyle(document.body, &amp;#039;width&amp;#039;, &amp;#039;100%&amp;#039;);&lt;br /&gt;
                resize(); model = engine.create(Math.floor(Math.random()*4294967296)); began = performance.now();&lt;br /&gt;
                document.addEventListener(&amp;#039;keydown&amp;#039;, keydown, true);&lt;br /&gt;
                document.addEventListener(&amp;#039;visibilitychange&amp;#039;, visibility);&lt;br /&gt;
                window.addEventListener(&amp;#039;resize&amp;#039;, resize); window.addEventListener(&amp;#039;pagehide&amp;#039;, pagehide);&lt;br /&gt;
                window.addEventListener(&amp;#039;beforeprint&amp;#039;, beforeprint); reduced.addEventListener(&amp;#039;change&amp;#039;, preference);&lt;br /&gt;
                skip.focus({preventScroll:true});&lt;br /&gt;
                watchdog = setTimeout(function () { finish(&amp;#039;watchdog&amp;#039;); }, 10000);&lt;br /&gt;
                if (document.hidden) { finish(&amp;#039;hidden&amp;#039;); return; }&lt;br /&gt;
                raf = requestAnimationFrame(tick);&lt;br /&gt;
            } catch (error) { finish(&amp;#039;init-error&amp;#039;); console.error(&amp;#039;Project Divide intro:&amp;#039;, error); }&lt;br /&gt;
        }&lt;br /&gt;
        if (test) {&lt;br /&gt;
            var replay = document.createElement(&amp;#039;button&amp;#039;); replay.className = &amp;#039;pd-intro-replay&amp;#039;; replay.type = &amp;#039;button&amp;#039;;&lt;br /&gt;
            replay.textContent = &amp;#039;重播开场&amp;#039;; replay.addEventListener(&amp;#039;click&amp;#039;, function () { start(false); }); controls.appendChild(replay);&lt;br /&gt;
            if (reduced.matches) {&lt;br /&gt;
                var notice = document.createElement(&amp;#039;p&amp;#039;); notice.className = &amp;#039;pd-intro-notice&amp;#039;;&lt;br /&gt;
                notice.textContent = &amp;#039;当前启用了减少动态效果，自动开场已跳过。下方保留静态画面；动态试播仅作用于这一次。&amp;#039;;&lt;br /&gt;
                controls.appendChild(notice); staticPreview();&lt;br /&gt;
                var motion = document.createElement(&amp;#039;button&amp;#039;); motion.className = &amp;#039;pd-intro-replay&amp;#039;; motion.type = &amp;#039;button&amp;#039;;&lt;br /&gt;
                motion.textContent = &amp;#039;动态试播（仅本次）&amp;#039;; motion.addEventListener(&amp;#039;click&amp;#039;, function () { start(true); }); controls.appendChild(motion);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        var seen = false; try { seen = sessionStorage.getItem(key) === &amp;#039;1&amp;#039;; } catch (ignored) { /* No persistence. */ }&lt;br /&gt;
        if (!attempted &amp;amp;&amp;amp; !seen &amp;amp;&amp;amp; !window.location.hash &amp;amp;&amp;amp; !document.hidden) { start(false); }&lt;br /&gt;
    }&lt;br /&gt;
    if (document.readyState === &amp;#039;loading&amp;#039;) { document.addEventListener(&amp;#039;DOMContentLoaded&amp;#039;, init, {once:true}); }&lt;br /&gt;
    else { init(); }&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>Gaoice</name></author>
	</entry>
</feed>