1/* ============================================================ 2 NBé¢é · 主é¢å¼æ 3 å¨ <head> é忥å è½½ï¼ä¸å deferï¼ï¼ä¿è¯æ¸²æåå°±å®å¥½å±æ§ï¼ 4 ä¸ä¼åºç°ãå çå°é»è®¤é è²ãéªä¸ä¸æåè²ãã 5 6 主é¢åä¸¤ç±»ï¼ 7 · 常驻ï¼alwaysï¼ââ éæ¶é½è½é 8 · èæ¥ï¼windowï¼ââ åªå¨æå®æ¥æçªå£éåºç°å¨é项é 9 10 èæ¥éæ¥èãä¸ç§æ¯ååï¼æ¯å¹´å ¬åæ¥æé½ä¸åï¼ 11 æä»¥ç¨ FESTIVAL 表ææè¿å å¹´çæ£æ¥ååæ»ï¼åååæ¾å 天ã 12 ç¨æ³ï¼<script src="../js/theme.js"></script> 13 ============================================================ */ 14(function () { 15 'use strict'; 16 17 var KEY = 'nb_theme'; // åç¨æ·éçä¸»é¢ id 18 var ATTR = 'theme'; // å å¨ <html> ä¸ç屿§å 19 20 /* ---------- èæ¥æ£æ¥åï¼å ¬åï¼---------- 21 ååèæ¥æ¯å¹´æ¢ç®åºæ¥çå ¬åæ¥æä¸ä¸æ ·ï¼è¿éåæè¿å å¹´ã 22 è¡¨éæ²¡æç年份 â è¯¥èæ¥ä¸åºç°ï¼å®å¯ä¸æ¾ç¤ºï¼ä¹ä¸è¦æ¾ç¤ºéï¼ã */ 23 var FESTIVAL = { 24 }; 25 26 /* æ¯ä¸ªèæ¥æå / å»¶åå 天åºç° */ 27 var SPAN = {}; 28 29 /* ---------- 䏻颿¸ å ---------- 30 window: èæ¥ä¸»é¢çæ£æ¥åæ¥æºï¼FESTIVAL çé®åï¼ 31 没æ window çå°±æ¯å¸¸é©»ä¸»é¢ */ 32 var THEMES = [ 33 { id: 'default', name: 'é»è®¤', icon: '\uD83C\uDFA8', 34 desc: 'NBé¢é忬çèç½é è²' }, 35 { id: 'tech', name: 'ç§æ', icon: '\uD83D\uDE80', 36 desc: '深空è + éè¹å æï¼é çç§ç«çæ°è´¨' }, 37 { id: 'cyber', name: 'èµåæå ', icon: '\uD83C\uDF03', 38 desc: 'éè¹ç´«ç² + é¨å¤ï¼æ éèºæ¯æ é¢' }, 39 { id: 'ink', name: '墨éµ', icon: '\uD83D\uDD8C\uFE0F', 40 desc: 'å®£çº¸ç±³ç½ + ç¦å¢¨ï¼å®éãççµ' }, 41 { id: 'pixel', name: 'åç´ ', icon: '\uD83D\uDC7E', 42 desc: '8-bit æéè²æ¿ï¼åå°çº¢ç½æºå¹´ä»£' }, 43 { id: 'eyecare', name: 'æ¤ç¼', icon: '\uD83C\uDF19', 44 desc: 'ä½å¯¹æ¯æç°ï¼å»å æï¼å¤éçä¸ç´¯' }, 45 { id: 'national', name: 'å½åº', icon: '\uD83C\uDDE8\uD83C\uDDF3', 46 desc: '红éé è²ï¼éæ¶ 10 æ 1 æ¥ ~ 7 æ¥', 47 fixed: [10, 1, 7] }, 48 ]; 49 50 var BY_ID = {}; 51 THEMES.forEach(function (t) { BY_ID[t.id] = t; }); 52 53 /* ---------- æ¥æå¤å® ---------- */ 54 function sameDay(d, m, day) { 55 return (d.getMonth() + 1) === m && d.getDate() === day; 56 } 57 /* 以 (m, day) 为ä¸å¿ï¼ååå span 天ï¼ç now å¨ä¸å¨é头 */ 58 function inSpan(now, m, day, span) { 59 var center = new Date(now.getFullYear(), m - 1, day); 60 center.setHours(0, 0, 0, 0); 61 var t = new Date(now.getFullYear(), now.getMonth(), now.getDate()); 62 var diff = Math.round((t - center) / 86400000); 63 return Math.abs(diff) <= span; 64 } 65 66 /* è¿ä¸ªä¸»é¢æ¤å»å¯ä¸å¯é */ 67 function available(id, now) { 68 var t = BY_ID[id]; 69 if (!t) return false; 70 var d = now || new Date(); 71 72 if (t.fixed) { // å½åºï¼åºå®å ¬ååºé´ 73 var m = d.getMonth() + 1, day = d.getDate(); 74 var a = t.fixed[0] * 100 + t.fixed[1]; 75 var b = t.fixed[0] * 100 + t.fixed[2]; 76 var cur = m * 100 + day; 77 return cur >= a && cur <= b; 78 } 79 if (t.festival) { // æ¥è / ä¸ç§ï¼æ¥è¡¨ 80 var table = FESTIVAL[t.festival] || {}; 81 var md = table[d.getFullYear()]; 82 if (!md) return false; // è¿ä¸å¹´æ²¡ç»è®° 83 return inSpan(d, md[0], md[1], SPAN[t.festival] || 3); 84 } 85 return true; // 常驻 86 } 87 88 /* ---------- 读åç¨æ·éæ© ---------- */ 89 function readChoice() { 90 var v = null; 91 /* URL åæ°ä¼å ï¼?theme=cyber / ?theme=ink / ?theme=default ⦠92 ç¨é䏿¯æ¹ä¾¿è°è¯ï¼äºæ¯å¯ä»¥è®©å«äººå享ãæä¸ªä¸»é¢ä¸çè¿ä¸é¡µãã */ 93 try { 94 var m = /[?&]theme=([a-z]+)/i.exec(location.search); 95 /* è°è¯ç¨ï¼?theme=xxx&preview=1 96 å¯ä»¥æ è§èæ¥çæ¥æçªå£ç´æ¥é¢è§ï¼æ¹ä¾¿å¹³æ¶è°æ ·å¼ã 97 æ®é访客ä¸å¸¦è¿ä¸ªåæ°ï¼çå°çä»ç¶æ¯æ£å¸¸ççªå£éå¶ã */ 98 var preview = /[?&]preview=1/i.test(location.search); 99 if (m) { 100 var q = m[1].toLowerCase(); 101 if (BY_ID[q] && (preview || available(q))) return q; 102 if (q === 'default') return 'default'; 103 } 104 } catch (e) {} 105 try { v = localStorage.getItem(KEY); } catch (e) { v = null; } 106 if (!v || v === 'default') return 'default'; 107 if (!BY_ID[v]) return 'default'; 108 /* èæ¥ä¸»é¢è¿æäº â åå°é»è®¤ */ 109 if (!available(v)) return 'default'; 110 return v; 111 } 112 113 /* ---------- åºç¨å° <html> ---------- */ 114 function apply(choice) { 115 var el = document.documentElement; 116 /* ç¨æ·æ²¡éè¿ â ä¸å¾ç¨ãé»è®¤ãã 117 èæ¥ä¸»é¢åªæ¯ãé£å 天å¨é项éåºç°ãï¼ä¸ä¼èªå¨å¥ä¸ã */ 118 var real = 'default'; 119 if (choice && choice !== 'default' && BY_ID[choice] && available(choice)) { 120 real = choice; 121 }
122 /* å è®°ä¸å½åæ¯ä¸æ¯æ·±è²æ¨¡å¼ï¼åææ dark ç±»ã 123 æææ¯å 为å®ç鿩卿éï¼html.dark bodyï¼ä¼åä½ä¸»é¢åºè²ï¼ 124 使·±è²è¿ä¸ªç¶ææ¬èº«è¦ç䏿¥ ââ æµ è²ä¸»é¢ï¼å¢¨éµãæ¤ç¼ï¼é å® 125 åå°èªå·±çæ·±è²åä½ï¼themes.css éç html[theme=x][data-dark]ï¼ã */ 126 var wasDark = el.classList.contains('dark') || 127 (window.matchMedia && 128 window.matchMedia('(prefers-color-scheme: dark)').matches); 129 130 if (real === 'default') { 131 el.removeAttribute(ATTR); 132 } else { 133 el.setAttribute(ATTR, real); 134 el.classList.remove('dark'); 135 } 136 if (wasDark) el.setAttribute('data-dark', '1'); 137 else el.removeAttribute('data-dark'); 138 el.setAttribute('data-theme-resolved', real); 139 } 140 141 /* ç³»ç»æ·±è²å好ååæ¶ä¹è·çæ´æ° data-darkï¼ 142 è¿æ ·ç¨æ·æ¹ç³»ç»è®¾ç½®ä¸ç¨å·æ°é¡µé¢ */ 143 try { 144 var mq = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)'); 145 if (mq && mq.addEventListener) { 146 mq.addEventListener('change', function () { apply(readChoice()); }); 147 } 148 } catch (e) {} 149 150 /* ---------- 坹夿¥å£ ---------- */ 151 var API = { 152 KEY: KEY, 153 get: readChoice, 154 resolved: readChoice, 155 set: function (choice) { 156 var real = (choice && BY_ID[choice] && available(choice)) ? choice : 'default'; 157 try { localStorage.setItem(KEY, real); } catch (e) {} 158 apply(real); 159 try { 160 window.dispatchEvent(new CustomEvent('nb-theme-change', { 161 detail: { theme: real } 162 })); 163 } catch (e) {} 164 }, 165 /* å ¼å®¹æ§è°ç¨ */ 166 nationalAvailable: function (now) { return available('national', now); }, 167 available: available, 168 /* å¯é主é¢å表ï¼åªåæ¤å»è½éçï¼ */ 169 list: function (now) { 170 return THEMES.filter(function (t) { return available(t.id, now); }) 171 .map(function (t) { 172 return { id: t.id, name: t.name, icon: t.icon, desc: t.desc }; 173 }); 174 }, 175 /* å ¨é¨ä¸»é¢ï¼å«æ¤å»ä¸å¯éçï¼ï¼è°è¯ç¨ */ 176 all: function () { 177 return THEMES.map(function (t) { 178 return { id: t.id, name: t.name, icon: t.icon, desc: t.desc, 179 on: available(t.id) }; 180 }); 181 } 182 }; 183 184 apply(readChoice()); 185 window.NBTheme = API; 186})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.