From 218b5434f75cd4b8d406765705259940ed0d65ae Mon Sep 17 00:00:00 2001
From: KotoriK <52659125+KotoriK@users.noreply.github.com>
Date: Mon, 7 Oct 2024 10:14:31 +0800
Subject: [PATCH 001/122] deprecate: _iro.template_url
---
inc/swicher.php | 1 -
1 file changed, 1 deletion(-)
diff --git a/inc/swicher.php b/inc/swicher.php
index 0e920765..feaa364e 100644
--- a/inc/swicher.php
+++ b/inc/swicher.php
@@ -67,7 +67,6 @@ function iro_get_the_author_name()
'qzone_autocomplete' => false,
'site_name' => get_bloginfo('name'),
'author_name' => iro_get_the_author_name(),
- 'template_url' => get_template_directory_uri(),
'site_url' => site_url(),
'qq_api_url' => rest_url('sakura/v1/qqinfo/json'),
'land_at_home' => check(is_home()),
From 9736db346588027edd0ed94d1ada3fdf54d5d481 Mon Sep 17 00:00:00 2001
From: KotoriK <52659125+KotoriK@users.noreply.github.com>
Date: Mon, 7 Oct 2024 10:16:08 +0800
Subject: [PATCH 002/122] feat: extract_theme_skin
---
inc/swicher.php | 1 +
opt/options/theme-options.php | 8 ++++++++
2 files changed, 9 insertions(+)
diff --git a/inc/swicher.php b/inc/swicher.php
index feaa364e..7b125420 100644
--- a/inc/swicher.php
+++ b/inc/swicher.php
@@ -62,6 +62,7 @@ function iro_get_the_author_name()
'darkmode' => check(iro_opt('theme_darkmode_auto')),
'email_domain' => iro_opt('email_domain', ''),
'email_name' => iro_opt('email_name', ''),
+ 'extract_theme_skin' => iro_opt('extract_theme_skin_from_cover', false)?true:false,
'ext_shared_lib' => iro_opt('external_vendor_lib'),
'cookie_version_control' => iro_opt('cookie_version', ''),
'qzone_autocomplete' => false,
diff --git a/opt/options/theme-options.php b/opt/options/theme-options.php
index 550dd796..07eaa58b 100644
--- a/opt/options/theme-options.php
+++ b/opt/options/theme-options.php
@@ -187,6 +187,14 @@ function iro_validate_optional_url( $value ) {
'content' => __('Color Schemes','sakurairo_csf'),
),
+ array(
+ 'id' => 'extract_theme_skin_from_cover',
+ 'type' => 'switcher',
+ 'title' => __('Extract Theme Color from Cover Image','sakurairo_csf'),
+ 'label' => __('Following options will be used as fallback (while cover image cannot be read by scripts)','sakurairo_csf'),
+ 'default' => false
+ ),
+
array(
'id' => 'theme_skin',
'type' => 'color',
From e115f9f76ce95474f8e6f23a1aabfda2c92aaba2 Mon Sep 17 00:00:00 2001
From: KotoriK <52659125+KotoriK@users.noreply.github.com>
Date: Mon, 7 Oct 2024 12:15:46 +0800
Subject: [PATCH 003/122] feat(article_theme): darkmode highlight
---
style.css | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/style.css b/style.css
index b37a3113..a4c6b9ee 100644
--- a/style.css
+++ b/style.css
@@ -10493,7 +10493,7 @@ body.dark .the-feature.from_left_and_right .info {
}
body.dark .post-list-thumb:hover {
- box-shadow: 0 1px 20px 0px var(--theme-skin-matching);
+ box-shadow: 0 1px 20px 0px var(--article-theme-highlight,var(--theme-skin-matching));
}
body.dark .post-list-thumb i{
From 76890432a67f35f280c96b41a13c2e1c2e717612 Mon Sep 17 00:00:00 2001
From: KotoriK <52659125+KotoriK@users.noreply.github.com>
Date: Mon, 7 Oct 2024 20:33:11 +0800
Subject: [PATCH 004/122] chore: update js bundle to 6a3b3ef
---
js/2496.js | 2 +-
js/7398.js | 2 --
js/7398.js.map | 1 -
js/8503.js | 2 ++
js/8503.js.map | 1 +
js/app.js | 2 +-
js/app.js.LICENSE.txt | 2 +-
js/app.js.map | 2 +-
8 files changed, 7 insertions(+), 7 deletions(-)
delete mode 100644 js/7398.js
delete mode 100644 js/7398.js.map
create mode 100644 js/8503.js
create mode 100644 js/8503.js.map
diff --git a/js/2496.js b/js/2496.js
index 73acb40c..8aa03a22 100644
--- a/js/2496.js
+++ b/js/2496.js
@@ -1,3 +1,3 @@
/*! For license information please see 2496.js.LICENSE.txt */
-(globalThis.webpackChunksakurairo_scripts=globalThis.webpackChunksakurairo_scripts||[]).push([[2496],{2496:(e,t,r)=>{r.r(t),r.d(t,{default:()=>N});r(9138);var n=r(2821),s=r(7925),o=r(4351),i=r(3451),a=r(8195),l=r(9319),c=r(9509),u=r(9257),d=r(7361),h=r(9382),m=r(8744),p=r.n(m);class f{constructor(e){this.key=e,this.pull()}pull(){let e=window.history.state,t=null==e?void 0:e[this.key];if(void 0===t||this.index!==t){var r=window.sessionStorage.getItem(this.key),n=r?JSON.parse(r):[];n[this.index]=this.state,window.sessionStorage.setItem(this.key,JSON.stringify(n)),void 0===t?(this.index=n.length,this.state=null,window.history.replaceState({...e,[this.key]:this.index},document.title)):(this.index=t,this.state=r?n[t]:null)}}}let w=(e,t)=>{e.replaceWith(t)},g={default:w,innerHTML:(e,t)=>{e.innerHTML=t.innerHTML},textContent:(e,t)=>{e.textContent=t.textContent},innerText:(e,t)=>{e.innerText=t.innerText},attributes:(e,t)=>{let r=e.getAttributeNames();t.getAttributeNames().forEach((n=>{e.setAttribute(n,t.getAttribute(n)||""),r=r.filter((e=>e!==n))})),r.forEach((t=>{e.removeAttribute(t)}))},replaceWith:w};class y{constructor(e,t){this.form=e,this.submitButton=t}getAttribute(e){let{submitButton:t,form:r}=this;if(t&&t.hasAttribute(`form${e}`)){var n=`${e.charAt(0).toUpperCase()}${e.slice(1)}`;if(n=t[`form${n}`])return n}return r[e]}getEntryList(){let{form:e,submitButton:t}=this,r=new FormData(e);return t&&!t.disabled&&t.name&&r.append(t.name,t.value),r}getNameValuePairs(){return Array.from(this.getEntryList(),(([e,t])=>[e,t instanceof File?t.name:t]))}getURLSearchParams(){return new URLSearchParams(this.getNameValuePairs())}getTextPlain(){return this.getNameValuePairs().reduce(((e,[t,r])=>`${e}${t}=${r}\r\n`),"")}getRequestInfo(){let e=this.getAttribute("action");var t=new URL(e,document.baseURI);if(!/^https?:$/.test(t.protocol))return null;switch(this.getAttribute("method")){case"get":return t.search=this.getURLSearchParams().toString(),t.href;case"post":switch(this.getAttribute("enctype")){case"application/x-www-form-urlencoded":t=this.getURLSearchParams();break;case"multipart/form-data":t=this.getEntryList();break;case"text/plain":t=this.getTextPlain();break;default:return null}return new Request(e,{method:"POST",body:t});default:return null}}}let v=e=>{if(e===window.name)return window;switch(e.toLowerCase()){case"":case"_self":return window;case"_parent":return window.parent;case"_top":return window.top}};class b{constructor(e){this.pjax=e}test(e){let{defaultTrigger:t}=this.pjax.options;if("boolean"==typeof t)return t;let{enable:r,exclude:n}=t;return!(!1===r||n&&e.matches(n))}load(e,t){var r,n;let s={},o=null==(r=t.getAttribute("referrerpolicy"))?void 0:r.toLowerCase();void 0!==o&&(s.referrerPolicy=o),null!=(n=t.getAttribute("rel"))&&n.split(/\s+/).some((e=>"noreferrer"===e.toLowerCase()))&&(s.referrer=""),this.pjax.load(new Request(e,s)).catch((()=>{}))}onLinkOpen(e){if(!e.defaultPrevented){var{target:t}=e;if(t instanceof Element&&(t=t.closest("a[href], area[href]"))&&this.test(t)){if((e instanceof MouseEvent||e instanceof KeyboardEvent)&&(e.metaKey||e.ctrlKey||e.shiftKey||e.altKey))return;v(t.target)===window&&t.origin===window.location.origin&&(e.preventDefault(),this.load(t.href,t))}}}onFormSubmit(e){if(!e.defaultPrevented){var{target:t,submitter:r}=e;if(t instanceof HTMLFormElement&&this.test(t)){var n=new y(t,r);v(n.getAttribute("target"))===window&&(n=n.getRequestInfo())&&new URL("string"==typeof n?n:n.url).origin===window.location.origin&&(e.preventDefault(),this.load(n,t))}}}register(){document.addEventListener("click",(e=>{this.onLinkOpen(e)})),document.addEventListener("keyup",(e=>{"Enter"===e.key&&this.onLinkOpen(e)})),"SubmitEvent"in window&&document.addEventListener("submit",(e=>{this.onFormSubmit(e)}))}}async function E(e,t={}){var r,n;let s,{selectors:o,switches:i,cache:a,timeout:l,hooks:c}={...this.options,...t},u={},d=(null==(r=this.abortController)?void 0:r.signal)||null;u.signal=d,r={cache:a,signal:d},e instanceof Request&&(r.referrer=e.referrer,r.referrerPolicy=e.referrerPolicy),(e=new Request(e,r)).headers.set("X-Requested-With","Fetch"),e.headers.set("X-Pjax","true"),e.headers.set("X-Pjax-Selectors",JSON.stringify(o)),e=await(null==(n=c.request)?void 0:n.call(c,e))||e,u.request=e,u.timeout=l,0 ${i} ${i} ${text} ${text} ${i} ${i} ${text} ${text} Markdown Supported while Forbidden Markdown Supported while Forbidden BsBLC0j8(zQ4RD%H8>a5({0u(sJZ+dbtTygo4G8C
zs^7-OgRN^&Yvcy%g8Yh@xD0B M&~8-6kE5>mJTAi9s1X~P!bt1>pF=`D-hz6+
zAIF^d0(WAjk4(o7 tJnf7ncl58LYRQazBSv}I)X
zrz}0YK08`a=S%Ol1|iY6$$7I4CsBsD5v8+9@BdHPn>s&|x0t=XE&JD7uwh_a647Oj
z%0@N*Safoc9>n?Ylb&vCCRp|9dWZ6#h)-fyo3AsBA=Y-7ytSBY Client local time:Dark mode will switch on automatically "
"from 22:00 to 7:00 Follow client settings:Follow "
@@ -904,39 +916,39 @@ msgstr ""
"アントのブラウザ設定に従う 常にオン:クライアントが設定"
"している場合を除き、常にオン Fill in as the example: \"BY\" means reusers should give credit to the creator"
"p> \"NC\" means no commercial use \"ND\""
@@ -2952,77 +2963,77 @@ msgstr ""
"および法的アドバイスについては creativecommons.org を参照してください。 Theme Official:Official API of the theme"
"p> IP-API:Provided by ip-api.com"
"p> すべて:テーマ公式が優先、フォールバックはIP-API Prism.js: Requires a language to be specified, see を参照してください。 カスタム: 別の"
"構成が使用可能な場合。 The theme respects your privacy However, when you use a service provider pre-populated by the "
@@ -4352,11 +4355,11 @@ msgstr ""
"カライズすることで、サードパーティに送信される情報を減らすことができます。"
"p>"
-#: options/theme-options.php:4042
+#: options/theme-options.php:4034
msgid "Send Theme Version to Fuukei"
msgstr "テーマバージョンをFuukeiに送る"
-#: options/theme-options.php:4043
+#: options/theme-options.php:4035
msgid ""
"The theme will only send time and version information to Fuukei officials "
"and the data will be cleaned regularly and used only to count version "
@@ -4365,11 +4368,11 @@ msgstr ""
"テーマは時間とバージョンの情報をFuukei Officialにのみ送信し、データは定期的に"
"クリーンアップされ、バージョンの更新をカウントするためにのみ使用されます。"
-#: options/theme-options.php:4049
+#: options/theme-options.php:4041
msgid "Reference Information"
msgstr "参照情報"
-#: options/theme-options.php:4054
+#: options/theme-options.php:4046
msgid ""
" Fluent Design Icon Referenced by Paradox Fluent Icon Pack MUH2 Design Icon Referenced by 缄默 ましろスタイルのロゴは、Hyacmによって提供および参照されているよう"
"に、元のテーマ作成者Mashiroを参照しています Options Framework Relies on the Codestar Open Source Codestar Framework Project256)throw new Error("Color count must be between 4 and 256");if(this.samplefac<1||this.samplefac>30)throw new Error("Sampling factor must be between 1 and 30");this.maxnetpos=this.netsize-1,this.netbiasshift=4,this.intbiasshift=16,this.intbias=1<256)throw new Error("Color count must be between 4 and 256");if(this.samplefac<1||this.samplefac>30)throw new Error("Sampling factor must be between 1 and 30");this.maxnetpos=this.netsize-1,this.netbiasshift=4,this.intbiasshift=16,this.intbias=1<
")+"
"+t.replace(/\r\n/g,"
"),o=s.join("\n")+"\n\n"+t.toString().replace(/\r\n/g,"\n");if(e.clipboardData)e.clipboardData.setData("text/html",n),e.clipboardData.setData("text/plain",o);else if(window.clipboardData)window.clipboardData.setData("text",o)}(e,n),(0,o.I)((0,r.__)("复制成功!"),1e3))}}function a(){_iro.clipboardCopyright&&(document.body.removeEventListener("copy",i),document.body.addEventListener("copy",i))}},4895:(e,t,n)=>{n.d(t,{vI:()=>p,LN:()=>w,t9:()=>v,LY:()=>h,rZ:()=>f});n(9261),n(3700),n(3632),n(1531),n(3678),n(4145);function o(e){return new Promise(((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)}))}function r(e,t){const n=indexedDB.open(e);n.onupgradeneeded=()=>n.result.createObjectStore(t);const r=o(n);return(e,n)=>r.then((o=>n(o.transaction(t,e).objectStore(t))))}const s=r("sakurairo","cache");var i=n(7721),a=n(4351),c=n(2818),l=n(7925),d=n(7156);let u=1,m="";async function h(){p(await w(!0)),u++}async function f(){u--,p(await w(!0))}const g=document.querySelector(".centerbg"),p=_iro.site_bg_as_cover?e=>{document.body.style.backgroundImage=`url(${e})`,document.dispatchEvent(new CustomEvent("coverBG_change",{detail:e}))}:g?e=>{g.style.backgroundImage=`url(${e})`,document.dispatchEvent(new CustomEvent("coverBG_change",{detail:e}))}:d.lQ;function y(e){const t=e?.match(/^url\("(.+)"\)$/);if(t)return t[1]}const v=_iro.site_bg_as_cover?()=>y(document.body.style.backgroundImage):g?()=>y(g.style.backgroundImage):d.lQ;function b(e=!1){const t=new URL(_iro.cover_api);return(0,c.F)()&&1==_iro.random_graphs_mts?(t.searchParams.set("type","mobile"),t.toString()+(e?"&"+u:"")):t.toString()+(e?(""===t.search?"?":"&")+u:"")}const w=_iro.cache_cover?(e=!1)=>{return(t="cover",s("readonly",(e=>o(e.get(t))))).then((t=>t&&t instanceof ArrayBuffer?(URL.revokeObjectURL(m),m="",m=URL.createObjectURL(new Blob([t])),m):b(e))).finally((()=>{!async function(e=!1){try{const t=await fetch(b(e),{headers:{Accept:i.t}});if(500==t.status){const e=await t.json();(0,l.I)(e.message),console.warn(e.message)}else if(t.ok){const e=await t.arrayBuffer();try{((e,t)=>{s("readwrite",(n=>(n.put(t,e),o(n.transaction))))})("cover",e)}catch(e){console.warn(e)}}}catch(e){e instanceof TypeError&&(console.warn((0,a.__)("你的封面API好像不支持跨域调用,这种情况下缓存是不会生效的哦")),(e=>{s("readwrite",(t=>(t.delete(e),o(t.transaction))))})("cover"))}}(e)}));var t}:b},9655:(e,t,n)=>{n.d(t,{ig:()=>m,jJ:()=>s,uO:()=>l,yi:()=>d});const o=window.matchMedia("(prefers-color-scheme:dark)");let r=!1;const s=()=>r;function i(e){e!==r&&(document.dispatchEvent(new CustomEvent("darkmode",{detail:e})),r=e)}function a(){localStorage.getItem("dark")||(o.matches&&_iro.darkmode?l():d())}function c(e){e==u()?localStorage.removeItem("dark"):1==e?localStorage.setItem("dark","1"):localStorage.setItem("dark","0")}function l(e){document.documentElement.style.backgroundColor="#333",document.getElementsByClassName("site-content")[0].style.backgroundColor="#333",document.body.classList.add("dark"),e&&c(!0),i(!0)}function d(e){document.documentElement.style.backgroundColor="",document.getElementsByClassName("site-content")[0].style.backgroundColor="rgba(255, 255, 255, .8)",document.body.classList.remove("dark"),document.body.classList.remove("dynamic"),i(!1),e&&c(!1)}function u(){switch(_iro.dm_strategy){case"client":return o.matches;case"eien":return!0;default:return function(){const e=new Date;return e.getHours()>21||e.getHours()<7}()}}function m(){const e=localStorage.getItem("dark");e?"1"==e?l():d():u()&&_iro.darkmode?l():d()}"client"===_iro.dm_strategy&&(o.removeEventListener?o.removeEventListener("change",a):o.removeListener(a),o.addEventListener?o.addEventListener("change",a):o.addListener(a))},8195:(e,t,n)=>{n.d(t,{J:()=>u,S:()=>l});var o=n(7925),r=n(4351),s=n(2818);let i,a;function c(e){return()=>{const{name:t}=e.dataset;t!=localStorage.getItem("font_family")&&("serif"==t?((0,s.F)()&&(0,o.I)((0,r.__)("将从网络加载字体,流量请注意")),document.body.classList.add("serif"),localStorage.setItem("font_family","serif"),d("serif")):(document.body.classList.remove("serif"),localStorage.setItem("font_family","sans-serif"),d("sans-serif")))}}function l(){const e=localStorage.getItem("font_family");e&&"serif"!=e||document.body.classList.add("serif")}function d(e){"sans-serif"===e||"sans-serif"==localStorage.getItem("font_family")?(i.classList.remove("selected"),a.classList.add("selected")):(a.classList.remove("selected"),i.classList.add("selected"))}function u(){const e=(i=document.getElementsByClassName("control-btn-serif")[0],a=document.getElementsByClassName("control-btn-sans-serif")[0],a&&i);e||localStorage.removeItem("font_family"),l(),e&&(d(),i.addEventListener("click",c(i)),a.addEventListener("click",c(a)))}},9509:(e,t,n)=>{async function o(){const e=document.getElementById("footer_yiyan");if(e){const t=_iro.yiyan_api||["https://api.maho.cc/yiyan/"];0==t.length&&console.warn("一言API: 路径为空");for(const n of t)try{const t=await r(n);e.innerText=t;break}catch(e){console.warn(`一言API: 尝试联系"${n}"时出错。 `,e);continue}}}n.d(t,{A:()=>o});const r=async e=>{const t=await fetch(e,{headers:{Accept:"application/json"}});if(t.ok){const e=await t.json(),n=("null"==e.from_who?null:e.from_who)||"",o=e.from!=e.from_who?`「${e.from}」`:"";return e.hitokoto+"——"+n+o}throw t.status}},2818:(e,t,n)=>{n.d(t,{F:()=>i,P:()=>r});let o=!1;function r(){const e=window.matchMedia("(max-width:860px)");o=e.matches,e.addEventListener?e.addEventListener("change",s):e.addListener(s)}function s(e){o=e.matches}const i=()=>o},2036:(e,t,n)=>{function o(){for(const e of document.querySelectorAll(".showcard")){const t=e.querySelector(".img"),n=e.querySelector(".showcard-button");if(!t||!n)throw new Error("invalid structure for .showcard");t.addEventListener("mouseover",(function(){n.classList.add("hover")})),t.addEventListener("mouseout",(function(){n.classList.remove("hover")}))}}n.d(t,{A:()=>o})},7894:(e,t,n)=>{n.d(t,{A:()=>i,o:()=>s});var o=n(6564);let r;function s(){r&&(r.destroy(),r=null)}async function i(){const e=document.getElementById("typed-js-initial");if(e){s();try{const t=JSON.parse(e.innerHTML),s=document.querySelector(".element");if(s.innerText="",_iro.ext_shared_lib)window.Typed||await(0,o.J)("dist/typed.umd.js","typed.js"),r=new window.Typed(s,t);else{const{default:e}=await n.e(7186).then(n.bind(n,7186));r=new e(s,t)}}catch(e){console.error("请检查typed.js设置",e)}}}},9257:(e,t,n)=>{n.d(t,{Br:()=>y,PW:()=>p,Zg:()=>f,lJ:()=>g});n(1531),n(3678),n(4145);var o=n(7156),r=n(4351),s=n(6564);const i=document.getElementById("bgvideo"),a=_iro.movies.name?.split(",")||[];let c=new Array(a.length).fill(0).map(((e,t)=>t)),l=[];const d=()=>{0==c.length&&(c=new Array(a.length).fill(0).map(((e,t)=>t)));const e=Math.floor(Math.random()*c.length);return a[c.splice(e,1)[0]]};function u(){const e=document.getElementsByClassName("video-stu")[0],t=d();e.innerHTML=(0,r.__)("正在载入视频 ..."),e.style.bottom="0px",i.setAttribute("src",new URL(t,_iro.movies.url||location.origin).toString()),i.setAttribute("video-name",(0,o.J)(t))}function m(){const e=document.getElementById("video-btn");e&&(e.classList.add("video-pause"),e.classList.remove("video-play"),e.style.display="");try{if(document.querySelector(".video-stu").style.bottom="-100px",document.querySelector(".focusinfo").style.top="-999px",_iro.float_player_on)return void Promise.all([n.e(8619),n.e(2563)]).then(n.bind(n,4052)).then((({pauseAllPlayer:e})=>{l=e(),i.play()}))}catch(e){console.warn(e)}i.play()}function h(){const e=document.getElementById("video-btn");e&&(e.classList.add("video-play"),e.classList.remove("video-pause"));try{document.querySelector(".focusinfo").style.top="49.3%"}catch{}i.pause();for(const e of l)e.play()}function f(){i&&null!=i.oncanplay&&document.querySelector(".haslive")&&document.querySelector(".videolive")&&m()}function g(){if(i&&null!=i.oncanplay&&document.querySelector(".haslive")){h();const e=document.getElementsByClassName("video-stu")[0];e.style.bottom="0px",e.innerHTML=(0,r.__)("已暂停...")}}function p(){const e=document.getElementById("video-btn");e&&e.addEventListener("click",(function(){this.classList.contains("loadvideo")?(this.classList.add("video-pause"),this.classList.remove("loadvideo"),u(),i.oncanplay=()=>{m(),document.getElementById("video-add").style.display="block",e.classList.add("videolive","haslive")}):this.classList.contains("video-pause")?(h(),e.classList.remove("videolive"),document.getElementsByClassName("video-stu")[0].style.bottom="0px",document.getElementsByClassName("video-stu")[0].innerHTML=(0,r.__)("已暂停...")):(m(),e.classList.add("videolive")),i.onended=function(){i.setAttribute("src",""),document.getElementById("video-add").style.display="none",document.querySelector(".focusinfo").style.top="49.3%",e&&(e.classList.add("loadvideo"),e.classList.remove("video-pause","videolive","haslive"),_iro.movies.loop&&e.click())}}));const t=document.getElementById("video-add");t&&t.addEventListener("click",u)}async function y(){!async function(){const e=document.querySelectorAll("video.hls");if(0==e.length)return;if(e[0].canPlayType("application/vnd.apple.mpegurl"))for(const t of e)t.src=t.dataset.src||t.src,t.autoplay=!0;else{if(!window.Hls)try{if(_iro.ext_shared_lib)await(0,s.J)("dist/hls.light.min.js","hls.js");else{const{default:e}=await n.e(4189).then(n.t.bind(n,4189,23));window.Hls=e}}catch(e){console.warn("Hls load failed: ",e)}Hls.isSupported()||console.error("Hls: Media Source Extensions is unsupported.");for(const t of e){const e=new Hls;e.loadSource(t.dataset.src||t.src),e.attachMedia(t),e.on(Hls.Events.MANIFEST_PARSED,(()=>{t.play()}))}}}(),async function(){document.querySelectorAll("video.lazyload").forEach((e=>e.addEventListener("canplay",v)))}()}function v(){this.poster=""}},7361:(e,t,n)=>{n.d(t,{u:()=>r});var o=n(4351);function r(){if(!_iro.audio)return;const e=window.AudioContext||window.webkitAudioContext;if(e){let t=0;const n=1,r=function(){const e=o.h.opt.web_audio?.sheet;return"string"==typeof e?e.split(" "):e instanceof Array?e:"880 987 1046 987 1046 1318 987 659 659 880 784 880 1046 784 659 659 698 659 698 1046 659 1046 1046 1046 987 698 698 987 987 880 987 1046 987 1046 1318 987 659 659 880 784 880 1046 784 659 698 1046 987 1046 1174 1174 1174 1046 1046 880 987 784 880 1046 1174 1318 1174 1318 1567 1046 987 1046 1318 1318 1174 784 784 880 1046 987 1174 1046 784 784 1396 1318 1174 659 1318 1046 1318 1760 1567 1567 1318 1174 1046 1046 1174 1046 1174 1567 1318 1318 1760 1567 1318 1174 1046 1046 1174 1046 1174 987 880 880 987 880".split(" ")}(),s=document.querySelectorAll(".site-title, #moblieGoTop, .site-branding, .searchbox, .changeSkin-gear, .menu-list li"),i="♪♩♫♬♭€§¶♯",a=o.h.opt.web_audio?.main_gain||1,c=new e,l=c.createGain(),d=c.createOscillator();let u;l.connect(c.destination),d.connect(l),d.type="sine",d.start(c.currentTime);let m=null;const h=e=>{if(e.currentTarget===m)return;c.resume(),m=e.currentTarget;const o=Math.round(i.length*Math.random()),s=e.pageX,h=e.pageY-5,f=document.createElement("b");f.textContent=i[o],f.style.zIndex="99999",f.style.top=h-100+"px",f.style.left=s+"px",f.style.position="absolute",f.style.color="#FF6EB4",f.style.pointerEvents="none",document.body.appendChild(f),f.animate([{top:h+"px"},{opacity:0}],{duration:500});const g=r[t]||r[t=0];t+=n,l.gain.cancelScheduledValues(c.currentTime),d.frequency.setValueAtTime(g,c.currentTime),l.gain.exponentialRampToValueAtTime(a,c.currentTime+.01),l.gain.exponentialRampToValueAtTime(.001,c.currentTime+2),l.gain.setValueAtTime(0,c.currentTime+2.1),setTimeout((()=>{f.remove(),m===e.currentTarget&&(m=null),clearTimeout(u),u=setTimeout((()=>{c.suspend(),u=void 0}),1e3)}),500)};s.forEach((e=>e.addEventListener("pointerenter",h)))}}},7925:(e,t,n)=>{function o(){const e=document.getElementsByClassName("butterBar");if(e.length>0)for(let t=0;t0&&e[d-1][2]>r;d--)e[d]=e[d-1];e[d]=[n,o,r]},a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},n=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,a.t=function(e,o){if(1&o&&(e=this(e)),8&o)return e;if("object"==typeof e&&e){if(4&o&&e.__esModule)return e;if(16&o&&"function"==typeof e.then)return e}var r=Object.create(null);a.r(r);var s={};t=t||[null,n({}),n([]),n(n)];for(var i=2&o&&e;"object"==typeof i&&!~t.indexOf(i);i=n(i))Object.getOwnPropertyNames(i).forEach((t=>s[t]=()=>e[t]));return s.default=()=>e,a.d(r,s),r},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((t,n)=>(a.f[n](e,t),t)),[])),a.u=e=>(({2065:"lg-2",2236:"lg-12",2661:"lg-6",3042:"lg-9",5459:"lg-0",5470:"lg-5",6458:"lg-1",7435:"lg-8",8268:"lg-7",8279:"lg-4",8599:"lg-11",9256:"lg-3",9438:"lg-10"}[e]||e)+".js"),a.miniCssF=e=>e+".css",a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o={},r="sakurairo-scripts:",a.l=(e,t,n,s)=>{if(o[e])o[e].push(t);else{var i,c;if(void 0!==n)for(var l=document.getElementsByTagName("script"),d=0;d
")+"
"+t.replace(/\r\n/g,"
"),o=s.join("\n")+"\n\n"+t.toString().replace(/\r\n/g,"\n");if(e.clipboardData)e.clipboardData.setData("text/html",n),e.clipboardData.setData("text/plain",o);else if(window.clipboardData)window.clipboardData.setData("text",o)}(e,n),(0,o.I)((0,r.__)("复制成功!"),1e3))}}function a(){_iro.clipboardCopyright&&(document.body.removeEventListener("copy",i),document.body.addEventListener("copy",i))}},4895:(e,t,n)=>{n.d(t,{vI:()=>p,LN:()=>w,t9:()=>v,LY:()=>h,rZ:()=>f});n(9261),n(3700),n(3632),n(1531),n(3678),n(4145);function o(e){return new Promise(((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)}))}function r(e,t){const n=indexedDB.open(e);n.onupgradeneeded=()=>n.result.createObjectStore(t);const r=o(n);return(e,n)=>r.then((o=>n(o.transaction(t,e).objectStore(t))))}const s=r("sakurairo","cache");var i=n(7721),a=n(4351),c=n(2818),l=n(7925),d=n(7156);let u=1,m="";async function h(){p(await w(!0)),u++}async function f(){u--,p(await w(!0))}const g=document.querySelector(".centerbg"),p=_iro.site_bg_as_cover?e=>{document.body.style.backgroundImage=`url(${e})`,document.dispatchEvent(new CustomEvent("coverBG_change",{detail:e}))}:g?e=>{g.style.backgroundImage=`url(${e})`,document.dispatchEvent(new CustomEvent("coverBG_change",{detail:e}))}:d.lQ;function y(e){const t=e?.match(/^url\("(.+)"\)$/);if(t)return t[1]}const v=_iro.site_bg_as_cover?()=>y(document.body.style.backgroundImage):g?()=>y(g.style.backgroundImage):d.lQ;function b(e=!1){const t=new URL(_iro.cover_api);return(0,c.F)()&&1==_iro.random_graphs_mts?(t.searchParams.set("type","mobile"),t.toString()+(e?"&"+u:"")):t.toString()+(e?(""===t.search?"?":"&")+u:"")}const w=_iro.cache_cover?(e=!1)=>{return(t="cover",s("readonly",(e=>o(e.get(t))))).then((t=>t&&t instanceof ArrayBuffer?(URL.revokeObjectURL(m),m="",m=URL.createObjectURL(new Blob([t])),m):b(e))).finally((()=>{!async function(e=!1){try{const t=await fetch(b(e),{headers:{Accept:i.t}});if(500==t.status){const e=await t.json();(0,l.I)(e.message),console.warn(e.message)}else if(t.ok){const e=await t.arrayBuffer();try{((e,t)=>{s("readwrite",(n=>(n.put(t,e),o(n.transaction))))})("cover",e)}catch(e){console.warn(e)}}}catch(e){e instanceof TypeError&&(console.warn((0,a.__)("你的封面API好像不支持跨域调用,这种情况下缓存是不会生效的哦")),(e=>{s("readwrite",(t=>(t.delete(e),o(t.transaction))))})("cover"))}}(e)}));var t}:b},9655:(e,t,n)=>{n.d(t,{ig:()=>m,jJ:()=>s,uO:()=>l,yi:()=>d});const o=window.matchMedia("(prefers-color-scheme:dark)");let r=!1;const s=()=>r;function i(e){e!==r&&(document.dispatchEvent(new CustomEvent("darkmode",{detail:e})),r=e)}function a(){localStorage.getItem("dark")||(o.matches&&_iro.darkmode?l():d())}function c(e){e==u()?localStorage.removeItem("dark"):1==e?localStorage.setItem("dark","1"):localStorage.setItem("dark","0")}function l(e){document.documentElement.style.backgroundColor="#333",document.getElementsByClassName("site-content")[0].style.backgroundColor="#333",document.body.classList.add("dark"),e&&c(!0),i(!0)}function d(e){document.documentElement.style.backgroundColor="",document.getElementsByClassName("site-content")[0].style.backgroundColor="rgba(255, 255, 255, .8)",document.body.classList.remove("dark"),document.body.classList.remove("dynamic"),i(!1),e&&c(!1)}function u(){switch(_iro.dm_strategy){case"client":return o.matches;case"eien":return!0;default:return function(){const e=new Date;return e.getHours()>21||e.getHours()<7}()}}function m(){const e=localStorage.getItem("dark");e?"1"==e?l():d():u()&&_iro.darkmode?l():d()}"client"===_iro.dm_strategy&&(o.removeEventListener?o.removeEventListener("change",a):o.removeListener(a),o.addEventListener?o.addEventListener("change",a):o.addListener(a))},8195:(e,t,n)=>{n.d(t,{J:()=>u,S:()=>l});var o=n(7925),r=n(4351),s=n(2818);let i,a;function c(e){return()=>{const{name:t}=e.dataset;t!=localStorage.getItem("font_family")&&("serif"==t?((0,s.F)()&&(0,o.I)((0,r.__)("将从网络加载字体,流量请注意")),document.body.classList.add("serif"),localStorage.setItem("font_family","serif"),d("serif")):(document.body.classList.remove("serif"),localStorage.setItem("font_family","sans-serif"),d("sans-serif")))}}function l(){const e=localStorage.getItem("font_family");e&&"serif"!=e||document.body.classList.add("serif")}function d(e){"sans-serif"===e||"sans-serif"==localStorage.getItem("font_family")?(i.classList.remove("selected"),a.classList.add("selected")):(a.classList.remove("selected"),i.classList.add("selected"))}function u(){const e=(i=document.getElementsByClassName("control-btn-serif")[0],a=document.getElementsByClassName("control-btn-sans-serif")[0],a&&i);e||localStorage.removeItem("font_family"),l(),e&&(d(),i.addEventListener("click",c(i)),a.addEventListener("click",c(a)))}},9509:(e,t,n)=>{async function o(){const e=document.getElementById("footer_yiyan");if(e){const t=_iro.yiyan_api||["https://api.maho.cc/yiyan/"];0==t.length&&console.warn("一言API: 路径为空");for(const n of t)try{const t=await r(n);e.innerText=t;break}catch(e){console.warn(`一言API: 尝试联系"${n}"时出错。 `,e);continue}}}n.d(t,{A:()=>o});const r=async e=>{const t=await fetch(e,{headers:{Accept:"application/json"}});if(t.ok){const e=await t.json(),n=("null"==e.from_who?null:e.from_who)||"",o=e.from!=e.from_who?`「${e.from}」`:"";return e.hitokoto+"——"+n+o}throw t.status}},2818:(e,t,n)=>{n.d(t,{F:()=>i,P:()=>r});let o=!1;function r(){const e=window.matchMedia("(max-width:860px)");o=e.matches,e.addEventListener?e.addEventListener("change",s):e.addListener(s)}function s(e){o=e.matches}const i=()=>o},2341:(e,t,n)=>{n.d(t,{U:()=>h,X:()=>u});var o=n(7156),r=n(2821),s=n(4351),i=n(3867),a=n(9311);const c=([e,t,n,o])=>{const r=`${e}deg,${t}%,${n}%`;return o&&1!==o?`hsla(${r},${o})`:`hsl(${r})`};let l;const d=(0,o.ai)((async function(){const e=document.location.href,t=document.querySelector("#pagination a");if(t.classList.contains("loading"))return;t.classList.add("loading"),t.innerText="";const n=await fetch(t.getAttribute("href")+"#main"),o=await n.text();if(e!=document.location.href)return;const a=(new DOMParser).parseFromString(o,"text/html"),c=a.querySelectorAll("#main .post, #shuoshuo_post"),l=a.querySelector("#pagination a"),d=l&&l.innerText,m=l&&l.getAttribute("href"),h=document.getElementById("main");for(let e=0;e0&&e[d-1][2]>r;d--)e[d]=e[d-1];e[d]=[n,o,r]},a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},n=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,a.t=function(e,o){if(1&o&&(e=this(e)),8&o)return e;if("object"==typeof e&&e){if(4&o&&e.__esModule)return e;if(16&o&&"function"==typeof e.then)return e}var r=Object.create(null);a.r(r);var s={};t=t||[null,n({}),n([]),n(n)];for(var i=2&o&&e;"object"==typeof i&&!~t.indexOf(i);i=n(i))Object.getOwnPropertyNames(i).forEach((t=>s[t]=()=>e[t]));return s.default=()=>e,a.d(r,s),r},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((t,n)=>(a.f[n](e,t),t)),[])),a.u=e=>(({2065:"lg-2",2236:"lg-12",2661:"lg-6",3042:"lg-9",5459:"lg-0",5470:"lg-5",6458:"lg-1",7435:"lg-8",8268:"lg-7",8279:"lg-4",8599:"lg-11",9256:"lg-3",9438:"lg-10"}[e]||e)+".js"),a.miniCssF=e=>e+".css",a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o={},r="sakurairo-scripts:",a.l=(e,t,n,s)=>{if(o[e])o[e].push(t);else{var i,c;if(void 0!==n)for(var l=document.getElementsByTagName("script"),d=0;d
') + \"
\" + selectionTxt.replace(/\\r\\n/g, \"
\"), textData = txt.join('\\n') + \"\\n\\n\" + selectionTxt.toString().replace(/\\r\\n/g, \"\\n\");\n if (event.clipboardData) {\n event.clipboardData.setData(\"text/html\", htmlData);\n event.clipboardData.setData(\"text/plain\", textData);\n }\n else if (window.clipboardData) {\n //deprecate?\n return window.clipboardData.setData(\"text\", textData);\n }\n}\nfunction copytext(e) {\n const selection = window.getSelection();\n if (selection) {\n const selectionText = selection.toString();\n if (selectionText.length > 30) {\n setClipboardText(e, selectionText);\n createButterbar(__(\"复制成功!\"), 1000);\n }\n }\n}\n/**\n * 添加复制时的版权提示\n */\nexport default function add_copyright() {\n if (_iro.clipboardCopyright) {\n document.body.removeEventListener(\"copy\", copytext);\n document.body.addEventListener(\"copy\", copytext);\n }\n}\n","function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n const dbp = promisifyRequest(request);\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","import { createStore, promisifyRequest } from 'idb-keyval';\nconst store = createStore('sakurairo', 'cache');\nconst get = (key) => store('readonly', (store) => promisifyRequest(store.get(key)));\nconst set = (key, value) => store('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n});\nconst del = (key) => store('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n});\nexport { get, set, del };\n","import { get, set, del } from './cache';\nimport { Accept_Image } from './compatibility';\nimport { __ } from '../common/sakurairo_global';\nimport { isMobile } from './mobile';\nimport { createButterbar } from '../common/butterbar';\nimport { noop } from '../common/util';\nlet bgn = 1;\nlet blob_url = '';\nexport async function nextBG() {\n changeCoverBG(await getCoverPath(true));\n bgn++;\n}\nexport async function preBG() {\n bgn--;\n changeCoverBG(await getCoverPath(true));\n}\nconst centerbg = document.querySelector(\".centerbg\");\n/**\n * 更改封面背景\n */\nexport const changeCoverBG = _iro.site_bg_as_cover ? (url) => {\n document.body.style.backgroundImage = `url(${url})`;\n document.dispatchEvent(new CustomEvent('coverBG_change', { detail: url }));\n} :\n centerbg ? (url) => {\n centerbg.style.backgroundImage = `url(${url})`;\n document.dispatchEvent(new CustomEvent('coverBG_change', { detail: url }));\n } : noop;\nfunction parseCSSUrl(cssText) {\n const result = cssText?.match(/^url\\(\"(.+)\"\\)$/);\n if (result) {\n return result[1];\n }\n}\n/**\n * 返回当前封面背景的URL\n */\nexport const getCurrentBG = _iro.site_bg_as_cover ? () => parseCSSUrl(document.body.style.backgroundImage) :\n (centerbg ? () => parseCSSUrl(centerbg.style.backgroundImage) : noop);\nfunction getAPIPath(useBGN = false) {\n const cover_api_url = new URL(_iro.cover_api);\n if (isMobile() && _iro.random_graphs_mts == true) {\n cover_api_url.searchParams.set('type', 'mobile');\n return cover_api_url.toString() + (useBGN ? \"&\" + bgn : '');\n }\n else {\n return cover_api_url.toString() + (useBGN ? (cover_api_url.search === '' ? \"?\" : '&') + bgn : '');\n }\n}\nexport const getCoverPath = _iro.cache_cover ? (useBGN = false) => get('cover').then(coverBG => {\n if (coverBG && coverBG instanceof ArrayBuffer) {\n cleanBlobUrl();\n blob_url = URL.createObjectURL(new Blob([coverBG]));\n return blob_url;\n }\n else {\n //fallback\n return getAPIPath(useBGN);\n }\n}).finally(() => {\n fetchThenCache(useBGN);\n})\n : getAPIPath;\nasync function fetchThenCache(useBGN = false) {\n try {\n const resp = await fetch(getAPIPath(useBGN), { headers: { Accept: Accept_Image } });\n if (resp.status == 500) {\n const result = await resp.json();\n createButterbar(result.message);\n console.warn(result.message);\n }\n else if (resp.ok) {\n const buf = await resp.arrayBuffer();\n try {\n set('cover', buf);\n /**\n * @problem Safari暂时不支持indexdb存储blob\n * DataCloneError: Failed to store record in an IDBObjectStore: BlobURLs are not yet supported.\n * @seealso https://developers.google.com/web/fundamentals/instant-and-offline/web-storage/indexeddb-best-practices#keeping_your_app_predictable\n */\n }\n catch (e) {\n //catch: FireFox无痕模式下数据库不允许修改\n /**\n * @problem FireFox无痕模式下数据库不允许修改\n * DOMException: A mutation operation was attempted on a database that did not allow mutations\n * Chrome不会报错\n * 像是火狐的设计 https://wiki.mozilla.org/Private_Browsing#Persistent_Storage\n * 变通方法 https://bugzilla.mozilla.org/show_bug.cgi?id=1639542#c9\n */\n console.warn(e);\n }\n }\n }\n catch (e) {\n if (e instanceof TypeError) {\n console.warn(__('你的封面API好像不支持跨域调用,这种情况下缓存是不会生效的哦'));\n del('cover');\n }\n }\n}\nfunction cleanBlobUrl() {\n URL.revokeObjectURL(blob_url);\n blob_url = '';\n}\n/* export function initCoverBG() {\n if (_iro.site_bg_as_cover) {\n if (centerbg) centerbg.style.background = '#0000'\n }\n} */ \n","const mediaQuery = window.matchMedia('(prefers-color-scheme:dark)');\nlet inDarkMode = false;\nexport const isInDarkMode = () => inDarkMode;\nfunction informDarkModeChange(nextValue) {\n if (nextValue !== inDarkMode) {\n document.dispatchEvent(new CustomEvent(\"darkmode\", { detail: nextValue }));\n inDarkMode = nextValue;\n }\n}\nfunction mediaQueryCallback() {\n const dark = localStorage.getItem(\"dark\");\n //仅在深色模式不是用户主动设置时触发\n if (!dark) {\n if (mediaQuery.matches && _iro.darkmode) {\n turnOnDarkMode();\n }\n else {\n turnOffDarkMode();\n }\n }\n}\nif (_iro.dm_strategy === 'client') {\n mediaQuery.removeEventListener ? mediaQuery.removeEventListener('change', mediaQueryCallback) : mediaQuery.removeListener(mediaQueryCallback);\n mediaQuery.addEventListener ? mediaQuery.addEventListener('change', mediaQueryCallback) : mediaQuery.addListener(mediaQueryCallback);\n}\nfunction saveUserSetting(value) {\n if (value == ifDarkmodeShouldOn()) {\n //用户设置与自动切换深色模式判断一致时,恢复自动切换\n localStorage.removeItem('dark');\n }\n else {\n if (value == true) {\n localStorage.setItem(\"dark\", \"1\");\n }\n else {\n localStorage.setItem(\"dark\", \"0\");\n }\n }\n //localStorage.setItem(\"bgImgSetting\", \"white-bg\");\n}\nexport function turnOnDarkMode(userTriggered) {\n document.documentElement.style.backgroundColor = \"#333\";\n document.getElementsByClassName(\"site-content\")[0].style.backgroundColor = \"#333\";\n document.body.classList.add(\"dark\");\n if (userTriggered)\n saveUserSetting(true);\n informDarkModeChange(true);\n}\nexport function turnOffDarkMode(userTriggered) {\n document.documentElement.style.backgroundColor = \"\";\n document.getElementsByClassName(\"site-content\")[0].style.backgroundColor = \"rgba(255, 255, 255, .8)\";\n document.body.classList.remove(\"dark\");\n document.body.classList.remove(\"dynamic\");\n informDarkModeChange(false);\n if (userTriggered) {\n saveUserSetting(false);\n //document.body.style.backgroundImage = `url(${_iro.skin_bg0})`;\n }\n}\n/**\n * 检查是否在深色模式时间\n * @returns {boolean}\n */\nfunction checkTime() {\n const today = new Date();\n return (today.getHours() > 21 || today.getHours() < 7);\n}\nexport function ifDarkmodeShouldOn() {\n switch (_iro.dm_strategy) {\n case 'client':\n return mediaQuery.matches;\n case 'eien':\n return true;\n default: /**case time */\n return checkTime();\n }\n}\nexport function checkDarkModeSetting() {\n const dark = localStorage.getItem(\"dark\");\n if (!dark) {\n //无用户设置时,自动切换深色模式\n if (ifDarkmodeShouldOn() && _iro.darkmode) {\n turnOnDarkMode();\n }\n else {\n turnOffDarkMode();\n }\n }\n else {\n if (dark == '1') {\n turnOnDarkMode();\n }\n else {\n turnOffDarkMode();\n }\n }\n}\n/* function mobile_dark_light() {\n if (document.body.classList.contains(\"dark\")) {\n document.documentElement.style.background = \"unset\";\n document.body.classList.remove(\"dark\");\n document.getElementById(\"moblieDarkLight\").innerHTML = '';\n setCookie(\"dark\", \"0\", 0.33);\n } else {\n document.documentElement.style.background = \"#333333\";\n document.getElementById(\"moblieDarkLight\").innerHTML = '';\n document.body.classList.add(\"dark\");\n setCookie(\"dark\", \"1\", 0.33);\n }\n} */ \n","import { createButterbar } from \"../common/butterbar\";\nimport { __ } from \"../common/sakurairo_global\";\nimport { isMobile } from \"./mobile\";\nlet btnSerif, btnSansSerif;\nfunction Serif() {\n if (isMobile()) {\n createButterbar(__(\"将从网络加载字体,流量请注意\"));\n }\n document.body.classList.add(\"serif\");\n localStorage.setItem(\"font_family\", \"serif\");\n setButtonState('serif');\n}\nfunction SansSerif() {\n document.body.classList.remove(\"serif\");\n localStorage.setItem(\"font_family\", \"sans-serif\");\n setButtonState('sans-serif');\n}\nfunction change_font_listener(btn) {\n return () => {\n const { name } = btn.dataset;\n const nowFont = localStorage.getItem(\"font_family\");\n if (name == nowFont) {\n return;\n }\n else {\n (name == 'serif') ? Serif() : SansSerif();\n }\n };\n}\nexport function loadFontSetting() {\n const nowFont = localStorage.getItem(\"font_family\");\n if (!nowFont || nowFont == \"serif\") {\n document.body.classList.add(\"serif\");\n }\n}\nfunction setButtonState(font_name) {\n if (font_name === 'sans-serif' || localStorage.getItem(\"font_family\") == 'sans-serif') {\n btnSerif.classList.remove(\"selected\");\n btnSansSerif.classList.add(\"selected\");\n }\n else {\n btnSansSerif.classList.remove(\"selected\");\n btnSerif.classList.add(\"selected\");\n }\n}\nfunction initDOMCache() {\n btnSerif = document.getElementsByClassName(\"control-btn-serif\")[0];\n btnSansSerif = document.getElementsByClassName(\"control-btn-sans-serif\")[0];\n return btnSansSerif && btnSerif;\n}\nfunction initListener() {\n btnSerif.addEventListener('click', change_font_listener(btnSerif));\n btnSansSerif.addEventListener('click', change_font_listener(btnSansSerif));\n}\nexport function initFontControl() {\n const result = initDOMCache();\n if (!result)\n localStorage.removeItem('font_family'); //样式菜单“简单”时,使用默认字体 “A”\n loadFontSetting();\n if (result) {\n setButtonState();\n initListener();\n }\n}\n","export default async function hitokoto() {\n const yiyan = document.getElementById(\"footer_yiyan\");\n if (yiyan) {\n const api_group = _iro.yiyan_api || [\"https://api.maho.cc/yiyan/\"];\n if (api_group.length == 0) {\n console.warn('一言API: 路径为空');\n }\n for (const api_path of api_group) {\n try {\n const txt = await request(api_path);\n yiyan.innerText = txt;\n break;\n }\n catch (e) {\n console.warn(`一言API: 尝试联系\"${api_path}\"时出错。 `, e);\n continue;\n }\n }\n }\n}\nconst request = async (api) => {\n const res = await fetch(api, { headers: { Accept: \"application/json\" } });\n if (res.ok) {\n const data = await res.json();\n const from_who = (data.from_who == 'null' ? null : data.from_who) || '';\n const from = data.from != data.from_who ? `「${data['from']}」` : '';\n const hitokoto = data.hitokoto;\n return hitokoto + '——' + from_who + from;\n }\n else {\n throw res.status;\n }\n};\n","let cache_is_mobile = false;\nexport function initIsMobileCache() {\n const mediaQuery = window.matchMedia('(max-width:860px)');\n cache_is_mobile = mediaQuery.matches;\n mediaQuery.addEventListener ? mediaQuery.addEventListener('change', refreshIsMobileCache) : mediaQuery.addListener(refreshIsMobileCache);\n}\nfunction refreshIsMobileCache(ev) {\n cache_is_mobile = ev.matches;\n}\n/**\n *\n * @returns 返回document.body.clientWidth <= 860的结果。这个结果是缓存的\n */\nexport const isMobile = () => cache_is_mobile;\n","export default function showcard() {\n for (const showcard of document.querySelectorAll('.showcard')) {\n const img = showcard.querySelector('.img');\n const button = showcard.querySelector('.showcard-button');\n if (!img || !button) {\n throw new Error('invalid structure for .showcard');\n }\n img.addEventListener('mouseover', function () {\n button.classList.add('hover');\n });\n img.addEventListener('mouseout', function () {\n button.classList.remove('hover');\n });\n }\n}\n","import { importExternal } from '../common/npmLib';\nlet typedInstance;\nexport function disableTypedJsIfExist() {\n if (typedInstance) {\n typedInstance.destroy();\n typedInstance = null;\n }\n}\nexport default async function initTypedJs() {\n const json = document.getElementById('typed-js-initial');\n if (json) {\n disableTypedJsIfExist(); // Fix mirai-mamori/Sakurairo #810\n try {\n const options = JSON.parse(json.innerHTML);\n const element = document.querySelector('.element');\n element.innerText = '';\n if (_iro.ext_shared_lib) {\n if (!window.Typed)\n await importExternal('dist/typed.umd.js', 'typed.js');\n typedInstance = new window.Typed(element, options);\n }\n else {\n const { default: Typed } = await import('typed.js');\n typedInstance = new Typed(element, options);\n }\n }\n catch (e) {\n console.error(\"请检查typed.js设置\", e);\n }\n }\n}\n","import { getBaseName } from '../common/util';\nimport { __ } from '../common/sakurairo_global';\nimport { importExternal } from '../common/npmLib';\nconst bgvideo = document.getElementById(\"bgvideo\");\nconst videoList = _iro.movies.name?.split(\",\") || []; // 视频列表\nlet unplayedIndex = new Array(videoList.length).fill(0).map((_, index) => index);\nlet aplayersToResume = [];\n//#region 背景视频\nconst _getNextRandomVideo = () => {\n if (unplayedIndex.length == 0) {\n unplayedIndex = new Array(videoList.length).fill(0).map((_, index) => index);\n }\n const nextIndex = Math.floor(Math.random() * unplayedIndex.length);\n return videoList[unplayedIndex.splice(nextIndex, 1)[0]];\n};\nfunction getVideo() {\n const video_stu = document.getElementsByClassName(\"video-stu\")[0];\n const fileName = _getNextRandomVideo(); // 随机抽取视频\n video_stu.innerHTML = __(\"正在载入视频 ...\");\n video_stu.style.bottom = \"0px\";\n //这里不需要检验_iro.movies是不是字符串,因为应该在前边检查\n bgvideo.setAttribute(\"src\", new URL(fileName, _iro.movies.url || location.origin).toString());\n bgvideo.setAttribute(\"video-name\", getBaseName(fileName));\n}\n/**\n * 播放\n */\nfunction splay() {\n const video_btn = document.getElementById(\"video-btn\");\n if (video_btn) {\n video_btn.classList.add(\"video-pause\");\n video_btn.classList.remove(\"video-play\");\n video_btn.style.display = \"\";\n }\n try {\n document.querySelector(\".video-stu\").style.bottom = \"-100px\";\n document.querySelector(\".focusinfo\").style.top = \"-999px\";\n if (_iro.float_player_on) {\n import('./aplayer').then(({ pauseAllPlayer }) => {\n aplayersToResume = pauseAllPlayer();\n bgvideo.play();\n });\n return;\n }\n }\n catch (e) {\n console.warn(e);\n }\n bgvideo.play();\n}\n/**\n * 暂停\n */\nfunction spause() {\n const video_btn = document.getElementById(\"video-btn\");\n if (video_btn) {\n video_btn.classList.add(\"video-play\");\n video_btn.classList.remove(\"video-pause\");\n }\n try {\n document.querySelector(\".focusinfo\").style.top = \"49.3%\";\n }\n catch { }\n bgvideo.pause();\n for (const player of aplayersToResume) {\n player.play();\n }\n}\n/**\n * 自动续播 - 播放\n */\nexport function liveplay() {\n if (bgvideo && bgvideo.oncanplay != undefined && document.querySelector(\".haslive\")) { // 检查视频数据\n if (document.querySelector(\".videolive\")) { // 检查播放状态\n splay();\n }\n }\n}\nexport function livepause() {\n if (bgvideo && bgvideo.oncanplay != undefined && document.querySelector(\".haslive\")) { // 检查视频数据\n spause();\n const video_stu = document.getElementsByClassName(\"video-stu\")[0];\n video_stu.style.bottom = \"0px\";\n video_stu.innerHTML = __(\"已暂停...\");\n }\n}\nexport function coverVideo() {\n const video_btn = document.getElementById(\"video-btn\");\n if (video_btn)\n video_btn.addEventListener(\"click\", function () {\n if (this.classList.contains(\"loadvideo\")) {\n this.classList.add(\"video-pause\");\n this.classList.remove(\"loadvideo\");\n getVideo();\n bgvideo.oncanplay = () => {\n splay();\n document.getElementById(\"video-add\").style.display = \"block\";\n video_btn.classList.add(\"videolive\", \"haslive\"); // MDZZ\n };\n }\n else {\n if (this.classList.contains(\"video-pause\")) {\n spause();\n video_btn.classList.remove(\"videolive\");\n document.getElementsByClassName(\"video-stu\")[0].style.bottom = \"0px\";\n document.getElementsByClassName(\"video-stu\")[0].innerHTML = __(\"已暂停...\");\n }\n else {\n splay();\n video_btn.classList.add(\"videolive\"); // 用于判断切换页面时的状态\n }\n }\n bgvideo.onended = function () {\n bgvideo.setAttribute(\"src\", \"\");\n document.getElementById(\"video-add\").style.display = \"none\";\n document.querySelector(\".focusinfo\").style.top = \"49.3%\";\n if (video_btn) {\n video_btn.classList.add(\"loadvideo\");\n video_btn.classList.remove(\"video-pause\", \"videolive\", \"haslive\");\n if (_iro.movies.loop) {\n video_btn.click();\n }\n }\n };\n });\n const video_add = document.getElementById(\"video-add\");\n if (video_add)\n video_add.addEventListener(\"click\", getVideo);\n}\n//#endregion\nexport async function coverVideoIni() {\n initHLS();\n lazyloadPatch();\n}\nfunction canPlayHandler() {\n this.poster = '';\n}\n/**\n * 用户代理可能会禁止自动播放,此时需要撤掉poster\n */\nasync function lazyloadPatch() {\n document.querySelectorAll('video.lazyload')\n .forEach(video => video.addEventListener('canplay', canPlayHandler));\n}\nasync function initHLS() {\n const videos = document.querySelectorAll('video.hls');\n if (videos.length == 0)\n return;\n //检查浏览器是否原生支持\n if (videos[0].canPlayType('application/vnd.apple.mpegurl')) {\n for (const video of videos) {\n video.src = video.dataset.src || video.src;\n video.autoplay = true;\n }\n }\n else {\n if (!window.Hls) {\n try {\n if (_iro.ext_shared_lib) {\n await importExternal('dist/hls.light.min.js', 'hls.js');\n }\n else {\n //@ts-ignore\n const { default: Hls } = await import('hls.js/dist/hls.light.js');\n window.Hls = Hls;\n }\n }\n catch (reason) {\n console.warn('Hls load failed: ', reason);\n }\n }\n if (!Hls.isSupported())\n console.error('Hls: Media Source Extensions is unsupported.');\n for (const video of videos) {\n const hls = new Hls();\n hls.loadSource(video.dataset.src || video.src);\n hls.attachMedia(video);\n hls.on(Hls.Events.MANIFEST_PARSED, () => {\n video.play();\n });\n }\n }\n}\n","import { sakurairoGlobal } from \"../common/sakurairo_global\";\nexport function web_audio() {\n if (!_iro.audio)\n return;\n //@ts-ignore\n const AudioContext = window.AudioContext || window.webkitAudioContext;\n if (AudioContext) {\n let i = 0;\n const o = 1;\n const t = getSheet();\n const selects = document.querySelectorAll(\".site-title, #moblieGoTop, .site-branding, .searchbox, .changeSkin-gear, .menu-list li\");\n const notes = \"♪♩♫♬♭€§¶♯\";\n const gainValueMax = sakurairoGlobal.opt.web_audio?.main_gain || 1;\n const ctx = new AudioContext;\n const l = ctx.createGain();\n const c = ctx.createOscillator();\n l.connect(ctx.destination);\n c.connect(l);\n c.type = \"sine\";\n c.start(ctx.currentTime);\n let _t;\n function suspendContextWhenIdle() {\n clearTimeout(_t);\n _t = setTimeout(() => {\n ctx.suspend();\n _t = undefined;\n }, 1000);\n }\n let lastTarget = null;\n const listener = (e) => {\n if (e.currentTarget === lastTarget)\n return;\n ctx.resume();\n lastTarget = e.currentTarget;\n const d = Math.round(notes.length * Math.random());\n const h = e.pageX;\n const p = e.pageY - 5;\n const dom = document.createElement(\"b\");\n dom.textContent = notes[d];\n dom.style.zIndex = \"99999\";\n dom.style.top = p - 100 + \"px\";\n dom.style.left = h + \"px\";\n dom.style.position = \"absolute\";\n dom.style.color = \"#FF6EB4\";\n dom.style.pointerEvents = \"none\";\n document.body.appendChild(dom);\n dom.animate([\n { top: p + \"px\" },\n { opacity: 0 }\n ], {\n duration: 500\n });\n const r = t[i] || t[i = 0];\n i += o;\n l.gain.cancelScheduledValues(ctx.currentTime);\n c.frequency.setValueAtTime(r, ctx.currentTime);\n l.gain.exponentialRampToValueAtTime(gainValueMax, ctx.currentTime + .01);\n l.gain.exponentialRampToValueAtTime(.001, ctx.currentTime + 2);\n l.gain.setValueAtTime(0, ctx.currentTime + 2.1);\n setTimeout(() => {\n dom.remove();\n if (lastTarget === e.currentTarget)\n lastTarget = null;\n suspendContextWhenIdle();\n }, 500);\n };\n selects.forEach(s => s.addEventListener('pointerenter', listener));\n }\n}\nfunction getSheet() {\n const sheet = sakurairoGlobal.opt.web_audio?.sheet;\n if (typeof sheet == 'string') {\n return sheet.split(' ');\n }\n else if (sheet instanceof Array) {\n return sheet;\n }\n else {\n //欢乐颂\n /*t = \"329.628 329.628 349.228 391.995 391.995 349.228 329.628 293.665 261.626 261.626 293.665 329.628 329.628 293.665 293.665 329.628 329.628 349.228 391.995 391.995 349.228 329.628 293.665 261.626 261.626 293.665 329.628 293.665 261.626 261.626 293.665 293.665 329.628 261.626 293.665 329.628 349.228 329.628 261.626 293.665 329.628 349.228 329.628 293.665 261.626 293.665 195.998 329.628 329.628 349.228 391.995 391.995 349.228 329.628 293.665 261.626 261.626 293.665 329.628 293.665 261.626 261.626\".split(\" \")*/\n //天空之城\n return \"880 987 1046 987 1046 1318 987 659 659 880 784 880 1046 784 659 659 698 659 698 1046 659 1046 1046 1046 987 698 698 987 987 880 987 1046 987 1046 1318 987 659 659 880 784 880 1046 784 659 698 1046 987 1046 1174 1174 1174 1046 1046 880 987 784 880 1046 1174 1318 1174 1318 1567 1046 987 1046 1318 1318 1174 784 784 880 1046 987 1174 1046 784 784 1396 1318 1174 659 1318 1046 1318 1760 1567 1567 1318 1174 1046 1046 1174 1046 1174 1567 1318 1318 1760 1567 1318 1174 1046 1046 1174 1046 1174 987 880 880 987 880\".split(\" \");\n }\n}\n","export function clearButterbar() {\n const butterBar = document.getElementsByClassName(\"butterBar\");\n if (butterBar.length > 0) {\n for (let i = 0; i < butterBar.length; i++) {\n butterBar[i].remove();\n }\n }\n}\nexport function createButterbar(message, keep) {\n clearButterbar();\n /* document.body.insertAdjacentHTML('beforeend', '
') + \"
\" + selectionTxt.replace(/\\r\\n/g, \"
\"), textData = txt.join('\\n') + \"\\n\\n\" + selectionTxt.toString().replace(/\\r\\n/g, \"\\n\");\n if (event.clipboardData) {\n event.clipboardData.setData(\"text/html\", htmlData);\n event.clipboardData.setData(\"text/plain\", textData);\n }\n else if (window.clipboardData) {\n //deprecate?\n return window.clipboardData.setData(\"text\", textData);\n }\n}\nfunction copytext(e) {\n const selection = window.getSelection();\n if (selection) {\n const selectionText = selection.toString();\n if (selectionText.length > 30) {\n setClipboardText(e, selectionText);\n createButterbar(__(\"复制成功!\"), 1000);\n }\n }\n}\n/**\n * 添加复制时的版权提示\n */\nexport default function add_copyright() {\n if (_iro.clipboardCopyright) {\n document.body.removeEventListener(\"copy\", copytext);\n document.body.addEventListener(\"copy\", copytext);\n }\n}\n","function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n const dbp = promisifyRequest(request);\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","import { createStore, promisifyRequest } from 'idb-keyval';\nconst store = createStore('sakurairo', 'cache');\nconst get = (key) => store('readonly', (store) => promisifyRequest(store.get(key)));\nconst set = (key, value) => store('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n});\nconst del = (key) => store('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n});\nexport { get, set, del };\n","import { get, set, del } from './cache';\nimport { Accept_Image } from './compatibility';\nimport { __ } from '../common/sakurairo_global';\nimport { isMobile } from './mobile';\nimport { createButterbar } from '../common/butterbar';\nimport { noop } from '../common/util';\nlet bgn = 1;\nlet blob_url = '';\nexport async function nextBG() {\n changeCoverBG(await getCoverPath(true));\n bgn++;\n}\nexport async function preBG() {\n bgn--;\n changeCoverBG(await getCoverPath(true));\n}\nconst centerbg = document.querySelector(\".centerbg\");\n/**\n * 更改封面背景\n */\nexport const changeCoverBG = _iro.site_bg_as_cover ? (url) => {\n document.body.style.backgroundImage = `url(${url})`;\n document.dispatchEvent(new CustomEvent('coverBG_change', { detail: url }));\n} :\n centerbg ? (url) => {\n centerbg.style.backgroundImage = `url(${url})`;\n document.dispatchEvent(new CustomEvent('coverBG_change', { detail: url }));\n } : noop;\nfunction parseCSSUrl(cssText) {\n const result = cssText?.match(/^url\\(\"(.+)\"\\)$/);\n if (result) {\n return result[1];\n }\n}\n/**\n * 返回当前封面背景的URL\n */\nexport const getCurrentBG = _iro.site_bg_as_cover ? () => parseCSSUrl(document.body.style.backgroundImage) :\n (centerbg ? () => parseCSSUrl(centerbg.style.backgroundImage) : noop);\nfunction getAPIPath(useBGN = false) {\n const cover_api_url = new URL(_iro.cover_api);\n if (isMobile() && _iro.random_graphs_mts == true) {\n cover_api_url.searchParams.set('type', 'mobile');\n return cover_api_url.toString() + (useBGN ? \"&\" + bgn : '');\n }\n else {\n return cover_api_url.toString() + (useBGN ? (cover_api_url.search === '' ? \"?\" : '&') + bgn : '');\n }\n}\nexport const getCoverPath = _iro.cache_cover ? (useBGN = false) => get('cover').then(coverBG => {\n if (coverBG && coverBG instanceof ArrayBuffer) {\n cleanBlobUrl();\n blob_url = URL.createObjectURL(new Blob([coverBG]));\n return blob_url;\n }\n else {\n //fallback\n return getAPIPath(useBGN);\n }\n}).finally(() => {\n fetchThenCache(useBGN);\n})\n : getAPIPath;\nasync function fetchThenCache(useBGN = false) {\n try {\n const resp = await fetch(getAPIPath(useBGN), { headers: { Accept: Accept_Image } });\n if (resp.status == 500) {\n const result = await resp.json();\n createButterbar(result.message);\n console.warn(result.message);\n }\n else if (resp.ok) {\n const buf = await resp.arrayBuffer();\n try {\n set('cover', buf);\n /**\n * @problem Safari暂时不支持indexdb存储blob\n * DataCloneError: Failed to store record in an IDBObjectStore: BlobURLs are not yet supported.\n * @seealso https://developers.google.com/web/fundamentals/instant-and-offline/web-storage/indexeddb-best-practices#keeping_your_app_predictable\n */\n }\n catch (e) {\n //catch: FireFox无痕模式下数据库不允许修改\n /**\n * @problem FireFox无痕模式下数据库不允许修改\n * DOMException: A mutation operation was attempted on a database that did not allow mutations\n * Chrome不会报错\n * 像是火狐的设计 https://wiki.mozilla.org/Private_Browsing#Persistent_Storage\n * 变通方法 https://bugzilla.mozilla.org/show_bug.cgi?id=1639542#c9\n */\n console.warn(e);\n }\n }\n }\n catch (e) {\n if (e instanceof TypeError) {\n console.warn(__('你的封面API好像不支持跨域调用,这种情况下缓存是不会生效的哦'));\n del('cover');\n }\n }\n}\nfunction cleanBlobUrl() {\n URL.revokeObjectURL(blob_url);\n blob_url = '';\n}\n/* export function initCoverBG() {\n if (_iro.site_bg_as_cover) {\n if (centerbg) centerbg.style.background = '#0000'\n }\n} */ \n","const mediaQuery = window.matchMedia('(prefers-color-scheme:dark)');\nlet inDarkMode = false;\nexport const isInDarkMode = () => inDarkMode;\nfunction informDarkModeChange(nextValue) {\n if (nextValue !== inDarkMode) {\n document.dispatchEvent(new CustomEvent(\"darkmode\", { detail: nextValue }));\n inDarkMode = nextValue;\n }\n}\nfunction mediaQueryCallback() {\n const dark = localStorage.getItem(\"dark\");\n //仅在深色模式不是用户主动设置时触发\n if (!dark) {\n if (mediaQuery.matches && _iro.darkmode) {\n turnOnDarkMode();\n }\n else {\n turnOffDarkMode();\n }\n }\n}\nif (_iro.dm_strategy === 'client') {\n mediaQuery.removeEventListener ? mediaQuery.removeEventListener('change', mediaQueryCallback) : mediaQuery.removeListener(mediaQueryCallback);\n mediaQuery.addEventListener ? mediaQuery.addEventListener('change', mediaQueryCallback) : mediaQuery.addListener(mediaQueryCallback);\n}\nfunction saveUserSetting(value) {\n if (value == ifDarkmodeShouldOn()) {\n //用户设置与自动切换深色模式判断一致时,恢复自动切换\n localStorage.removeItem('dark');\n }\n else {\n if (value == true) {\n localStorage.setItem(\"dark\", \"1\");\n }\n else {\n localStorage.setItem(\"dark\", \"0\");\n }\n }\n //localStorage.setItem(\"bgImgSetting\", \"white-bg\");\n}\nexport function turnOnDarkMode(userTriggered) {\n document.documentElement.style.backgroundColor = \"#333\";\n document.getElementsByClassName(\"site-content\")[0].style.backgroundColor = \"#333\";\n document.body.classList.add(\"dark\");\n if (userTriggered)\n saveUserSetting(true);\n informDarkModeChange(true);\n}\nexport function turnOffDarkMode(userTriggered) {\n document.documentElement.style.backgroundColor = \"\";\n document.getElementsByClassName(\"site-content\")[0].style.backgroundColor = \"rgba(255, 255, 255, .8)\";\n document.body.classList.remove(\"dark\");\n document.body.classList.remove(\"dynamic\");\n informDarkModeChange(false);\n if (userTriggered) {\n saveUserSetting(false);\n //document.body.style.backgroundImage = `url(${_iro.skin_bg0})`;\n }\n}\n/**\n * 检查是否在深色模式时间\n * @returns {boolean}\n */\nfunction checkTime() {\n const today = new Date();\n return (today.getHours() > 21 || today.getHours() < 7);\n}\nexport function ifDarkmodeShouldOn() {\n switch (_iro.dm_strategy) {\n case 'client':\n return mediaQuery.matches;\n case 'eien':\n return true;\n default: /**case time */\n return checkTime();\n }\n}\nexport function checkDarkModeSetting() {\n const dark = localStorage.getItem(\"dark\");\n if (!dark) {\n //无用户设置时,自动切换深色模式\n if (ifDarkmodeShouldOn() && _iro.darkmode) {\n turnOnDarkMode();\n }\n else {\n turnOffDarkMode();\n }\n }\n else {\n if (dark == '1') {\n turnOnDarkMode();\n }\n else {\n turnOffDarkMode();\n }\n }\n}\n/* function mobile_dark_light() {\n if (document.body.classList.contains(\"dark\")) {\n document.documentElement.style.background = \"unset\";\n document.body.classList.remove(\"dark\");\n document.getElementById(\"moblieDarkLight\").innerHTML = '';\n setCookie(\"dark\", \"0\", 0.33);\n } else {\n document.documentElement.style.background = \"#333333\";\n document.getElementById(\"moblieDarkLight\").innerHTML = '';\n document.body.classList.add(\"dark\");\n setCookie(\"dark\", \"1\", 0.33);\n }\n} */ \n","import { createButterbar } from \"../common/butterbar\";\nimport { __ } from \"../common/sakurairo_global\";\nimport { isMobile } from \"./mobile\";\nlet btnSerif, btnSansSerif;\nfunction Serif() {\n if (isMobile()) {\n createButterbar(__(\"将从网络加载字体,流量请注意\"));\n }\n document.body.classList.add(\"serif\");\n localStorage.setItem(\"font_family\", \"serif\");\n setButtonState('serif');\n}\nfunction SansSerif() {\n document.body.classList.remove(\"serif\");\n localStorage.setItem(\"font_family\", \"sans-serif\");\n setButtonState('sans-serif');\n}\nfunction change_font_listener(btn) {\n return () => {\n const { name } = btn.dataset;\n const nowFont = localStorage.getItem(\"font_family\");\n if (name == nowFont) {\n return;\n }\n else {\n (name == 'serif') ? Serif() : SansSerif();\n }\n };\n}\nexport function loadFontSetting() {\n const nowFont = localStorage.getItem(\"font_family\");\n if (!nowFont || nowFont == \"serif\") {\n document.body.classList.add(\"serif\");\n }\n}\nfunction setButtonState(font_name) {\n if (font_name === 'sans-serif' || localStorage.getItem(\"font_family\") == 'sans-serif') {\n btnSerif.classList.remove(\"selected\");\n btnSansSerif.classList.add(\"selected\");\n }\n else {\n btnSansSerif.classList.remove(\"selected\");\n btnSerif.classList.add(\"selected\");\n }\n}\nfunction initDOMCache() {\n btnSerif = document.getElementsByClassName(\"control-btn-serif\")[0];\n btnSansSerif = document.getElementsByClassName(\"control-btn-sans-serif\")[0];\n return btnSansSerif && btnSerif;\n}\nfunction initListener() {\n btnSerif.addEventListener('click', change_font_listener(btnSerif));\n btnSansSerif.addEventListener('click', change_font_listener(btnSansSerif));\n}\nexport function initFontControl() {\n const result = initDOMCache();\n if (!result)\n localStorage.removeItem('font_family'); //样式菜单“简单”时,使用默认字体 “A”\n loadFontSetting();\n if (result) {\n setButtonState();\n initListener();\n }\n}\n","export default async function hitokoto() {\n const yiyan = document.getElementById(\"footer_yiyan\");\n if (yiyan) {\n const api_group = _iro.yiyan_api || [\"https://api.maho.cc/yiyan/\"];\n if (api_group.length == 0) {\n console.warn('一言API: 路径为空');\n }\n for (const api_path of api_group) {\n try {\n const txt = await request(api_path);\n yiyan.innerText = txt;\n break;\n }\n catch (e) {\n console.warn(`一言API: 尝试联系\"${api_path}\"时出错。 `, e);\n continue;\n }\n }\n }\n}\nconst request = async (api) => {\n const res = await fetch(api, { headers: { Accept: \"application/json\" } });\n if (res.ok) {\n const data = await res.json();\n const from_who = (data.from_who == 'null' ? null : data.from_who) || '';\n const from = data.from != data.from_who ? `「${data['from']}」` : '';\n const hitokoto = data.hitokoto;\n return hitokoto + '——' + from_who + from;\n }\n else {\n throw res.status;\n }\n};\n","let cache_is_mobile = false;\nexport function initIsMobileCache() {\n const mediaQuery = window.matchMedia('(max-width:860px)');\n cache_is_mobile = mediaQuery.matches;\n mediaQuery.addEventListener ? mediaQuery.addEventListener('change', refreshIsMobileCache) : mediaQuery.addListener(refreshIsMobileCache);\n}\nfunction refreshIsMobileCache(ev) {\n cache_is_mobile = ev.matches;\n}\n/**\n *\n * @returns 返回document.body.clientWidth <= 860的结果。这个结果是缓存的\n */\nexport const isMobile = () => cache_is_mobile;\n","import { onlyOnceATime } from \"../common/util\";\nimport lazyload from \"../common/lazyload\";\nimport { __ } from '../common/sakurairo_global';\n// @ts-ignore\nimport { code_highlight_style } from '../common/code-highlight';\nimport { getForeground, getHighlight, getThemeColorFromImageElement } from \"./theme-color\";\nconst hslaCSSText = ([h, s, l, a]) => {\n const hsl = `${h}deg,${s}%,${l}%`;\n return a && a !== 1 ? `hsla(${hsl},${a})` : `hsl(${hsl})`;\n};\nlet load_post_timer;\nconst load_post = onlyOnceATime(async function load_post() {\n const now_href = document.location.href;\n const pagination_a = document.querySelector('#pagination a');\n if (pagination_a.classList.contains(\"loading\"))\n return;\n pagination_a.classList.add(\"loading\");\n pagination_a.innerText = \"\";\n // $('#pagination a').addClass(\"loading\").text(\"\");\n const resp = await fetch(pagination_a.getAttribute(\"href\") + \"#main\");\n const text = await resp.text();\n //在进行DOM操作前检查页面是否已经变化,防止错误加载到其他页面上\n if (now_href != document.location.href)\n return; /**如果页面状态发生了变化,那么也应该不用理加载提示符 */\n const parser = new DOMParser(), DOM = parser.parseFromString(text, \"text/html\"), result = DOM.querySelectorAll(\"#main .post, #shuoshuo_post\"), paga = DOM.querySelector(\"#pagination a\"), paga_innerText = paga && paga.innerText, nextHref = paga && paga.getAttribute(\"href\"), main = document.getElementById(\"main\");\n for (let i = 0; i < result.length; i++) {\n main.append(result[i]);\n }\n //if (resp.ok) {\n // result = $(data).find(\"#main .post\");\n // nextHref = $(data).find(\"#pagination a\").attr(\"href\");\n // $(\"#main\").append(result.fadeIn(500));\n const dpga = document.querySelector(\"#pagination a\"), addps = document.querySelector(\"#add_post span\");\n if (dpga) {\n dpga.classList.remove(\"loading\");\n dpga.innerText = paga_innerText;\n }\n if (addps) {\n addps.classList.remove(\"loading\");\n addps.innerText = \"\";\n }\n // $(\"#pagination a\").removeClass(\"loading\").text(\"Previous\");\n // $('#add_post span').removeClass(\"loading\").text(\"\");\n lazyload();\n code_highlight_style();\n post_list_show_animation();\n document.dispatchEvent(new CustomEvent('ajax_post_loaded'));\n if (nextHref != undefined) {\n pagination_a.setAttribute(\"href\", nextHref);\n // $(\"#pagination a\").attr(\"href\", nextHref);\n //加载完成上滑\n let tempScrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;\n // window.scrollTo(tempScrollTop);\n // $(window).scrollTop(tempScrollTop);\n window.scrollTo({\n top: tempScrollTop + 300,\n behavior: 'smooth'\n });\n // $body.animate({\n // scrollTop: tempScrollTop + 300\n //\n // }, 666)\n }\n else {\n document.getElementById(\"pagination\").innerHTML = \"\" + __(\"很高兴你翻到这里,但是真的没有了...\") + \"\";\n // $(\"#pagination\").html(\"很高兴你翻到这里,但是真的没有了...\");\n }\n //}\n /* $.ajax({\n type: \"POST\",\n url: $('#pagination a').attr(\"href\") + \"#main\",\n success: function (data) {\n result = $(data).find(\"#main .post\");\n nextHref = $(data).find(\"#pagination a\").attr(\"href\");\n $(\"#main\").append(result.fadeIn(500));\n $(\"#pagination a\").removeClass(\"loading\").text(\"Previous\");\n $('#add_post span').removeClass(\"loading\").text(\"\");\n lazyload();\n post_list_show_animation();\n if (nextHref != undefined) {\n $(\"#pagination a\").attr(\"href\", nextHref);\n //加载完成上滑\n var tempScrollTop = $(window).scrollTop();\n $(window).scrollTop(tempScrollTop);\n $body.animate({\n scrollTop: tempScrollTop + 300\n\n }, 666)\n } else {\n $(\"#pagination\").html(\"很高兴你翻到这里,但是真的没有了...\");\n }\n }\n }); */\n});\nexport function post_list_show_animation() {\n const articles = document.querySelectorAll('article.post-list-thumb');\n if (articles) {\n const io = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n entry.target.classList.add(\"post-list-show\");\n }\n else if (!entry.target.classList.contains(\"post-list-show\")) {\n return;\n }\n const target = entry.target;\n target.style.willChange = 'auto';\n io.unobserve(target);\n const thumbImage = target.querySelector('.post-thumb img');\n if (thumbImage) {\n let finalImageElement = thumbImage;\n if (thumbImage.classList.contains('lazyload')) {\n finalImageElement = document.createElement('img');\n finalImageElement.src = thumbImage.getAttribute('data-src');\n finalImageElement.crossOrigin = \"anonymous\";\n }\n getThemeColorFromImageElement(finalImageElement)\n .then(rgba => {\n if (!rgba)\n return;\n const style = target.style;\n style.setProperty('--article-theme', `rgba(${rgba[0]},${rgba[1]},${rgba[2]},${rgba[3] / 255})`);\n style.setProperty('--article-theme-highlight', hslaCSSText(getHighlight(rgba)));\n style.setProperty('--article-theme-foreground', hslaCSSText(getForeground(rgba)));\n });\n }\n }\n }, {\n root: null,\n threshold: [0.66]\n });\n for (const article of articles) {\n io.observe(article);\n }\n }\n}\nfunction XLS_Listener(e) {\n //要求是#pagination只有anchor一个直接子后代\n if (e.target.parentElement.id == 'pagination') {\n e.preventDefault();\n e.stopPropagation();\n clearTimeout(load_post_timer);\n load_post();\n }\n}\nexport function XLS() {\n const intersectionObserver = new IntersectionObserver((entries) => {\n if (entries[0].intersectionRatio <= 0)\n return;\n // var page_next = $('#pagination a').attr(\"href\");\n const _page_next = document.querySelector('#pagination a');\n if (_page_next) {\n const href_page_next = _page_next.getAttribute(\"href\"), load_key = document.getElementById(\"add_post_time\");\n if (href_page_next != undefined && load_key) {\n const load_time = load_key.title;\n if (load_time != \"233\") {\n console.log(\"%c 自动加载时倒计时 %c\", \"background:#9a9da2; color:#ffffff; border-radius:4px;\", \"\", \"\", load_time);\n load_post_timer = setTimeout(load_post, parseInt(load_time, 10) * 1000);\n }\n }\n }\n });\n intersectionObserver.observe(document.querySelector('.footer-device'));\n document.body.removeEventListener('click', XLS_Listener);\n document.body.addEventListener(\"click\", XLS_Listener);\n}\n","export default function showcard() {\n for (const showcard of document.querySelectorAll('.showcard')) {\n const img = showcard.querySelector('.img');\n const button = showcard.querySelector('.showcard-button');\n if (!img || !button) {\n throw new Error('invalid structure for .showcard');\n }\n img.addEventListener('mouseover', function () {\n button.classList.add('hover');\n });\n img.addEventListener('mouseout', function () {\n button.classList.remove('hover');\n });\n }\n}\n","let lastMsgId = 0;\nexport default class PromiseWorker {\n w;\n cb = {};\n [Symbol.dispose];\n constructor(worker) {\n this.w = worker;\n const callback = (e) => {\n const payload = e.data;\n const messageId = payload[0];\n const callback = this.cb[messageId];\n if (!callback)\n return;\n delete this.cb[messageId];\n callback(payload[1], payload[2]);\n };\n worker.addEventListener('message', callback);\n this.postMessage = (message, ...extraArgs) => {\n const messageId = lastMsgId++;\n const messageToSend = [messageId, message];\n return new Promise((resolve, reject) => {\n this.cb[messageId] = (error, result) => {\n if (error) {\n return reject(new Error(error.message));\n }\n resolve(result);\n };\n this.w.postMessage(messageToSend, ...extraArgs);\n });\n };\n this[Symbol.dispose] = () => {\n worker.removeEventListener('message', callback);\n };\n }\n postMessage;\n}\n","/**\n * RGB space.\n *\n * @module color-space/rgb\n */\n\nexport default {\n\tname: 'rgb',\n\tmin: [0,0,0],\n\tmax: [255,255,255],\n\tchannel: ['red', 'green', 'blue'],\n\talias: ['RGB']\n};\n","/**\n * @module color-space/hsl\n */\nimport rgb from './rgb.js';\n\nexport default {\n\tname: 'hsl',\n\tmin: [0,0,0],\n\tmax: [360,100,100],\n\tchannel: ['hue', 'saturation', 'lightness'],\n\talias: ['HSL'],\n\n\trgb: function(hsl) {\n\t\tvar h = hsl[0]/360, s = hsl[1]/100, l = hsl[2]/100, t1, t2, t3, rgb, val, i=0;\n\n\t\tif (s === 0) return val = l * 255, [val, val, val];\n\n\t\tt2 = l < 0.5 ? l * (1 + s) : l + s - l * s;\n\t\tt1 = 2 * l - t2;\n\n\t\trgb = [0, 0, 0];\n\t\tfor (;i<3;) {\n\t\t\tt3 = h + 1 / 3 * - (i - 1);\n\t\t\tt3 < 0 ? t3++ : t3 > 1 && t3--;\n\t\t\tval = 6 * t3 < 1 ? t1 + (t2 - t1) * 6 * t3 :\n\t\t\t2 * t3 < 1 ? t2 :\n\t\t\t3 * t3 < 2 ? t1 + (t2 - t1) * (2 / 3 - t3) * 6 :\n\t\t\tt1;\n\t\t\trgb[i++] = val * 255;\n\t\t}\n\n\t\treturn rgb;\n\t}\n};\n\n\n//extend rgb\nrgb.hsl = function(rgb) {\n\tvar r = rgb[0]/255,\n\t\t\tg = rgb[1]/255,\n\t\t\tb = rgb[2]/255,\n\t\t\tmin = Math.min(r, g, b),\n\t\t\tmax = Math.max(r, g, b),\n\t\t\tdelta = max - min,\n\t\t\th, s, l;\n\n\tif (max === min) {\n\t\th = 0;\n\t}\n\telse if (r === max) {\n\t\th = (g - b) / delta;\n\t}\n\telse if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t}\n\telse if (b === max) {\n\t\th = 4 + (r - g)/ delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tl = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t}\n\telse if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t}\n\telse {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n","/**\n * CIE XYZ\n *\n * @module color-space/xyz\n */\nimport rgb from './rgb.js';\n\nvar xyz = {\n\tname: 'xyz',\n\tmin: [0,0,0],\n\tchannel: ['X','Y','Z'],\n\talias: ['XYZ', 'ciexyz', 'cie1931']\n};\n\n\n/**\n * Whitepoint reference values with observer/illuminant\n *\n * http://en.wikipedia.org/wiki/Standard_illuminant\n */\nxyz.whitepoint = {\n\t//1931 2°\n\t2: {\n\t\t//incadescent\n\t\tA:[109.85, 100, 35.585],\n\t\t// B:[],\n\t\tC: [98.074, 100, 118.232],\n\t\tD50: [96.422, 100, 82.521],\n\t\tD55: [95.682, 100, 92.149],\n\t\t//daylight\n\t\tD65: [95.045592705167, 100, 108.9057750759878],\n\t\tD75: [94.972, 100, 122.638],\n\t\t//flourescent\n\t\t// F1: [],\n\t\tF2: [99.187, 100, 67.395],\n\t\t// F3: [],\n\t\t// F4: [],\n\t\t// F5: [],\n\t\t// F6:[],\n\t\tF7: [95.044, 100, 108.755],\n\t\t// F8: [],\n\t\t// F9: [],\n\t\t// F10: [],\n\t\tF11: [100.966, 100, 64.370],\n\t\t// F12: [],\n\t\tE: [100,100,100]\n\t},\n\n\t//1964 10°\n\t10: {\n\t\t//incadescent\n\t\tA:[111.144, 100, 35.200],\n\t\tC: [97.285, 100, 116.145],\n\t\tD50: [96.720, 100, 81.427],\n\t\tD55: [95.799, 100, 90.926],\n\t\t//daylight\n\t\tD65: [94.811, 100, 107.304],\n\t\tD75: [94.416, 100, 120.641],\n\t\t//flourescent\n\t\tF2: [103.280, 100, 69.026],\n\t\tF7: [95.792, 100, 107.687],\n\t\tF11: [103.866, 100, 65.627],\n\t\tE: [100,100,100]\n\t}\n};\n\n\n/**\n * Top values are the whitepoint’s top values, default are D65\n */\nxyz.max = xyz.whitepoint[2].D65;\n\n\n/**\n * Transform xyz to rgb\n *\n * @param {Array} xyz Array of xyz values\n *\n * @return {Array} RGB values\n */\nxyz.rgb = function (_xyz, white) {\n\t//FIXME: make sure we have to divide like this. Probably we have to replace matrix as well then\n\twhite = white || xyz.whitepoint[2].E;\n\n\tvar x = _xyz[0] / white[0],\n\t\ty = _xyz[1] / white[1],\n\t\tz = _xyz[2] / white[2],\n\t\tr, g, b;\n\n\t// assume sRGB\n\t// http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html\n\tr = (x * 3.240969941904521) + (y * -1.537383177570093) + (z * -0.498610760293);\n\tg = (x * -0.96924363628087) + (y * 1.87596750150772) + (z * 0.041555057407175);\n\tb = (x * 0.055630079696993) + (y * -0.20397695888897) + (z * 1.056971514242878);\n\n\tr = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n\t\t: r = (r * 12.92);\n\n\tg = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n\t\t: g = (g * 12.92);\n\n\tb = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n\t\t: b = (b * 12.92);\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n}\n\n\n\n/**\n * RGB to XYZ\n *\n * @param {Array} rgb RGB channels\n *\n * @return {Array} XYZ channels\n */\nrgb.xyz = function(rgb, white) {\n\tvar r = rgb[0] / 255,\n\t\t\tg = rgb[1] / 255,\n\t\t\tb = rgb[2] / 255;\n\n\t// assume sRGB\n\tr = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n\tvar x = (r * 0.41239079926595) + (g * 0.35758433938387) + (b * 0.18048078840183);\n\tvar y = (r * 0.21263900587151) + (g * 0.71516867876775) + (b * 0.072192315360733);\n\tvar z = (r * 0.019330818715591) + (g * 0.11919477979462) + (b * 0.95053215224966);\n\n\twhite = white || xyz.whitepoint[2].E;\n\n\treturn [x * white[0], y * white[1], z * white[2]];\n};\n\n\n\nexport default xyz;\n","/**\n * CIE LAB space model\n *\n * @module color-space/lab\n */\n\nimport xyz from './xyz.js';\n\nexport default {\n\tname: 'lab',\n\tmin: [0,-100,-100],\n\tmax: [100,100,100],\n\tchannel: ['lightness', 'a', 'b'],\n\talias: ['LAB', 'cielab'],\n\n\txyz: function(lab) {\n\t\tvar l = lab[0],\n\t\t\t\ta = lab[1],\n\t\t\t\tb = lab[2],\n\t\t\t\tx, y, z, y2;\n\n\t\tif (l <= 8) {\n\t\t\ty = (l * 100) / 903.3;\n\t\t\ty2 = (7.787 * (y / 100)) + (16 / 116);\n\t\t} else {\n\t\t\ty = 100 * Math.pow((l + 16) / 116, 3);\n\t\t\ty2 = Math.pow(y / 100, 1/3);\n\t\t}\n\n\t\tx = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3);\n\n\t\tz = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3);\n\n\t\treturn [x, y, z];\n\t}\n};\n\n\n//extend xyz\nxyz.lab = function(xyz){\n\tvar x = xyz[0],\n\t\t\ty = xyz[1],\n\t\t\tz = xyz[2],\n\t\t\tl, a, b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n","import rgb from 'color-space/rgb.js';\nimport xyz from 'color-space/xyz.js';\nimport lab from 'color-space/lab.js';\n\nfunction _filled_array(fillWith, count) {\n const array = [];\n for (let i = 0; i < count; i++) {\n array.push(fillWith);\n }\n return array;\n}\nfunction euclidean_distance_squared_index(a, a_start, b) {\n const r = a[a_start++] - b[0];\n const g = a[a_start++] - b[1];\n const _b = a[a_start++] - b[2];\n return r ** 2 + g ** 2 + _b ** 2;\n}\nfunction kmeans(data, k, maxAttempt, thresold = 2, clipAlpha = false) {\n const cluster_sum = [];\n const thresold_squared = thresold ** 2;\n let pixelCount = data.length / 4;\n let cluster_centers = [];\n let new_cluster_centers = [];\n let iteration = 0;\n const isDataTypedArray = data instanceof Uint8ClampedArray;\n const PIXEL_LEN = clipAlpha ? 3 : 4;\n if (clipAlpha) {\n let j = 0;\n const dataNoAlpha = isDataTypedArray ? new Uint8ClampedArray(pixelCount * 3) : [];\n for (let i = 0; i < data.length; ) {\n if (data[i + 3] == 0) {\n i += 4;\n continue;\n }\n dataNoAlpha[j++] = data[i++];\n dataNoAlpha[j++] = data[i++];\n dataNoAlpha[j++] = data[i++];\n i++;\n }\n data = dataNoAlpha.slice(0, j);\n pixelCount = j / 3;\n }\n for (let i = 0; i < k; i++) {\n const start = Math.floor(1 * (pixelCount - 1)) * PIXEL_LEN;\n cluster_centers.push(\n /* Array.from */\n data.slice(start, start + 3)\n );\n new_cluster_centers.push(isDataTypedArray ? new Uint8ClampedArray(3) : _filled_array(0, 3));\n cluster_sum.push(_filled_array(0, 4));\n }\n while (iteration < maxAttempt) {\n for (let i = 0; i < data.length; ) {\n let cluster_index = 0;\n let _min_distance = euclidean_distance_squared_index(data, i, cluster_centers[0]);\n for (let j = 1; j < k; j++) {\n const distance = euclidean_distance_squared_index(data, i, cluster_centers[j]);\n if (distance < _min_distance) {\n _min_distance = distance;\n cluster_index = j;\n }\n }\n const sum = cluster_sum[cluster_index];\n sum[0] += data[i++];\n sum[1] += data[i++];\n sum[2] += data[i++];\n sum[3]++;\n if (PIXEL_LEN === 4) i++;\n }\n let allStabled = true;\n for (let i = 0; i < k; i++) {\n const rgbc = cluster_sum[i];\n const count = rgbc[3];\n if (count == 0) {\n const start = Math.floor(Math.random() * (pixelCount - 1)) * PIXEL_LEN;\n new_cluster_centers[i] = /* Array.from */\n data.slice(start, start + 3);\n allStabled = false;\n } else {\n let new_center = new_cluster_centers[i];\n let diffSquared = 0;\n for (let j = 0; j < 3; j++) {\n new_center[j] = rgbc[j] / count;\n diffSquared += (new_center[j] - cluster_centers[i][j]) ** 2;\n }\n if (diffSquared > thresold_squared) {\n allStabled = false;\n }\n }\n }\n if (allStabled) {\n return {\n centroid: new_cluster_centers,\n iteration,\n fit: true,\n label: cluster_sum.map((v) => v[3]),\n size: pixelCount\n };\n }\n const medium = cluster_centers;\n cluster_centers = new_cluster_centers;\n new_cluster_centers = medium;\n iteration++;\n for (let i = 0; i < k; i++) {\n cluster_sum[i].fill(0);\n }\n }\n return {\n centroid: cluster_centers,\n iteration,\n fit: false,\n label: cluster_sum.map((v) => v[3]),\n size: pixelCount\n };\n}\n\n/**\n * NeuQuant Neural-Network Quantization Algorithm\n *\n * Copyright (c) 1994 Anthony Dekker\n *\n * See \"Kohonen neural networks for optimal colour quantization\" in \"Network:\n * Computation in Neural Systems\" Vol. 5 (1994) pp 351-367. for a discussion of\n * the algorithm.\n *\n * See also http://members.ozemail.com.au/~dekker/NEUQUANT.HTML\n *\n * Any party obtaining a copy of these files from the author, directly or\n * indirectly, is granted, free of charge, a full and unrestricted irrevocable,\n * world-wide, paid up, royalty-free, nonexclusive right and license to deal in\n * this software and documentation files (the \"Software\"), including without\n * limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons who\n * receive copies from any such party to do so, with the only requirement being\n * that this copyright notice remain intact.\n *\n * Copyright (c) 2012 Johan Nordberg (JavaScript port)\n * Copyright (c) 2014 Devon Govett (JavaScript port)\n */\n\nconst prime1 = 499;\nconst prime2 = 491;\nconst prime3 = 487;\nconst prime4 = 503;\n\nconst maxprime = Math.max(prime1, prime2, prime3, prime4);\nconst minpicturebytes = (3 * maxprime);\n\nconst defaults = {\n ncycles: 100,\n netsize: 256,\n samplefac: 10\n};\n\nconst assign = function (target) {\n for (let i = 1, l = arguments.length; i < l; i++) {\n const nextSource = arguments[i];\n if (nextSource != null) {\n for (const nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n target[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return target\n};\n\nclass NeuQuant {\n constructor (pixels, options) {\n assign(this, defaults, {pixels}, options);\n\n if (this.netsize < 4 || this.netsize > 256) {\n throw new Error('Color count must be between 4 and 256')\n }\n\n if (this.samplefac < 1 || this.samplefac > 30) {\n throw new Error('Sampling factor must be between 1 and 30')\n }\n\n this.maxnetpos = this.netsize - 1;\n\n this.netbiasshift = 4;\n this.intbiasshift = 16;\n this.intbias = (1 << this.intbiasshift);\n this.gammashift = 10;\n this.gamma = (1 << this.gammashift);\n this.betashift = 10;\n this.beta = (this.intbias >> this.betashift);\n this.betagamma = (this.beta * this.gamma);\n\n this.initrad = (this.netsize >> 3);\n this.radiusbiasshift = 6;\n this.radiusbias = (1 << this.radiusbiasshift);\n this.initradius = (this.initrad * this.radiusbias);\n this.radiusdec = 30;\n\n this.alphabiasshift = 10;\n this.initalpha = (1 << this.alphabiasshift);\n\n this.radbiasshift = 8;\n this.radbias = (1 << this.radbiasshift);\n this.alpharadbshift = (this.alphabiasshift + this.radbiasshift);\n this.alpharadbias = (1 << this.alpharadbshift);\n\n this.network = [];\n this.netindex = new Uint32Array(256);\n this.bias = new Uint32Array(this.netsize);\n this.freq = new Uint32Array(this.netsize);\n this.radpower = new Uint32Array(this.netsize >> 3);\n\n for (let i = 0, l = this.netsize; i < l; i++) {\n let v = (i << (this.netbiasshift + 8)) / this.netsize;\n this.network[i] = new Float64Array([v, v, v, 0]);\n this.freq[i] = this.intbias / this.netsize;\n this.bias[i] = 0;\n }\n }\n\n unbiasnet () {\n for (let i = 0, l = this.netsize; i < l; i++) {\n this.network[i][0] >>= this.netbiasshift;\n this.network[i][1] >>= this.netbiasshift;\n this.network[i][2] >>= this.netbiasshift;\n this.network[i][3] = i;\n }\n }\n\n altersingle (alpha, i, b, g, r) {\n this.network[i][0] -= (alpha * (this.network[i][0] - b)) / this.initalpha;\n this.network[i][1] -= (alpha * (this.network[i][1] - g)) / this.initalpha;\n this.network[i][2] -= (alpha * (this.network[i][2] - r)) / this.initalpha;\n }\n\n alterneigh (radius, i, b, g, r) {\n const lo = Math.abs(i - radius);\n const hi = Math.min(i + radius, this.netsize);\n\n let j = i + 1;\n let k = i - 1;\n let m = 1;\n\n while ((j < hi) || (k > lo)) {\n const a = this.radpower[m++];\n\n if (j < hi) {\n const p = this.network[j++];\n p[0] -= (a * (p[0] - b)) / this.alpharadbias;\n p[1] -= (a * (p[1] - g)) / this.alpharadbias;\n p[2] -= (a * (p[2] - r)) / this.alpharadbias;\n }\n\n if (k > lo) {\n const p = this.network[k--];\n p[0] -= (a * (p[0] - b)) / this.alpharadbias;\n p[1] -= (a * (p[1] - g)) / this.alpharadbias;\n p[2] -= (a * (p[2] - r)) / this.alpharadbias;\n }\n }\n }\n\n contest (b, g, r) {\n let bestd = ~(1 << 31);\n let bestbiasd = bestd;\n let bestpos = -1;\n let bestbiaspos = bestpos;\n\n for (let i = 0, l = this.netsize; i < l; i++) {\n let n = this.network[i];\n\n let dist = Math.abs(n[0] - b) + Math.abs(n[1] - g) + Math.abs(n[2] - r);\n if (dist < bestd) {\n bestd = dist;\n bestpos = i;\n }\n\n let biasdist = dist - ((this.bias[i]) >> (this.intbiasshift - this.netbiasshift));\n if (biasdist < bestbiasd) {\n bestbiasd = biasdist;\n bestbiaspos = i;\n }\n\n let betafreq = (this.freq[i] >> this.betashift);\n this.freq[i] -= betafreq;\n this.bias[i] += (betafreq << this.gammashift);\n }\n\n this.freq[bestpos] += this.beta;\n this.bias[bestpos] -= this.betagamma;\n\n return bestbiaspos\n }\n\n inxbuild () {\n let previouscol = 0;\n let startpos = 0;\n\n for (let i = 0, l = this.netsize; i < l; i++) {\n let p = this.network[i];\n let q = null;\n let smallpos = i;\n let smallval = p[1];\n\n for (let j = i + 1; j < l; j++) {\n q = this.network[j];\n if (q[1] < smallval) {\n smallpos = j;\n smallval = q[1];\n }\n }\n q = this.network[smallpos];\n\n if (i !== smallpos) {\n [p[0], q[0]] = [q[0], p[0]];\n [p[1], q[1]] = [q[1], p[1]];\n [p[2], q[2]] = [q[2], p[2]];\n [p[3], q[3]] = [q[3], p[3]];\n }\n\n if (smallval !== previouscol) {\n this.netindex[previouscol] = (startpos + i) >> 1;\n for (let j = previouscol + 1; j < smallval; j++) {\n this.netindex[j] = i;\n }\n previouscol = smallval;\n startpos = i;\n }\n }\n\n this.netindex[previouscol] = (startpos + this.maxnetpos) >> 1;\n for (let i = previouscol + 1; i < 256; i++) {\n this.netindex[i] = this.maxnetpos;\n }\n }\n\n learn () {\n const lengthcount = this.pixels.length;\n const alphadec = 30 + ((this.samplefac - 1) / 3);\n const samplepixels = lengthcount / (3 * this.samplefac);\n\n let delta = samplepixels / this.ncycles | 0;\n let alpha = this.initalpha;\n let radius = this.initradius;\n\n let rad = radius >> this.radiusbiasshift;\n\n if (rad <= 1) {\n rad = 0;\n }\n\n for (let i = 0; i < rad; i++) {\n this.radpower[i] = alpha * (((rad * rad - i * i) * this.radbias) / (rad * rad));\n }\n\n let step;\n if (lengthcount < minpicturebytes) {\n this.samplefac = 1;\n step = 3;\n } else if ((lengthcount % prime1) !== 0) {\n step = 3 * prime1;\n } else if ((lengthcount % prime2) !== 0) {\n step = 3 * prime2;\n } else if ((lengthcount % prime3) !== 0) {\n step = 3 * prime3;\n } else {\n step = 3 * prime4;\n }\n\n let pix = 0;\n\n for (let i = 0; i < samplepixels;) {\n let b = (this.pixels[pix] & 0xff) << this.netbiasshift;\n let g = (this.pixels[pix + 1] & 0xff) << this.netbiasshift;\n let r = (this.pixels[pix + 2] & 0xff) << this.netbiasshift;\n\n let j = this.contest(b, g, r);\n this.altersingle(alpha, j, b, g, r);\n if (rad !== 0) {\n this.alterneigh(rad, j, b, g, r);\n }\n\n pix += step;\n if (pix >= lengthcount) {\n pix -= lengthcount;\n }\n\n if (delta === 0) {\n delta = 1;\n }\n\n if (++i % delta === 0) {\n alpha -= alpha / alphadec;\n radius -= radius / this.radiusdec;\n rad = radius >> this.radiusbiasshift;\n\n if (rad <= 1) {\n rad = 0;\n }\n\n for (let k = 0; k < rad; k++) {\n this.radpower[k] = alpha * (((rad * rad - k * k) * this.radbias) / (rad * rad));\n }\n }\n }\n }\n\n buildColorMap () {\n this.learn();\n this.unbiasnet();\n this.inxbuild();\n }\n\n getColorMap () {\n const map = new Uint8Array(this.netsize * 3);\n const index = new Uint8Array(this.netsize);\n\n for (let i = 0, l = this.netsize; i < l; i++) {\n index[this.network[i][3]] = i;\n }\n\n for (let i = 0, j = 0, k = 0, l = this.netsize; i < l; i++) {\n k = index[i];\n map[j++] = this.network[k][0] & 0xff;\n map[j++] = this.network[k][1] & 0xff;\n map[j++] = this.network[k][2] & 0xff;\n }\n\n return map\n }\n}\n\nfunction findClosest (palette, r, g, b) {\n let minpos = 0;\n let mind = 256 * 256 * 256;\n\n for (let i = 0, l = palette.length; i < l;) {\n const dr = r - palette[i++];\n const dg = g - palette[i++];\n const db = b - palette[i];\n const d = dr * dr + dg * dg + db * db;\n const pos = i / 3 | 0;\n\n if (d < mind) {\n mind = d;\n minpos = pos;\n }\n\n i++;\n }\n\n return minpos\n}\n\nfunction palette (pixels, options) {\n const nq = new NeuQuant(pixels, options);\n nq.buildColorMap();\n return nq.getColorMap()\n}\n\nfunction indexed (pixels, palette) {\n const indexed = new Uint8Array(pixels.length / 3);\n const memo = {};\n\n for (let i = 0, j = 0, l = pixels.length; i < l;) {\n const r = pixels[i++];\n const g = pixels[i++];\n const b = pixels[i++];\n const k = r << 16 | g << 8 | b;\n\n if (k in memo) {\n indexed[j++] = memo[k];\n } else {\n indexed[j++] = memo[k] = findClosest(palette, r, g, b);\n }\n }\n\n return indexed\n}\n\nfunction rgba2Rgb(data) {\n const rgb = new Uint8ClampedArray(data.length / 4 * 3);\n const len = data.length;\n let rgb_i = 0;\n for (let i = 0; i < len; ) {\n for (let j = 0; j < 3; j++) {\n rgb[rgb_i++] = data[i++];\n }\n i++;\n }\n return rgb;\n}\nfunction neuquant(img, k, samplefac = 1) {\n const img_rgb = rgba2Rgb(img);\n const palette$1 = palette(img_rgb, { netsize: k, samplefac });\n const indexed_pixel = indexed(img_rgb, palette$1);\n const pixel = [];\n const len = palette$1.length;\n for (let i = 0; i < len; ) {\n pixel.push([palette$1[i++], palette$1[i++], palette$1[i++], 255]);\n }\n return { centroid: pixel, label: count(k, indexed_pixel) };\n}\nfunction count(k, index) {\n const counts = new Array(k).fill(0);\n for (const i of index) {\n counts[i]++;\n }\n return counts;\n}\n\nfunction _prepare2DContext(width, height) {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n canvas.height = height;\n canvas.width = width;\n return ctx;\n}\nfunction _prepare2DContextAsync(width, height) {\n const canvas = new OffscreenCanvas(width, height);\n const ctx = canvas.getContext(\"2d\");\n return ctx;\n}\nfunction awaitImage(imgElement) {\n return new Promise((resolve, reject) => {\n if (imgElement.complete) {\n resolve();\n } else {\n imgElement.addEventListener(\"load\", (e) => {\n resolve(e);\n });\n imgElement.addEventListener(\"error\", (reason) => {\n reject(reason);\n });\n }\n });\n}\nfunction _readImage(prepareCtx, imgSource) {\n const { naturalWidth, naturalHeight } = imgSource;\n const ctx = prepareCtx(naturalWidth, naturalHeight);\n ctx.drawImage(imgSource, 0, 0, naturalWidth, naturalHeight);\n return ctx.getImageData(0, 0, naturalWidth, naturalHeight);\n}\nconst readImage = _readImage.bind(void 0, _prepare2DContext);\nconst readImageOffscreen = _readImage.bind(void 0, _prepare2DContextAsync);\nfunction _readImageDownsampling(prepareCtx, imgSource, maxSample) {\n let { naturalWidth: width, naturalHeight: height } = imgSource;\n const scale = width * height / maxSample;\n if (scale > 1) {\n const scaleSqrt = Math.sqrt(scale);\n width = width / scaleSqrt | 0;\n height = height / scaleSqrt | 0;\n }\n const ctx = prepareCtx(width, height);\n ctx.drawImage(imgSource, 0, 0, width, height);\n return ctx.getImageData(0, 0, width, height);\n}\nconst readImageDownsampling = _readImageDownsampling.bind(void 0, _prepare2DContext);\nconst readImageDownsamplingOffscreen = _readImageDownsampling.bind(void 0, _prepare2DContextAsync);\n\nfunction convertToLab(source) {\n const array = [];\n for (let i = 0; i < source.length; i += 4) {\n const pixel = source.slice(i, i + 4);\n const alpha = pixel[3];\n const pixel_rgb = pixel.slice(0, 3);\n const pixel_xyz = rgb.xyz(pixel_rgb);\n const pixel_lab = xyz.lab(pixel_xyz);\n array.push(...pixel_lab, alpha);\n }\n return array;\n}\nfunction labaToRGBA(laba) {\n const pixel_lab = laba.slice(0, 3);\n const alpha = laba[3];\n const pixel_xyz = lab.xyz(pixel_lab);\n const pixel_rgb = xyz.rgb(pixel_xyz);\n pixel_rgb.push(alpha);\n return pixel_rgb;\n}\n\nfunction max_min_of_three([a, b, c]) {\n if (a > b) {\n if (b > c) {\n return [a, c];\n } else {\n if (a > c) {\n return [a, b];\n } else {\n return [c, b];\n }\n }\n } else {\n if (b > c) {\n if (c > a) {\n return [b, a];\n } else {\n return [b, c];\n }\n } else {\n return [c, a];\n }\n }\n}\n\nfunction normalizeRGBA(rgba) {\n return rgba.map((v) => v / 255);\n}\nfunction rgbaToHSLA(rgba) {\n let h, s;\n const [max, min] = max_min_of_three(rgba);\n const diff = max - min;\n const light_2x = max + min;\n if (diff == 0) {\n h = 0;\n s = 0;\n } else {\n if (max == rgba[0]) {\n const temp_h = 60 * (rgba[1] - rgba[2]) / diff;\n if (temp_h < 0) {\n h = temp_h + 360;\n } else {\n h = temp_h;\n }\n } else if (max == rgba[1]) {\n h = 60 * (rgba[2] - rgba[0]) / diff + 120;\n } else {\n h = 60 * (rgba[0] - rgba[1]) / diff + 240;\n }\n if (light_2x == 0) {\n s = 0;\n } else if (light_2x <= 1) {\n s = diff / light_2x;\n } else {\n s = diff / (2 - light_2x);\n }\n }\n return [h, s, light_2x / 2, rgba[3]];\n}\nconst getVector4Comparer = (sort = [0, 1, 2, 3]) => (a, b) => {\n let result;\n for (const s of sort) {\n result = a[s] - b[s];\n if (result != 0) {\n return result;\n }\n }\n return result;\n};\nconst hslaCSSText = ([h, s, l, a]) => `hsla(${h}deg,${s * 100}%,${l * 100}%,${a})`;\nconst rgbaCSSText = (pixel) => `rgba(${pixel.map((v) => Math.floor(v)).join(\",\")})`;\n\nexport { awaitImage, convertToLab, getVector4Comparer, hslaCSSText, kmeans, labaToRGBA, neuquant, normalizeRGBA, readImage, readImageDownsampling, readImageDownsamplingOffscreen, readImageOffscreen, rgbaCSSText, rgbaToHSLA };\n","import PromiseWorker from '@kotorik/promise-worker';\nimport { isInDarkMode } from '../darkmode';\n//@ts-ignore\nimport 'color-space/hsl';\n//@ts-ignore\nimport rgb from 'color-space/rgb';\nimport { awaitImage, readImageDownsampling } from '@kotorik/palette';\nconst originalThemeSkinMatcing = getComputedStyle(document.documentElement).getPropertyValue('--theme-skin-matching');\nconst worker = new PromiseWorker(new Worker(new URL('./worker.ts', import.meta.url)));\nlet currentColor = [0, 0, 0, 0];\nfunction hslaCSSText([h, s, l, a]) {\n if (a) {\n return \"hsla(\" + h + \"deg,\" + s + \"%,\" + l + \"%,\" + a + \")\";\n }\n else {\n return \"hsl(\" + h + \"deg,\" + s + \"%,\" + l + \"%)\";\n }\n}\nexport async function getThemeColorFromImageElement(imgElement) {\n try {\n await awaitImage(imgElement);\n const imageData = readImageDownsampling(imgElement, 10000);\n const result = await worker.postMessage(imageData.data, { transfer: [imageData.data.buffer] });\n return result;\n }\n catch (e) {\n console.error(e);\n return null;\n }\n}\nfunction _updateThemeColorMeta(color_css) {\n const meta = document.querySelector('meta[name=theme-color]');\n meta && (meta.content = color_css);\n}\nexport async function updateThemeSkin(coverBGUrl) {\n const imgElement = document.createElement('img');\n imgElement.src = coverBGUrl;\n imgElement.crossOrigin = \"anonymous\";\n const rgba = await getThemeColorFromImageElement(imgElement);\n if (rgba) {\n currentColor = rgba;\n _setColor();\n }\n else {\n _updateThemeColorMeta(originalThemeSkinMatcing); //回滚\n }\n}\nfunction _setColor(darkmode) {\n let hsla = rgb.hsl(currentColor);\n const darkmodeColor = [...hsla];\n darkmodeColor[2] *= 0.5;\n if (typeof darkmode == 'undefined' ? isInDarkMode() : darkmode) {\n hsla = darkmodeColor;\n }\n _updateThemeColorMeta(hslaCSSText(hsla));\n if (_iro.extract_theme_skin) {\n document.documentElement.style.setProperty('--theme-skin-matching', hslaCSSText(hsla));\n document.documentElement.style.setProperty('--theme-skin-dark', hslaCSSText(darkmodeColor));\n }\n /* const textColor = [0, 0, 0] as [number, number, number]\n \n if (hsla[2] > 40) {\n textColor[2] = 0.314\n } else {\n textColor[2] = 1 - 0.314\n }\n \n const style = document.documentElement.style\n const [h, s, l] = hsla\n style.setProperty('--header-color-h', h + 'deg')\n style.setProperty('--header-color-s', s + '%')\n style.setProperty('--header-color-l', l + '%')\n \n const siteHeader = document.querySelector256)throw new Error("Color count must be between 4 and 256");if(this.samplefac<1||this.samplefac>30)throw new Error("Sampling factor must be between 1 and 30");this.maxnetpos=this.netsize-1,this.netbiasshift=4,this.intbiasshift=16,this.intbias=1<
")+"
"+t.replace(/\r\n/g,"
"),o=s.join("\n")+"\n\n"+t.toString().replace(/\r\n/g,"\n");if(e.clipboardData)e.clipboardData.setData("text/html",n),e.clipboardData.setData("text/plain",o);else if(window.clipboardData)window.clipboardData.setData("text",o)}(e,n),(0,o.I)((0,r.__)("复制成功!"),1e3))}}function a(){_iro.clipboardCopyright&&(document.body.removeEventListener("copy",i),document.body.addEventListener("copy",i))}},4895:(e,t,n)=>{n.d(t,{vI:()=>p,LN:()=>w,t9:()=>v,LY:()=>h,rZ:()=>f});n(9261),n(3700),n(3632),n(1531),n(3678),n(4145);function o(e){return new Promise(((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)}))}function r(e,t){const n=indexedDB.open(e);n.onupgradeneeded=()=>n.result.createObjectStore(t);const r=o(n);return(e,n)=>r.then((o=>n(o.transaction(t,e).objectStore(t))))}const s=r("sakurairo","cache");var i=n(7721),a=n(4351),c=n(2818),l=n(7925),d=n(7156);let u=1,m="";async function h(){p(await w(!0)),u++}async function f(){u--,p(await w(!0))}const g=document.querySelector(".centerbg"),p=_iro.site_bg_as_cover?e=>{document.body.style.backgroundImage=`url(${e})`,document.dispatchEvent(new CustomEvent("coverBG_change",{detail:e}))}:g?e=>{g.style.backgroundImage=`url(${e})`,document.dispatchEvent(new CustomEvent("coverBG_change",{detail:e}))}:d.lQ;function y(e){const t=e?.match(/^url\("(.+)"\)$/);if(t)return t[1]}const v=_iro.site_bg_as_cover?()=>y(document.body.style.backgroundImage):g?()=>y(g.style.backgroundImage):d.lQ;function b(e=!1){const t=new URL(_iro.cover_api);return(0,c.F)()&&1==_iro.random_graphs_mts?(t.searchParams.set("type","mobile"),t.toString()+(e?"&"+u:"")):t.toString()+(e?(""===t.search?"?":"&")+u:"")}const w=_iro.cache_cover?(e=!1)=>{return(t="cover",s("readonly",(e=>o(e.get(t))))).then((t=>t&&t instanceof ArrayBuffer?(URL.revokeObjectURL(m),m="",m=URL.createObjectURL(new Blob([t])),m):b(e))).finally((()=>{!async function(e=!1){try{const t=await fetch(b(e),{headers:{Accept:i.t}});if(500==t.status){const e=await t.json();(0,l.I)(e.message),console.warn(e.message)}else if(t.ok){const e=await t.arrayBuffer();try{((e,t)=>{s("readwrite",(n=>(n.put(t,e),o(n.transaction))))})("cover",e)}catch(e){console.warn(e)}}}catch(e){e instanceof TypeError&&(console.warn((0,a.__)("你的封面API好像不支持跨域调用,这种情况下缓存是不会生效的哦")),(e=>{s("readwrite",(t=>(t.delete(e),o(t.transaction))))})("cover"))}}(e)}));var t}:b},9655:(e,t,n)=>{n.d(t,{ig:()=>m,jJ:()=>s,uO:()=>l,yi:()=>d});const o=window.matchMedia("(prefers-color-scheme:dark)");let r=!1;const s=()=>r;function i(e){e!==r&&(document.dispatchEvent(new CustomEvent("darkmode",{detail:e})),r=e)}function a(){localStorage.getItem("dark")||(o.matches&&_iro.darkmode?l():d())}function c(e){e==u()?localStorage.removeItem("dark"):1==e?localStorage.setItem("dark","1"):localStorage.setItem("dark","0")}function l(e){document.documentElement.style.backgroundColor="#333",document.getElementsByClassName("site-content")[0].style.backgroundColor="#333",document.body.classList.add("dark"),e&&c(!0),i(!0)}function d(e){document.documentElement.style.backgroundColor="",document.getElementsByClassName("site-content")[0].style.backgroundColor="rgba(255, 255, 255, .8)",document.body.classList.remove("dark"),document.body.classList.remove("dynamic"),i(!1),e&&c(!1)}function u(){switch(_iro.dm_strategy){case"client":return o.matches;case"eien":return!0;default:return function(){const e=new Date;return e.getHours()>21||e.getHours()<7}()}}function m(){const e=localStorage.getItem("dark");e?"1"==e?l():d():u()&&_iro.darkmode?l():d()}"client"===_iro.dm_strategy&&(o.removeEventListener?o.removeEventListener("change",a):o.removeListener(a),o.addEventListener?o.addEventListener("change",a):o.addListener(a))},8195:(e,t,n)=>{n.d(t,{J:()=>u,S:()=>l});var o=n(7925),r=n(4351),s=n(2818);let i,a;function c(e){return()=>{const{name:t}=e.dataset;t!=localStorage.getItem("font_family")&&("serif"==t?((0,s.F)()&&(0,o.I)((0,r.__)("将从网络加载字体,流量请注意")),document.body.classList.add("serif"),localStorage.setItem("font_family","serif"),d("serif")):(document.body.classList.remove("serif"),localStorage.setItem("font_family","sans-serif"),d("sans-serif")))}}function l(){const e=localStorage.getItem("font_family");e&&"serif"!=e||document.body.classList.add("serif")}function d(e){"sans-serif"===e||"sans-serif"==localStorage.getItem("font_family")?(i.classList.remove("selected"),a.classList.add("selected")):(a.classList.remove("selected"),i.classList.add("selected"))}function u(){const e=(i=document.getElementsByClassName("control-btn-serif")[0],a=document.getElementsByClassName("control-btn-sans-serif")[0],a&&i);e||localStorage.removeItem("font_family"),l(),e&&(d(),i.addEventListener("click",c(i)),a.addEventListener("click",c(a)))}},9509:(e,t,n)=>{async function o(){const e=document.getElementById("footer_yiyan");if(e){const t=_iro.yiyan_api||["https://api.maho.cc/yiyan/"];0==t.length&&console.warn("一言API: 路径为空");for(const n of t)try{const t=await r(n);e.innerText=t;break}catch(e){console.warn(`一言API: 尝试联系"${n}"时出错。 `,e);continue}}}n.d(t,{A:()=>o});const r=async e=>{const t=await fetch(e,{headers:{Accept:"application/json"}});if(t.ok){const e=await t.json(),n=("null"==e.from_who?null:e.from_who)||"",o=e.from!=e.from_who?`「${e.from}」`:"";return e.hitokoto+"——"+n+o}throw t.status}},2818:(e,t,n)=>{n.d(t,{F:()=>i,P:()=>r});let o=!1;function r(){const e=window.matchMedia("(max-width:860px)");o=e.matches,e.addEventListener?e.addEventListener("change",s):e.addListener(s)}function s(e){o=e.matches}const i=()=>o},2036:(e,t,n)=>{function o(){for(const e of document.querySelectorAll(".showcard")){const t=e.querySelector(".img"),n=e.querySelector(".showcard-button");if(!t||!n)throw new Error("invalid structure for .showcard");t.addEventListener("mouseover",(function(){n.classList.add("hover")})),t.addEventListener("mouseout",(function(){n.classList.remove("hover")}))}}n.d(t,{A:()=>o})},7894:(e,t,n)=>{n.d(t,{A:()=>i,o:()=>s});var o=n(6564);let r;function s(){r&&(r.destroy(),r=null)}async function i(){const e=document.getElementById("typed-js-initial");if(e){s();try{const t=JSON.parse(e.innerHTML),s=document.querySelector(".element");if(s.innerText="",_iro.ext_shared_lib)window.Typed||await(0,o.J)("dist/typed.umd.js","typed.js"),r=new window.Typed(s,t);else{const{default:e}=await n.e(7186).then(n.bind(n,7186));r=new e(s,t)}}catch(e){console.error("请检查typed.js设置",e)}}}},9257:(e,t,n)=>{n.d(t,{Br:()=>y,PW:()=>p,Zg:()=>f,lJ:()=>g});n(1531),n(3678),n(4145);var o=n(7156),r=n(4351),s=n(6564);const i=document.getElementById("bgvideo"),a=_iro.movies.name?.split(",")||[];let c=new Array(a.length).fill(0).map(((e,t)=>t)),l=[];const d=()=>{0==c.length&&(c=new Array(a.length).fill(0).map(((e,t)=>t)));const e=Math.floor(Math.random()*c.length);return a[c.splice(e,1)[0]]};function u(){const e=document.getElementsByClassName("video-stu")[0],t=d();e.innerHTML=(0,r.__)("正在载入视频 ..."),e.style.bottom="0px",i.setAttribute("src",new URL(t,_iro.movies.url||location.origin).toString()),i.setAttribute("video-name",(0,o.J)(t))}function m(){const e=document.getElementById("video-btn");e&&(e.classList.add("video-pause"),e.classList.remove("video-play"),e.style.display="");try{if(document.querySelector(".video-stu").style.bottom="-100px",document.querySelector(".focusinfo").style.top="-999px",_iro.float_player_on)return void Promise.all([n.e(8619),n.e(2563)]).then(n.bind(n,4052)).then((({pauseAllPlayer:e})=>{l=e(),i.play()}))}catch(e){console.warn(e)}i.play()}function h(){const e=document.getElementById("video-btn");e&&(e.classList.add("video-play"),e.classList.remove("video-pause"));try{document.querySelector(".focusinfo").style.top="49.3%"}catch{}i.pause();for(const e of l)e.play()}function f(){i&&null!=i.oncanplay&&document.querySelector(".haslive")&&document.querySelector(".videolive")&&m()}function g(){if(i&&null!=i.oncanplay&&document.querySelector(".haslive")){h();const e=document.getElementsByClassName("video-stu")[0];e.style.bottom="0px",e.innerHTML=(0,r.__)("已暂停...")}}function p(){const e=document.getElementById("video-btn");e&&e.addEventListener("click",(function(){this.classList.contains("loadvideo")?(this.classList.add("video-pause"),this.classList.remove("loadvideo"),u(),i.oncanplay=()=>{m(),document.getElementById("video-add").style.display="block",e.classList.add("videolive","haslive")}):this.classList.contains("video-pause")?(h(),e.classList.remove("videolive"),document.getElementsByClassName("video-stu")[0].style.bottom="0px",document.getElementsByClassName("video-stu")[0].innerHTML=(0,r.__)("已暂停...")):(m(),e.classList.add("videolive")),i.onended=function(){i.setAttribute("src",""),document.getElementById("video-add").style.display="none",document.querySelector(".focusinfo").style.top="49.3%",e&&(e.classList.add("loadvideo"),e.classList.remove("video-pause","videolive","haslive"),_iro.movies.loop&&e.click())}}));const t=document.getElementById("video-add");t&&t.addEventListener("click",u)}async function y(){!async function(){const e=document.querySelectorAll("video.hls");if(0==e.length)return;if(e[0].canPlayType("application/vnd.apple.mpegurl"))for(const t of e)t.src=t.dataset.src||t.src,t.autoplay=!0;else{if(!window.Hls)try{if(_iro.ext_shared_lib)await(0,s.J)("dist/hls.light.min.js","hls.js");else{const{default:e}=await n.e(4189).then(n.t.bind(n,4189,23));window.Hls=e}}catch(e){console.warn("Hls load failed: ",e)}Hls.isSupported()||console.error("Hls: Media Source Extensions is unsupported.");for(const t of e){const e=new Hls;e.loadSource(t.dataset.src||t.src),e.attachMedia(t),e.on(Hls.Events.MANIFEST_PARSED,(()=>{t.play()}))}}}(),async function(){document.querySelectorAll("video.lazyload").forEach((e=>e.addEventListener("canplay",v)))}()}function v(){this.poster=""}},7361:(e,t,n)=>{n.d(t,{u:()=>r});var o=n(4351);function r(){if(!_iro.audio)return;const e=window.AudioContext||window.webkitAudioContext;if(e){let t=0;const n=1,r=function(){const e=o.h.opt.web_audio?.sheet;return"string"==typeof e?e.split(" "):e instanceof Array?e:"880 987 1046 987 1046 1318 987 659 659 880 784 880 1046 784 659 659 698 659 698 1046 659 1046 1046 1046 987 698 698 987 987 880 987 1046 987 1046 1318 987 659 659 880 784 880 1046 784 659 698 1046 987 1046 1174 1174 1174 1046 1046 880 987 784 880 1046 1174 1318 1174 1318 1567 1046 987 1046 1318 1318 1174 784 784 880 1046 987 1174 1046 784 784 1396 1318 1174 659 1318 1046 1318 1760 1567 1567 1318 1174 1046 1046 1174 1046 1174 1567 1318 1318 1760 1567 1318 1174 1046 1046 1174 1046 1174 987 880 880 987 880".split(" ")}(),s=document.querySelectorAll(".site-title, #moblieGoTop, .site-branding, .searchbox, .changeSkin-gear, .menu-list li"),i="♪♩♫♬♭€§¶♯",a=o.h.opt.web_audio?.main_gain||1,c=new e,l=c.createGain(),d=c.createOscillator();let u;l.connect(c.destination),d.connect(l),d.type="sine",d.start(c.currentTime);let m=null;const h=e=>{if(e.currentTarget===m)return;c.resume(),m=e.currentTarget;const o=Math.round(i.length*Math.random()),s=e.pageX,h=e.pageY-5,f=document.createElement("b");f.textContent=i[o],f.style.zIndex="99999",f.style.top=h-100+"px",f.style.left=s+"px",f.style.position="absolute",f.style.color="#FF6EB4",f.style.pointerEvents="none",document.body.appendChild(f),f.animate([{top:h+"px"},{opacity:0}],{duration:500});const g=r[t]||r[t=0];t+=n,l.gain.cancelScheduledValues(c.currentTime),d.frequency.setValueAtTime(g,c.currentTime),l.gain.exponentialRampToValueAtTime(a,c.currentTime+.01),l.gain.exponentialRampToValueAtTime(.001,c.currentTime+2),l.gain.setValueAtTime(0,c.currentTime+2.1),setTimeout((()=>{f.remove(),m===e.currentTarget&&(m=null),clearTimeout(u),u=setTimeout((()=>{c.suspend(),u=void 0}),1e3)}),500)};s.forEach((e=>e.addEventListener("pointerenter",h)))}}},7925:(e,t,n)=>{function o(){const e=document.getElementsByClassName("butterBar");if(e.length>0)for(let t=0;t0&&e[d-1][2]>r;d--)e[d]=e[d-1];e[d]=[n,o,r]},a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},n=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,a.t=function(e,o){if(1&o&&(e=this(e)),8&o)return e;if("object"==typeof e&&e){if(4&o&&e.__esModule)return e;if(16&o&&"function"==typeof e.then)return e}var r=Object.create(null);a.r(r);var s={};t=t||[null,n({}),n([]),n(n)];for(var i=2&o&&e;"object"==typeof i&&!~t.indexOf(i);i=n(i))Object.getOwnPropertyNames(i).forEach((t=>s[t]=()=>e[t]));return s.default=()=>e,a.d(r,s),r},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((t,n)=>(a.f[n](e,t),t)),[])),a.u=e=>(({2065:"lg-2",2236:"lg-12",2661:"lg-6",3042:"lg-9",5459:"lg-0",5470:"lg-5",6458:"lg-1",7435:"lg-8",8268:"lg-7",8279:"lg-4",8599:"lg-11",9256:"lg-3",9438:"lg-10"}[e]||e)+".js"),a.miniCssF=e=>e+".css",a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o={},r="sakurairo-scripts:",a.l=(e,t,n,s)=>{if(o[e])o[e].push(t);else{var i,c;if(void 0!==n)for(var l=document.getElementsByTagName("script"),d=0;d
")+"
"+t.replace(/\r\n/g,"
"),o=s.join("\n")+"\n\n"+t.toString().replace(/\r\n/g,"\n");if(e.clipboardData)e.clipboardData.setData("text/html",n),e.clipboardData.setData("text/plain",o);else if(window.clipboardData)window.clipboardData.setData("text",o)}(e,n),(0,o.I)((0,r.__)("复制成功!"),1e3))}}function a(){_iro.clipboardCopyright&&(document.body.removeEventListener("copy",i),document.body.addEventListener("copy",i))}},4895:(e,t,n)=>{n.d(t,{vI:()=>p,LN:()=>w,t9:()=>v,LY:()=>h,rZ:()=>f});n(9261),n(3700),n(3632),n(1531),n(3678),n(4145);function o(e){return new Promise(((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)}))}function r(e,t){const n=indexedDB.open(e);n.onupgradeneeded=()=>n.result.createObjectStore(t);const r=o(n);return(e,n)=>r.then((o=>n(o.transaction(t,e).objectStore(t))))}const s=r("sakurairo","cache");var i=n(7721),a=n(4351),c=n(2818),l=n(7925),d=n(7156);let u=1,m="";async function h(){p(await w(!0)),u++}async function f(){u--,p(await w(!0))}const g=document.querySelector(".centerbg"),p=_iro.site_bg_as_cover?e=>{document.body.style.backgroundImage=`url(${e})`,document.dispatchEvent(new CustomEvent("coverBG_change",{detail:e}))}:g?e=>{g.style.backgroundImage=`url(${e})`,document.dispatchEvent(new CustomEvent("coverBG_change",{detail:e}))}:d.lQ;function y(e){const t=e?.match(/^url\("(.+)"\)$/);if(t)return t[1]}const v=_iro.site_bg_as_cover?()=>y(document.body.style.backgroundImage):g?()=>y(g.style.backgroundImage):d.lQ;function b(e=!1){const t=new URL(_iro.cover_api);return(0,c.F)()&&1==_iro.random_graphs_mts?(t.searchParams.set("type","mobile"),t.toString()+(e?"&"+u:"")):t.toString()+(e?(""===t.search?"?":"&")+u:"")}const w=_iro.cache_cover?(e=!1)=>{return(t="cover",s("readonly",(e=>o(e.get(t))))).then((t=>t&&t instanceof ArrayBuffer?(URL.revokeObjectURL(m),m="",m=URL.createObjectURL(new Blob([t])),m):b(e))).finally((()=>{!async function(e=!1){try{const t=await fetch(b(e),{headers:{Accept:i.t}});if(500==t.status){const e=await t.json();(0,l.I)(e.message),console.warn(e.message)}else if(t.ok){const e=await t.arrayBuffer();try{((e,t)=>{s("readwrite",(n=>(n.put(t,e),o(n.transaction))))})("cover",e)}catch(e){console.warn(e)}}}catch(e){e instanceof TypeError&&(console.warn((0,a.__)("你的封面API好像不支持跨域调用,这种情况下缓存是不会生效的哦")),(e=>{s("readwrite",(t=>(t.delete(e),o(t.transaction))))})("cover"))}}(e)}));var t}:b},9655:(e,t,n)=>{n.d(t,{ig:()=>m,jJ:()=>s,uO:()=>l,yi:()=>d});const o=window.matchMedia("(prefers-color-scheme:dark)");let r=!1;const s=()=>r;function i(e){e!==r&&(document.dispatchEvent(new CustomEvent("darkmode",{detail:e})),r=e)}function a(){localStorage.getItem("dark")||(o.matches&&_iro.darkmode?l():d())}function c(e){e==u()?localStorage.removeItem("dark"):1==e?localStorage.setItem("dark","1"):localStorage.setItem("dark","0")}function l(e){document.documentElement.style.backgroundColor="#333",document.getElementsByClassName("site-content")[0].style.backgroundColor="#333",document.body.classList.add("dark"),e&&c(!0),i(!0)}function d(e){document.documentElement.style.backgroundColor="",document.getElementsByClassName("site-content")[0].style.backgroundColor="rgba(255, 255, 255, .8)",document.body.classList.remove("dark"),document.body.classList.remove("dynamic"),i(!1),e&&c(!1)}function u(){switch(_iro.dm_strategy){case"client":return o.matches;case"eien":return!0;default:return function(){const e=new Date;return e.getHours()>21||e.getHours()<7}()}}function m(){const e=localStorage.getItem("dark");e?"1"==e?l():d():u()&&_iro.darkmode?l():d()}"client"===_iro.dm_strategy&&(o.removeEventListener?o.removeEventListener("change",a):o.removeListener(a),o.addEventListener?o.addEventListener("change",a):o.addListener(a))},8195:(e,t,n)=>{n.d(t,{J:()=>u,S:()=>l});var o=n(7925),r=n(4351),s=n(2818);let i,a;function c(e){return()=>{const{name:t}=e.dataset;t!=localStorage.getItem("font_family")&&("serif"==t?((0,s.F)()&&(0,o.I)((0,r.__)("将从网络加载字体,流量请注意")),document.body.classList.add("serif"),localStorage.setItem("font_family","serif"),d("serif")):(document.body.classList.remove("serif"),localStorage.setItem("font_family","sans-serif"),d("sans-serif")))}}function l(){const e=localStorage.getItem("font_family");e&&"serif"!=e||document.body.classList.add("serif")}function d(e){"sans-serif"===e||"sans-serif"==localStorage.getItem("font_family")?(i.classList.remove("selected"),a.classList.add("selected")):(a.classList.remove("selected"),i.classList.add("selected"))}function u(){const e=(i=document.getElementsByClassName("control-btn-serif")[0],a=document.getElementsByClassName("control-btn-sans-serif")[0],a&&i);e||localStorage.removeItem("font_family"),l(),e&&(d(),i.addEventListener("click",c(i)),a.addEventListener("click",c(a)))}},9509:(e,t,n)=>{async function o(){const e=document.getElementById("footer_yiyan");if(e){const t=_iro.yiyan_api||["https://api.maho.cc/yiyan/"];0==t.length&&console.warn("一言API: 路径为空");for(const n of t)try{const t=await r(n);e.innerText=t;break}catch(e){console.warn(`一言API: 尝试联系"${n}"时出错。 `,e);continue}}}n.d(t,{A:()=>o});const r=async e=>{const t=await fetch(e,{headers:{Accept:"application/json"}});if(t.ok){const e=await t.json(),n=("null"==e.from_who?null:e.from_who)||"",o=e.from!=e.from_who?`「${e.from}」`:"";return e.hitokoto+"——"+n+o}throw t.status}},2818:(e,t,n)=>{n.d(t,{F:()=>i,P:()=>r});let o=!1;function r(){const e=window.matchMedia("(max-width:860px)");o=e.matches,e.addEventListener?e.addEventListener("change",s):e.addListener(s)}function s(e){o=e.matches}const i=()=>o},2341:(e,t,n)=>{n.d(t,{U:()=>h,X:()=>u});var o=n(7156),r=n(2821),s=n(4351),i=n(3867),a=n(9311);const c=([e,t,n,o])=>{const r=`${e}deg,${t}%,${n}%`;return o&&1!==o?`hsla(${r},${o})`:`hsl(${r})`};let l;const d=(0,o.ai)((async function(){const e=document.location.href,t=document.querySelector("#pagination a");if(t.classList.contains("loading"))return;t.classList.add("loading"),t.innerText="";const n=await fetch(t.getAttribute("href")+"#main"),o=await n.text();if(e!=document.location.href)return;const a=(new DOMParser).parseFromString(o,"text/html"),c=a.querySelectorAll("#main .post, #shuoshuo_post"),l=a.querySelector("#pagination a"),d=l&&l.innerText,m=l&&l.getAttribute("href"),h=document.getElementById("main");for(let e=0;e0&&e[d-1][2]>r;d--)e[d]=e[d-1];e[d]=[n,o,r]},a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},n=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,a.t=function(e,o){if(1&o&&(e=this(e)),8&o)return e;if("object"==typeof e&&e){if(4&o&&e.__esModule)return e;if(16&o&&"function"==typeof e.then)return e}var r=Object.create(null);a.r(r);var s={};t=t||[null,n({}),n([]),n(n)];for(var i=2&o&&e;"object"==typeof i&&!~t.indexOf(i);i=n(i))Object.getOwnPropertyNames(i).forEach((t=>s[t]=()=>e[t]));return s.default=()=>e,a.d(r,s),r},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((t,n)=>(a.f[n](e,t),t)),[])),a.u=e=>(({2065:"lg-2",2236:"lg-12",2661:"lg-6",3042:"lg-9",5459:"lg-0",5470:"lg-5",6458:"lg-1",7435:"lg-8",8268:"lg-7",8279:"lg-4",8599:"lg-11",9256:"lg-3",9438:"lg-10"}[e]||e)+".js"),a.miniCssF=e=>e+".css",a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o={},r="sakurairo-scripts:",a.l=(e,t,n,s)=>{if(o[e])o[e].push(t);else{var i,c;if(void 0!==n)for(var l=document.getElementsByTagName("script"),d=0;d
') + \"
\" + selectionTxt.replace(/\\r\\n/g, \"
\"), textData = txt.join('\\n') + \"\\n\\n\" + selectionTxt.toString().replace(/\\r\\n/g, \"\\n\");\n if (event.clipboardData) {\n event.clipboardData.setData(\"text/html\", htmlData);\n event.clipboardData.setData(\"text/plain\", textData);\n }\n else if (window.clipboardData) {\n //deprecate?\n return window.clipboardData.setData(\"text\", textData);\n }\n}\nfunction copytext(e) {\n const selection = window.getSelection();\n if (selection) {\n const selectionText = selection.toString();\n if (selectionText.length > 30) {\n setClipboardText(e, selectionText);\n createButterbar(__(\"复制成功!\"), 1000);\n }\n }\n}\n/**\n * 添加复制时的版权提示\n */\nexport default function add_copyright() {\n if (_iro.clipboardCopyright) {\n document.body.removeEventListener(\"copy\", copytext);\n document.body.addEventListener(\"copy\", copytext);\n }\n}\n","function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n const dbp = promisifyRequest(request);\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","import { createStore, promisifyRequest } from 'idb-keyval';\nconst store = createStore('sakurairo', 'cache');\nconst get = (key) => store('readonly', (store) => promisifyRequest(store.get(key)));\nconst set = (key, value) => store('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n});\nconst del = (key) => store('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n});\nexport { get, set, del };\n","import { get, set, del } from './cache';\nimport { Accept_Image } from './compatibility';\nimport { __ } from '../common/sakurairo_global';\nimport { isMobile } from './mobile';\nimport { createButterbar } from '../common/butterbar';\nimport { noop } from '../common/util';\nlet bgn = 1;\nlet blob_url = '';\nexport async function nextBG() {\n changeCoverBG(await getCoverPath(true));\n bgn++;\n}\nexport async function preBG() {\n bgn--;\n changeCoverBG(await getCoverPath(true));\n}\nconst centerbg = document.querySelector(\".centerbg\");\n/**\n * 更改封面背景\n */\nexport const changeCoverBG = _iro.site_bg_as_cover ? (url) => {\n document.body.style.backgroundImage = `url(${url})`;\n document.dispatchEvent(new CustomEvent('coverBG_change', { detail: url }));\n} :\n centerbg ? (url) => {\n centerbg.style.backgroundImage = `url(${url})`;\n document.dispatchEvent(new CustomEvent('coverBG_change', { detail: url }));\n } : noop;\nfunction parseCSSUrl(cssText) {\n const result = cssText?.match(/^url\\(\"(.+)\"\\)$/);\n if (result) {\n return result[1];\n }\n}\n/**\n * 返回当前封面背景的URL\n */\nexport const getCurrentBG = _iro.site_bg_as_cover ? () => parseCSSUrl(document.body.style.backgroundImage) :\n (centerbg ? () => parseCSSUrl(centerbg.style.backgroundImage) : noop);\nfunction getAPIPath(useBGN = false) {\n const cover_api_url = new URL(_iro.cover_api);\n if (isMobile() && _iro.random_graphs_mts == true) {\n cover_api_url.searchParams.set('type', 'mobile');\n return cover_api_url.toString() + (useBGN ? \"&\" + bgn : '');\n }\n else {\n return cover_api_url.toString() + (useBGN ? (cover_api_url.search === '' ? \"?\" : '&') + bgn : '');\n }\n}\nexport const getCoverPath = _iro.cache_cover ? (useBGN = false) => get('cover').then(coverBG => {\n if (coverBG && coverBG instanceof ArrayBuffer) {\n cleanBlobUrl();\n blob_url = URL.createObjectURL(new Blob([coverBG]));\n return blob_url;\n }\n else {\n //fallback\n return getAPIPath(useBGN);\n }\n}).finally(() => {\n fetchThenCache(useBGN);\n})\n : getAPIPath;\nasync function fetchThenCache(useBGN = false) {\n try {\n const resp = await fetch(getAPIPath(useBGN), { headers: { Accept: Accept_Image } });\n if (resp.status == 500) {\n const result = await resp.json();\n createButterbar(result.message);\n console.warn(result.message);\n }\n else if (resp.ok) {\n const buf = await resp.arrayBuffer();\n try {\n set('cover', buf);\n /**\n * @problem Safari暂时不支持indexdb存储blob\n * DataCloneError: Failed to store record in an IDBObjectStore: BlobURLs are not yet supported.\n * @seealso https://developers.google.com/web/fundamentals/instant-and-offline/web-storage/indexeddb-best-practices#keeping_your_app_predictable\n */\n }\n catch (e) {\n //catch: FireFox无痕模式下数据库不允许修改\n /**\n * @problem FireFox无痕模式下数据库不允许修改\n * DOMException: A mutation operation was attempted on a database that did not allow mutations\n * Chrome不会报错\n * 像是火狐的设计 https://wiki.mozilla.org/Private_Browsing#Persistent_Storage\n * 变通方法 https://bugzilla.mozilla.org/show_bug.cgi?id=1639542#c9\n */\n console.warn(e);\n }\n }\n }\n catch (e) {\n if (e instanceof TypeError) {\n console.warn(__('你的封面API好像不支持跨域调用,这种情况下缓存是不会生效的哦'));\n del('cover');\n }\n }\n}\nfunction cleanBlobUrl() {\n URL.revokeObjectURL(blob_url);\n blob_url = '';\n}\n/* export function initCoverBG() {\n if (_iro.site_bg_as_cover) {\n if (centerbg) centerbg.style.background = '#0000'\n }\n} */ \n","const mediaQuery = window.matchMedia('(prefers-color-scheme:dark)');\nlet inDarkMode = false;\nexport const isInDarkMode = () => inDarkMode;\nfunction informDarkModeChange(nextValue) {\n if (nextValue !== inDarkMode) {\n document.dispatchEvent(new CustomEvent(\"darkmode\", { detail: nextValue }));\n inDarkMode = nextValue;\n }\n}\nfunction mediaQueryCallback() {\n const dark = localStorage.getItem(\"dark\");\n //仅在深色模式不是用户主动设置时触发\n if (!dark) {\n if (mediaQuery.matches && _iro.darkmode) {\n turnOnDarkMode();\n }\n else {\n turnOffDarkMode();\n }\n }\n}\nif (_iro.dm_strategy === 'client') {\n mediaQuery.removeEventListener ? mediaQuery.removeEventListener('change', mediaQueryCallback) : mediaQuery.removeListener(mediaQueryCallback);\n mediaQuery.addEventListener ? mediaQuery.addEventListener('change', mediaQueryCallback) : mediaQuery.addListener(mediaQueryCallback);\n}\nfunction saveUserSetting(value) {\n if (value == ifDarkmodeShouldOn()) {\n //用户设置与自动切换深色模式判断一致时,恢复自动切换\n localStorage.removeItem('dark');\n }\n else {\n if (value == true) {\n localStorage.setItem(\"dark\", \"1\");\n }\n else {\n localStorage.setItem(\"dark\", \"0\");\n }\n }\n //localStorage.setItem(\"bgImgSetting\", \"white-bg\");\n}\nexport function turnOnDarkMode(userTriggered) {\n document.documentElement.style.backgroundColor = \"#333\";\n document.getElementsByClassName(\"site-content\")[0].style.backgroundColor = \"#333\";\n document.body.classList.add(\"dark\");\n if (userTriggered)\n saveUserSetting(true);\n informDarkModeChange(true);\n}\nexport function turnOffDarkMode(userTriggered) {\n document.documentElement.style.backgroundColor = \"\";\n document.getElementsByClassName(\"site-content\")[0].style.backgroundColor = \"rgba(255, 255, 255, .8)\";\n document.body.classList.remove(\"dark\");\n document.body.classList.remove(\"dynamic\");\n informDarkModeChange(false);\n if (userTriggered) {\n saveUserSetting(false);\n //document.body.style.backgroundImage = `url(${_iro.skin_bg0})`;\n }\n}\n/**\n * 检查是否在深色模式时间\n * @returns {boolean}\n */\nfunction checkTime() {\n const today = new Date();\n return (today.getHours() > 21 || today.getHours() < 7);\n}\nexport function ifDarkmodeShouldOn() {\n switch (_iro.dm_strategy) {\n case 'client':\n return mediaQuery.matches;\n case 'eien':\n return true;\n default: /**case time */\n return checkTime();\n }\n}\nexport function checkDarkModeSetting() {\n const dark = localStorage.getItem(\"dark\");\n if (!dark) {\n //无用户设置时,自动切换深色模式\n if (ifDarkmodeShouldOn() && _iro.darkmode) {\n turnOnDarkMode();\n }\n else {\n turnOffDarkMode();\n }\n }\n else {\n if (dark == '1') {\n turnOnDarkMode();\n }\n else {\n turnOffDarkMode();\n }\n }\n}\n/* function mobile_dark_light() {\n if (document.body.classList.contains(\"dark\")) {\n document.documentElement.style.background = \"unset\";\n document.body.classList.remove(\"dark\");\n document.getElementById(\"moblieDarkLight\").innerHTML = '';\n setCookie(\"dark\", \"0\", 0.33);\n } else {\n document.documentElement.style.background = \"#333333\";\n document.getElementById(\"moblieDarkLight\").innerHTML = '';\n document.body.classList.add(\"dark\");\n setCookie(\"dark\", \"1\", 0.33);\n }\n} */ \n","import { createButterbar } from \"../common/butterbar\";\nimport { __ } from \"../common/sakurairo_global\";\nimport { isMobile } from \"./mobile\";\nlet btnSerif, btnSansSerif;\nfunction Serif() {\n if (isMobile()) {\n createButterbar(__(\"将从网络加载字体,流量请注意\"));\n }\n document.body.classList.add(\"serif\");\n localStorage.setItem(\"font_family\", \"serif\");\n setButtonState('serif');\n}\nfunction SansSerif() {\n document.body.classList.remove(\"serif\");\n localStorage.setItem(\"font_family\", \"sans-serif\");\n setButtonState('sans-serif');\n}\nfunction change_font_listener(btn) {\n return () => {\n const { name } = btn.dataset;\n const nowFont = localStorage.getItem(\"font_family\");\n if (name == nowFont) {\n return;\n }\n else {\n (name == 'serif') ? Serif() : SansSerif();\n }\n };\n}\nexport function loadFontSetting() {\n const nowFont = localStorage.getItem(\"font_family\");\n if (!nowFont || nowFont == \"serif\") {\n document.body.classList.add(\"serif\");\n }\n}\nfunction setButtonState(font_name) {\n if (font_name === 'sans-serif' || localStorage.getItem(\"font_family\") == 'sans-serif') {\n btnSerif.classList.remove(\"selected\");\n btnSansSerif.classList.add(\"selected\");\n }\n else {\n btnSansSerif.classList.remove(\"selected\");\n btnSerif.classList.add(\"selected\");\n }\n}\nfunction initDOMCache() {\n btnSerif = document.getElementsByClassName(\"control-btn-serif\")[0];\n btnSansSerif = document.getElementsByClassName(\"control-btn-sans-serif\")[0];\n return btnSansSerif && btnSerif;\n}\nfunction initListener() {\n btnSerif.addEventListener('click', change_font_listener(btnSerif));\n btnSansSerif.addEventListener('click', change_font_listener(btnSansSerif));\n}\nexport function initFontControl() {\n const result = initDOMCache();\n if (!result)\n localStorage.removeItem('font_family'); //样式菜单“简单”时,使用默认字体 “A”\n loadFontSetting();\n if (result) {\n setButtonState();\n initListener();\n }\n}\n","export default async function hitokoto() {\n const yiyan = document.getElementById(\"footer_yiyan\");\n if (yiyan) {\n const api_group = _iro.yiyan_api || [\"https://api.maho.cc/yiyan/\"];\n if (api_group.length == 0) {\n console.warn('一言API: 路径为空');\n }\n for (const api_path of api_group) {\n try {\n const txt = await request(api_path);\n yiyan.innerText = txt;\n break;\n }\n catch (e) {\n console.warn(`一言API: 尝试联系\"${api_path}\"时出错。 `, e);\n continue;\n }\n }\n }\n}\nconst request = async (api) => {\n const res = await fetch(api, { headers: { Accept: \"application/json\" } });\n if (res.ok) {\n const data = await res.json();\n const from_who = (data.from_who == 'null' ? null : data.from_who) || '';\n const from = data.from != data.from_who ? `「${data['from']}」` : '';\n const hitokoto = data.hitokoto;\n return hitokoto + '——' + from_who + from;\n }\n else {\n throw res.status;\n }\n};\n","let cache_is_mobile = false;\nexport function initIsMobileCache() {\n const mediaQuery = window.matchMedia('(max-width:860px)');\n cache_is_mobile = mediaQuery.matches;\n mediaQuery.addEventListener ? mediaQuery.addEventListener('change', refreshIsMobileCache) : mediaQuery.addListener(refreshIsMobileCache);\n}\nfunction refreshIsMobileCache(ev) {\n cache_is_mobile = ev.matches;\n}\n/**\n *\n * @returns 返回document.body.clientWidth <= 860的结果。这个结果是缓存的\n */\nexport const isMobile = () => cache_is_mobile;\n","export default function showcard() {\n for (const showcard of document.querySelectorAll('.showcard')) {\n const img = showcard.querySelector('.img');\n const button = showcard.querySelector('.showcard-button');\n if (!img || !button) {\n throw new Error('invalid structure for .showcard');\n }\n img.addEventListener('mouseover', function () {\n button.classList.add('hover');\n });\n img.addEventListener('mouseout', function () {\n button.classList.remove('hover');\n });\n }\n}\n","import { importExternal } from '../common/npmLib';\nlet typedInstance;\nexport function disableTypedJsIfExist() {\n if (typedInstance) {\n typedInstance.destroy();\n typedInstance = null;\n }\n}\nexport default async function initTypedJs() {\n const json = document.getElementById('typed-js-initial');\n if (json) {\n disableTypedJsIfExist(); // Fix mirai-mamori/Sakurairo #810\n try {\n const options = JSON.parse(json.innerHTML);\n const element = document.querySelector('.element');\n element.innerText = '';\n if (_iro.ext_shared_lib) {\n if (!window.Typed)\n await importExternal('dist/typed.umd.js', 'typed.js');\n typedInstance = new window.Typed(element, options);\n }\n else {\n const { default: Typed } = await import('typed.js');\n typedInstance = new Typed(element, options);\n }\n }\n catch (e) {\n console.error(\"请检查typed.js设置\", e);\n }\n }\n}\n","import { getBaseName } from '../common/util';\nimport { __ } from '../common/sakurairo_global';\nimport { importExternal } from '../common/npmLib';\nconst bgvideo = document.getElementById(\"bgvideo\");\nconst videoList = _iro.movies.name?.split(\",\") || []; // 视频列表\nlet unplayedIndex = new Array(videoList.length).fill(0).map((_, index) => index);\nlet aplayersToResume = [];\n//#region 背景视频\nconst _getNextRandomVideo = () => {\n if (unplayedIndex.length == 0) {\n unplayedIndex = new Array(videoList.length).fill(0).map((_, index) => index);\n }\n const nextIndex = Math.floor(Math.random() * unplayedIndex.length);\n return videoList[unplayedIndex.splice(nextIndex, 1)[0]];\n};\nfunction getVideo() {\n const video_stu = document.getElementsByClassName(\"video-stu\")[0];\n const fileName = _getNextRandomVideo(); // 随机抽取视频\n video_stu.innerHTML = __(\"正在载入视频 ...\");\n video_stu.style.bottom = \"0px\";\n //这里不需要检验_iro.movies是不是字符串,因为应该在前边检查\n bgvideo.setAttribute(\"src\", new URL(fileName, _iro.movies.url || location.origin).toString());\n bgvideo.setAttribute(\"video-name\", getBaseName(fileName));\n}\n/**\n * 播放\n */\nfunction splay() {\n const video_btn = document.getElementById(\"video-btn\");\n if (video_btn) {\n video_btn.classList.add(\"video-pause\");\n video_btn.classList.remove(\"video-play\");\n video_btn.style.display = \"\";\n }\n try {\n document.querySelector(\".video-stu\").style.bottom = \"-100px\";\n document.querySelector(\".focusinfo\").style.top = \"-999px\";\n if (_iro.float_player_on) {\n import('./aplayer').then(({ pauseAllPlayer }) => {\n aplayersToResume = pauseAllPlayer();\n bgvideo.play();\n });\n return;\n }\n }\n catch (e) {\n console.warn(e);\n }\n bgvideo.play();\n}\n/**\n * 暂停\n */\nfunction spause() {\n const video_btn = document.getElementById(\"video-btn\");\n if (video_btn) {\n video_btn.classList.add(\"video-play\");\n video_btn.classList.remove(\"video-pause\");\n }\n try {\n document.querySelector(\".focusinfo\").style.top = \"49.3%\";\n }\n catch { }\n bgvideo.pause();\n for (const player of aplayersToResume) {\n player.play();\n }\n}\n/**\n * 自动续播 - 播放\n */\nexport function liveplay() {\n if (bgvideo && bgvideo.oncanplay != undefined && document.querySelector(\".haslive\")) { // 检查视频数据\n if (document.querySelector(\".videolive\")) { // 检查播放状态\n splay();\n }\n }\n}\nexport function livepause() {\n if (bgvideo && bgvideo.oncanplay != undefined && document.querySelector(\".haslive\")) { // 检查视频数据\n spause();\n const video_stu = document.getElementsByClassName(\"video-stu\")[0];\n video_stu.style.bottom = \"0px\";\n video_stu.innerHTML = __(\"已暂停...\");\n }\n}\nexport function coverVideo() {\n const video_btn = document.getElementById(\"video-btn\");\n if (video_btn)\n video_btn.addEventListener(\"click\", function () {\n if (this.classList.contains(\"loadvideo\")) {\n this.classList.add(\"video-pause\");\n this.classList.remove(\"loadvideo\");\n getVideo();\n bgvideo.oncanplay = () => {\n splay();\n document.getElementById(\"video-add\").style.display = \"block\";\n video_btn.classList.add(\"videolive\", \"haslive\"); // MDZZ\n };\n }\n else {\n if (this.classList.contains(\"video-pause\")) {\n spause();\n video_btn.classList.remove(\"videolive\");\n document.getElementsByClassName(\"video-stu\")[0].style.bottom = \"0px\";\n document.getElementsByClassName(\"video-stu\")[0].innerHTML = __(\"已暂停...\");\n }\n else {\n splay();\n video_btn.classList.add(\"videolive\"); // 用于判断切换页面时的状态\n }\n }\n bgvideo.onended = function () {\n bgvideo.setAttribute(\"src\", \"\");\n document.getElementById(\"video-add\").style.display = \"none\";\n document.querySelector(\".focusinfo\").style.top = \"49.3%\";\n if (video_btn) {\n video_btn.classList.add(\"loadvideo\");\n video_btn.classList.remove(\"video-pause\", \"videolive\", \"haslive\");\n if (_iro.movies.loop) {\n video_btn.click();\n }\n }\n };\n });\n const video_add = document.getElementById(\"video-add\");\n if (video_add)\n video_add.addEventListener(\"click\", getVideo);\n}\n//#endregion\nexport async function coverVideoIni() {\n initHLS();\n lazyloadPatch();\n}\nfunction canPlayHandler() {\n this.poster = '';\n}\n/**\n * 用户代理可能会禁止自动播放,此时需要撤掉poster\n */\nasync function lazyloadPatch() {\n document.querySelectorAll('video.lazyload')\n .forEach(video => video.addEventListener('canplay', canPlayHandler));\n}\nasync function initHLS() {\n const videos = document.querySelectorAll('video.hls');\n if (videos.length == 0)\n return;\n //检查浏览器是否原生支持\n if (videos[0].canPlayType('application/vnd.apple.mpegurl')) {\n for (const video of videos) {\n video.src = video.dataset.src || video.src;\n video.autoplay = true;\n }\n }\n else {\n if (!window.Hls) {\n try {\n if (_iro.ext_shared_lib) {\n await importExternal('dist/hls.light.min.js', 'hls.js');\n }\n else {\n //@ts-ignore\n const { default: Hls } = await import('hls.js/dist/hls.light.js');\n window.Hls = Hls;\n }\n }\n catch (reason) {\n console.warn('Hls load failed: ', reason);\n }\n }\n if (!Hls.isSupported())\n console.error('Hls: Media Source Extensions is unsupported.');\n for (const video of videos) {\n const hls = new Hls();\n hls.loadSource(video.dataset.src || video.src);\n hls.attachMedia(video);\n hls.on(Hls.Events.MANIFEST_PARSED, () => {\n video.play();\n });\n }\n }\n}\n","import { sakurairoGlobal } from \"../common/sakurairo_global\";\nexport function web_audio() {\n if (!_iro.audio)\n return;\n //@ts-ignore\n const AudioContext = window.AudioContext || window.webkitAudioContext;\n if (AudioContext) {\n let i = 0;\n const o = 1;\n const t = getSheet();\n const selects = document.querySelectorAll(\".site-title, #moblieGoTop, .site-branding, .searchbox, .changeSkin-gear, .menu-list li\");\n const notes = \"♪♩♫♬♭€§¶♯\";\n const gainValueMax = sakurairoGlobal.opt.web_audio?.main_gain || 1;\n const ctx = new AudioContext;\n const l = ctx.createGain();\n const c = ctx.createOscillator();\n l.connect(ctx.destination);\n c.connect(l);\n c.type = \"sine\";\n c.start(ctx.currentTime);\n let _t;\n function suspendContextWhenIdle() {\n clearTimeout(_t);\n _t = setTimeout(() => {\n ctx.suspend();\n _t = undefined;\n }, 1000);\n }\n let lastTarget = null;\n const listener = (e) => {\n if (e.currentTarget === lastTarget)\n return;\n ctx.resume();\n lastTarget = e.currentTarget;\n const d = Math.round(notes.length * Math.random());\n const h = e.pageX;\n const p = e.pageY - 5;\n const dom = document.createElement(\"b\");\n dom.textContent = notes[d];\n dom.style.zIndex = \"99999\";\n dom.style.top = p - 100 + \"px\";\n dom.style.left = h + \"px\";\n dom.style.position = \"absolute\";\n dom.style.color = \"#FF6EB4\";\n dom.style.pointerEvents = \"none\";\n document.body.appendChild(dom);\n dom.animate([\n { top: p + \"px\" },\n { opacity: 0 }\n ], {\n duration: 500\n });\n const r = t[i] || t[i = 0];\n i += o;\n l.gain.cancelScheduledValues(ctx.currentTime);\n c.frequency.setValueAtTime(r, ctx.currentTime);\n l.gain.exponentialRampToValueAtTime(gainValueMax, ctx.currentTime + .01);\n l.gain.exponentialRampToValueAtTime(.001, ctx.currentTime + 2);\n l.gain.setValueAtTime(0, ctx.currentTime + 2.1);\n setTimeout(() => {\n dom.remove();\n if (lastTarget === e.currentTarget)\n lastTarget = null;\n suspendContextWhenIdle();\n }, 500);\n };\n selects.forEach(s => s.addEventListener('pointerenter', listener));\n }\n}\nfunction getSheet() {\n const sheet = sakurairoGlobal.opt.web_audio?.sheet;\n if (typeof sheet == 'string') {\n return sheet.split(' ');\n }\n else if (sheet instanceof Array) {\n return sheet;\n }\n else {\n //欢乐颂\n /*t = \"329.628 329.628 349.228 391.995 391.995 349.228 329.628 293.665 261.626 261.626 293.665 329.628 329.628 293.665 293.665 329.628 329.628 349.228 391.995 391.995 349.228 329.628 293.665 261.626 261.626 293.665 329.628 293.665 261.626 261.626 293.665 293.665 329.628 261.626 293.665 329.628 349.228 329.628 261.626 293.665 329.628 349.228 329.628 293.665 261.626 293.665 195.998 329.628 329.628 349.228 391.995 391.995 349.228 329.628 293.665 261.626 261.626 293.665 329.628 293.665 261.626 261.626\".split(\" \")*/\n //天空之城\n return \"880 987 1046 987 1046 1318 987 659 659 880 784 880 1046 784 659 659 698 659 698 1046 659 1046 1046 1046 987 698 698 987 987 880 987 1046 987 1046 1318 987 659 659 880 784 880 1046 784 659 698 1046 987 1046 1174 1174 1174 1046 1046 880 987 784 880 1046 1174 1318 1174 1318 1567 1046 987 1046 1318 1318 1174 784 784 880 1046 987 1174 1046 784 784 1396 1318 1174 659 1318 1046 1318 1760 1567 1567 1318 1174 1046 1046 1174 1046 1174 1567 1318 1318 1760 1567 1318 1174 1046 1046 1174 1046 1174 987 880 880 987 880\".split(\" \");\n }\n}\n","export function clearButterbar() {\n const butterBar = document.getElementsByClassName(\"butterBar\");\n if (butterBar.length > 0) {\n for (let i = 0; i < butterBar.length; i++) {\n butterBar[i].remove();\n }\n }\n}\nexport function createButterbar(message, keep) {\n clearButterbar();\n /* document.body.insertAdjacentHTML('beforeend', '
') + \"
\" + selectionTxt.replace(/\\r\\n/g, \"
\"), textData = txt.join('\\n') + \"\\n\\n\" + selectionTxt.toString().replace(/\\r\\n/g, \"\\n\");\n if (event.clipboardData) {\n event.clipboardData.setData(\"text/html\", htmlData);\n event.clipboardData.setData(\"text/plain\", textData);\n }\n else if (window.clipboardData) {\n //deprecate?\n return window.clipboardData.setData(\"text\", textData);\n }\n}\nfunction copytext(e) {\n const selection = window.getSelection();\n if (selection) {\n const selectionText = selection.toString();\n if (selectionText.length > 30) {\n setClipboardText(e, selectionText);\n createButterbar(__(\"复制成功!\"), 1000);\n }\n }\n}\n/**\n * 添加复制时的版权提示\n */\nexport default function add_copyright() {\n if (_iro.clipboardCopyright) {\n document.body.removeEventListener(\"copy\", copytext);\n document.body.addEventListener(\"copy\", copytext);\n }\n}\n","function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n const dbp = promisifyRequest(request);\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","import { createStore, promisifyRequest } from 'idb-keyval';\nconst store = createStore('sakurairo', 'cache');\nconst get = (key) => store('readonly', (store) => promisifyRequest(store.get(key)));\nconst set = (key, value) => store('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n});\nconst del = (key) => store('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n});\nexport { get, set, del };\n","import { get, set, del } from './cache';\nimport { Accept_Image } from './compatibility';\nimport { __ } from '../common/sakurairo_global';\nimport { isMobile } from './mobile';\nimport { createButterbar } from '../common/butterbar';\nimport { noop } from '../common/util';\nlet bgn = 1;\nlet blob_url = '';\nexport async function nextBG() {\n changeCoverBG(await getCoverPath(true));\n bgn++;\n}\nexport async function preBG() {\n bgn--;\n changeCoverBG(await getCoverPath(true));\n}\nconst centerbg = document.querySelector(\".centerbg\");\n/**\n * 更改封面背景\n */\nexport const changeCoverBG = _iro.site_bg_as_cover ? (url) => {\n document.body.style.backgroundImage = `url(${url})`;\n document.dispatchEvent(new CustomEvent('coverBG_change', { detail: url }));\n} :\n centerbg ? (url) => {\n centerbg.style.backgroundImage = `url(${url})`;\n document.dispatchEvent(new CustomEvent('coverBG_change', { detail: url }));\n } : noop;\nfunction parseCSSUrl(cssText) {\n const result = cssText?.match(/^url\\(\"(.+)\"\\)$/);\n if (result) {\n return result[1];\n }\n}\n/**\n * 返回当前封面背景的URL\n */\nexport const getCurrentBG = _iro.site_bg_as_cover ? () => parseCSSUrl(document.body.style.backgroundImage) :\n (centerbg ? () => parseCSSUrl(centerbg.style.backgroundImage) : noop);\nfunction getAPIPath(useBGN = false) {\n const cover_api_url = new URL(_iro.cover_api);\n if (isMobile() && _iro.random_graphs_mts == true) {\n cover_api_url.searchParams.set('type', 'mobile');\n return cover_api_url.toString() + (useBGN ? \"&\" + bgn : '');\n }\n else {\n return cover_api_url.toString() + (useBGN ? (cover_api_url.search === '' ? \"?\" : '&') + bgn : '');\n }\n}\nexport const getCoverPath = _iro.cache_cover ? (useBGN = false) => get('cover').then(coverBG => {\n if (coverBG && coverBG instanceof ArrayBuffer) {\n cleanBlobUrl();\n blob_url = URL.createObjectURL(new Blob([coverBG]));\n return blob_url;\n }\n else {\n //fallback\n return getAPIPath(useBGN);\n }\n}).finally(() => {\n fetchThenCache(useBGN);\n})\n : getAPIPath;\nasync function fetchThenCache(useBGN = false) {\n try {\n const resp = await fetch(getAPIPath(useBGN), { headers: { Accept: Accept_Image } });\n if (resp.status == 500) {\n const result = await resp.json();\n createButterbar(result.message);\n console.warn(result.message);\n }\n else if (resp.ok) {\n const buf = await resp.arrayBuffer();\n try {\n set('cover', buf);\n /**\n * @problem Safari暂时不支持indexdb存储blob\n * DataCloneError: Failed to store record in an IDBObjectStore: BlobURLs are not yet supported.\n * @seealso https://developers.google.com/web/fundamentals/instant-and-offline/web-storage/indexeddb-best-practices#keeping_your_app_predictable\n */\n }\n catch (e) {\n //catch: FireFox无痕模式下数据库不允许修改\n /**\n * @problem FireFox无痕模式下数据库不允许修改\n * DOMException: A mutation operation was attempted on a database that did not allow mutations\n * Chrome不会报错\n * 像是火狐的设计 https://wiki.mozilla.org/Private_Browsing#Persistent_Storage\n * 变通方法 https://bugzilla.mozilla.org/show_bug.cgi?id=1639542#c9\n */\n console.warn(e);\n }\n }\n }\n catch (e) {\n if (e instanceof TypeError) {\n console.warn(__('你的封面API好像不支持跨域调用,这种情况下缓存是不会生效的哦'));\n del('cover');\n }\n }\n}\nfunction cleanBlobUrl() {\n URL.revokeObjectURL(blob_url);\n blob_url = '';\n}\n/* export function initCoverBG() {\n if (_iro.site_bg_as_cover) {\n if (centerbg) centerbg.style.background = '#0000'\n }\n} */ \n","const mediaQuery = window.matchMedia('(prefers-color-scheme:dark)');\nlet inDarkMode = false;\nexport const isInDarkMode = () => inDarkMode;\nfunction informDarkModeChange(nextValue) {\n if (nextValue !== inDarkMode) {\n document.dispatchEvent(new CustomEvent(\"darkmode\", { detail: nextValue }));\n inDarkMode = nextValue;\n }\n}\nfunction mediaQueryCallback() {\n const dark = localStorage.getItem(\"dark\");\n //仅在深色模式不是用户主动设置时触发\n if (!dark) {\n if (mediaQuery.matches && _iro.darkmode) {\n turnOnDarkMode();\n }\n else {\n turnOffDarkMode();\n }\n }\n}\nif (_iro.dm_strategy === 'client') {\n mediaQuery.removeEventListener ? mediaQuery.removeEventListener('change', mediaQueryCallback) : mediaQuery.removeListener(mediaQueryCallback);\n mediaQuery.addEventListener ? mediaQuery.addEventListener('change', mediaQueryCallback) : mediaQuery.addListener(mediaQueryCallback);\n}\nfunction saveUserSetting(value) {\n if (value == ifDarkmodeShouldOn()) {\n //用户设置与自动切换深色模式判断一致时,恢复自动切换\n localStorage.removeItem('dark');\n }\n else {\n if (value == true) {\n localStorage.setItem(\"dark\", \"1\");\n }\n else {\n localStorage.setItem(\"dark\", \"0\");\n }\n }\n //localStorage.setItem(\"bgImgSetting\", \"white-bg\");\n}\nexport function turnOnDarkMode(userTriggered) {\n document.documentElement.style.backgroundColor = \"#333\";\n document.getElementsByClassName(\"site-content\")[0].style.backgroundColor = \"#333\";\n document.body.classList.add(\"dark\");\n if (userTriggered)\n saveUserSetting(true);\n informDarkModeChange(true);\n}\nexport function turnOffDarkMode(userTriggered) {\n document.documentElement.style.backgroundColor = \"\";\n document.getElementsByClassName(\"site-content\")[0].style.backgroundColor = \"rgba(255, 255, 255, .8)\";\n document.body.classList.remove(\"dark\");\n document.body.classList.remove(\"dynamic\");\n informDarkModeChange(false);\n if (userTriggered) {\n saveUserSetting(false);\n //document.body.style.backgroundImage = `url(${_iro.skin_bg0})`;\n }\n}\n/**\n * 检查是否在深色模式时间\n * @returns {boolean}\n */\nfunction checkTime() {\n const today = new Date();\n return (today.getHours() > 21 || today.getHours() < 7);\n}\nexport function ifDarkmodeShouldOn() {\n switch (_iro.dm_strategy) {\n case 'client':\n return mediaQuery.matches;\n case 'eien':\n return true;\n default: /**case time */\n return checkTime();\n }\n}\nexport function checkDarkModeSetting() {\n const dark = localStorage.getItem(\"dark\");\n if (!dark) {\n //无用户设置时,自动切换深色模式\n if (ifDarkmodeShouldOn() && _iro.darkmode) {\n turnOnDarkMode();\n }\n else {\n turnOffDarkMode();\n }\n }\n else {\n if (dark == '1') {\n turnOnDarkMode();\n }\n else {\n turnOffDarkMode();\n }\n }\n}\n/* function mobile_dark_light() {\n if (document.body.classList.contains(\"dark\")) {\n document.documentElement.style.background = \"unset\";\n document.body.classList.remove(\"dark\");\n document.getElementById(\"moblieDarkLight\").innerHTML = '';\n setCookie(\"dark\", \"0\", 0.33);\n } else {\n document.documentElement.style.background = \"#333333\";\n document.getElementById(\"moblieDarkLight\").innerHTML = '';\n document.body.classList.add(\"dark\");\n setCookie(\"dark\", \"1\", 0.33);\n }\n} */ \n","import { createButterbar } from \"../common/butterbar\";\nimport { __ } from \"../common/sakurairo_global\";\nimport { isMobile } from \"./mobile\";\nlet btnSerif, btnSansSerif;\nfunction Serif() {\n if (isMobile()) {\n createButterbar(__(\"将从网络加载字体,流量请注意\"));\n }\n document.body.classList.add(\"serif\");\n localStorage.setItem(\"font_family\", \"serif\");\n setButtonState('serif');\n}\nfunction SansSerif() {\n document.body.classList.remove(\"serif\");\n localStorage.setItem(\"font_family\", \"sans-serif\");\n setButtonState('sans-serif');\n}\nfunction change_font_listener(btn) {\n return () => {\n const { name } = btn.dataset;\n const nowFont = localStorage.getItem(\"font_family\");\n if (name == nowFont) {\n return;\n }\n else {\n (name == 'serif') ? Serif() : SansSerif();\n }\n };\n}\nexport function loadFontSetting() {\n const nowFont = localStorage.getItem(\"font_family\");\n if (!nowFont || nowFont == \"serif\") {\n document.body.classList.add(\"serif\");\n }\n}\nfunction setButtonState(font_name) {\n if (font_name === 'sans-serif' || localStorage.getItem(\"font_family\") == 'sans-serif') {\n btnSerif.classList.remove(\"selected\");\n btnSansSerif.classList.add(\"selected\");\n }\n else {\n btnSansSerif.classList.remove(\"selected\");\n btnSerif.classList.add(\"selected\");\n }\n}\nfunction initDOMCache() {\n btnSerif = document.getElementsByClassName(\"control-btn-serif\")[0];\n btnSansSerif = document.getElementsByClassName(\"control-btn-sans-serif\")[0];\n return btnSansSerif && btnSerif;\n}\nfunction initListener() {\n btnSerif.addEventListener('click', change_font_listener(btnSerif));\n btnSansSerif.addEventListener('click', change_font_listener(btnSansSerif));\n}\nexport function initFontControl() {\n const result = initDOMCache();\n if (!result)\n localStorage.removeItem('font_family'); //样式菜单“简单”时,使用默认字体 “A”\n loadFontSetting();\n if (result) {\n setButtonState();\n initListener();\n }\n}\n","export default async function hitokoto() {\n const yiyan = document.getElementById(\"footer_yiyan\");\n if (yiyan) {\n const api_group = _iro.yiyan_api || [\"https://api.maho.cc/yiyan/\"];\n if (api_group.length == 0) {\n console.warn('一言API: 路径为空');\n }\n for (const api_path of api_group) {\n try {\n const txt = await request(api_path);\n yiyan.innerText = txt;\n break;\n }\n catch (e) {\n console.warn(`一言API: 尝试联系\"${api_path}\"时出错。 `, e);\n continue;\n }\n }\n }\n}\nconst request = async (api) => {\n const res = await fetch(api, { headers: { Accept: \"application/json\" } });\n if (res.ok) {\n const data = await res.json();\n const from_who = (data.from_who == 'null' ? null : data.from_who) || '';\n const from = data.from != data.from_who ? `「${data['from']}」` : '';\n const hitokoto = data.hitokoto;\n return hitokoto + '——' + from_who + from;\n }\n else {\n throw res.status;\n }\n};\n","let cache_is_mobile = false;\nexport function initIsMobileCache() {\n const mediaQuery = window.matchMedia('(max-width:860px)');\n cache_is_mobile = mediaQuery.matches;\n mediaQuery.addEventListener ? mediaQuery.addEventListener('change', refreshIsMobileCache) : mediaQuery.addListener(refreshIsMobileCache);\n}\nfunction refreshIsMobileCache(ev) {\n cache_is_mobile = ev.matches;\n}\n/**\n *\n * @returns 返回document.body.clientWidth <= 860的结果。这个结果是缓存的\n */\nexport const isMobile = () => cache_is_mobile;\n","import { onlyOnceATime } from \"../common/util\";\nimport lazyload from \"../common/lazyload\";\nimport { __ } from '../common/sakurairo_global';\n// @ts-ignore\nimport { code_highlight_style } from '../common/code-highlight';\nimport { getForeground, getHighlight, getThemeColorFromImageElement } from \"./theme-color\";\nconst hslaCSSText = ([h, s, l, a]) => {\n const hsl = `${h}deg,${s}%,${l}%`;\n return a && a !== 1 ? `hsla(${hsl},${a})` : `hsl(${hsl})`;\n};\nlet load_post_timer;\nconst load_post = onlyOnceATime(async function load_post() {\n const now_href = document.location.href;\n const pagination_a = document.querySelector('#pagination a');\n if (pagination_a.classList.contains(\"loading\"))\n return;\n pagination_a.classList.add(\"loading\");\n pagination_a.innerText = \"\";\n // $('#pagination a').addClass(\"loading\").text(\"\");\n const resp = await fetch(pagination_a.getAttribute(\"href\") + \"#main\");\n const text = await resp.text();\n //在进行DOM操作前检查页面是否已经变化,防止错误加载到其他页面上\n if (now_href != document.location.href)\n return; /**如果页面状态发生了变化,那么也应该不用理加载提示符 */\n const parser = new DOMParser(), DOM = parser.parseFromString(text, \"text/html\"), result = DOM.querySelectorAll(\"#main .post, #shuoshuo_post\"), paga = DOM.querySelector(\"#pagination a\"), paga_innerText = paga && paga.innerText, nextHref = paga && paga.getAttribute(\"href\"), main = document.getElementById(\"main\");\n for (let i = 0; i < result.length; i++) {\n main.append(result[i]);\n }\n //if (resp.ok) {\n // result = $(data).find(\"#main .post\");\n // nextHref = $(data).find(\"#pagination a\").attr(\"href\");\n // $(\"#main\").append(result.fadeIn(500));\n const dpga = document.querySelector(\"#pagination a\"), addps = document.querySelector(\"#add_post span\");\n if (dpga) {\n dpga.classList.remove(\"loading\");\n dpga.innerText = paga_innerText;\n }\n if (addps) {\n addps.classList.remove(\"loading\");\n addps.innerText = \"\";\n }\n // $(\"#pagination a\").removeClass(\"loading\").text(\"Previous\");\n // $('#add_post span').removeClass(\"loading\").text(\"\");\n lazyload();\n code_highlight_style();\n post_list_show_animation();\n document.dispatchEvent(new CustomEvent('ajax_post_loaded'));\n if (nextHref != undefined) {\n pagination_a.setAttribute(\"href\", nextHref);\n // $(\"#pagination a\").attr(\"href\", nextHref);\n //加载完成上滑\n let tempScrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;\n // window.scrollTo(tempScrollTop);\n // $(window).scrollTop(tempScrollTop);\n window.scrollTo({\n top: tempScrollTop + 300,\n behavior: 'smooth'\n });\n // $body.animate({\n // scrollTop: tempScrollTop + 300\n //\n // }, 666)\n }\n else {\n document.getElementById(\"pagination\").innerHTML = \"\" + __(\"很高兴你翻到这里,但是真的没有了...\") + \"\";\n // $(\"#pagination\").html(\"很高兴你翻到这里,但是真的没有了...\");\n }\n //}\n /* $.ajax({\n type: \"POST\",\n url: $('#pagination a').attr(\"href\") + \"#main\",\n success: function (data) {\n result = $(data).find(\"#main .post\");\n nextHref = $(data).find(\"#pagination a\").attr(\"href\");\n $(\"#main\").append(result.fadeIn(500));\n $(\"#pagination a\").removeClass(\"loading\").text(\"Previous\");\n $('#add_post span').removeClass(\"loading\").text(\"\");\n lazyload();\n post_list_show_animation();\n if (nextHref != undefined) {\n $(\"#pagination a\").attr(\"href\", nextHref);\n //加载完成上滑\n var tempScrollTop = $(window).scrollTop();\n $(window).scrollTop(tempScrollTop);\n $body.animate({\n scrollTop: tempScrollTop + 300\n\n }, 666)\n } else {\n $(\"#pagination\").html(\"很高兴你翻到这里,但是真的没有了...\");\n }\n }\n }); */\n});\nexport function post_list_show_animation() {\n const articles = document.querySelectorAll('article.post-list-thumb');\n if (articles) {\n const io = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n entry.target.classList.add(\"post-list-show\");\n }\n else if (!entry.target.classList.contains(\"post-list-show\")) {\n return;\n }\n const target = entry.target;\n target.style.willChange = 'auto';\n io.unobserve(target);\n const thumbImage = target.querySelector('.post-thumb img');\n if (thumbImage) {\n let finalImageElement = thumbImage;\n if (thumbImage.classList.contains('lazyload')) {\n finalImageElement = document.createElement('img');\n finalImageElement.src = thumbImage.getAttribute('data-src');\n finalImageElement.crossOrigin = \"anonymous\";\n }\n getThemeColorFromImageElement(finalImageElement)\n .then(rgba => {\n if (!rgba)\n return;\n const style = target.style;\n style.setProperty('--article-theme', `rgba(${rgba[0]},${rgba[1]},${rgba[2]},${rgba[3] / 255})`);\n style.setProperty('--article-theme-highlight', hslaCSSText(getHighlight(rgba)));\n style.setProperty('--article-theme-foreground', hslaCSSText(getForeground(rgba)));\n });\n }\n }\n }, {\n root: null,\n threshold: [0.66]\n });\n for (const article of articles) {\n io.observe(article);\n }\n }\n}\nfunction XLS_Listener(e) {\n //要求是#pagination只有anchor一个直接子后代\n if (e.target.parentElement.id == 'pagination') {\n e.preventDefault();\n e.stopPropagation();\n clearTimeout(load_post_timer);\n load_post();\n }\n}\nexport function XLS() {\n const intersectionObserver = new IntersectionObserver((entries) => {\n if (entries[0].intersectionRatio <= 0)\n return;\n // var page_next = $('#pagination a').attr(\"href\");\n const _page_next = document.querySelector('#pagination a');\n if (_page_next) {\n const href_page_next = _page_next.getAttribute(\"href\"), load_key = document.getElementById(\"add_post_time\");\n if (href_page_next != undefined && load_key) {\n const load_time = load_key.title;\n if (load_time != \"233\") {\n console.log(\"%c 自动加载时倒计时 %c\", \"background:#9a9da2; color:#ffffff; border-radius:4px;\", \"\", \"\", load_time);\n load_post_timer = setTimeout(load_post, parseInt(load_time, 10) * 1000);\n }\n }\n }\n });\n intersectionObserver.observe(document.querySelector('.footer-device'));\n document.body.removeEventListener('click', XLS_Listener);\n document.body.addEventListener(\"click\", XLS_Listener);\n}\n","export default function showcard() {\n for (const showcard of document.querySelectorAll('.showcard')) {\n const img = showcard.querySelector('.img');\n const button = showcard.querySelector('.showcard-button');\n if (!img || !button) {\n throw new Error('invalid structure for .showcard');\n }\n img.addEventListener('mouseover', function () {\n button.classList.add('hover');\n });\n img.addEventListener('mouseout', function () {\n button.classList.remove('hover');\n });\n }\n}\n","let lastMsgId = 0;\nexport default class PromiseWorker {\n w;\n cb = {};\n [Symbol.dispose];\n constructor(worker) {\n this.w = worker;\n const callback = (e) => {\n const payload = e.data;\n const messageId = payload[0];\n const callback = this.cb[messageId];\n if (!callback)\n return;\n delete this.cb[messageId];\n callback(payload[1], payload[2]);\n };\n worker.addEventListener('message', callback);\n this.postMessage = (message, ...extraArgs) => {\n const messageId = lastMsgId++;\n const messageToSend = [messageId, message];\n return new Promise((resolve, reject) => {\n this.cb[messageId] = (error, result) => {\n if (error) {\n return reject(new Error(error.message));\n }\n resolve(result);\n };\n this.w.postMessage(messageToSend, ...extraArgs);\n });\n };\n this[Symbol.dispose] = () => {\n worker.removeEventListener('message', callback);\n };\n }\n postMessage;\n}\n","/**\n * RGB space.\n *\n * @module color-space/rgb\n */\n\nexport default {\n\tname: 'rgb',\n\tmin: [0,0,0],\n\tmax: [255,255,255],\n\tchannel: ['red', 'green', 'blue'],\n\talias: ['RGB']\n};\n","/**\n * @module color-space/hsl\n */\nimport rgb from './rgb.js';\n\nexport default {\n\tname: 'hsl',\n\tmin: [0,0,0],\n\tmax: [360,100,100],\n\tchannel: ['hue', 'saturation', 'lightness'],\n\talias: ['HSL'],\n\n\trgb: function(hsl) {\n\t\tvar h = hsl[0]/360, s = hsl[1]/100, l = hsl[2]/100, t1, t2, t3, rgb, val, i=0;\n\n\t\tif (s === 0) return val = l * 255, [val, val, val];\n\n\t\tt2 = l < 0.5 ? l * (1 + s) : l + s - l * s;\n\t\tt1 = 2 * l - t2;\n\n\t\trgb = [0, 0, 0];\n\t\tfor (;i<3;) {\n\t\t\tt3 = h + 1 / 3 * - (i - 1);\n\t\t\tt3 < 0 ? t3++ : t3 > 1 && t3--;\n\t\t\tval = 6 * t3 < 1 ? t1 + (t2 - t1) * 6 * t3 :\n\t\t\t2 * t3 < 1 ? t2 :\n\t\t\t3 * t3 < 2 ? t1 + (t2 - t1) * (2 / 3 - t3) * 6 :\n\t\t\tt1;\n\t\t\trgb[i++] = val * 255;\n\t\t}\n\n\t\treturn rgb;\n\t}\n};\n\n\n//extend rgb\nrgb.hsl = function(rgb) {\n\tvar r = rgb[0]/255,\n\t\t\tg = rgb[1]/255,\n\t\t\tb = rgb[2]/255,\n\t\t\tmin = Math.min(r, g, b),\n\t\t\tmax = Math.max(r, g, b),\n\t\t\tdelta = max - min,\n\t\t\th, s, l;\n\n\tif (max === min) {\n\t\th = 0;\n\t}\n\telse if (r === max) {\n\t\th = (g - b) / delta;\n\t}\n\telse if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t}\n\telse if (b === max) {\n\t\th = 4 + (r - g)/ delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tl = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t}\n\telse if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t}\n\telse {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n","/**\n * CIE XYZ\n *\n * @module color-space/xyz\n */\nimport rgb from './rgb.js';\n\nvar xyz = {\n\tname: 'xyz',\n\tmin: [0,0,0],\n\tchannel: ['X','Y','Z'],\n\talias: ['XYZ', 'ciexyz', 'cie1931']\n};\n\n\n/**\n * Whitepoint reference values with observer/illuminant\n *\n * http://en.wikipedia.org/wiki/Standard_illuminant\n */\nxyz.whitepoint = {\n\t//1931 2°\n\t2: {\n\t\t//incadescent\n\t\tA:[109.85, 100, 35.585],\n\t\t// B:[],\n\t\tC: [98.074, 100, 118.232],\n\t\tD50: [96.422, 100, 82.521],\n\t\tD55: [95.682, 100, 92.149],\n\t\t//daylight\n\t\tD65: [95.045592705167, 100, 108.9057750759878],\n\t\tD75: [94.972, 100, 122.638],\n\t\t//flourescent\n\t\t// F1: [],\n\t\tF2: [99.187, 100, 67.395],\n\t\t// F3: [],\n\t\t// F4: [],\n\t\t// F5: [],\n\t\t// F6:[],\n\t\tF7: [95.044, 100, 108.755],\n\t\t// F8: [],\n\t\t// F9: [],\n\t\t// F10: [],\n\t\tF11: [100.966, 100, 64.370],\n\t\t// F12: [],\n\t\tE: [100,100,100]\n\t},\n\n\t//1964 10°\n\t10: {\n\t\t//incadescent\n\t\tA:[111.144, 100, 35.200],\n\t\tC: [97.285, 100, 116.145],\n\t\tD50: [96.720, 100, 81.427],\n\t\tD55: [95.799, 100, 90.926],\n\t\t//daylight\n\t\tD65: [94.811, 100, 107.304],\n\t\tD75: [94.416, 100, 120.641],\n\t\t//flourescent\n\t\tF2: [103.280, 100, 69.026],\n\t\tF7: [95.792, 100, 107.687],\n\t\tF11: [103.866, 100, 65.627],\n\t\tE: [100,100,100]\n\t}\n};\n\n\n/**\n * Top values are the whitepoint’s top values, default are D65\n */\nxyz.max = xyz.whitepoint[2].D65;\n\n\n/**\n * Transform xyz to rgb\n *\n * @param {Array} xyz Array of xyz values\n *\n * @return {Array} RGB values\n */\nxyz.rgb = function (_xyz, white) {\n\t//FIXME: make sure we have to divide like this. Probably we have to replace matrix as well then\n\twhite = white || xyz.whitepoint[2].E;\n\n\tvar x = _xyz[0] / white[0],\n\t\ty = _xyz[1] / white[1],\n\t\tz = _xyz[2] / white[2],\n\t\tr, g, b;\n\n\t// assume sRGB\n\t// http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html\n\tr = (x * 3.240969941904521) + (y * -1.537383177570093) + (z * -0.498610760293);\n\tg = (x * -0.96924363628087) + (y * 1.87596750150772) + (z * 0.041555057407175);\n\tb = (x * 0.055630079696993) + (y * -0.20397695888897) + (z * 1.056971514242878);\n\n\tr = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n\t\t: r = (r * 12.92);\n\n\tg = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n\t\t: g = (g * 12.92);\n\n\tb = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n\t\t: b = (b * 12.92);\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n}\n\n\n\n/**\n * RGB to XYZ\n *\n * @param {Array} rgb RGB channels\n *\n * @return {Array} XYZ channels\n */\nrgb.xyz = function(rgb, white) {\n\tvar r = rgb[0] / 255,\n\t\t\tg = rgb[1] / 255,\n\t\t\tb = rgb[2] / 255;\n\n\t// assume sRGB\n\tr = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n\tvar x = (r * 0.41239079926595) + (g * 0.35758433938387) + (b * 0.18048078840183);\n\tvar y = (r * 0.21263900587151) + (g * 0.71516867876775) + (b * 0.072192315360733);\n\tvar z = (r * 0.019330818715591) + (g * 0.11919477979462) + (b * 0.95053215224966);\n\n\twhite = white || xyz.whitepoint[2].E;\n\n\treturn [x * white[0], y * white[1], z * white[2]];\n};\n\n\n\nexport default xyz;\n","/**\n * CIE LAB space model\n *\n * @module color-space/lab\n */\n\nimport xyz from './xyz.js';\n\nexport default {\n\tname: 'lab',\n\tmin: [0,-100,-100],\n\tmax: [100,100,100],\n\tchannel: ['lightness', 'a', 'b'],\n\talias: ['LAB', 'cielab'],\n\n\txyz: function(lab) {\n\t\tvar l = lab[0],\n\t\t\t\ta = lab[1],\n\t\t\t\tb = lab[2],\n\t\t\t\tx, y, z, y2;\n\n\t\tif (l <= 8) {\n\t\t\ty = (l * 100) / 903.3;\n\t\t\ty2 = (7.787 * (y / 100)) + (16 / 116);\n\t\t} else {\n\t\t\ty = 100 * Math.pow((l + 16) / 116, 3);\n\t\t\ty2 = Math.pow(y / 100, 1/3);\n\t\t}\n\n\t\tx = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3);\n\n\t\tz = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3);\n\n\t\treturn [x, y, z];\n\t}\n};\n\n\n//extend xyz\nxyz.lab = function(xyz){\n\tvar x = xyz[0],\n\t\t\ty = xyz[1],\n\t\t\tz = xyz[2],\n\t\t\tl, a, b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n","import rgb from 'color-space/rgb.js';\nimport xyz from 'color-space/xyz.js';\nimport lab from 'color-space/lab.js';\n\nfunction _filled_array(fillWith, count) {\n const array = [];\n for (let i = 0; i < count; i++) {\n array.push(fillWith);\n }\n return array;\n}\nfunction euclidean_distance_squared_index(a, a_start, b) {\n const r = a[a_start++] - b[0];\n const g = a[a_start++] - b[1];\n const _b = a[a_start++] - b[2];\n return r ** 2 + g ** 2 + _b ** 2;\n}\nfunction kmeans(data, k, maxAttempt, thresold = 2, clipAlpha = false) {\n const cluster_sum = [];\n const thresold_squared = thresold ** 2;\n let pixelCount = data.length / 4;\n let cluster_centers = [];\n let new_cluster_centers = [];\n let iteration = 0;\n const isDataTypedArray = data instanceof Uint8ClampedArray;\n const PIXEL_LEN = clipAlpha ? 3 : 4;\n if (clipAlpha) {\n let j = 0;\n const dataNoAlpha = isDataTypedArray ? new Uint8ClampedArray(pixelCount * 3) : [];\n for (let i = 0; i < data.length; ) {\n if (data[i + 3] == 0) {\n i += 4;\n continue;\n }\n dataNoAlpha[j++] = data[i++];\n dataNoAlpha[j++] = data[i++];\n dataNoAlpha[j++] = data[i++];\n i++;\n }\n data = dataNoAlpha.slice(0, j);\n pixelCount = j / 3;\n }\n for (let i = 0; i < k; i++) {\n const start = Math.floor(1 * (pixelCount - 1)) * PIXEL_LEN;\n cluster_centers.push(\n /* Array.from */\n data.slice(start, start + 3)\n );\n new_cluster_centers.push(isDataTypedArray ? new Uint8ClampedArray(3) : _filled_array(0, 3));\n cluster_sum.push(_filled_array(0, 4));\n }\n while (iteration < maxAttempt) {\n for (let i = 0; i < data.length; ) {\n let cluster_index = 0;\n let _min_distance = euclidean_distance_squared_index(data, i, cluster_centers[0]);\n for (let j = 1; j < k; j++) {\n const distance = euclidean_distance_squared_index(data, i, cluster_centers[j]);\n if (distance < _min_distance) {\n _min_distance = distance;\n cluster_index = j;\n }\n }\n const sum = cluster_sum[cluster_index];\n sum[0] += data[i++];\n sum[1] += data[i++];\n sum[2] += data[i++];\n sum[3]++;\n if (PIXEL_LEN === 4) i++;\n }\n let allStabled = true;\n for (let i = 0; i < k; i++) {\n const rgbc = cluster_sum[i];\n const count = rgbc[3];\n if (count == 0) {\n const start = Math.floor(Math.random() * (pixelCount - 1)) * PIXEL_LEN;\n new_cluster_centers[i] = /* Array.from */\n data.slice(start, start + 3);\n allStabled = false;\n } else {\n let new_center = new_cluster_centers[i];\n let diffSquared = 0;\n for (let j = 0; j < 3; j++) {\n new_center[j] = rgbc[j] / count;\n diffSquared += (new_center[j] - cluster_centers[i][j]) ** 2;\n }\n if (diffSquared > thresold_squared) {\n allStabled = false;\n }\n }\n }\n if (allStabled) {\n return {\n centroid: new_cluster_centers,\n iteration,\n fit: true,\n label: cluster_sum.map((v) => v[3]),\n size: pixelCount\n };\n }\n const medium = cluster_centers;\n cluster_centers = new_cluster_centers;\n new_cluster_centers = medium;\n iteration++;\n for (let i = 0; i < k; i++) {\n cluster_sum[i].fill(0);\n }\n }\n return {\n centroid: cluster_centers,\n iteration,\n fit: false,\n label: cluster_sum.map((v) => v[3]),\n size: pixelCount\n };\n}\n\n/**\n * NeuQuant Neural-Network Quantization Algorithm\n *\n * Copyright (c) 1994 Anthony Dekker\n *\n * See \"Kohonen neural networks for optimal colour quantization\" in \"Network:\n * Computation in Neural Systems\" Vol. 5 (1994) pp 351-367. for a discussion of\n * the algorithm.\n *\n * See also http://members.ozemail.com.au/~dekker/NEUQUANT.HTML\n *\n * Any party obtaining a copy of these files from the author, directly or\n * indirectly, is granted, free of charge, a full and unrestricted irrevocable,\n * world-wide, paid up, royalty-free, nonexclusive right and license to deal in\n * this software and documentation files (the \"Software\"), including without\n * limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons who\n * receive copies from any such party to do so, with the only requirement being\n * that this copyright notice remain intact.\n *\n * Copyright (c) 2012 Johan Nordberg (JavaScript port)\n * Copyright (c) 2014 Devon Govett (JavaScript port)\n */\n\nconst prime1 = 499;\nconst prime2 = 491;\nconst prime3 = 487;\nconst prime4 = 503;\n\nconst maxprime = Math.max(prime1, prime2, prime3, prime4);\nconst minpicturebytes = (3 * maxprime);\n\nconst defaults = {\n ncycles: 100,\n netsize: 256,\n samplefac: 10\n};\n\nconst assign = function (target) {\n for (let i = 1, l = arguments.length; i < l; i++) {\n const nextSource = arguments[i];\n if (nextSource != null) {\n for (const nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n target[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return target\n};\n\nclass NeuQuant {\n constructor (pixels, options) {\n assign(this, defaults, {pixels}, options);\n\n if (this.netsize < 4 || this.netsize > 256) {\n throw new Error('Color count must be between 4 and 256')\n }\n\n if (this.samplefac < 1 || this.samplefac > 30) {\n throw new Error('Sampling factor must be between 1 and 30')\n }\n\n this.maxnetpos = this.netsize - 1;\n\n this.netbiasshift = 4;\n this.intbiasshift = 16;\n this.intbias = (1 << this.intbiasshift);\n this.gammashift = 10;\n this.gamma = (1 << this.gammashift);\n this.betashift = 10;\n this.beta = (this.intbias >> this.betashift);\n this.betagamma = (this.beta * this.gamma);\n\n this.initrad = (this.netsize >> 3);\n this.radiusbiasshift = 6;\n this.radiusbias = (1 << this.radiusbiasshift);\n this.initradius = (this.initrad * this.radiusbias);\n this.radiusdec = 30;\n\n this.alphabiasshift = 10;\n this.initalpha = (1 << this.alphabiasshift);\n\n this.radbiasshift = 8;\n this.radbias = (1 << this.radbiasshift);\n this.alpharadbshift = (this.alphabiasshift + this.radbiasshift);\n this.alpharadbias = (1 << this.alpharadbshift);\n\n this.network = [];\n this.netindex = new Uint32Array(256);\n this.bias = new Uint32Array(this.netsize);\n this.freq = new Uint32Array(this.netsize);\n this.radpower = new Uint32Array(this.netsize >> 3);\n\n for (let i = 0, l = this.netsize; i < l; i++) {\n let v = (i << (this.netbiasshift + 8)) / this.netsize;\n this.network[i] = new Float64Array([v, v, v, 0]);\n this.freq[i] = this.intbias / this.netsize;\n this.bias[i] = 0;\n }\n }\n\n unbiasnet () {\n for (let i = 0, l = this.netsize; i < l; i++) {\n this.network[i][0] >>= this.netbiasshift;\n this.network[i][1] >>= this.netbiasshift;\n this.network[i][2] >>= this.netbiasshift;\n this.network[i][3] = i;\n }\n }\n\n altersingle (alpha, i, b, g, r) {\n this.network[i][0] -= (alpha * (this.network[i][0] - b)) / this.initalpha;\n this.network[i][1] -= (alpha * (this.network[i][1] - g)) / this.initalpha;\n this.network[i][2] -= (alpha * (this.network[i][2] - r)) / this.initalpha;\n }\n\n alterneigh (radius, i, b, g, r) {\n const lo = Math.abs(i - radius);\n const hi = Math.min(i + radius, this.netsize);\n\n let j = i + 1;\n let k = i - 1;\n let m = 1;\n\n while ((j < hi) || (k > lo)) {\n const a = this.radpower[m++];\n\n if (j < hi) {\n const p = this.network[j++];\n p[0] -= (a * (p[0] - b)) / this.alpharadbias;\n p[1] -= (a * (p[1] - g)) / this.alpharadbias;\n p[2] -= (a * (p[2] - r)) / this.alpharadbias;\n }\n\n if (k > lo) {\n const p = this.network[k--];\n p[0] -= (a * (p[0] - b)) / this.alpharadbias;\n p[1] -= (a * (p[1] - g)) / this.alpharadbias;\n p[2] -= (a * (p[2] - r)) / this.alpharadbias;\n }\n }\n }\n\n contest (b, g, r) {\n let bestd = ~(1 << 31);\n let bestbiasd = bestd;\n let bestpos = -1;\n let bestbiaspos = bestpos;\n\n for (let i = 0, l = this.netsize; i < l; i++) {\n let n = this.network[i];\n\n let dist = Math.abs(n[0] - b) + Math.abs(n[1] - g) + Math.abs(n[2] - r);\n if (dist < bestd) {\n bestd = dist;\n bestpos = i;\n }\n\n let biasdist = dist - ((this.bias[i]) >> (this.intbiasshift - this.netbiasshift));\n if (biasdist < bestbiasd) {\n bestbiasd = biasdist;\n bestbiaspos = i;\n }\n\n let betafreq = (this.freq[i] >> this.betashift);\n this.freq[i] -= betafreq;\n this.bias[i] += (betafreq << this.gammashift);\n }\n\n this.freq[bestpos] += this.beta;\n this.bias[bestpos] -= this.betagamma;\n\n return bestbiaspos\n }\n\n inxbuild () {\n let previouscol = 0;\n let startpos = 0;\n\n for (let i = 0, l = this.netsize; i < l; i++) {\n let p = this.network[i];\n let q = null;\n let smallpos = i;\n let smallval = p[1];\n\n for (let j = i + 1; j < l; j++) {\n q = this.network[j];\n if (q[1] < smallval) {\n smallpos = j;\n smallval = q[1];\n }\n }\n q = this.network[smallpos];\n\n if (i !== smallpos) {\n [p[0], q[0]] = [q[0], p[0]];\n [p[1], q[1]] = [q[1], p[1]];\n [p[2], q[2]] = [q[2], p[2]];\n [p[3], q[3]] = [q[3], p[3]];\n }\n\n if (smallval !== previouscol) {\n this.netindex[previouscol] = (startpos + i) >> 1;\n for (let j = previouscol + 1; j < smallval; j++) {\n this.netindex[j] = i;\n }\n previouscol = smallval;\n startpos = i;\n }\n }\n\n this.netindex[previouscol] = (startpos + this.maxnetpos) >> 1;\n for (let i = previouscol + 1; i < 256; i++) {\n this.netindex[i] = this.maxnetpos;\n }\n }\n\n learn () {\n const lengthcount = this.pixels.length;\n const alphadec = 30 + ((this.samplefac - 1) / 3);\n const samplepixels = lengthcount / (3 * this.samplefac);\n\n let delta = samplepixels / this.ncycles | 0;\n let alpha = this.initalpha;\n let radius = this.initradius;\n\n let rad = radius >> this.radiusbiasshift;\n\n if (rad <= 1) {\n rad = 0;\n }\n\n for (let i = 0; i < rad; i++) {\n this.radpower[i] = alpha * (((rad * rad - i * i) * this.radbias) / (rad * rad));\n }\n\n let step;\n if (lengthcount < minpicturebytes) {\n this.samplefac = 1;\n step = 3;\n } else if ((lengthcount % prime1) !== 0) {\n step = 3 * prime1;\n } else if ((lengthcount % prime2) !== 0) {\n step = 3 * prime2;\n } else if ((lengthcount % prime3) !== 0) {\n step = 3 * prime3;\n } else {\n step = 3 * prime4;\n }\n\n let pix = 0;\n\n for (let i = 0; i < samplepixels;) {\n let b = (this.pixels[pix] & 0xff) << this.netbiasshift;\n let g = (this.pixels[pix + 1] & 0xff) << this.netbiasshift;\n let r = (this.pixels[pix + 2] & 0xff) << this.netbiasshift;\n\n let j = this.contest(b, g, r);\n this.altersingle(alpha, j, b, g, r);\n if (rad !== 0) {\n this.alterneigh(rad, j, b, g, r);\n }\n\n pix += step;\n if (pix >= lengthcount) {\n pix -= lengthcount;\n }\n\n if (delta === 0) {\n delta = 1;\n }\n\n if (++i % delta === 0) {\n alpha -= alpha / alphadec;\n radius -= radius / this.radiusdec;\n rad = radius >> this.radiusbiasshift;\n\n if (rad <= 1) {\n rad = 0;\n }\n\n for (let k = 0; k < rad; k++) {\n this.radpower[k] = alpha * (((rad * rad - k * k) * this.radbias) / (rad * rad));\n }\n }\n }\n }\n\n buildColorMap () {\n this.learn();\n this.unbiasnet();\n this.inxbuild();\n }\n\n getColorMap () {\n const map = new Uint8Array(this.netsize * 3);\n const index = new Uint8Array(this.netsize);\n\n for (let i = 0, l = this.netsize; i < l; i++) {\n index[this.network[i][3]] = i;\n }\n\n for (let i = 0, j = 0, k = 0, l = this.netsize; i < l; i++) {\n k = index[i];\n map[j++] = this.network[k][0] & 0xff;\n map[j++] = this.network[k][1] & 0xff;\n map[j++] = this.network[k][2] & 0xff;\n }\n\n return map\n }\n}\n\nfunction findClosest (palette, r, g, b) {\n let minpos = 0;\n let mind = 256 * 256 * 256;\n\n for (let i = 0, l = palette.length; i < l;) {\n const dr = r - palette[i++];\n const dg = g - palette[i++];\n const db = b - palette[i];\n const d = dr * dr + dg * dg + db * db;\n const pos = i / 3 | 0;\n\n if (d < mind) {\n mind = d;\n minpos = pos;\n }\n\n i++;\n }\n\n return minpos\n}\n\nfunction palette (pixels, options) {\n const nq = new NeuQuant(pixels, options);\n nq.buildColorMap();\n return nq.getColorMap()\n}\n\nfunction indexed (pixels, palette) {\n const indexed = new Uint8Array(pixels.length / 3);\n const memo = {};\n\n for (let i = 0, j = 0, l = pixels.length; i < l;) {\n const r = pixels[i++];\n const g = pixels[i++];\n const b = pixels[i++];\n const k = r << 16 | g << 8 | b;\n\n if (k in memo) {\n indexed[j++] = memo[k];\n } else {\n indexed[j++] = memo[k] = findClosest(palette, r, g, b);\n }\n }\n\n return indexed\n}\n\nfunction rgba2Rgb(data) {\n const rgb = new Uint8ClampedArray(data.length / 4 * 3);\n const len = data.length;\n let rgb_i = 0;\n for (let i = 0; i < len; ) {\n for (let j = 0; j < 3; j++) {\n rgb[rgb_i++] = data[i++];\n }\n i++;\n }\n return rgb;\n}\nfunction neuquant(img, k, samplefac = 1) {\n const img_rgb = rgba2Rgb(img);\n const palette$1 = palette(img_rgb, { netsize: k, samplefac });\n const indexed_pixel = indexed(img_rgb, palette$1);\n const pixel = [];\n const len = palette$1.length;\n for (let i = 0; i < len; ) {\n pixel.push([palette$1[i++], palette$1[i++], palette$1[i++], 255]);\n }\n return { centroid: pixel, label: count(k, indexed_pixel) };\n}\nfunction count(k, index) {\n const counts = new Array(k).fill(0);\n for (const i of index) {\n counts[i]++;\n }\n return counts;\n}\n\nfunction _prepare2DContext(width, height) {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n canvas.height = height;\n canvas.width = width;\n return ctx;\n}\nfunction _prepare2DContextAsync(width, height) {\n const canvas = new OffscreenCanvas(width, height);\n const ctx = canvas.getContext(\"2d\");\n return ctx;\n}\nfunction awaitImage(imgElement) {\n return new Promise((resolve, reject) => {\n if (imgElement.complete) {\n resolve();\n } else {\n imgElement.addEventListener(\"load\", (e) => {\n resolve(e);\n });\n imgElement.addEventListener(\"error\", (reason) => {\n reject(reason);\n });\n }\n });\n}\nfunction _readImage(prepareCtx, imgSource) {\n const { naturalWidth, naturalHeight } = imgSource;\n const ctx = prepareCtx(naturalWidth, naturalHeight);\n ctx.drawImage(imgSource, 0, 0, naturalWidth, naturalHeight);\n return ctx.getImageData(0, 0, naturalWidth, naturalHeight);\n}\nconst readImage = _readImage.bind(void 0, _prepare2DContext);\nconst readImageOffscreen = _readImage.bind(void 0, _prepare2DContextAsync);\nfunction _readImageDownsampling(prepareCtx, imgSource, maxSample) {\n let { naturalWidth: width, naturalHeight: height } = imgSource;\n const scale = width * height / maxSample;\n if (scale > 1) {\n const scaleSqrt = Math.sqrt(scale);\n width = width / scaleSqrt | 0;\n height = height / scaleSqrt | 0;\n }\n const ctx = prepareCtx(width, height);\n ctx.drawImage(imgSource, 0, 0, width, height);\n return ctx.getImageData(0, 0, width, height);\n}\nconst readImageDownsampling = _readImageDownsampling.bind(void 0, _prepare2DContext);\nconst readImageDownsamplingOffscreen = _readImageDownsampling.bind(void 0, _prepare2DContextAsync);\n\nfunction convertToLab(source) {\n const array = [];\n for (let i = 0; i < source.length; i += 4) {\n const pixel = source.slice(i, i + 4);\n const alpha = pixel[3];\n const pixel_rgb = pixel.slice(0, 3);\n const pixel_xyz = rgb.xyz(pixel_rgb);\n const pixel_lab = xyz.lab(pixel_xyz);\n array.push(...pixel_lab, alpha);\n }\n return array;\n}\nfunction labaToRGBA(laba) {\n const pixel_lab = laba.slice(0, 3);\n const alpha = laba[3];\n const pixel_xyz = lab.xyz(pixel_lab);\n const pixel_rgb = xyz.rgb(pixel_xyz);\n pixel_rgb.push(alpha);\n return pixel_rgb;\n}\n\nfunction max_min_of_three([a, b, c]) {\n if (a > b) {\n if (b > c) {\n return [a, c];\n } else {\n if (a > c) {\n return [a, b];\n } else {\n return [c, b];\n }\n }\n } else {\n if (b > c) {\n if (c > a) {\n return [b, a];\n } else {\n return [b, c];\n }\n } else {\n return [c, a];\n }\n }\n}\n\nfunction normalizeRGBA(rgba) {\n return rgba.map((v) => v / 255);\n}\nfunction rgbaToHSLA(rgba) {\n let h, s;\n const [max, min] = max_min_of_three(rgba);\n const diff = max - min;\n const light_2x = max + min;\n if (diff == 0) {\n h = 0;\n s = 0;\n } else {\n if (max == rgba[0]) {\n const temp_h = 60 * (rgba[1] - rgba[2]) / diff;\n if (temp_h < 0) {\n h = temp_h + 360;\n } else {\n h = temp_h;\n }\n } else if (max == rgba[1]) {\n h = 60 * (rgba[2] - rgba[0]) / diff + 120;\n } else {\n h = 60 * (rgba[0] - rgba[1]) / diff + 240;\n }\n if (light_2x == 0) {\n s = 0;\n } else if (light_2x <= 1) {\n s = diff / light_2x;\n } else {\n s = diff / (2 - light_2x);\n }\n }\n return [h, s, light_2x / 2, rgba[3]];\n}\nconst getVector4Comparer = (sort = [0, 1, 2, 3]) => (a, b) => {\n let result;\n for (const s of sort) {\n result = a[s] - b[s];\n if (result != 0) {\n return result;\n }\n }\n return result;\n};\nconst hslaCSSText = ([h, s, l, a]) => `hsla(${h}deg,${s * 100}%,${l * 100}%,${a})`;\nconst rgbaCSSText = (pixel) => `rgba(${pixel.map((v) => Math.floor(v)).join(\",\")})`;\n\nexport { awaitImage, convertToLab, getVector4Comparer, hslaCSSText, kmeans, labaToRGBA, neuquant, normalizeRGBA, readImage, readImageDownsampling, readImageDownsamplingOffscreen, readImageOffscreen, rgbaCSSText, rgbaToHSLA };\n","import PromiseWorker from '@kotorik/promise-worker';\nimport { isInDarkMode } from '../darkmode';\n//@ts-ignore\nimport 'color-space/hsl';\n//@ts-ignore\nimport rgb from 'color-space/rgb';\nimport { awaitImage, readImageDownsampling } from '@kotorik/palette';\nconst originalThemeSkinMatcing = getComputedStyle(document.documentElement).getPropertyValue('--theme-skin-matching');\nconst worker = new PromiseWorker(new Worker(new URL('./worker.ts', import.meta.url)));\nlet currentColor = [0, 0, 0, 0];\nfunction hslaCSSText([h, s, l, a]) {\n if (a) {\n return \"hsla(\" + h + \"deg,\" + s + \"%,\" + l + \"%,\" + a + \")\";\n }\n else {\n return \"hsl(\" + h + \"deg,\" + s + \"%,\" + l + \"%)\";\n }\n}\nexport async function getThemeColorFromImageElement(imgElement) {\n try {\n await awaitImage(imgElement);\n const imageData = readImageDownsampling(imgElement, 10000);\n const result = await worker.postMessage(imageData.data, { transfer: [imageData.data.buffer] });\n return result;\n }\n catch (e) {\n console.error(e);\n return null;\n }\n}\nfunction _updateThemeColorMeta(color_css) {\n const meta = document.querySelector('meta[name=theme-color]');\n meta && (meta.content = color_css);\n}\nexport async function updateThemeSkin(coverBGUrl) {\n const imgElement = document.createElement('img');\n imgElement.src = coverBGUrl;\n imgElement.crossOrigin = \"anonymous\";\n const rgba = await getThemeColorFromImageElement(imgElement);\n if (rgba) {\n currentColor = rgba;\n _setColor();\n }\n else {\n _updateThemeColorMeta(originalThemeSkinMatcing); //回滚\n }\n}\nfunction _setColor(darkmode) {\n let hsla = rgb.hsl(currentColor);\n const darkmodeColor = [...hsla];\n darkmodeColor[2] *= 0.5;\n if (typeof darkmode == 'undefined' ? isInDarkMode() : darkmode) {\n hsla = darkmodeColor;\n }\n _updateThemeColorMeta(hslaCSSText(hsla));\n if (_iro.extract_theme_skin) {\n document.documentElement.style.setProperty('--theme-skin-matching', hslaCSSText(hsla));\n document.documentElement.style.setProperty('--theme-skin-dark', hslaCSSText(darkmodeColor));\n }\n /* const textColor = [0, 0, 0] as [number, number, number]\n \n if (hsla[2] > 40) {\n textColor[2] = 0.314\n } else {\n textColor[2] = 1 - 0.314\n }\n \n const style = document.documentElement.style\n const [h, s, l] = hsla\n style.setProperty('--header-color-h', h + 'deg')\n style.setProperty('--header-color-s', s + '%')\n style.setProperty('--header-color-l', l + '%')\n \n const siteHeader = document.querySelector32DcdkIaVe9dhe
zs@
Hitokoto API Setup Instructions
"
"[\"https://api.nmxc.ltd/yiyan/\", \"https://v1.hitokoto.cn/\"]
, where "
@@ -1551,19 +1563,19 @@ msgstr ""
"ラー。 https://api.nmxc.ltd/yiyan/"
"a>
Highlight.js: Default. Automatic language recognition. "
"p>
Follow client settings:Follow client browser " @@ -886,138 +896,138 @@ msgid "" "the client
" msgstr "" -#: options/theme-options.php:237 +#: options/theme-options.php:245 msgid "Automatic Switch Strategy of Dark Mode" msgstr "" -#: options/theme-options.php:240 +#: options/theme-options.php:248 msgid "Client local time" msgstr "" -#: options/theme-options.php:241 +#: options/theme-options.php:249 msgid "Follow client settings" msgstr "" -#: options/theme-options.php:242 +#: options/theme-options.php:250 msgid "Always on" msgstr "" -#: options/theme-options.php:250 +#: options/theme-options.php:258 msgid "Dark Mode Image Brightness" msgstr "" -#: options/theme-options.php:251 options/theme-options.php:262 +#: options/theme-options.php:259 options/theme-options.php:270 msgid "Slide to adjust, the recommended value range is 0.6-0.8" msgstr "" -#: options/theme-options.php:261 +#: options/theme-options.php:269 msgid "Dark Mode Component Transparency" msgstr "" -#: options/theme-options.php:271 +#: options/theme-options.php:279 msgid "Dark mode Background Transparency" msgstr "" -#: options/theme-options.php:272 +#: options/theme-options.php:280 msgid "" "Slide to adjust, the recommended value range is 0.6-0.8. In order to ensure the " "best appearance, please keep the display of the frontend background image" msgstr "" -#: options/theme-options.php:281 +#: options/theme-options.php:289 msgid "Other Appearance Related" msgstr "" -#: options/theme-options.php:287 +#: options/theme-options.php:295 msgid "Commemorate Mode" msgstr "" -#: options/theme-options.php:288 +#: options/theme-options.php:296 msgid "After turning on, a black and white filter will be added to the global theme" msgstr "" -#: options/theme-options.php:295 +#: options/theme-options.php:303 msgid "Occupying SVG while Loading Control Units" msgstr "" -#: options/theme-options.php:296 +#: options/theme-options.php:304 msgid "Fill in the address, which is the SVG displayed when loading control units" msgstr "" -#: options/theme-options.php:305 +#: options/theme-options.php:313 msgid "Font Options" msgstr "" -#: options/theme-options.php:312 +#: options/theme-options.php:320 msgid "" "You can click here to learn how to set the options " "on this page" msgstr "" -#: options/theme-options.php:317 +#: options/theme-options.php:325 msgid "Global" msgstr "" -#: options/theme-options.php:323 +#: options/theme-options.php:331 msgid "Non-Emphasis Text Weight" msgstr "" -#: options/theme-options.php:324 +#: options/theme-options.php:332 msgid "Slide to adjust, the recommended value range is 300-500" msgstr "" -#: options/theme-options.php:334 +#: options/theme-options.php:342 msgid "Text Font Size" msgstr "" -#: options/theme-options.php:335 options/theme-options.php:1534 +#: options/theme-options.php:343 options/theme-options.php:1542 msgid "Slide to adjust, the recommended value range is 15-18" msgstr "" -#: options/theme-options.php:345 +#: options/theme-options.php:353 msgid "External Fonts" msgstr "" -#: options/theme-options.php:351 +#: options/theme-options.php:359 msgid "Reference External Fonts" msgstr "" -#: options/theme-options.php:352 +#: options/theme-options.php:360 msgid "" "After turning on, you can use external fonts as the default font or other " "component fonts, but it may affect performance" msgstr "" -#: options/theme-options.php:359 +#: options/theme-options.php:367 msgid "External Font Options" msgstr "" -#: options/theme-options.php:365 +#: options/theme-options.php:373 msgid "Font 1 Name" msgstr "" -#: options/theme-options.php:370 +#: options/theme-options.php:378 msgid "Font 1 Link" msgstr "" -#: options/theme-options.php:375 +#: options/theme-options.php:383 msgid "Font 2 Name" msgstr "" -#: options/theme-options.php:380 +#: options/theme-options.php:388 msgid "Font 2 Link" msgstr "" -#: options/theme-options.php:394 +#: options/theme-options.php:402 msgid "Google Fonts Api Link" msgstr "" -#: options/theme-options.php:401 +#: options/theme-options.php:409 msgid "Google Fonts Name" msgstr "" -#: options/theme-options.php:402 +#: options/theme-options.php:410 msgid "" "Please make sure that the added fonts can be referenced in Google Fonts library. " "Fill in the font names. The added fonts must be preceded by \"|\". If multiple " @@ -1025,437 +1035,437 @@ msgid "" "use a plus sign instead. For example: | zcool + xiaowei| Ma + Shan + Zheng" msgstr "" -#: options/theme-options.php:410 +#: options/theme-options.php:418 msgid "Navigation Menu Options" msgstr "" -#: options/theme-options.php:417 +#: options/theme-options.php:425 msgid "" "You can click here to learn how " "to set the options on this page" msgstr "" -#: options/theme-options.php:423 +#: options/theme-options.php:431 msgid "Nav Menu Style" msgstr "" -#: options/theme-options.php:434 +#: options/theme-options.php:442 msgid "Nav Menu Radius" msgstr "" -#: options/theme-options.php:436 options/theme-options.php:531 -#: options/theme-options.php:2306 +#: options/theme-options.php:444 options/theme-options.php:539 +#: options/theme-options.php:2314 msgid "Slide to adjust, the recommended value is 15" msgstr "" -#: options/theme-options.php:445 +#: options/theme-options.php:453 msgid "Nav Menu Content Display Method" msgstr "" -#: options/theme-options.php:446 +#: options/theme-options.php:454 msgid "You can choose to unfold or fold the nav menu contents" msgstr "" -#: options/theme-options.php:448 +#: options/theme-options.php:456 msgid "Unfold" msgstr "" -#: options/theme-options.php:449 +#: options/theme-options.php:457 msgid "Fold" msgstr "" -#: options/theme-options.php:457 +#: options/theme-options.php:465 msgid "Nav Menu Animation Effects" msgstr "" -#: options/theme-options.php:458 +#: options/theme-options.php:466 msgid "" "It is on by default. If it is off, the nav menu content will be displayed " "directly without effects" msgstr "" -#: options/theme-options.php:465 +#: options/theme-options.php:473 msgid "Nav Menu Animation Time" msgstr "" -#: options/theme-options.php:467 options/theme-options.php:1432 +#: options/theme-options.php:475 options/theme-options.php:1440 msgid "Slide to adjust, the recommended value range is 1-2" msgstr "" -#: options/theme-options.php:477 +#: options/theme-options.php:485 msgid "Nav Menu Font" msgstr "" -#: options/theme-options.php:485 +#: options/theme-options.php:493 msgid "Nav Menu Search" msgstr "" -#: options/theme-options.php:486 +#: options/theme-options.php:494 msgid "It is on by default. Click to enter the search area" msgstr "" -#: options/theme-options.php:493 +#: options/theme-options.php:501 msgid "Search Area Background Image" msgstr "" -#: options/theme-options.php:494 +#: options/theme-options.php:502 msgid "" "Set the background image of your search area. Leave this option blank to display " "a white background" msgstr "" -#: options/theme-options.php:503 +#: options/theme-options.php:511 msgid "Nav Menu User Avatar" msgstr "" -#: options/theme-options.php:504 +#: options/theme-options.php:512 msgid "It is on by default. Click to enter the login interface" msgstr "" -#: options/theme-options.php:511 +#: options/theme-options.php:519 msgid "Nav Menu Unlisted User Avatar" msgstr "" -#: options/theme-options.php:521 +#: options/theme-options.php:529 msgid "Secondary Menu Prompt Arrow" msgstr "" -#: options/theme-options.php:522 +#: options/theme-options.php:530 msgid "" "After turning on, the menu prompt arrow will appear in the secondary menu of the " "navigation menu" msgstr "" -#: options/theme-options.php:529 +#: options/theme-options.php:537 msgid "Secondary Menu Radius" msgstr "" -#: options/theme-options.php:540 +#: options/theme-options.php:548 msgid "Mashiro Logo Style" msgstr "" -#: options/theme-options.php:541 +#: options/theme-options.php:549 msgid "" "After turning on, the Mashiro Logo will appear and replace the navigation menu " "logo position" msgstr "" -#: options/theme-options.php:548 +#: options/theme-options.php:556 msgid "Nav Menu Text Logo Options" msgstr "" -#: options/theme-options.php:554 +#: options/theme-options.php:562 msgid "Text A" msgstr "" -#: options/theme-options.php:559 +#: options/theme-options.php:567 msgid "Text B" msgstr "" -#: options/theme-options.php:564 +#: options/theme-options.php:572 msgid "Text C" msgstr "" -#: options/theme-options.php:569 +#: options/theme-options.php:577 msgid "Secondary Text" msgstr "" -#: options/theme-options.php:575 +#: options/theme-options.php:583 msgid "Font Name" msgstr "" -#: options/theme-options.php:592 +#: options/theme-options.php:600 msgid "Widgets Panel and Frontend Related Options" msgstr "" -#: options/theme-options.php:599 +#: options/theme-options.php:607 msgid "" "You can click here" "a> to learn how to set the options on this page" msgstr "" -#: options/theme-options.php:604 +#: options/theme-options.php:612 msgid "Widgets Panel" msgstr "" -#: options/theme-options.php:610 +#: options/theme-options.php:618 msgid "Widgets Panel Button Radius" msgstr "" -#: options/theme-options.php:611 options/theme-options.php:621 +#: options/theme-options.php:619 options/theme-options.php:629 msgid "Slide to adjust, the recommended value is 10" msgstr "" -#: options/theme-options.php:620 +#: options/theme-options.php:628 msgid "Widgets Panel Widget Radius" msgstr "" -#: options/theme-options.php:630 +#: options/theme-options.php:638 msgid "Widgets Panel Font" msgstr "" -#: options/theme-options.php:638 +#: options/theme-options.php:646 msgid "Widgets Panel WP Widget Area" msgstr "" -#: options/theme-options.php:639 +#: options/theme-options.php:647 msgid "When turned on, the WP Widget Area will be displayed in Widgets Panel" msgstr "" -#: options/theme-options.php:646 +#: options/theme-options.php:654 msgid "Widgets Panel Day&Night Switching" msgstr "" -#: options/theme-options.php:647 +#: options/theme-options.php:655 msgid "" "Enabled by default, the Day&Night Switching will be displayed in Widgets Panel" msgstr "" -#: options/theme-options.php:654 +#: options/theme-options.php:662 msgid "Widgets Panel Font Switching" msgstr "" -#: options/theme-options.php:655 +#: options/theme-options.php:663 msgid "Enabled by default, the Font Switching will be displayed in Widgets Panel" msgstr "" -#: options/theme-options.php:661 +#: options/theme-options.php:669 msgid "Frontend Background" msgstr "" -#: options/theme-options.php:672 +#: options/theme-options.php:680 msgid "Frontend Background Scaling Method" msgstr "" -#: options/theme-options.php:673 +#: options/theme-options.php:681 msgid "" "You can choose two ways to scale the frontend background, the default is auto-" "scaling" msgstr "" -#: options/theme-options.php:680 +#: options/theme-options.php:688 msgid "Background Transparency Blur" msgstr "" -#: options/theme-options.php:681 +#: options/theme-options.php:689 msgid "After opening Background Transparency Blur" msgstr "" -#: options/theme-options.php:688 +#: options/theme-options.php:696 msgid "Widgets Panel Background Switching(Frontend Background)" msgstr "" -#: options/theme-options.php:697 options/theme-options.php:713 -#: options/theme-options.php:729 options/theme-options.php:745 -#: options/theme-options.php:761 +#: options/theme-options.php:705 options/theme-options.php:721 +#: options/theme-options.php:737 options/theme-options.php:753 +#: options/theme-options.php:769 msgid "Image" msgstr "" -#: options/theme-options.php:702 +#: options/theme-options.php:710 msgid "Heart Shaped" msgstr "" -#: options/theme-options.php:708 options/theme-options.php:724 -#: options/theme-options.php:740 options/theme-options.php:756 +#: options/theme-options.php:716 options/theme-options.php:732 +#: options/theme-options.php:748 options/theme-options.php:764 msgid "Switch" msgstr "" -#: options/theme-options.php:718 +#: options/theme-options.php:726 msgid "Star Shaped" msgstr "" -#: options/theme-options.php:734 +#: options/theme-options.php:742 msgid "Square Shaped" msgstr "" -#: options/theme-options.php:750 +#: options/theme-options.php:758 msgid "Lemon Shaped" msgstr "" -#: options/theme-options.php:781 +#: options/theme-options.php:789 msgid "Background Transparency in the Frontend" msgstr "" -#: options/theme-options.php:782 +#: options/theme-options.php:790 msgid "Slide to adjust, the recommended sliding value range is 0.6-0.8" msgstr "" -#: options/theme-options.php:791 +#: options/theme-options.php:799 msgid "Frontend Font" msgstr "" -#: options/theme-options.php:797 +#: options/theme-options.php:805 msgid "Global Default Font/Widgets Panel Font Switching A" msgstr "" -#: options/theme-options.php:804 +#: options/theme-options.php:812 msgid "Widgets Panel Font Switching B" msgstr "" -#: options/theme-options.php:814 +#: options/theme-options.php:822 msgid "Footer Options" msgstr "" -#: options/theme-options.php:821 +#: options/theme-options.php:829 msgid "" "You can click here to learn how to set the options " "on this page" msgstr "" -#: options/theme-options.php:827 +#: options/theme-options.php:835 msgid "Footer Online Music Player" msgstr "" -#: options/theme-options.php:828 +#: options/theme-options.php:836 msgid "" "A button will appear at the bottom left corner of the footer after turning on, " "click it and the footer online player will be displayed" msgstr "" -#: options/theme-options.php:831 +#: options/theme-options.php:839 msgid "Netease Cloud Music" msgstr "" -#: options/theme-options.php:832 +#: options/theme-options.php:840 msgid "Kugou Music(may not be available)" msgstr "" -#: options/theme-options.php:833 +#: options/theme-options.php:841 msgid "Baidu Music(not available on servers overseas)" msgstr "" -#: options/theme-options.php:834 +#: options/theme-options.php:842 msgid "QQ Music(may not be available)" msgstr "" -#: options/theme-options.php:842 +#: options/theme-options.php:850 msgid "Footer Online Music Player Proxy" msgstr "" -#: options/theme-options.php:844 +#: options/theme-options.php:852 msgid "" "Ex. http://127.0.0.1:8080. Reference: https://curl.se/libcurl/c/CURLOPT_PROXY.html" msgstr "" -#: options/theme-options.php:851 +#: options/theme-options.php:859 msgid "Footer Online Music Player Songlist ID" msgstr "" -#: options/theme-options.php:853 +#: options/theme-options.php:861 msgid "" "Fill in the song ID, e.g. https://music.163.com/#/playlist?id=5380675133 " "SongID:5380675133" msgstr "" -#: options/theme-options.php:860 +#: options/theme-options.php:868 msgid "Footer Online Music Player Mode" msgstr "" -#: options/theme-options.php:862 +#: options/theme-options.php:870 msgid "Select music player mode" msgstr "" -#: options/theme-options.php:864 +#: options/theme-options.php:872 msgid "List" msgstr "" -#: options/theme-options.php:865 +#: options/theme-options.php:873 msgid "Random" msgstr "" -#: options/theme-options.php:873 +#: options/theme-options.php:881 msgid "Footer Online Music Player Preload" msgstr "" -#: options/theme-options.php:875 +#: options/theme-options.php:883 msgid "Whether to preload songs" msgstr "" -#: options/theme-options.php:878 +#: options/theme-options.php:886 msgid "Preload Metadata" msgstr "" -#: options/theme-options.php:887 +#: options/theme-options.php:895 msgid "Default Volume of Footer Online Music Player" msgstr "" -#: options/theme-options.php:889 +#: options/theme-options.php:897 msgid "Slide to adjust, the recommended sliding value range is 0.4-0.6" msgstr "" -#: options/theme-options.php:898 +#: options/theme-options.php:906 msgid "Netease Cloud Music Cookies" msgstr "" -#: options/theme-options.php:900 +#: options/theme-options.php:908 msgid "" "If you want to play VIP music on Netease Cloud Music Platform, please fill in " "your account cookies in this option." msgstr "" -#: options/theme-options.php:906 +#: options/theme-options.php:914 msgid "Footer Sakura Icon" msgstr "" -#: options/theme-options.php:907 +#: options/theme-options.php:915 msgid "Enabled by default, sakura icon will appear on the footer" msgstr "" -#: options/theme-options.php:914 +#: options/theme-options.php:922 msgid "Footer Info" msgstr "" -#: options/theme-options.php:915 +#: options/theme-options.php:923 msgid "Footer description text, supports HTML code" msgstr "" -#: options/theme-options.php:922 +#: options/theme-options.php:930 msgid "Footer Text Font" msgstr "" -#: options/theme-options.php:930 +#: options/theme-options.php:938 msgid "Footer Load Occupancy Query" msgstr "" -#: options/theme-options.php:931 +#: options/theme-options.php:939 msgid "" "Load occupancy information will appear at the end of the page after turning it " "on. Not recommended in production environment." msgstr "" -#: options/theme-options.php:938 +#: options/theme-options.php:946 msgid "Footer Upyun League Logo" msgstr "" -#: options/theme-options.php:939 +#: options/theme-options.php:947 msgid "Upyun Logo will appear at the end of the page after turning it on" msgstr "" -#: options/theme-options.php:947 +#: options/theme-options.php:955 msgid "Footer Addition" msgstr "" -#: options/theme-options.php:948 +#: options/theme-options.php:956 msgid "" "Add HTML code at the end of the page. Useful for adding customize JavaScript." msgstr "" -#: options/theme-options.php:953 +#: options/theme-options.php:961 msgid "Hitokoto" msgstr "" -#: options/theme-options.php:959 +#: options/theme-options.php:967 msgid "Footer Hitokoto" msgstr "" -#: options/theme-options.php:960 +#: options/theme-options.php:968 msgid "Hitokoto will appear at the end of the page after turning it on" msgstr "" -#: options/theme-options.php:967 +#: options/theme-options.php:975 msgid "" "Fill in as the example: "
"[\"https://api.nmxc.ltd/yiyan/\", \"https://v1.hitokoto.cn/\"]
, where the "
@@ -1468,1266 +1478,1265 @@ msgid ""
"nmxc.ltd/yiyan/
\"BY\" means reusers should give credit to the creator" "p>
\"NC\" means no commercial use
\"ND\"" @@ -2736,310 +2745,302 @@ msgid "" "href=\"https://creativecommons.org/\">the official website
" msgstr "" -#: options/theme-options.php:2754 +#: options/theme-options.php:2762 msgid "Article Page Appreciation Function (Alipay QR Code)" msgstr "" -#: options/theme-options.php:2756 +#: options/theme-options.php:2764 msgid "Upload Alipay Receipt QR Code Image" msgstr "" -#: options/theme-options.php:2763 +#: options/theme-options.php:2771 msgid "Article Page Appreciation Function (Wechat QR Code)" msgstr "" -#: options/theme-options.php:2765 +#: options/theme-options.php:2773 msgid "Upload WeChat Receipt QR Code Image" msgstr "" -#: options/theme-options.php:2772 +#: options/theme-options.php:2780 msgid "Article Page Author Avatar" msgstr "" -#: options/theme-options.php:2774 +#: options/theme-options.php:2782 msgid "Enabled by default, Author avatar will appear on the function bar" msgstr "" -#: options/theme-options.php:2781 +#: options/theme-options.php:2789 msgid "Article Page Author Name" msgstr "" -#: options/theme-options.php:2783 +#: options/theme-options.php:2791 msgid "Author name will appear on the function bar when enabled" msgstr "" -#: options/theme-options.php:2790 +#: options/theme-options.php:2798 msgid "Article Page Author Signature" msgstr "" -#: options/theme-options.php:2792 +#: options/theme-options.php:2800 msgid "Enabled by default, Author signature will appear on the function bar" msgstr "" -#: options/theme-options.php:2799 +#: options/theme-options.php:2807 msgid "Article Last Update Time" msgstr "" -#: options/theme-options.php:2801 +#: options/theme-options.php:2809 msgid "Article last update time will appear on the function bar when enabled" msgstr "" -#: options/theme-options.php:2808 +#: options/theme-options.php:2816 msgid "Article Tag" msgstr "" -#: options/theme-options.php:2810 +#: options/theme-options.php:2818 msgid "Enabled by default, Article tag will appear on the function bar" msgstr "" -#: options/theme-options.php:2817 +#: options/theme-options.php:2825 msgid "Article Page Prev/Next Article Switcher" msgstr "" -#: options/theme-options.php:2818 +#: options/theme-options.php:2826 msgid "" "Enabled by default, the previous and next article switch will appear on the " "article pages" msgstr "" -#: options/theme-options.php:2827 +#: options/theme-options.php:2835 msgid "Template Page Options" msgstr "" -#: options/theme-options.php:2834 +#: options/theme-options.php:2842 msgid "" "You can click here to learn how " "to set the options on this page" msgstr "" -#: options/theme-options.php:2839 +#: options/theme-options.php:2847 msgid "Public Settings" msgstr "" -#: options/theme-options.php:2845 +#: options/theme-options.php:2853 msgid "Template Page Title Font Size" msgstr "" -#: options/theme-options.php:2846 +#: options/theme-options.php:2854 msgid "" "Slide to adjust, recommended value range is 36-48. This option is only available " "for template pages with featured images already set" msgstr "" -#: options/theme-options.php:2855 +#: options/theme-options.php:2863 msgid "Bangumi Template Settings" msgstr "" -#: options/theme-options.php:2861 +#: options/theme-options.php:2869 msgid "Bangumi Template Source" msgstr "" -#: options/theme-options.php:2872 +#: options/theme-options.php:2880 msgid "My Anime List Username" msgstr "" -#: options/theme-options.php:2874 +#: options/theme-options.php:2882 msgid "Username on https://myanimelist.net/" msgstr "" -#: options/theme-options.php:2881 +#: options/theme-options.php:2889 msgid "My Anime List Sort" msgstr "" -#: options/theme-options.php:2884 +#: options/theme-options.php:2892 msgid "Status and Last Updated" msgstr "" -#: options/theme-options.php:2885 +#: options/theme-options.php:2893 msgid "Last Updated" msgstr "" -#: options/theme-options.php:2886 +#: options/theme-options.php:2894 msgid "Status" msgstr "" -#: options/theme-options.php:2894 +#: options/theme-options.php:2902 msgid "Bilibili Account UID" msgstr "" -#: options/theme-options.php:2895 +#: options/theme-options.php:2903 msgid "" "Fill in your account ID, e.g. https://space.bilibili.com/13972644/, just the " "number part \"13972644\"" msgstr "" -#: options/theme-options.php:2903 +#: options/theme-options.php:2911 msgid "Bilibili Account Cookies" msgstr "" -#: options/theme-options.php:2904 +#: options/theme-options.php:2912 msgid "" "Fill in your account cookies, F12 to open your browser web panel, go to your " "bilibili homepage to get cookies. If left empty, it will not show the progress of " "catching up bangumis" msgstr "" -#: options/theme-options.php:2911 +#: options/theme-options.php:2919 msgid "Friend Link Template Settings" msgstr "" -#: options/theme-options.php:2917 +#: options/theme-options.php:2925 msgid "Friend Link Template Unit Alignment" msgstr "" -#: options/theme-options.php:2929 +#: options/theme-options.php:2937 msgid "Friend Link Template Unit Matching Color" msgstr "" -#: options/theme-options.php:2937 +#: options/theme-options.php:2945 msgid "Friend Link Template Unit Border Shadow Color" msgstr "" -#: options/theme-options.php:2945 +#: options/theme-options.php:2953 msgid "Friend Link Sorting Mode" msgstr "" -#: options/theme-options.php:2946 +#: options/theme-options.php:2954 msgid "Select the friend link sorting mode, \"Name\" is used by Default." msgstr "" -#: options/theme-options.php:2948 +#: options/theme-options.php:2956 msgid "Name" msgstr "" -#: options/theme-options.php:2949 +#: options/theme-options.php:2957 msgid "Rating" msgstr "" -#: options/theme-options.php:2950 +#: options/theme-options.php:2958 msgid "Updated" msgstr "" -#: options/theme-options.php:2951 +#: options/theme-options.php:2959 msgid "Rand" msgstr "" -#: options/theme-options.php:2959 +#: options/theme-options.php:2967 msgid "Ascending OR Descending" msgstr "" -#: options/theme-options.php:2960 +#: options/theme-options.php:2968 msgid "Order friend link in ascending or descending." msgstr "" -#: options/theme-options.php:2963 +#: options/theme-options.php:2971 msgid "Ascending" msgstr "" -#: options/theme-options.php:2964 +#: options/theme-options.php:2972 msgid "Descending" msgstr "" -#: options/theme-options.php:2971 +#: options/theme-options.php:2979 msgid "Login Template Settings" msgstr "" -#: options/theme-options.php:2977 +#: options/theme-options.php:2985 msgid "Login Template Registration Function" msgstr "" -#: options/theme-options.php:2978 +#: options/theme-options.php:2986 msgid "Login template will allow registration when enabled" msgstr "" -#: options/theme-options.php:2987 +#: options/theme-options.php:2995 msgid "Comment-related Options" msgstr "" -#: options/theme-options.php:2994 +#: options/theme-options.php:3002 msgid "" "You can click here to learn how " "to set the options on this page" msgstr "" -#: options/theme-options.php:2999 +#: options/theme-options.php:3007 msgid "Comment Area Style" msgstr "" -#: options/theme-options.php:3005 +#: options/theme-options.php:3013 msgid "Page Comment Area Display" msgstr "" -#: options/theme-options.php:3006 +#: options/theme-options.php:3014 msgid "You can choose to expand or shirink the content of the comment area" msgstr "" -#: options/theme-options.php:3008 +#: options/theme-options.php:3016 msgid "Expand" msgstr "" -#: options/theme-options.php:3009 -msgid "Shrink" -msgstr "" - #: options/theme-options.php:3017 -msgid "Page Comment Area Matching Color" +msgid "Shrink" msgstr "" #: options/theme-options.php:3025 -msgid "Page Comment Area Shadow Color" -msgstr "" - -#: options/theme-options.php:3033 msgid "Page Comment Area Bottom Right Background Image" msgstr "" -#: options/theme-options.php:3034 +#: options/theme-options.php:3026 msgid "If this option is blank, there will be no image, no best recommendation here" msgstr "" -#: options/theme-options.php:3040 +#: options/theme-options.php:3032 msgid "Comment Area Function" msgstr "" -#: options/theme-options.php:3046 +#: options/theme-options.php:3038 msgid "Comment Area Emoticon" msgstr "" -#: options/theme-options.php:3047 +#: options/theme-options.php:3039 msgid "" "Select the emoticons to be displayed in the comment area input box. Uncheck all " "to turn off the comment input box emoticon function." msgstr "" -#: options/theme-options.php:3050 +#: options/theme-options.php:3042 msgid "BiliBili Emoticon Pack" msgstr "" -#: options/theme-options.php:3051 +#: options/theme-options.php:3043 msgid "Baidu Tieba Emoticon Pack" msgstr "" -#: options/theme-options.php:3052 +#: options/theme-options.php:3044 msgid "Emoji" msgstr "" -#: options/theme-options.php:3053 +#: options/theme-options.php:3045 msgid "Customized Emoticon Pack" msgstr "" -#: options/theme-options.php:3061 +#: options/theme-options.php:3053 msgid "Customized Emoticon Column Name" msgstr "" -#: options/theme-options.php:3062 +#: options/theme-options.php:3054 msgid "" "It is recommended to enter less than 4 Chinese characters in length to avoid " "causing compatibility issues on mobile terminals." msgstr "" -#: options/theme-options.php:3070 +#: options/theme-options.php:3062 msgid "Path To Custom Expression" msgstr "" -#: options/theme-options.php:3071 +#: options/theme-options.php:3063 msgid "" "Click here" "a> updating emoticon list. Specific usage reference: Comment related settings" msgstr "" -#: options/theme-options.php:3078 +#: options/theme-options.php:3070 msgid "Custom Emoticon Proxy Address" msgstr "" -#: options/theme-options.php:3079 +#: options/theme-options.php:3071 msgid "" "Fill in the CDN address of the emoticon image. If left blank, the CDN proxy " "function will not be enabled." msgstr "" -#: options/theme-options.php:3089 +#: options/theme-options.php:3081 msgid "Page Comment Area UA Info" msgstr "" -#: options/theme-options.php:3090 +#: options/theme-options.php:3082 msgid "" "When enabled, the page comment area will display the user’s browser, operating " "system information" msgstr "" -#: options/theme-options.php:3097 +#: options/theme-options.php:3089 msgid "Page Comment Area Location Information" msgstr "" -#: options/theme-options.php:3098 +#: options/theme-options.php:3090 msgid "" "When enabled, the page comment area will show the user’s location information" msgstr "" -#: options/theme-options.php:3105 +#: options/theme-options.php:3097 msgid "Management Page Displays Location Information" msgstr "" -#: options/theme-options.php:3106 +#: options/theme-options.php:3098 msgid "" "When enabled, the commenter's IP geographical location information will be " "displayed on the comment management page" msgstr "" -#: options/theme-options.php:3113 +#: options/theme-options.php:3105 msgid "Location Information Persistence" msgstr "" -#: options/theme-options.php:3114 +#: options/theme-options.php:3106 msgid "" "When enabled, the commenter's IP geographical location information will be stored " "in the database" msgstr "" -#: options/theme-options.php:3121 +#: options/theme-options.php:3113 msgid "API To Parse Geographical Location" msgstr "" -#: options/theme-options.php:3123 +#: options/theme-options.php:3115 msgid "Theme Official" msgstr "" -#: options/theme-options.php:3124 +#: options/theme-options.php:3116 msgid "IP—API" msgstr "" -#: options/theme-options.php:3125 +#: options/theme-options.php:3117 msgid "All" msgstr "" -#: options/theme-options.php:3133 +#: options/theme-options.php:3125 msgid "" "Theme Official:Official API of the theme
IP-API:" "Provided by ip-api." @@ -3121,550 +3122,550 @@ msgid "" "for fallback
" msgstr "" -#: options/theme-options.php:3141 +#: options/theme-options.php:3133 msgid "Private Comment Function" msgstr "" -#: options/theme-options.php:3142 +#: options/theme-options.php:3134 msgid "" "When enabled, users are allowed to set their comments to be invisible to others" msgstr "" -#: options/theme-options.php:3149 +#: options/theme-options.php:3141 msgid "Page Comment Area Bot Verification" msgstr "" -#: options/theme-options.php:3150 +#: options/theme-options.php:3142 msgid "After turning on user comments need to be verified before posting" msgstr "" -#: options/theme-options.php:3157 +#: options/theme-options.php:3149 msgid "QQ Avatar Link Encryption" msgstr "" -#: options/theme-options.php:3160 +#: options/theme-options.php:3152 msgid "Redirect (low security)" msgstr "" -#: options/theme-options.php:3161 +#: options/theme-options.php:3153 msgid "Get avatar data in the backend (medium security)" msgstr "" -#: options/theme-options.php:3162 +#: options/theme-options.php:3154 msgid "Parse avatar interface in the backend (high security, slow)" msgstr "" -#: options/theme-options.php:3170 +#: options/theme-options.php:3162 msgid "Page Comment Area Upload Image Interface" msgstr "" -#: options/theme-options.php:3184 +#: options/theme-options.php:3176 msgid "Imgur Client ID" msgstr "" -#: options/theme-options.php:3186 +#: options/theme-options.php:3178 msgid "" "Fill in Client ID here, to register please visit https://api.imgur.com/oauth2/" "addclient" msgstr "" -#: options/theme-options.php:3192 +#: options/theme-options.php:3184 msgid "Imgur Upload Proxy" msgstr "" -#: options/theme-options.php:3194 +#: options/theme-options.php:3186 msgid "" "The proxy used by the backend when uploading images to Imgur. You can refer to " "the tutorial: https://2heng.xin/2018/06/06/javascript-upload-images-with-imgur-" "api/" msgstr "" -#: options/theme-options.php:3201 +#: options/theme-options.php:3193 msgid "SM.MS Secret Token" msgstr "" -#: options/theme-options.php:3203 +#: options/theme-options.php:3195 msgid "Fill in your Key here, to get it please visit https://sm.ms/home/apitoken" msgstr "" -#: options/theme-options.php:3209 +#: options/theme-options.php:3201 msgid "Chevereto API v1 Key" msgstr "" -#: options/theme-options.php:3211 +#: options/theme-options.php:3203 msgid "" "Fill in the Key here, to get please visit your Chevereto home page address/" "dashboard/settings/api" msgstr "" -#: options/theme-options.php:3217 +#: options/theme-options.php:3209 msgid "Chevereto Address" msgstr "" -#: options/theme-options.php:3219 +#: options/theme-options.php:3211 msgid "" "Your Chevereto home page address. Please note that there is no \"/\" at the end, " "e.g. https://your.cherverto.com" msgstr "" -#: options/theme-options.php:3225 +#: options/theme-options.php:3217 msgid "Lsky Pro v1 Token" msgstr "" -#: options/theme-options.php:3227 +#: options/theme-options.php:3219 msgid "" "Fill in the Token here, Please note that there is no \"Bearer \" at first, to get " "please visit your Lsky Pro home page address/api" msgstr "" -#: options/theme-options.php:3233 +#: options/theme-options.php:3225 msgid "Lsky Pro Address" msgstr "" -#: options/theme-options.php:3235 +#: options/theme-options.php:3227 msgid "" "Your Lsky Pro home page address. Please note that there is no \"/\" at the end, e." "g. https://your.lskypro.com" msgstr "" -#: options/theme-options.php:3241 +#: options/theme-options.php:3233 msgid "Comment Image Proxy" msgstr "" -#: options/theme-options.php:3242 +#: options/theme-options.php:3234 msgid "Proxy for the image displayed on the frontend" msgstr "" -#: options/theme-options.php:3249 +#: options/theme-options.php:3241 msgid "Comment Email Notification" msgstr "" -#: options/theme-options.php:3255 +#: options/theme-options.php:3247 msgid "Mail Template Featured Image" msgstr "" -#: options/theme-options.php:3256 +#: options/theme-options.php:3248 msgid "Set the background image of your reply email" msgstr "" -#: options/theme-options.php:3264 +#: options/theme-options.php:3256 msgid "Mail Template Sending Address Prefix" msgstr "" -#: options/theme-options.php:3265 +#: options/theme-options.php:3257 msgid "" "Used to send system mail. The sender address will be displayed in the user's " "mailbox, don't use Non-English Characters. The default system mail address is " "bibi@your domain" msgstr "" -#: options/theme-options.php:3272 +#: options/theme-options.php:3264 msgid "User Mail Reply Notification" msgstr "" -#: options/theme-options.php:3273 +#: options/theme-options.php:3265 msgid "" "By default WordPress will use email notifications to notify users when their " "comments receive a reply. After turning it on users are allowed to set whether to " "use email notifications when their comments receive a reply" msgstr "" -#: options/theme-options.php:3280 +#: options/theme-options.php:3272 msgid "Admin Email Reply Notification" msgstr "" -#: options/theme-options.php:3281 +#: options/theme-options.php:3273 msgid "" "Use email notifications when admin comments receive a reply after turning it on" msgstr "" -#: options/theme-options.php:3290 +#: options/theme-options.php:3282 msgid "Other Options" msgstr "" -#: options/theme-options.php:3296 +#: options/theme-options.php:3288 msgid "Login Screen and Dashboard Related Options" msgstr "" -#: options/theme-options.php:3303 +#: options/theme-options.php:3295 msgid "" "You can click here" "a> to learn how to set the options on this page" msgstr "" -#: options/theme-options.php:3308 +#: options/theme-options.php:3300 msgid "Login Screen" msgstr "" -#: options/theme-options.php:3314 +#: options/theme-options.php:3306 msgid "Custom Login Screen" msgstr "" -#: options/theme-options.php:3315 +#: options/theme-options.php:3307 msgid "Default on, custom login screen will replace the default login screen" msgstr "" -#: options/theme-options.php:3322 +#: options/theme-options.php:3314 msgid "Login Screen Background Image" msgstr "" -#: options/theme-options.php:3323 +#: options/theme-options.php:3315 msgid "" "Set your login screen background image, leave this option blank to show the " "default" msgstr "" -#: options/theme-options.php:3332 +#: options/theme-options.php:3324 msgid "Login Screen Background Blur" msgstr "" -#: options/theme-options.php:3333 +#: options/theme-options.php:3325 msgid "Login screen background image will be blurred when enabled" msgstr "" -#: options/theme-options.php:3341 +#: options/theme-options.php:3333 msgid "Login Screen Logo" msgstr "" -#: options/theme-options.php:3342 +#: options/theme-options.php:3334 msgid "Set your login screen Logo" msgstr "" -#: options/theme-options.php:3351 +#: options/theme-options.php:3343 msgid "Jump after login" msgstr "" -#: options/theme-options.php:3352 +#: options/theme-options.php:3344 msgid "Jump to backend for admins and home for users after turning on." msgstr "" -#: options/theme-options.php:3359 +#: options/theme-options.php:3351 msgid "Login Screen Language Option" msgstr "" -#: options/theme-options.php:3360 +#: options/theme-options.php:3352 msgid "Login screen language option will be display when enabled" msgstr "" -#: options/theme-options.php:3366 +#: options/theme-options.php:3358 msgid "Dashboard" msgstr "" -#: options/theme-options.php:3372 +#: options/theme-options.php:3364 msgid "Dashboard Background Image" msgstr "" -#: options/theme-options.php:3373 +#: options/theme-options.php:3365 msgid "" "Set your dashboard background image, leave this option blank to show white " "background" msgstr "" -#: options/theme-options.php:3381 +#: options/theme-options.php:3373 msgid "Dashboard Options Menu Style" msgstr "" -#: options/theme-options.php:3392 +#: options/theme-options.php:3384 msgid "Dashboard Primary Menu Color" msgstr "" -#: options/theme-options.php:3400 +#: options/theme-options.php:3392 msgid "Dashboard Secondary Menu Color" msgstr "" -#: options/theme-options.php:3408 +#: options/theme-options.php:3400 msgid "Dashboard Emphasis Color" msgstr "" -#: options/theme-options.php:3416 +#: options/theme-options.php:3408 msgid "Dashboard Button Color" msgstr "" -#: options/theme-options.php:3424 +#: options/theme-options.php:3416 msgid "Dashboard Text Color" msgstr "" -#: options/theme-options.php:3434 +#: options/theme-options.php:3426 msgid "ChatGPT Options" msgstr "" -#: options/theme-options.php:3441 +#: options/theme-options.php:3433 msgid "" "You can click here to learn how to set the options on this page" msgstr "" -#: options/theme-options.php:3447 +#: options/theme-options.php:3439 msgid "ChatGPT Function" msgstr "" -#: options/theme-options.php:3448 +#: options/theme-options.php:3440 msgid "After turning on ChatGPT Function will be available" msgstr "" -#: options/theme-options.php:3455 +#: options/theme-options.php:3447 msgid "ChatGPT Base URL" msgstr "" -#: options/theme-options.php:3456 +#: options/theme-options.php:3448 msgid "Fill in the ChatGPT Base URL, The default is https://openai.fuukei.org/" msgstr "" -#: options/theme-options.php:3464 +#: options/theme-options.php:3456 msgid "ChatGPT API keys" msgstr "" -#: options/theme-options.php:3465 +#: options/theme-options.php:3457 msgid "" "Fill in Your ChatGPT API keys, You can go to OpenAI Website to get your API Keys" msgstr "" -#: options/theme-options.php:3472 +#: options/theme-options.php:3464 msgid "ChatGPT Article Summarize" msgstr "" -#: options/theme-options.php:3473 +#: options/theme-options.php:3465 msgid "After turning on ChatGPT will automatically generate article abstracts" msgstr "" -#: options/theme-options.php:3480 +#: options/theme-options.php:3472 msgid "" "Each update of your post will trigger a request to generate a summary. Due to " "current API limitations, if your article exceeds 4097 Token, the system will only " "send the unexceeded portion to generate a summary" msgstr "" -#: options/theme-options.php:3490 +#: options/theme-options.php:3482 msgid "Article IDs that do not Require ChatGPT Summarize" msgstr "" -#: options/theme-options.php:3491 +#: options/theme-options.php:3483 msgid "" "Enter the article IDs that do not need to generate ChatGPT Summarize, and split " "multiple article IDs with \",\"" msgstr "" -#: options/theme-options.php:3502 +#: options/theme-options.php:3494 msgid "ChatGPT Article Summarize Init Prompt" msgstr "" -#: options/theme-options.php:3507 +#: options/theme-options.php:3499 msgid "" "Init Prompt instructs AI how to generate summaries for your articles. Init Prompt " "will be passed to ChatGPT as \"system\" role" msgstr "" -#: options/theme-options.php:3514 +#: options/theme-options.php:3506 msgid "ChatGPT Model" msgstr "" -#: options/theme-options.php:3515 +#: options/theme-options.php:3507 msgid "" "Only models support Chat Completion API can be used. The default is \"gpt-3.5-" "turbo\". View https://platform.openai.com/docs/models/overview for more info." msgstr "" -#: options/theme-options.php:3527 +#: options/theme-options.php:3519 msgid "ChatGPT API self test" msgstr "" -#: options/theme-options.php:3531 +#: options/theme-options.php:3523 msgid "TEST" msgstr "" -#: options/theme-options.php:3534 +#: options/theme-options.php:3526 msgid "Results: " msgstr "" -#: options/theme-options.php:3546 +#: options/theme-options.php:3538 msgid "Waiting for response..." msgstr "" -#: options/theme-options.php:3557 +#: options/theme-options.php:3549 msgid "Malformed post_id: " msgstr "" -#: options/theme-options.php:3574 +#: options/theme-options.php:3566 msgid "Low Use Options" msgstr "" -#: options/theme-options.php:3581 +#: options/theme-options.php:3573 msgid "" "You can click here to learn how to set the " "options on this page" msgstr "" -#: options/theme-options.php:3587 +#: options/theme-options.php:3579 msgid "Statistics API" msgstr "" -#: options/theme-options.php:3588 +#: options/theme-options.php:3580 msgid "" "You can choose WP-Statistics plugin statistics or theme built-in statistics to " "display" msgstr "" -#: options/theme-options.php:3590 +#: options/theme-options.php:3582 msgid "Theme Built in Statistics" msgstr "" -#: options/theme-options.php:3591 +#: options/theme-options.php:3583 msgid "WP-Statistics Plugin Statistics" msgstr "" -#: options/theme-options.php:3599 +#: options/theme-options.php:3591 msgid "Statistics display format" msgstr "" -#: options/theme-options.php:3600 +#: options/theme-options.php:3592 msgid "You can choose from four different data display formats" msgstr "" -#: options/theme-options.php:3602 +#: options/theme-options.php:3594 msgid "23333 Visits" msgstr "" -#: options/theme-options.php:3603 +#: options/theme-options.php:3595 msgid "23,333 Visits" msgstr "" -#: options/theme-options.php:3604 +#: options/theme-options.php:3596 msgid "23 333 Visits" msgstr "" -#: options/theme-options.php:3605 +#: options/theme-options.php:3597 msgid "23K Visits" msgstr "" -#: options/theme-options.php:3613 +#: options/theme-options.php:3605 msgid "Live Search" msgstr "" -#: options/theme-options.php:3614 +#: options/theme-options.php:3606 msgid "" "After turning on the live search in the frontend, call Rest API to update the " "cache once an hour. You can set the cache time manually in api.php" msgstr "" -#: options/theme-options.php:3621 +#: options/theme-options.php:3613 msgid "Live Search Comment Support" msgstr "" -#: options/theme-options.php:3623 +#: options/theme-options.php:3615 msgid "" "Enable to search for comments in live search (not recommended if site has too " "many comments)" msgstr "" -#: options/theme-options.php:3630 +#: options/theme-options.php:3622 msgid "Google Analytics Id" msgstr "" -#: options/theme-options.php:3631 +#: options/theme-options.php:3623 msgid "If you already have a plugin to handle it, please keep here empty." msgstr "" -#: options/theme-options.php:3637 +#: options/theme-options.php:3629 msgid "Custom CSS Styles" msgstr "" -#: options/theme-options.php:3638 +#: options/theme-options.php:3630 msgid "Fill in the CSS code without writing style tag" msgstr "" -#: options/theme-options.php:3645 +#: options/theme-options.php:3637 msgid "Code inserted in the header" msgstr "" -#: options/theme-options.php:3646 +#: options/theme-options.php:3638 msgid "Insert HTML code right before ." msgstr "" -#: options/theme-options.php:3652 +#: options/theme-options.php:3644 msgid "Timezone Fix" msgstr "" -#: options/theme-options.php:3653 +#: options/theme-options.php:3645 msgid "" "Slide to adjust. If the comment has a time difference problem, adjust it here, " "fill in an integer. Calculation method: actual time = time of display error - the " "integer you entered (in hours)" msgstr "" -#: options/theme-options.php:3662 +#: options/theme-options.php:3654 msgid "Gravatar Service Proxy" msgstr "" -#: options/theme-options.php:3663 +#: options/theme-options.php:3655 msgid "" "You can select multiple proxy as the Gravatar Service Proxy. By default, Tianli " "is used as the Gravatar Service Proxy." msgstr "" -#: options/theme-options.php:3665 +#: options/theme-options.php:3657 msgid "Weavatar Service" msgstr "" -#: options/theme-options.php:3666 +#: options/theme-options.php:3658 msgid "Cravatar Service" msgstr "" -#: options/theme-options.php:3667 +#: options/theme-options.php:3659 msgid "Geekzu" msgstr "" -#: options/theme-options.php:3668 +#: options/theme-options.php:3660 msgid "Loli Net" msgstr "" -#: options/theme-options.php:3669 +#: options/theme-options.php:3661 msgid "Official" msgstr "" -#: options/theme-options.php:3670 options/theme-options.php:3678 +#: options/theme-options.php:3662 options/theme-options.php:3670 msgid "Custom Proxy Address" msgstr "" -#: options/theme-options.php:3679 +#: options/theme-options.php:3671 msgid "" "Enter your Gravatar proxy address without starting with \"http(s)://\" and ending " "with \"/\". Example: gravatar.com/avatar." msgstr "" -#: options/theme-options.php:3686 +#: options/theme-options.php:3678 msgid "Lightbox" msgstr "" -#: options/theme-options.php:3692 +#: options/theme-options.php:3684 msgid "BaguetteBox Lightbox Effect" msgstr "" -#: options/theme-options.php:3693 +#: options/theme-options.php:3685 msgid "BaguetteBox will be used as the image lightbox effect when turned on" msgstr "" -#: options/theme-options.php:3705 +#: options/theme-options.php:3697 msgid "FancyBox Lightbox Effect" msgstr "" -#: options/theme-options.php:3706 +#: options/theme-options.php:3698 msgid "" "FancyBox will be used as an image lightbox effect after turning on, additional JQ " "libraries will be loaded" msgstr "" -#: options/theme-options.php:3718 +#: options/theme-options.php:3710 msgid "LightGallery Lightbox Effect" msgstr "" -#: options/theme-options.php:3719 +#: options/theme-options.php:3711 msgid "LightGallery will be used as an image lightbox effect after turning on." msgstr "" -#: options/theme-options.php:3729 +#: options/theme-options.php:3721 msgid "" "Attension: Please read License Instruction before use.Prism.js: Requires a language to be specified, see " msgstr "" -#: options/theme-options.php:3772 +#: options/theme-options.php:3764 msgid "Code Highlight Method" msgstr "" -#: options/theme-options.php:3776 +#: options/theme-options.php:3768 msgid "Custom Program" msgstr "" -#: options/theme-options.php:3784 +#: options/theme-options.php:3776 msgid "Prism.js: Add Line Number Display for All Code Blocks" msgstr "" -#: options/theme-options.php:3788 +#: options/theme-options.php:3780 msgid "" "See the plugin description " "documentation" msgstr "" -#: options/theme-options.php:3794 +#: options/theme-options.php:3786 msgid "Prism.js: Autoload Address" msgstr "" -#: options/theme-options.php:3798 +#: options/theme-options.php:3790 msgid "Leave blank to use default values" msgstr "" -#: options/theme-options.php:3805 +#: options/theme-options.php:3797 msgid "Prism.js: Code Highlight Theme" msgstr "" -#: options/theme-options.php:3806 options/theme-options.php:3817 +#: options/theme-options.php:3798 options/theme-options.php:3809 msgid "Relative to autoload address. Leave blank to use default values" msgstr "" -#: options/theme-options.php:3816 +#: options/theme-options.php:3808 msgid "Prism.js: Code Highlight Theme (Dark Mode)" msgstr "" -#: options/theme-options.php:3827 +#: options/theme-options.php:3819 msgid "" "The following Options are not recommended to be modified blindly, please use them " "under the guidance of others" msgstr "" -#: options/theme-options.php:3833 +#: options/theme-options.php:3825 msgid "Image CDN" msgstr "" -#: options/theme-options.php:3834 +#: options/theme-options.php:3826 msgid "" "Note: fill in the format https://your CDN domain/. This means that images with " "original path http://your.domain/wp-content/uploads/2018/05/xx.png will be loaded " "from http://your CDN domain/2018/05/xx.png" msgstr "" -#: options/theme-options.php:3841 +#: options/theme-options.php:3833 msgid "Articles Categories (Do not display)" msgstr "" -#: options/theme-options.php:3842 options/theme-options.php:3849 +#: options/theme-options.php:3834 options/theme-options.php:3841 msgid "Fill in category ID, seperate in English\" , \" when more than one" msgstr "" -#: options/theme-options.php:3848 +#: options/theme-options.php:3840 msgid "Image Display Category" msgstr "" -#: options/theme-options.php:3855 +#: options/theme-options.php:3847 msgid "Specify Login Address" msgstr "" -#: options/theme-options.php:3856 +#: options/theme-options.php:3848 msgid "" "Force not to use the WordPress login page address to login, fill in the new login " "page address, such as: http://www.xxx.com/login. Note that before filling in the " @@ -3781,72 +3782,72 @@ msgid "" "enter the background, etc." msgstr "" -#: options/theme-options.php:3862 +#: options/theme-options.php:3854 msgid "Specify Registration Address" msgstr "" -#: options/theme-options.php:3863 +#: options/theme-options.php:3855 msgid "" "This address is used as the registration entry on the login page, if you specify " "a login address, it is recommended to fill in" msgstr "" -#: options/theme-options.php:3869 +#: options/theme-options.php:3861 msgid "Version Control" msgstr "" -#: options/theme-options.php:3870 +#: options/theme-options.php:3862 msgid "Used to update front-end cookies and browser cache, can use any string" msgstr "" -#: options/theme-options.php:3876 +#: options/theme-options.php:3868 msgid "Backup&Recovery" msgstr "" -#: options/theme-options.php:3878 +#: options/theme-options.php:3870 msgid "Backup or Recovery your theme options" msgstr "" -#: options/theme-options.php:3889 +#: options/theme-options.php:3881 msgid "About Theme" msgstr "" -#: options/theme-options.php:3895 +#: options/theme-options.php:3887 msgid "Version Info" msgstr "" -#: options/theme-options.php:3900 +#: options/theme-options.php:3892 msgid "" "" msgstr "" -#: options/theme-options.php:3906 +#: options/theme-options.php:3898 #, php-format msgid "" "Theme Sakurairo Version %s | Internal Version %s | Project Address" msgstr "" -#: options/theme-options.php:3911 +#: options/theme-options.php:3903 msgid "Update Related" msgstr "" -#: options/theme-options.php:3917 +#: options/theme-options.php:3909 msgid "Theme Update Source" msgstr "" -#: options/theme-options.php:3923 +#: options/theme-options.php:3915 msgid "" "If you are using a server set up in mainland China, please use the Upyun source " "or the official theme source as your theme update source" msgstr "" -#: options/theme-options.php:3930 +#: options/theme-options.php:3922 msgid "Theme Update Test Channel Disclaimer" msgstr "" -#: options/theme-options.php:3936 +#: options/theme-options.php:3928 msgid "" "Please copy the text in quotes after ensure that you have carefully " "understood the risks associated with participating in the test and are willing to " @@ -3855,70 +3856,70 @@ msgid "" "to bear all unexpected consequences\"" msgstr "" -#: options/theme-options.php:3942 +#: options/theme-options.php:3934 msgid "Theme Update Channel" msgstr "" -#: options/theme-options.php:3949 +#: options/theme-options.php:3941 msgid "" "You can toggle the update channel here to participate in the testing of the new " "version" msgstr "" -#: options/theme-options.php:3951 +#: options/theme-options.php:3943 msgid "Stable Channel" msgstr "" -#: options/theme-options.php:3952 +#: options/theme-options.php:3944 msgid "Beta Channel" msgstr "" -#: options/theme-options.php:3953 +#: options/theme-options.php:3945 msgid "Preview Channel" msgstr "" -#: options/theme-options.php:3960 +#: options/theme-options.php:3952 msgid "Resource Control" msgstr "" -#: options/theme-options.php:3966 +#: options/theme-options.php:3958 msgid "Provide Critical Frontend Resource locally" msgstr "" -#: options/theme-options.php:3967 +#: options/theme-options.php:3959 msgid "" "Enabeld by default. Critical resources are those resources whose loading " "performance will have a significant impact on the user experience." msgstr "" -#: options/theme-options.php:3974 +#: options/theme-options.php:3966 msgid "Provide Other Frontend Resource locally" msgstr "" -#: options/theme-options.php:3975 +#: options/theme-options.php:3967 msgid "Less important frontend resource in the theme's folder." msgstr "" -#: options/theme-options.php:3982 +#: options/theme-options.php:3974 msgid "Provide 3rd-party library from public CDN" msgstr "" -#: options/theme-options.php:3983 +#: options/theme-options.php:3975 msgid "" "When disabled, 3rd-party dependencies, which have been built to bundles along " "with themes's entry script, will be loaded from the exact same origin with " "Critical Frontend Resource. " msgstr "" -#: options/theme-options.php:3990 +#: options/theme-options.php:3982 msgid "Public CDN Basepath" msgstr "" -#: options/theme-options.php:4002 +#: options/theme-options.php:3994 msgid "Vision Resource Basepath" msgstr "" -#: options/theme-options.php:4003 +#: options/theme-options.php:3995 msgid "" "This link directory structure needs to be consistent with the Sakurairo Vision repositories officially " @@ -3927,31 +3928,31 @@ msgid "" "default." msgstr "" -#: options/theme-options.php:4009 +#: options/theme-options.php:4001 msgid "Theme Sponsors" msgstr "" -#: options/theme-options.php:4014 +#: options/theme-options.php:4006 msgid "" "" msgstr "" -#: options/theme-options.php:4019 +#: options/theme-options.php:4011 msgid "Theme Contributors" msgstr "" -#: options/theme-options.php:4024 +#: options/theme-options.php:4016 msgid "" "" msgstr "" -#: options/theme-options.php:4029 +#: options/theme-options.php:4021 msgid "Privacy information" msgstr "" -#: options/theme-options.php:4034 +#: options/theme-options.php:4026 msgid "" "
The theme respects your privacy
\n" "However, when you use a service provider pre-populated by the theme to " @@ -3962,21 +3963,21 @@ msgid "" "you to modify
" msgstr "" -#: options/theme-options.php:4042 +#: options/theme-options.php:4034 msgid "Send Theme Version to Fuukei" msgstr "" -#: options/theme-options.php:4043 +#: options/theme-options.php:4035 msgid "" "The theme will only send time and version information to Fuukei officials and the " "data will be cleaned regularly and used only to count version updates." msgstr "" -#: options/theme-options.php:4049 +#: options/theme-options.php:4041 msgid "Reference Information" msgstr "" -#: options/theme-options.php:4054 +#: options/theme-options.php:4046 msgid "" "Fluent Design Icon Referenced by Paradox Fluent Icon Pack
\n" "MUH2 Design Icon Referenced by 缄默 "
msgstr ""
-#: options/theme-options.php:4061
+#: options/theme-options.php:4053
msgid "Dependency Information"
msgstr ""
-#: options/theme-options.php:4066
+#: options/theme-options.php:4058
msgid ""
" Options Framework Relies on the Codestar Open Source Codestar Framework Project
Oq_HHQV`O7st5crt}f}68~83$UGIu9JSi+{_WaPH7k>; z;+lIboBy{3iPw?QD_Pqb+UjqCHT{%2QNeeq{hEw6?zh*DashlB>svl1D}P;LFG+lt zy79DqgYqsNWSeeiC2~w*=zp0$%yaL(iR`1bJ67{OaAUBCr20csmX6GFH*C``i%B7lA~+h zrX~-WJRBEb=W|y7-#N6!Sj)*ohuH5Em!*D|zdN~h*LX_f*!4abLd~quF-#}r2=YNY zI@VNmEy_N78TQfa->|2$YkS6w_aCbp6<5NdbZYda?BUjvF;=7QXMbYd_*NA;kGAX9 zx&rY$_9uyNyDBfM)#>-jAdc1xjwKn|vJ$tTewTl{Ze((Cvir#MlJnM*)jRuNYk7 了解如何在" "此页面上设置选项" -#: options/theme-options.php:423 +#: options/theme-options.php:431 msgid "Nav Menu Style" msgstr "导航菜单样式" -#: options/theme-options.php:434 +#: options/theme-options.php:442 msgid "Nav Menu Radius" msgstr "导航菜单圆角" -#: options/theme-options.php:436 options/theme-options.php:531 -#: options/theme-options.php:2306 +#: options/theme-options.php:444 options/theme-options.php:539 +#: options/theme-options.php:2314 msgid "Slide to adjust, the recommended value is 15" msgstr "滑动滑块,推荐数值为15" -#: options/theme-options.php:445 +#: options/theme-options.php:453 msgid "Nav Menu Content Display Method" msgstr "导航菜单内容显示" -#: options/theme-options.php:446 +#: options/theme-options.php:454 msgid "You can choose to unfold or fold the nav menu contents" msgstr "你可以选择展开显示或者收缩显示导航菜单内容" -#: options/theme-options.php:448 +#: options/theme-options.php:456 msgid "Unfold" msgstr "展开" -#: options/theme-options.php:449 +#: options/theme-options.php:457 msgid "Fold" msgstr "收缩" -#: options/theme-options.php:457 +#: options/theme-options.php:465 msgid "Nav Menu Animation Effects" msgstr "导航菜单动画时间" -#: options/theme-options.php:458 +#: options/theme-options.php:466 msgid "" "It is on by default. If it is off, the nav menu content will be displayed " "directly without effects" msgstr "默认开启,如果关闭,则导航内容将直接显示" -#: options/theme-options.php:465 +#: options/theme-options.php:473 msgid "Nav Menu Animation Time" msgstr "导航菜单动画时间" -#: options/theme-options.php:467 options/theme-options.php:1432 +#: options/theme-options.php:475 options/theme-options.php:1440 msgid "Slide to adjust, the recommended value range is 1-2" msgstr "滑动滑块,推荐数值范围为1-2" -#: options/theme-options.php:477 +#: options/theme-options.php:485 msgid "Nav Menu Font" msgstr "导航菜单字体" -#: options/theme-options.php:485 +#: options/theme-options.php:493 msgid "Nav Menu Search" msgstr "导航菜单搜索" -#: options/theme-options.php:486 +#: options/theme-options.php:494 msgid "It is on by default. Click to enter the search area" msgstr "默认开启,点击将进入搜索区域" -#: options/theme-options.php:493 +#: options/theme-options.php:501 msgid "Search Area Background Image" msgstr "搜索区域背景图片" -#: options/theme-options.php:494 +#: options/theme-options.php:502 msgid "" "Set the background image of your search area. Leave this option blank to " "display a white background" msgstr "设置你的搜索区域背景图片,此选项留空则显示白色背景" -#: options/theme-options.php:503 +#: options/theme-options.php:511 msgid "Nav Menu User Avatar" msgstr "导航菜单用户头像" -#: options/theme-options.php:504 +#: options/theme-options.php:512 msgid "It is on by default. Click to enter the login interface" msgstr "默认开启,点击将进入登录界面" -#: options/theme-options.php:511 +#: options/theme-options.php:519 msgid "Nav Menu Unlisted User Avatar" msgstr "导航菜单用户未登录头像" -#: options/theme-options.php:521 +#: options/theme-options.php:529 msgid "Secondary Menu Prompt Arrow" msgstr "二级菜单提示箭头" -#: options/theme-options.php:522 +#: options/theme-options.php:530 msgid "" "After turning on, the menu prompt arrow will appear in the secondary menu of " "the navigation menu" msgstr "开启之后菜单提示箭头将出现在二级菜单" -#: options/theme-options.php:529 +#: options/theme-options.php:537 msgid "Secondary Menu Radius" msgstr "二级菜单圆角" -#: options/theme-options.php:540 +#: options/theme-options.php:548 msgid "Mashiro Logo Style" msgstr "白猫样式Logo" -#: options/theme-options.php:541 +#: options/theme-options.php:549 msgid "" "After turning on, the Mashiro Logo will appear and replace the navigation " "menu logo position" msgstr "开启之后白猫样式Logo将出现并替换导航菜单Logo位置" -#: options/theme-options.php:548 +#: options/theme-options.php:556 msgid "Nav Menu Text Logo Options" msgstr "导航菜单文字Logo选项" -#: options/theme-options.php:554 +#: options/theme-options.php:562 msgid "Text A" msgstr "文本A" -#: options/theme-options.php:559 +#: options/theme-options.php:567 msgid "Text B" msgstr "文本B" -#: options/theme-options.php:564 +#: options/theme-options.php:572 msgid "Text C" msgstr "文本C" -#: options/theme-options.php:569 +#: options/theme-options.php:577 msgid "Secondary Text" msgstr "二级文字" -#: options/theme-options.php:575 +#: options/theme-options.php:583 msgid "Font Name" msgstr "字体名称" -#: options/theme-options.php:592 +#: options/theme-options.php:600 msgid "Widgets Panel and Frontend Related Options" msgstr "小组件面板和前台相关设置" -#: options/theme-options.php:599 +#: options/theme-options.php:607 msgid "" "You can click here" @@ -1202,131 +1212,131 @@ msgstr "" "#%E6%A0%B7%E5%BC%8F%E8%8F%9C%E5%8D%95%E5%92%8C%E5%89%8D%E5%8F%B0%E8%83%8C%E6%99%AF%E7%9B%B8%E5%85%B3%E8%AE%BE%E7%BD%AE\">" "此处 了解如何在此页面上设置选项" -#: options/theme-options.php:604 +#: options/theme-options.php:612 msgid "Widgets Panel" msgstr "小组件面板" -#: options/theme-options.php:610 +#: options/theme-options.php:618 msgid "Widgets Panel Button Radius" msgstr "小组件面板按钮圆角" -#: options/theme-options.php:611 options/theme-options.php:621 +#: options/theme-options.php:619 options/theme-options.php:629 msgid "Slide to adjust, the recommended value is 10" msgstr "滑动滑块,推荐数值为10" -#: options/theme-options.php:620 +#: options/theme-options.php:628 msgid "Widgets Panel Widget Radius" msgstr "小组件面板组件圆角" -#: options/theme-options.php:630 +#: options/theme-options.php:638 msgid "Widgets Panel Font" msgstr "小组件面板字体" -#: options/theme-options.php:638 +#: options/theme-options.php:646 msgid "Widgets Panel WP Widget Area" msgstr "小组件面板WP小工具区" -#: options/theme-options.php:639 +#: options/theme-options.php:647 msgid "When turned on, the WP Widget Area will be displayed in Widgets Panel" msgstr "开启之后WP小工具区将显示在小组件面板" -#: options/theme-options.php:646 +#: options/theme-options.php:654 msgid "Widgets Panel Day&Night Switching" msgstr "小部件面板浅色/深色模式切换" -#: options/theme-options.php:647 +#: options/theme-options.php:655 msgid "" "Enabled by default, the Day&Night Switching will be displayed in Widgets " "Panel" msgstr "默认开启,小组件面板将出现浅色/深色模式切换组件" -#: options/theme-options.php:654 +#: options/theme-options.php:662 msgid "Widgets Panel Font Switching" msgstr "小组件面板字体切换" -#: options/theme-options.php:655 +#: options/theme-options.php:663 msgid "" "Enabled by default, the Font Switching will be displayed in Widgets Panel" msgstr "默认开启,小组件面板将出现字体切换组件" -#: options/theme-options.php:661 +#: options/theme-options.php:669 msgid "Frontend Background" msgstr "前台背景" -#: options/theme-options.php:672 +#: options/theme-options.php:680 msgid "Frontend Background Scaling Method" msgstr "前台背景缩放方式" -#: options/theme-options.php:673 +#: options/theme-options.php:681 msgid "" "You can choose two ways to scale the frontend background, the default is " "auto-scaling" msgstr "你可以选择两种方式缩放前台背景,默认自动缩放" -#: options/theme-options.php:680 +#: options/theme-options.php:688 msgid "Background Transparency Blur" msgstr "前台背景模糊" -#: options/theme-options.php:681 +#: options/theme-options.php:689 msgid "After opening Background Transparency Blur" msgstr "开启之后前台背景模糊" -#: options/theme-options.php:688 +#: options/theme-options.php:696 msgid "Widgets Panel Background Switching(Frontend Background)" msgstr "小组件面板背景切换(前台背景)" -#: options/theme-options.php:697 options/theme-options.php:713 -#: options/theme-options.php:729 options/theme-options.php:745 -#: options/theme-options.php:761 +#: options/theme-options.php:705 options/theme-options.php:721 +#: options/theme-options.php:737 options/theme-options.php:753 +#: options/theme-options.php:769 msgid "Image" msgstr "图片" -#: options/theme-options.php:702 +#: options/theme-options.php:710 msgid "Heart Shaped" msgstr "心形形状" -#: options/theme-options.php:708 options/theme-options.php:724 -#: options/theme-options.php:740 options/theme-options.php:756 +#: options/theme-options.php:716 options/theme-options.php:732 +#: options/theme-options.php:748 options/theme-options.php:764 msgid "Switch" msgstr "开关" -#: options/theme-options.php:718 +#: options/theme-options.php:726 msgid "Star Shaped" msgstr "星形形状" -#: options/theme-options.php:734 +#: options/theme-options.php:742 msgid "Square Shaped" msgstr "方形形状" -#: options/theme-options.php:750 +#: options/theme-options.php:758 msgid "Lemon Shaped" msgstr "柠檬形状" -#: options/theme-options.php:781 +#: options/theme-options.php:789 msgid "Background Transparency in the Frontend" msgstr "前台背景透明度" -#: options/theme-options.php:782 +#: options/theme-options.php:790 msgid "Slide to adjust, the recommended sliding value range is 0.6-0.8" msgstr "滑动滑块,推荐数值范围为0.6-0.8" -#: options/theme-options.php:791 +#: options/theme-options.php:799 msgid "Frontend Font" msgstr "前台字体" -#: options/theme-options.php:797 +#: options/theme-options.php:805 msgid "Global Default Font/Widgets Panel Font Switching A" msgstr "默认字体/小组件面板字体切换 A" -#: options/theme-options.php:804 +#: options/theme-options.php:812 msgid "Widgets Panel Font Switching B" msgstr "小组件面板字体切换 B" -#: options/theme-options.php:814 +#: options/theme-options.php:822 msgid "Footer Options" msgstr "页尾设置" -#: options/theme-options.php:821 +#: options/theme-options.php:829 msgid "" "You can click here to learn how to set the " @@ -1335,37 +1345,37 @@ msgstr "" "您可以单击 此处 了解如何在此页面上设置选项" -#: options/theme-options.php:827 +#: options/theme-options.php:835 msgid "Footer Online Music Player" msgstr "页尾在线音乐播放器" -#: options/theme-options.php:828 +#: options/theme-options.php:836 msgid "" "A button will appear at the bottom left corner of the footer after turning " "on, click it and the footer online player will be displayed" msgstr "开启之后页尾左下角将出现按钮,点击按钮后页尾在线播放器将显示" -#: options/theme-options.php:831 +#: options/theme-options.php:839 msgid "Netease Cloud Music" msgstr "网易云音乐" -#: options/theme-options.php:832 +#: options/theme-options.php:840 msgid "Kugou Music(may not be available)" msgstr "酷狗音乐(可能无法使用)" -#: options/theme-options.php:833 +#: options/theme-options.php:841 msgid "Baidu Music(not available on servers overseas)" msgstr "千千音乐(海外服务器无法使用)" -#: options/theme-options.php:834 +#: options/theme-options.php:842 msgid "QQ Music(may not be available)" msgstr "QQ音乐(可能无法使用)" -#: options/theme-options.php:842 +#: options/theme-options.php:850 msgid "Footer Online Music Player Proxy" msgstr "页尾在线音乐播放器代理" -#: options/theme-options.php:844 +#: options/theme-options.php:852 msgid "" "Ex. http://127.0.0.1:8080. Reference: https://curl.se/libcurl/c/" "CURLOPT_PROXY.html" @@ -1373,11 +1383,11 @@ msgstr "" "例如:http://127.0.0.1:8080 请参考:https://curl.se/libcurl/c/CURLOPT_PROXY." "html" -#: options/theme-options.php:851 +#: options/theme-options.php:859 msgid "Footer Online Music Player Songlist ID" msgstr "页尾在线播放器歌单ID" -#: options/theme-options.php:853 +#: options/theme-options.php:861 msgid "" "Fill in the song ID, e.g. https://music.163.com/#/playlist?id=5380675133 " "SongID:5380675133" @@ -1385,113 +1395,113 @@ msgstr "" "填写歌单ID,例如:https://music.163.com/#/playlist?id=5380675133的歌单ID是" "5380675133" -#: options/theme-options.php:860 +#: options/theme-options.php:868 msgid "Footer Online Music Player Mode" msgstr "页尾在线音乐播放器模式" -#: options/theme-options.php:862 +#: options/theme-options.php:870 msgid "Select music player mode" msgstr "选择音乐播放器模式" -#: options/theme-options.php:864 +#: options/theme-options.php:872 msgid "List" msgstr "列表播放" -#: options/theme-options.php:865 +#: options/theme-options.php:873 msgid "Random" msgstr "随机播放" -#: options/theme-options.php:873 +#: options/theme-options.php:881 msgid "Footer Online Music Player Preload" msgstr "页尾在线音乐播放器预加载" -#: options/theme-options.php:875 +#: options/theme-options.php:883 msgid "Whether to preload songs" msgstr "选择是否预加载歌曲" -#: options/theme-options.php:878 +#: options/theme-options.php:886 msgid "Preload Metadata" msgstr "预加载元数据" -#: options/theme-options.php:887 +#: options/theme-options.php:895 msgid "Default Volume of Footer Online Music Player" msgstr "页尾在线音乐播放器默认音量" -#: options/theme-options.php:889 +#: options/theme-options.php:897 msgid "Slide to adjust, the recommended sliding value range is 0.4-0.6" msgstr "滑动滑块,推荐数值范围为0.4-0.6" -#: options/theme-options.php:898 +#: options/theme-options.php:906 msgid "Netease Cloud Music Cookies" msgstr "网易云音乐Cookies" -#: options/theme-options.php:900 +#: options/theme-options.php:908 msgid "" "If you want to play VIP music on Netease Cloud Music Platform, please fill " "in your account cookies in this option." msgstr "如果你想播放网易云音乐会员专享音乐,请在此选项填入你的帐号Cookies。" -#: options/theme-options.php:906 +#: options/theme-options.php:914 msgid "Footer Sakura Icon" msgstr "页尾樱花图标" -#: options/theme-options.php:907 +#: options/theme-options.php:915 msgid "Enabled by default, sakura icon will appear on the footer" msgstr "默认开启,将在页尾显示樱花图标" -#: options/theme-options.php:914 +#: options/theme-options.php:922 msgid "Footer Info" msgstr "页尾信息" -#: options/theme-options.php:915 +#: options/theme-options.php:923 msgid "Footer description text, supports HTML code" msgstr "页尾说明文字,支持HTML代码" -#: options/theme-options.php:922 +#: options/theme-options.php:930 msgid "Footer Text Font" msgstr "页尾文本字体" -#: options/theme-options.php:930 +#: options/theme-options.php:938 msgid "Footer Load Occupancy Query" msgstr "页尾负载占用查询" -#: options/theme-options.php:931 +#: options/theme-options.php:939 msgid "" "Load occupancy information will appear at the end of the page after turning " "it on. Not recommended in production environment." msgstr "" "开始之后将加载占用信息,该信息将显示在页面末尾。不建议在生产环境中使用。" -#: options/theme-options.php:938 +#: options/theme-options.php:946 msgid "Footer Upyun League Logo" msgstr "页尾又拍云联盟Logo" -#: options/theme-options.php:939 +#: options/theme-options.php:947 msgid "Upyun Logo will appear at the end of the page after turning it on" msgstr "开始之后将显示又拍云联盟Logo及信息" -#: options/theme-options.php:947 +#: options/theme-options.php:955 msgid "Footer Addition" msgstr "页尾附加代码" -#: options/theme-options.php:948 +#: options/theme-options.php:956 msgid "" "Add HTML code at the end of the page. Useful for adding customize JavaScript." msgstr "在页尾添加HTML代码。可用于添加 JavaScript" -#: options/theme-options.php:953 +#: options/theme-options.php:961 msgid "Hitokoto" msgstr "一言" -#: options/theme-options.php:959 +#: options/theme-options.php:967 msgid "Footer Hitokoto" msgstr "页尾一言" -#: options/theme-options.php:960 +#: options/theme-options.php:968 msgid "Hitokoto will appear at the end of the page after turning it on" msgstr "开启之后页尾将出现一言" -#: options/theme-options.php:967 +#: options/theme-options.php:975 msgid "" "7VdWl8b)7wmP9kBq%jj&^5{A%?hi^dUsNe}7N-mn@%?>WDF{iq;6r9ED? zUOV>Aw0MCQciEpOE=ybz|M@>hO{Cn&V!k fOvEM@Af0*qtuNh!>6;CivO_ll_9jf zPF-zE`ktT <>46z8)anfJ FAj`O*>Ep0aj)hw%ETnyskS{Yzbba{2wo8pnr!WZBF9n8vjO z|M(jkC&uw@)7!`qy>ScsE{;ecUPie% Q2v1Zs7vt=9eB}N zy`{XH {1t1|#*P_9e3J5Y|45VQz+gYKNpy(~R@c?q z>MP=>9ILINAJ;Ug#D}yf%^7Cn$L#!o4Sjpbq}9v*(58`HSCY{;!S~p^v0o!@!4Wqp zYiq<_kK8x-zV-bF<=V6 1ptwm94vXR|v=c!A604=wYn`gO} OU*(^R!61Be)jlekn z<7Uy7PgDAW%nqDN+i=v@00ZooDObkjxYQ4C9+TkFx-0t%GJEkITu6(ylozmfA #qg#eT!`Js8g#%1v>f `90{K%FO8J|(FUj;9+$5MWhy$0on+c9EoKXL4EJI?^iWg}OJ+{@H&CwGll z+mB{*a(yU2*u{>+x;A~unIjZ8U??8;uyKS=f!vTezJ!2Ueh{eGZTWZ$V|wY`Z| z@s`CqLs|acro}xu%SiUl?32jF(nAZZj(=cw@~1dvJ>`Pz+UA=b{V}bgD>tA;S$1tz ztfm)nUiQtzXEDuHdsY08Tg3zlZMxLzLDeqJ2M-)LcvSkJ{;`9Hj7T3mXn5?X^nn9o zd-aVSIlOP5*tFrX{n7>w?3LF0x!Cffo=qRvH@5fS=lc$eP0vW{PdRPSpur>5dRX7I zKC!*V#18L0EPcp`;R%~gj9rqqbhFVThNbl$5&Pt`eKY#THW@r{@UYl^!v<$iR41*} z$)=%G*2iq>x#~jwN9x2@OR8J5+NS1L-%D(LdFP7D+ooMxu x)<- YR73ZhHIr`khzan0@8LmopbFyRu- =m zI_INXyQXYCUntN&cZJJ4XSlk|`EOiZxPungrcA!PZSB=J-sG^$+jeFyo13|8;q@sS Sw>Bvim=(P>e}h2vn*RgNca~cK delta 15295 zcmY+~37k*W|HtwB#n^{oFc{1*_H8i37-NiK7-U}(A%1qU?^|Cxk;0|2CuGZ>wN#== zB}99O6m8;1BJ_W~zvt8c@&Dh) #zVG#b`W_h43bp!0eMfuOP;m zbtZd3uOf-&By_=%m>s8>Gw~_n`FI9@L0$Op6xX4Xs1u$;<$uC_cpJko>oXjSxv(29 z#T _L2QOj*7MbRG$=CvQ+)R85Kd^lH>7Lh~ zxF@#8J!X~}+$?cB9FHr46uM9-G}H6G$DybL+RpO4UbqIEVPLjv*8+zSug7s%aE=@L zd032i3r6BGEQ4QS6#k7hF> 6w^V@@22MR5`i!X=mk|G@~%G0*b`Vo}tHPDdV1(EFN#PSlU6A&x;c+=taM_BqeX z#5SlAc?qZDJyiX~1@3~IaX4|I=V^ plP$Q9lq33ngEJ&x&oWx4h z9sFqigT0B1F5>y&WYlD nm&Fy OC)OGPpG))OKt>WP;phPg$bw*_rpRs26f_js7bjRHF@7a-N*;18~Xx_;LoT> z5_s92H~eMBUp*;ALPK80D&kSIx(@0>X_$r`Q72x4VYmTX;#O>ge<2ITOIgN>z+ 2{p~c}V+$*#&Rw7>u%VRgx1!iCpK8p!> z1pk9~ke8kJ#7cMGFHkpd5p_esKdhq0D$grTqAo^bSJa4%MUBJ^9D~oH+GSboo^4sw zkXABlquQsVj&Fe);m)WI_C-CyRjxkhy-uM7iGx@cKS! a0CRtr9g>6tHG!)gLQCJ*jU{H6mnnDcjLp`g{Q4N1E zZ=)`hZM{1%5;aoQQLCe+*$Z{Pv8eMrkGheSs7JCB^$0$;{Mq%4zlQ2Z66*OMs5t8e zH$>rBlsE>nVO`WJNkz?t4Afj`i#onLeuTp bD1t4L(Q z*HF)LGp67bWC?pQ8{GvCq8`b|sE*x7-D%_|*Rj%=gSaB =m_YC7v^{ufY4nV!}7NMTyM$}||57nV_s7G`eHA3DN_YDb0 zb*L!ne8FlI)F2bCaiuKh;TBiN6X@gxok@B%{J zY0qu0{S1sFUWH8Npm&5qZ5m#{_EZ$w;V#r4)seBNNi-YPk>#incpcS&^X3iI^2)W- z{X!~^`HAOZZG0IuQm0U>;yPB=`p>z`T_6GVOf#_(_C(#uJgk6wu^N7d>QJ8D?gBBW zj>MzpP;-l0qAt`A!*CWx;C$3%UWwVczPDBd+=N;_J5U`tj(WzIP %L>q1jVMB+Tui()nE&JUq3bQ*i&MO4ol z?sX&78fOysM~%#{*aNHXbCYg97AD?~diKXq9k_^9@xeaEzc+ JhPI{I0ZS2gMGff$%!$vSE;I*A;wn`Ao2cX8MNP)z7N0f0LOse$s1E-TGRR*j z6k3wVcZ5$TK8a7@G#rXwqvlBS_gFHx4clVdqbwy{i$$>BF?WaUP$MuHwOYoZE;tV- z;xda1z0b>z>w9q&H2dpfS!{_qa0EVsGm)Y4vVOoQ1y~`dRr8RdM{b!FM%_tmoQkb58=gYFus*}a z_yg+BDt_$lGzr6q8{l5dz)ZZ4GqKSpELl8`qp;m6#=jSZ_fNTJT;Wr9hx5&EunF~5 zPBQ^<1ggWopzbW&8MmwoVl;6JERFq8k8mz(wX8r*<^vXgfogv{NTD)?h_h~JQcxFY zhL2+})H*+aweeR>!ZM$^5$K9_h*x7LJdZ1}$~or=v+sG{g5 3)L>T<_lM- z|0NTJ#8=1!_qKn =648|M++Ks@qWh98T5$Bz(vh}-am3(nMw+%@qpsQjEu z?hl&U-@AV)*^Se+{tI5_8&89!*ctO)alcUdpyt2?tcr_J&-QH`ipOv;CeRDz*P!Om z2F!}vFb;R2R>679gWsYi T4o!}p95O&o~wgRXZOc9)ei5P}&neSl%;u98s zjk@q9i+{jFSy*luNq)mMcVh=p$DNW~-@8O13~!l#p?dtt;;`$k$9c?X)U2<9d9fbq z_)N2v*}?2$K4tbb2V<}bJsd%y30+_H3p0`vUHP5m65#Lr8(aXp-{j4RgKqIR0xtY7 zlMplSFjqJ}_@`SXjqdTf=J>g&Nqhy1-~&`gBk#M(9E-Zaj`w-~s(6w_9UOp)*O;$c z!-E#Ti&{3HpqA5hOvaplyH(T(YY-2?S-2YOW7!Ap>)H!5h+jZm@0|XfuRVo44_%@M z_9kA6x$z#Vr`aC4j^#0nVm0#REbd@&PgIAV#{@iqY52h6`v16Z#BfX`KQBn33Wawt z9DhNLz&+FuX7>W27fB2%u7$erV^|g^Sbnv|`^|4r9SH tChNb_WI7p{-0A7sujSE5e17YpM#)P;Vw{6n)u)__- e ^ q#6oz4E1ABP&D1?c1Jm<=1|40u6Z zpa}(?s3j`yX7)A*nIp{cs5e*;bw`V^5UxkPat~Vk9qL7O%M9dlaRkPYkI5AXh7L?4 zp$>FJb)XMM@`4$R8meG!ccG=IN3sb^;$Bqy&n*A7`IC9u4Dhd(>S#W*w3(PE=qfTT z(bXJ+y3kbA1s0$l!4ivCTm1&qiFc!h_ Xasv{T7Ur-nN3w5HXaChR$s0+3<`=ZYK4C;K#E#8Uh$j7Kj8T_3>1qzY* z+zC@qCu(i>$IwWa3oO6f+=J@K#};42=EQ$lzEOVH;ZCTzFdB8f8OU)#Z=p3<=Mvs~ zsG&ZO>iI=fkME!kjEZm Ly@boj*D37UpFzD(E}%LbUBu-RF|_{E zEzt~h!A_{2ce8vy)PbYS=TJkq0d*$_EIws^Z{9X@M7iUOqi!Gpb)AM$tbY|UNvMad zaSP73hINX%0~({Abz8G1>cYcO9i5H+a3K!FyQuT_D(3P7Q0M>D%v;>W&5N`C^)Z=E zLLZ;Qs5o!5Tepo-lWQpId%hC&BlWb!6-xv{|9P$(YO-y>rg# MU{A~M#0cX3 zsG&ZA8qu)0fVUVsqOS83#^X)wr1f9Atn2AGY)r*k?0{EsI3|}1g#Nv63u*{I!*mQU zAMjGK4eEjm%#)~9m7_u+^vh}v_9WheYG0_L8_D(|X*rm}5GrQk0=$J9vZ S=jPBv^xnW+tj5t*yS7ITW=VC!yXO zOHgmfov256*5bRUuVk?*_6Sku%P>1*P?Kp8g>pC(d*K%R4f9rY@9z7k3l^*9E>H{g zRqKqp@N~?I>rr>M3DthD#ivlu{u|VBS5b2*qB`qe2SinO2bM)OsA+LGRF4OuJ|2@% zLqFg0Yt1)M=Q)m=oaZdQj_TN-sPo*ne0aR;Q1N)yzj{)Zgq~p))E%XuPS_n)KL|C+ zMxfpU+i?tDMvd4LHC($xn49 VhAm&U+E{i|GdHe1V$IoIwgBNaVM~G}Il=MRjB~ z>KVRk^%pQSgl0r7*Rd3APrLD`3w(sS@L5d5%cvVFli(g Lbi3vlQz1a%L^mi!9CRhg*Ie>U=ZJRmgG R z=SN+rh#7}EVGY!sG{>j08|r)?qDJyG>bM^ ht>#>OvKg+)!6X#SKuCwF&B(ceH#zR0oEje!|Vhf?EF@DCoimP#yVB z75F>qfIwY$f#Rq~Q5hq#Iu^l3sCHdY9T fjjEakEjAY?-+k)uDr!15cwK!I!8<`Mbq`S)8vP>t81-TF*7Cg1W ISj#q1Q;zrOb$ka!6n zqFx|N>$_#P1$Dvms1961UEq%S0M)^)scvM#QE@3$2P&dQFa!07`=Lg1K57oE4^mLW zqn5ac`i?(B9T45Xb)X@tT?dPYp(fdM)cau(s)IYsw@@Ab5Ou+CQ60O3dVl f2End7XP17LQDK?Vm&4`36+Sk7GXCUBL## zw;F{y81!m3c0J8Nb)Yk9QuRR{I2tvn7MdGTclI_8#4{GBWVjy|tx+TLjJeYChfwGL z8FlR|=z! zFJW;d)Q#1^(E4v_4W2TeMor2IsL8g|^83wWmOo?hm*!Q=-?I3gnLX2WAQJU)ibbu8 zDj53xA5TFSs$-_2?jQrT-aA`705ypwq1w+vJ*wv{UTLmFjno!Y`=h84_yl#{udV*K zOk4lio4E$Xup Bjp{%jRL=*ahHgCSj%QfCkNOrY$HDlXS-qwE z@wwdm0As1YWk$Agabl1{B`P{$MO3VR58Q+k@Eqy_ty{ZxW6f90ljd#I@uk|h<1 R JP z)bTScei5q@uR|^C)0m?5f0=?NMX3(%50L)2gm^3JP1UfY`-v7r-N{YViF0&vv%9!i z7S*BZI1*DV-i~VjCTi}SLcQ8AD6j8-*2e>0cPxUTHy#$^Rk;v#!VR6>dfkm0fqkgI z{SKpM_j${EPq_9u%tEO4rBNeT5q17d%lF1$O%j7B=oijP)IY_3g8Dp0ba8(XwZ$gH z7f_F?Y*#nAQc>@Rei)A9P#vCSF2>TtYfvL_1l6H)sBgzNUG4Y(9THmiS)OzaI-|aB zJun`JpqAe%tKVeqz-i?7p?;Rv?dCfAH1;Omjr_>;igb5x)VA1~cn<34{O8?S|GKlt z9)Zw*Uh9I2UqB7jdDJtziTdpqc*^DDQOoNw)SMV?`FW_1&uiu}%U?!4^GB#RVq8x* zlGTC~+LLICdgm`gUFbCGkvu{@iuhj6VW>y616SZJ^ZEa{xN>h>=lCo2qx-mgufEQQ z_!;?S{Q}+*3=ZiZ@K#ZX9}w_%;3wvkfdOwlakW7K?+Tv9g}85Uz D-$Lt+Z*9sWwFg1>l1xf4dBW^Zwe ztC@*r3I?bz&;K0chrvJih?w6cq3w+F>>5RF>XeqFwgi2JcvK#*< nZ6&Sc9HNu#4~ffBztBINoYaMX z!15-s>wPesn#G}G7*5I&tUAmTh)sy9c|G-YV>N; z)`(nB`WTPb{aN+mnpfsJ+OApaO2jX*cO<^)s=R>J>F<}J9IY1|Ya_H}CC;S&kbkpY zWO6jwcggcs^tO@JJNv%1yg~UF%I(-MQ8$7kpJv}fxt5=r5?zjI?#;K>4>3Rc6l%5o z$v%v|nm;8aI&j)wmJ%Jdk@{c#gZxv 3o5kbAZ|t5 zf42tYzhJ+>&KETF-mXezH})d5(@TcG5j=hx=Jr0K@B#Y+|6%>8R=jMzW1OxQO^)LY zc74AJ;iozbuc5ZOwEcH`)yl;!!Dr8_;`d68>)V>rQLCMeVYFz 9qTrGyOpPn%}NLR1 bv#~E`UqGF =u_6&0U{cR1ZRQiUjwr6l5HQI_>PUXFn^$DKi2hyU-RiH&qGI3<|e^n^JuI(PV z4eU=6H}q4}VoFXVI%?;8kMb7EWoQ{kIlDh0EvD~2O6%DF-SmAuLc9yt(7G%BPJE61 zJ3G?>%*j5HeKgn7uZQ~7AHV|Eh9dv@oL?Qpef)=M@qr3{wT4NlcgRg6mxB6`=$)^v zG;s>~n(SXueuG>*eovf+7m0uJ*EWpm@-dOVSxNW~K8LCF;&Jw~#I-p>+uQ6V$*m{; zgEsd=S$;!X{bW4Eo{#)=>R Tn|_!Y{ DO!$-K4O!h@vJN**EMu$>ayoazD9cmg8@EFNyL; z7V9j3Q%>|3HHizaMeQF%BQe%L(j>atc}ge99KdD*QO5x7h#7zSLjTG^)~8)v>i_ zkK~A|+{ ps&v;S=Qr|8dS${F~!= zO13T8*V)ICeb)~(kL){_thVQ|2L5L8o1rW#!Q!4=Wej^~_L<~jIYU#dg|{#p`STpJ zjdCQrwwKM0{)Fby)#}rtEW5U9R`Va?yzIM))3KMU_Nw|vn#TkR?fJg>KQ;C=nY1|H zo(IovkMT1n=l6GSE||B&fL?uujf-tO?CD`6{au?2?b*8dLj4@IVrwSWOHACe@W+ku z`xh4pbk4iKP+VY9bj2SRZo58f!L?_1d)L?Qy}s(zYddCM+kWWkbBC_3S#$m6H?AJu Rb^X Client local time:Dark mode will switch on automatically " "from 22:00 to 7:00 Follow client settings:Follow " @@ -896,39 +906,39 @@ msgstr "" "p>
跟随客户端设置:跟随客户端浏览器的设置
永" "远开启:永远开启,除非客户端另有配置
" -#: options/theme-options.php:237 +#: options/theme-options.php:245 msgid "Automatic Switch Strategy of Dark Mode" msgstr "深色模式自动切换策略" -#: options/theme-options.php:240 +#: options/theme-options.php:248 msgid "Client local time" msgstr "客户端当地时间" -#: options/theme-options.php:241 +#: options/theme-options.php:249 msgid "Follow client settings" msgstr "跟随客户端设置" -#: options/theme-options.php:242 +#: options/theme-options.php:250 msgid "Always on" msgstr "永远开启" -#: options/theme-options.php:250 +#: options/theme-options.php:258 msgid "Dark Mode Image Brightness" msgstr "深色模式图像亮度" -#: options/theme-options.php:251 options/theme-options.php:262 +#: options/theme-options.php:259 options/theme-options.php:270 msgid "Slide to adjust, the recommended value range is 0.6-0.8" msgstr "滑动滑块,推荐数值范围为0.6-0.8" -#: options/theme-options.php:261 +#: options/theme-options.php:269 msgid "Dark Mode Component Transparency" msgstr "深色模式部件透明度" -#: options/theme-options.php:271 +#: options/theme-options.php:279 msgid "Dark mode Background Transparency" msgstr "深色模式背景透明度" -#: options/theme-options.php:272 +#: options/theme-options.php:280 msgid "" "Slide to adjust, the recommended value range is 0.6-0.8. In order to ensure " "the best appearance, please keep the display of the frontend background image" @@ -936,33 +946,33 @@ msgstr "" "滑动滑块,推荐数值范围为0.6-0.8。为保证最佳观感,使用此项最好保留前台背景图像" "的显示" -#: options/theme-options.php:281 +#: options/theme-options.php:289 msgid "Other Appearance Related" msgstr "其他外观相关" -#: options/theme-options.php:287 +#: options/theme-options.php:295 msgid "Commemorate Mode" msgstr "纪念模式" -#: options/theme-options.php:288 +#: options/theme-options.php:296 msgid "" "After turning on, a black and white filter will be added to the global theme" msgstr "开启之后主题全局将添加黑白滤镜" -#: options/theme-options.php:295 +#: options/theme-options.php:303 msgid "Occupying SVG while Loading Control Units" msgstr "加载控件单元占位SVG" -#: options/theme-options.php:296 +#: options/theme-options.php:304 msgid "" "Fill in the address, which is the SVG displayed when loading control units" msgstr "填写地址,此为加载控件单元时占位显示的SVG" -#: options/theme-options.php:305 +#: options/theme-options.php:313 msgid "Font Options" msgstr "字体设置" -#: options/theme-options.php:312 +#: options/theme-options.php:320 msgid "" "You can click here to learn how to set the " @@ -971,69 +981,69 @@ msgstr "" "您可以单击 此处 了解如何在此页面上设置选项" -#: options/theme-options.php:317 +#: options/theme-options.php:325 msgid "Global" msgstr "全局设置" -#: options/theme-options.php:323 +#: options/theme-options.php:331 msgid "Non-Emphasis Text Weight" msgstr "非强调文本字重" -#: options/theme-options.php:324 +#: options/theme-options.php:332 msgid "Slide to adjust, the recommended value range is 300-500" msgstr "滑动滑块,推荐数值范围为300-500" -#: options/theme-options.php:334 +#: options/theme-options.php:342 msgid "Text Font Size" msgstr "文本字体大小" -#: options/theme-options.php:335 options/theme-options.php:1534 +#: options/theme-options.php:343 options/theme-options.php:1542 msgid "Slide to adjust, the recommended value range is 15-18" msgstr "滑动滑块,推荐数值范围为15-18" -#: options/theme-options.php:345 +#: options/theme-options.php:353 msgid "External Fonts" msgstr "外部字体" -#: options/theme-options.php:351 +#: options/theme-options.php:359 msgid "Reference External Fonts" msgstr "引用外部字体" -#: options/theme-options.php:352 +#: options/theme-options.php:360 msgid "" "After turning on, you can use external fonts as the default font or other " "component fonts, but it may affect performance" msgstr "开启之后可以使用外部字体作为默认字体或其他部件字体,但可能影响性能" -#: options/theme-options.php:359 +#: options/theme-options.php:367 msgid "External Font Options" msgstr "外部字体选项" -#: options/theme-options.php:365 +#: options/theme-options.php:373 msgid "Font 1 Name" msgstr "字体 1 名称" -#: options/theme-options.php:370 +#: options/theme-options.php:378 msgid "Font 1 Link" msgstr "字体 1 链接" -#: options/theme-options.php:375 +#: options/theme-options.php:383 msgid "Font 2 Name" msgstr "字体 2 名称" -#: options/theme-options.php:380 +#: options/theme-options.php:388 msgid "Font 2 Link" msgstr "字体 2 链接" -#: options/theme-options.php:394 +#: options/theme-options.php:402 msgid "Google Fonts Api Link" msgstr "Google字体API地址" -#: options/theme-options.php:401 +#: options/theme-options.php:409 msgid "Google Fonts Name" msgstr "Google字体名称" -#: options/theme-options.php:402 +#: options/theme-options.php:410 msgid "" "Please make sure that the added fonts can be referenced in Google Fonts " "library. Fill in the font names. The added fonts must be preceded by \"|\". " @@ -1045,11 +1055,11 @@ msgstr "" "有”|“。如果引用多个字体,请使用“|”作为分割符,如果字体名称有空格,请用加号替" "代。例如:|ZCOOL+XiaoWei|Ma+Shan+Zheng" -#: options/theme-options.php:410 +#: options/theme-options.php:418 msgid "Navigation Menu Options" msgstr "导航菜单设置" -#: options/theme-options.php:417 +#: options/theme-options.php:425 msgid "" "You can click here to learn " @@ -1059,140 +1069,140 @@ msgstr "" "#%E5%AF%BC%E8%88%AA%E8%8F%9C%E5%8D%95%E8%AE%BE%E7%BD%AE\">此处Hitokoto API Setup Instructions
Fill in as the example:
" "[\"https://api.nmxc.ltd/yiyan/\", \"https://v1.hitokoto.cn/\"]
, where " @@ -1512,19 +1522,19 @@ msgstr "" "Maho API:官方API的反代镜像。https://api.nmxc.ltd/yiyan/
" -#: options/theme-options.php:976 +#: options/theme-options.php:984 msgid "Hitokoto API address" msgstr "一言API地址" -#: options/theme-options.php:978 +#: options/theme-options.php:986 msgid "Fill in the address in JavaScript array format" msgstr "填写地址,格式为JavaScript数组" -#: options/theme-options.php:987 +#: options/theme-options.php:995 msgid "Cursor Options" msgstr "光标设置" -#: options/theme-options.php:994 +#: options/theme-options.php:1002 msgid "" "You can click here to learn how to set the " @@ -1533,51 +1543,51 @@ msgstr "" "您可以单击 此处 了解如何在此页面上设置选项" -#: options/theme-options.php:1000 +#: options/theme-options.php:1008 msgid "Standard Cursor Style" msgstr "标准光标样式" -#: options/theme-options.php:1001 +#: options/theme-options.php:1009 msgid "Apply to global, fill in \".cur\" mouse file link" msgstr "应用于全局,填写Cur鼠标文件链接" -#: options/theme-options.php:1008 +#: options/theme-options.php:1016 msgid "Selected Cursor Style" msgstr "选定光标样式" -#: options/theme-options.php:1009 +#: options/theme-options.php:1017 msgid "Apply to multiple styles, fill in \".cur\" file link" msgstr "应用于多种样式,填写Cur鼠标文件链接" -#: options/theme-options.php:1016 +#: options/theme-options.php:1024 msgid "Selected Control Unit Cursor Style" msgstr "选中控件单元光标样式" -#: options/theme-options.php:1017 +#: options/theme-options.php:1025 msgid "Apply to selected control unit, fill in \".cur\" file link" msgstr "应用于选中某个控件单元,填写Cur鼠标文件链接" -#: options/theme-options.php:1024 +#: options/theme-options.php:1032 msgid "Selected Text Cursor Style" msgstr "选中文本光标样式" -#: options/theme-options.php:1025 +#: options/theme-options.php:1033 msgid "Apply to selected text, fill in \".cur\" file link" msgstr "应用于选中文本,填写Cur鼠标文件链接" -#: options/theme-options.php:1032 +#: options/theme-options.php:1040 msgid "Work Status Cursor Style" msgstr "工作状态光标样式" -#: options/theme-options.php:1033 +#: options/theme-options.php:1041 msgid "Apply to load control unit, fill in \".cur\" file link" msgstr "应用于加载控件单元,填写Cur鼠标文件链接" -#: options/theme-options.php:1042 +#: options/theme-options.php:1050 msgid "Additional Options" msgstr "额外设置" -#: options/theme-options.php:1049 +#: options/theme-options.php:1057 msgid "" "You can click here to learn how to set the " @@ -1586,72 +1596,72 @@ msgstr "" "您可以单击 此处 了解如何在此页面上设置选项" -#: options/theme-options.php:1054 +#: options/theme-options.php:1062 msgid "Effects&Animations" msgstr "特效及动画" -#: options/theme-options.php:1060 +#: options/theme-options.php:1068 msgid "Preload Animation" msgstr "预加载动画" -#: options/theme-options.php:1061 +#: options/theme-options.php:1069 msgid "" "Preload animation before new pages load; To enable this option, ensure your " "page resources can load properly." msgstr "开启之后新页面加载前会有预加载动画,此选项需确保你的页面资源正常加载。" -#: options/theme-options.php:1068 +#: options/theme-options.php:1076 msgid "Preload Animation Color A" msgstr "预加载动画颜色A" -#: options/theme-options.php:1077 +#: options/theme-options.php:1085 msgid "Preload Animation Color B" msgstr "预加载动画颜色B" -#: options/theme-options.php:1085 +#: options/theme-options.php:1093 msgid "Preload Animation Blur Transition Effect" msgstr "预加载模糊过渡效果" -#: options/theme-options.php:1087 +#: options/theme-options.php:1095 msgid "Blur transition duration in milliseconds ms, off when set to 0." msgstr "模糊过渡持续时间,单位毫秒ms,为0时关闭。" -#: options/theme-options.php:1097 +#: options/theme-options.php:1105 msgid "Sakura Falling Effects" msgstr "樱花飘落特效" -#: options/theme-options.php:1100 +#: options/theme-options.php:1108 msgid "Native Quantity" msgstr "原生数量" -#: options/theme-options.php:1101 +#: options/theme-options.php:1109 msgid "Quarter Quantity" msgstr "四分之一数量" -#: options/theme-options.php:1102 +#: options/theme-options.php:1110 msgid "Half Quantity" msgstr "二分之一数量" -#: options/theme-options.php:1103 +#: options/theme-options.php:1111 msgid "Less Quantity" msgstr "少量数量" -#: options/theme-options.php:1111 +#: options/theme-options.php:1119 msgid "Particles Effects" msgstr "粒子特效" -#: options/theme-options.php:1113 +#: options/theme-options.php:1121 msgid "" "Particles effects will appear in the global background. Please open the " "Cover-and-Frontend-Background-Integration Options to get the best experience" msgstr "" "粒子特效将会出现在全局背景,请打开封面与前台背景一体化选项以获取最佳体验" -#: options/theme-options.php:1121 +#: options/theme-options.php:1129 msgid "Particles JSON" msgstr "粒子特效 JSON" -#: options/theme-options.php:1123 +#: options/theme-options.php:1131 msgid "" "You can go to the Project Address to generate your unique Particles Effects" @@ -1659,160 +1669,160 @@ msgstr "" "你可以访问 项目地址 " "以生成属于你的独特粒子特效" -#: options/theme-options.php:1240 +#: options/theme-options.php:1248 msgid "Note Touch Effects" msgstr "音符触动特效" -#: options/theme-options.php:1241 +#: options/theme-options.php:1249 msgid "" "After turning on, there will be a note sound alert when the back to top " "button and Mashiro style logo touch" msgstr "开启之后返回顶部按钮和白猫样式Logo触碰时将有音符声音提示" -#: options/theme-options.php:1247 +#: options/theme-options.php:1255 msgid "Feature" msgstr "功能" -#: options/theme-options.php:1253 +#: options/theme-options.php:1261 msgid "PJAX Partial Refresh" msgstr "PJAX局部刷新" -#: options/theme-options.php:1254 +#: options/theme-options.php:1262 msgid "Enabled by default, clicking to a new page will not require reloading" msgstr "默认开启,点击新页面将不需要重新加载" -#: options/theme-options.php:1261 +#: options/theme-options.php:1269 msgid "NProgress Loading Progress Bar" msgstr "NProgress加载进度条" -#: options/theme-options.php:1262 +#: options/theme-options.php:1270 msgid "" "Enabled by default, when loading page there will be a progress bar alert" msgstr "默认开启,加载页面将有进度条提示" -#: options/theme-options.php:1269 +#: options/theme-options.php:1277 msgid "Global Smooth Scroll" msgstr "全局平滑滚动" -#: options/theme-options.php:1270 +#: options/theme-options.php:1278 msgid "Enabled by default, page scrolling will be smoother" msgstr "默认开启,页面滚动将更加平滑" -#: options/theme-options.php:1277 +#: options/theme-options.php:1285 msgid "Captcha Selection" msgstr "验证码选项" -#: options/theme-options.php:1280 +#: options/theme-options.php:1288 msgid "Theme Built in Captcha" msgstr "主题内建验证码" -#: options/theme-options.php:1281 +#: options/theme-options.php:1289 msgid "Vaptcha" msgstr "Vaptcha验证码" -#: options/theme-options.php:1289 +#: options/theme-options.php:1297 msgid "Vaptcha VID" msgstr "" -#: options/theme-options.php:1291 +#: options/theme-options.php:1299 msgid "Fill in your Vaptcha VID" msgstr "填写你的 Vaptcha VID" -#: options/theme-options.php:1297 +#: options/theme-options.php:1305 msgid "Vaptcha KEY" msgstr "" -#: options/theme-options.php:1299 +#: options/theme-options.php:1307 msgid "Fill in your Vaptcha KEY" msgstr "填写你的 Vaptcha KEY" -#: options/theme-options.php:1305 +#: options/theme-options.php:1313 msgid "Vaptcha Scene" msgstr "Vaptcha场景" -#: options/theme-options.php:1321 +#: options/theme-options.php:1329 msgid "Pagination Mode" msgstr "分页模式" -#: options/theme-options.php:1323 +#: options/theme-options.php:1331 msgid "Ajax Load" msgstr "Ajax加载" -#: options/theme-options.php:1324 +#: options/theme-options.php:1332 msgid "Page Up/Down" msgstr "上下页" -#: options/theme-options.php:1332 +#: options/theme-options.php:1340 msgid "Next Page Auto Load" msgstr "下一页自动加载" -#: options/theme-options.php:1335 +#: options/theme-options.php:1343 msgid "do not autoload" msgstr "不自动加载" -#: options/theme-options.php:1336 +#: options/theme-options.php:1344 msgid "0 Sec" msgstr "0 秒" -#: options/theme-options.php:1337 +#: options/theme-options.php:1345 msgid "1 Sec" msgstr "1 秒" -#: options/theme-options.php:1338 +#: options/theme-options.php:1346 msgid "2 Sec" msgstr "2 秒" -#: options/theme-options.php:1339 +#: options/theme-options.php:1347 msgid "3 Sec" msgstr "3 秒" -#: options/theme-options.php:1340 +#: options/theme-options.php:1348 msgid "4 Sec" msgstr "4 秒" -#: options/theme-options.php:1341 +#: options/theme-options.php:1349 msgid "5 Sec" msgstr "5 秒" -#: options/theme-options.php:1342 +#: options/theme-options.php:1350 msgid "6 Sec" msgstr "6 秒" -#: options/theme-options.php:1343 +#: options/theme-options.php:1351 msgid "7 Sec" msgstr "7 秒" -#: options/theme-options.php:1344 +#: options/theme-options.php:1352 msgid "8 Sec" msgstr "8 秒" -#: options/theme-options.php:1345 +#: options/theme-options.php:1353 msgid "9 Sec" msgstr "9 秒" -#: options/theme-options.php:1346 +#: options/theme-options.php:1354 msgid "10 Sec" msgstr "10 秒" -#: options/theme-options.php:1354 +#: options/theme-options.php:1362 msgid "Placeholder SVG when loading the next page" msgstr "加载下一页占位 SVG" -#: options/theme-options.php:1355 +#: options/theme-options.php:1363 msgid "" "Fill in the address, this is the SVG that will be displayed as a placeholder " "when the next page is loading" msgstr "填写地址,此为加载下一页时占位显示的SVG" -#: options/theme-options.php:1363 +#: options/theme-options.php:1371 msgid "HomePage Options" msgstr "主页设置" -#: options/theme-options.php:1369 +#: options/theme-options.php:1377 msgid "Cover Options" msgstr "封面设置" -#: options/theme-options.php:1376 +#: options/theme-options.php:1384 msgid "" "You can click here to learn how to set the " @@ -1821,165 +1831,165 @@ msgstr "" "您可以单击 此处 了解如何在此页面上设置选项" -#: options/theme-options.php:1382 +#: options/theme-options.php:1390 msgid "Cover Switch" msgstr "封面开关" -#: options/theme-options.php:1383 +#: options/theme-options.php:1391 msgid "On by default, if off, all options below will be disabled" msgstr "默认开启,如果关闭,则下文所有选项均将失效" -#: options/theme-options.php:1390 +#: options/theme-options.php:1398 msgid "Cover Full Screen" msgstr "封面全屏显示" -#: options/theme-options.php:1399 +#: options/theme-options.php:1407 msgid "Cover Arc Occlusion (Below)" msgstr "封面弧形遮挡(下方)" -#: options/theme-options.php:1400 +#: options/theme-options.php:1408 msgid "An arc occlusion will appear below the cover when turned on" msgstr "开启之后封面下方将出现弧形遮挡" -#: options/theme-options.php:1411 +#: options/theme-options.php:1419 msgid "Cover Radius" msgstr "封面圆角" -#: options/theme-options.php:1412 +#: options/theme-options.php:1420 msgid "Slide to adjust, the recommended value range is 15-20" msgstr "滑动滑块,推荐数值范围为15-20" -#: options/theme-options.php:1422 +#: options/theme-options.php:1430 msgid "Cover Animation" msgstr "封面动画" -#: options/theme-options.php:1423 +#: options/theme-options.php:1431 msgid "On by default, if off, the cover will be displayed directly" msgstr "默认开启,如果关闭,则封面将直接显示" -#: options/theme-options.php:1431 +#: options/theme-options.php:1439 msgid "Cover Animation Time" msgstr "封面动画时间" -#: options/theme-options.php:1446 +#: options/theme-options.php:1454 msgid "Cover Info Bar" msgstr "封面信息栏" -#: options/theme-options.php:1447 +#: options/theme-options.php:1455 msgid "" "Enabled by default, show avatar, Mashiro effects text, signature bar, " "shuoshuo bar, social area" msgstr "默认开启,显示头像、白猫特效文字、签名栏、说说栏、社交区域" -#: options/theme-options.php:1455 +#: options/theme-options.php:1463 msgid "Cover Info Bar Style" msgstr "封面信息栏" -#: options/theme-options.php:1470 +#: options/theme-options.php:1478 msgid "Cover Info Bar Background Color" msgstr "封面信息栏背景颜色" -#: options/theme-options.php:1482 +#: options/theme-options.php:1490 msgid "Cover Info Bar Avatar Radius" msgstr "封面信息栏头像圆角" -#: options/theme-options.php:1483 +#: options/theme-options.php:1491 msgid "Slide to adjust, the recommended value is 100" msgstr "滑动滑块,推荐数值为10" -#: options/theme-options.php:1495 +#: options/theme-options.php:1503 msgid "Cover Info Bar Rounded" msgstr "封面信息栏圆角" -#: options/theme-options.php:1496 +#: options/theme-options.php:1504 msgid "Slide to adjust, the recommended value range 10-20" msgstr "滑动滑块,推荐数值范围为10-20" -#: options/theme-options.php:1509 +#: options/theme-options.php:1517 msgid "Cover Signature Field Text" msgstr "封面签名栏文本" -#: options/theme-options.php:1510 +#: options/theme-options.php:1518 msgid "A self-descriptive quote" msgstr "一段自我描述的话" -#: options/theme-options.php:1521 +#: options/theme-options.php:1529 msgid "Cover Signature Field Text Font" msgstr "封面签名栏文本字体" -#: options/theme-options.php:1533 +#: options/theme-options.php:1541 msgid "Cover Signature Field Text Font Size" msgstr "封面签名栏文本字体大小" -#: options/theme-options.php:1548 +#: options/theme-options.php:1556 msgid "Cover Signature Bar Typing Effects" msgstr "封面签名栏打字特效" -#: options/theme-options.php:1549 +#: options/theme-options.php:1557 msgid "" "When turned on, the signature bar text will have an additional paragraph of " "text and will be rendered with typing effects" msgstr "开启之后签名栏文本将增加一段文本并呈现打字特效" -#: options/theme-options.php:1560 +#: options/theme-options.php:1568 msgid "Cover Signature Field Typing Effects Double Quotes" msgstr "封面签名栏打字特效双引号" -#: options/theme-options.php:1566 +#: options/theme-options.php:1574 msgid "Typing effects will be appended with double quotes when turned on" msgstr "开启之后打字特效将追加双引号" -#: options/theme-options.php:1573 +#: options/theme-options.php:1581 msgid "Cover Signature Field Typing Effects Placeholder" msgstr "封面签名栏打字特效占位语句" -#: options/theme-options.php:1586 +#: options/theme-options.php:1594 msgid "Typed.js initial option" msgstr "Typed.js初始化选项" -#: options/theme-options.php:1598 +#: options/theme-options.php:1606 msgid "Cover Random Image Options" msgstr "封面随机图片选项" -#: options/theme-options.php:1600 +#: options/theme-options.php:1608 msgid "External API" msgstr "外部API" -#: options/theme-options.php:1601 +#: options/theme-options.php:1609 msgid "Webp optimized" msgstr "Webp优化" -#: options/theme-options.php:1602 +#: options/theme-options.php:1610 msgid "Local" msgstr "本地" -#: options/theme-options.php:1611 +#: options/theme-options.php:1619 msgid "Cover Random Image Multi-terminal Separation" msgstr "封面随机图片多终端分离" -#: options/theme-options.php:1612 +#: options/theme-options.php:1620 msgid "" "Enabled by default, desktop and mobile devices will use separate random " "image addresses" msgstr "默认开启,桌面端和移动端会分别使用不同的随机图片地址" -#: options/theme-options.php:1620 +#: options/theme-options.php:1628 msgid "Webp Optimization/External API Desktop Side Random Graphics Address" msgstr "Webp优化/外部API桌面端随机图片地址" -#: options/theme-options.php:1621 options/theme-options.php:1640 +#: options/theme-options.php:1629 options/theme-options.php:1648 msgid "Fill in an URL" msgstr "填写URL" -#: options/theme-options.php:1634 +#: options/theme-options.php:1642 msgid "External API Mobile Devices Random Image Address" msgstr "外部API手机端随机图片地址" -#: options/theme-options.php:1649 +#: options/theme-options.php:1657 msgid "Cover Random Background Image Cache" msgstr "封面随机背景图片缓存" -#: options/theme-options.php:1650 +#: options/theme-options.php:1658 msgid "" "Enabled by default, this feature will cache a cover image locally, which can " "improve the loading speed of the first cover after entering the homepage. " @@ -1988,111 +1998,111 @@ msgstr "" "默认开启,此功能会在本地缓存一份封面图片,可提升进入主页后第一张封面的加载速" "度。注意:此功能需要封面API能接受跨域请求。" -#: options/theme-options.php:1658 +#: options/theme-options.php:1666 msgid "Cover and Frontend Background Integration" msgstr "封面与前台背景一体化" -#: options/theme-options.php:1659 +#: options/theme-options.php:1667 msgid "" "When enabled, the background of the cover will be set to transparent, while " "the frontend background will use the cover's random image API" msgstr "开启之后,封面的背景将设置为透明,同时前台背景将使用封面的随机图API" -#: options/theme-options.php:1667 +#: options/theme-options.php:1675 msgid "Cover Random Images Filter" msgstr "封面随机图片滤镜" -#: options/theme-options.php:1669 +#: options/theme-options.php:1677 msgid "No filter" msgstr "无滤镜" -#: options/theme-options.php:1670 +#: options/theme-options.php:1678 msgid "Light filter" msgstr "浅色滤镜" -#: options/theme-options.php:1671 +#: options/theme-options.php:1679 msgid "Dimmed filter" msgstr "暗淡滤镜" -#: options/theme-options.php:1672 +#: options/theme-options.php:1680 msgid "Grid filter" msgstr "网格滤镜" -#: options/theme-options.php:1673 +#: options/theme-options.php:1681 msgid "Dot filter" msgstr "点状滤镜" -#: options/theme-options.php:1682 +#: options/theme-options.php:1690 msgid "Cover Wave Effects" msgstr "封面波浪特效" -#: options/theme-options.php:1683 +#: options/theme-options.php:1691 msgid "" "Wave effect will appear at the bottom of the cover of the home page after " "turning on, and it will be forced off in the dark mode" msgstr "开启之后首页封面底部将出现波浪特效,深色模式下将强制关闭" -#: options/theme-options.php:1691 +#: options/theme-options.php:1699 msgid "Cover Dropdown Arrow" msgstr "封面下拉箭头" -#: options/theme-options.php:1692 +#: options/theme-options.php:1700 msgid "Enabled by default, show a dropdown arrow at bottom of home cover" msgstr "默认开启,首页封面底部显示下拉箭头" -#: options/theme-options.php:1700 +#: options/theme-options.php:1708 msgid "Cover Dropdown Arrow Display on Mobile Devices" msgstr "封面下拉箭头移动端显示" -#: options/theme-options.php:1705 +#: options/theme-options.php:1713 msgid "" "Drop down arrow will appear at the bottom of the mobile devices' home cover " "after turning it on" msgstr "开启之后移动端首页封面底部将出现下拉箭头" -#: options/theme-options.php:1712 +#: options/theme-options.php:1720 msgid "Cover Dropdown Arrow Color" msgstr "封面下拉箭头颜色" -#: options/theme-options.php:1724 +#: options/theme-options.php:1732 msgid "Cover Dropdown Arrow Color (Dark Mode)" msgstr "封面下拉箭头颜色(深色模式)" -#: options/theme-options.php:1729 +#: options/theme-options.php:1737 msgid "Customize the colors, dark colors are recommended" msgstr "自定义颜色,建议使用浅色系颜色" -#: options/theme-options.php:1736 +#: options/theme-options.php:1744 msgid "Cover Video" msgstr "封面视频" -#: options/theme-options.php:1737 +#: options/theme-options.php:1745 msgid "Use a video instead of the images as the cover" msgstr "将会使用视频替换随机图片作为封面" -#: options/theme-options.php:1745 +#: options/theme-options.php:1753 msgid "Cover Video Loop" msgstr "封面视频循环" -#: options/theme-options.php:1750 +#: options/theme-options.php:1758 msgid "Video will loop automatically when enabled." msgstr "开启之后视频将自动循环" -#: options/theme-options.php:1757 +#: options/theme-options.php:1765 msgid "Cover Video Auto Resume" msgstr "封面视频自动恢复" -#: options/theme-options.php:1762 +#: options/theme-options.php:1770 msgid "" "Cover Video will resume automatically when coming back to homepage while " "Pjax enabled." msgstr "开启之后返回首页时视频将恢复播放,需要开启Pjax功能" -#: options/theme-options.php:1769 +#: options/theme-options.php:1777 msgid "Cover Video URL Base Path" msgstr "封面视频URL根路径" -#: options/theme-options.php:1775 +#: options/theme-options.php:1783 msgid "" "Fill in the base path your video located at. For example: https://localhost. " "Your site's URL is used as default. Please pay attention to the protocol " @@ -2101,22 +2111,22 @@ msgstr "" "填写视频所在的根路径。例如:https://localhost. 你站点的URL将作为默认URL。请注" "意URL的协议名称。" -#: options/theme-options.php:1781 +#: options/theme-options.php:1789 msgid "Cover Video File Name" msgstr "封面视频文件名称" -#: options/theme-options.php:1786 +#: options/theme-options.php:1794 msgid "" "For example: abc.mp4. Multiple videos should be separated by English commas " "like \"abc.mp4,efg.mp4,\" Random play is on by default." msgstr "" "例如:abc.mp4,多个视频请用英文逗号隔开如abc.mp4,efg.mp4。默认随机播放。" -#: options/theme-options.php:1794 +#: options/theme-options.php:1802 msgid "Cover Social Area Options" msgstr "封面社交区域设置" -#: options/theme-options.php:1801 +#: options/theme-options.php:1809 msgid "" "You can click here" @@ -2126,167 +2136,167 @@ msgstr "" "#%E5%B0%81%E9%9D%A2%E7%A4%BE%E4%BA%A4%E5%8C%BA%E5%9F%9F%E8%AE%BE%E7%BD%AE\">" "此处 了解如何在此页面上设置选项" -#: options/theme-options.php:1806 +#: options/theme-options.php:1814 msgid "Related Options" msgstr "相关设置" -#: options/theme-options.php:1812 +#: options/theme-options.php:1820 msgid "Cover Social Area" msgstr "封面社交区域" -#: options/theme-options.php:1813 +#: options/theme-options.php:1821 msgid "" "Enabled by default, show cover random image toggle button and social network " "icons" msgstr "默认开启,显示封面随机图片切换按钮和社交网络图标" -#: options/theme-options.php:1820 +#: options/theme-options.php:1828 msgid "Social Icon" msgstr "社交网络图标" -#: options/theme-options.php:1821 +#: options/theme-options.php:1829 msgid "" "Select your favorite icon pack. Icon pack references are detailed in the " "\"About Theme\" section" msgstr "选择你喜欢的图标包。图标包引用信息详见关于主题" -#: options/theme-options.php:1843 +#: options/theme-options.php:1851 msgid "Cover Social Area Rounded Corners" msgstr "封面社交区域圆角" -#: options/theme-options.php:1845 +#: options/theme-options.php:1853 msgid "Slide to adjust, the recommended value range is 10-20" msgstr "滑动滑块,推荐数值范围为10-20" -#: options/theme-options.php:1854 +#: options/theme-options.php:1862 msgid "Switch Button of Random Images" msgstr "随机图片切换按钮" -#: options/theme-options.php:1856 +#: options/theme-options.php:1864 msgid "Enabled by default, show cover random image toggle button" msgstr "默认开启,显示封面随机图片切换按钮" -#: options/theme-options.php:1862 +#: options/theme-options.php:1870 msgid "Social Network" msgstr "社交网络" -#: options/theme-options.php:1868 +#: options/theme-options.php:1876 msgid "Wechat" msgstr "微信" -#: options/theme-options.php:1877 +#: options/theme-options.php:1885 msgid "QQ" msgstr "QQ" -#: options/theme-options.php:1879 +#: options/theme-options.php:1887 msgid "" "Please note the format of filling out the form, e.g. tencent://message/?" "uin=123456" msgstr "请注意填写格式,例如:tencent://message/?uin=123456" -#: options/theme-options.php:1885 +#: options/theme-options.php:1893 msgid "Bilibili" msgstr "哔哩哔哩" -#: options/theme-options.php:1887 options/theme-options.php:1895 -#: options/theme-options.php:1903 options/theme-options.php:1911 -#: options/theme-options.php:1919 options/theme-options.php:1927 -#: options/theme-options.php:1935 options/theme-options.php:1943 -#: options/theme-options.php:1951 options/theme-options.php:1959 -#: options/theme-options.php:1967 options/theme-options.php:1975 -#: options/theme-options.php:1983 options/theme-options.php:1991 -#: options/theme-options.php:1999 options/theme-options.php:2007 -#: options/theme-options.php:2032 options/theme-options.php:2339 -#: options/theme-options.php:2365 options/theme-options.php:2391 -#: options/theme-options.php:2479 +#: options/theme-options.php:1895 options/theme-options.php:1903 +#: options/theme-options.php:1911 options/theme-options.php:1919 +#: options/theme-options.php:1927 options/theme-options.php:1935 +#: options/theme-options.php:1943 options/theme-options.php:1951 +#: options/theme-options.php:1959 options/theme-options.php:1967 +#: options/theme-options.php:1975 options/theme-options.php:1983 +#: options/theme-options.php:1991 options/theme-options.php:1999 +#: options/theme-options.php:2007 options/theme-options.php:2015 +#: options/theme-options.php:2040 options/theme-options.php:2347 +#: options/theme-options.php:2373 options/theme-options.php:2399 +#: options/theme-options.php:2487 msgid "add URL" msgstr "填写地址" -#: options/theme-options.php:1893 +#: options/theme-options.php:1901 msgid "NetEase Music" msgstr "网易云音乐" -#: options/theme-options.php:1901 +#: options/theme-options.php:1909 msgid "Weibo" msgstr "微博" -#: options/theme-options.php:1909 +#: options/theme-options.php:1917 msgid "Github" msgstr "Github" -#: options/theme-options.php:1917 +#: options/theme-options.php:1925 msgid "Telegram" msgstr "Telegram" -#: options/theme-options.php:1925 +#: options/theme-options.php:1933 msgid "Steam" msgstr "Steam" -#: options/theme-options.php:1933 +#: options/theme-options.php:1941 msgid "ZhiHu" msgstr "知乎" -#: options/theme-options.php:1941 +#: options/theme-options.php:1949 msgid "QZone" msgstr "QQ空间" -#: options/theme-options.php:1949 +#: options/theme-options.php:1957 msgid "Lofter" msgstr "" -#: options/theme-options.php:1957 +#: options/theme-options.php:1965 msgid "Youku" msgstr "优酷" -#: options/theme-options.php:1965 +#: options/theme-options.php:1973 msgid "Linkedin" msgstr "领英" -#: options/theme-options.php:1973 +#: options/theme-options.php:1981 msgid "Twitter" msgstr "推特" -#: options/theme-options.php:1981 +#: options/theme-options.php:1989 msgid "Facebook" msgstr "脸书" -#: options/theme-options.php:1989 +#: options/theme-options.php:1997 msgid "CSDN" msgstr "CSDN" -#: options/theme-options.php:1997 +#: options/theme-options.php:2005 msgid "JianShu" msgstr "简书" -#: options/theme-options.php:2005 +#: options/theme-options.php:2013 msgid "Customized Social Network Ⅰ" msgstr "自定义社交网络 Ⅰ" -#: options/theme-options.php:2013 +#: options/theme-options.php:2021 msgid "Customized Social Network Ⅰ Title" msgstr "自定义社交网络 Ⅰ 标题" -#: options/theme-options.php:2021 +#: options/theme-options.php:2029 msgid "Customized Social Network Ⅰ icon" msgstr "自定义社交网络 Ⅰ 图标" -#: options/theme-options.php:2030 +#: options/theme-options.php:2038 msgid "Customized Social Network Ⅱ" msgstr "自定义社交网络 Ⅱ" -#: options/theme-options.php:2038 +#: options/theme-options.php:2046 msgid "Customized Social Network Ⅱ Title" msgstr "自定义社交网络 Ⅱ 标题" -#: options/theme-options.php:2046 +#: options/theme-options.php:2054 msgid "Customized Social Network Ⅱ icon" msgstr "自定义社交网络 Ⅱ 图标" -#: options/theme-options.php:2055 +#: options/theme-options.php:2063 msgid "Email Username" msgstr "电子邮件用户名" -#: options/theme-options.php:2057 +#: options/theme-options.php:2065 msgid "" "name@domain.com fo name, the full address can be known only when there is a " "js runtime in the frontend, you can fill in with confidence" @@ -2294,19 +2304,19 @@ msgstr "" "name@domain.com的name部分,前端仅具有 js 运行环境时才能获取完整地址,可放心填" "写" -#: options/theme-options.php:2063 +#: options/theme-options.php:2071 msgid "Email Domain" msgstr "电子邮件域" -#: options/theme-options.php:2065 +#: options/theme-options.php:2073 msgid "name@domain.com fo domain.com" msgstr "name@domain.com的domain.com部分" -#: options/theme-options.php:2073 +#: options/theme-options.php:2081 msgid "Bulletin Board and Area Title Options" msgstr "公告板和区域标题设置" -#: options/theme-options.php:2080 +#: options/theme-options.php:2088 msgid "" "You can click here" @@ -2316,88 +2326,87 @@ msgstr "" "#%E5%85%AC%E5%91%8A%E6%A0%8F%E5%92%8C%E5%8C%BA%E5%9F%9F%E6%A0%87%E9%A2%98%E8%AE%BE%E7%BD%AE\">" "此处 了解如何在此页面上设置选项" -#: options/theme-options.php:2085 options/theme-options.php:2091 +#: options/theme-options.php:2093 options/theme-options.php:2099 msgid "Bulletin Board" msgstr "公告板" -#: options/theme-options.php:2092 +#: options/theme-options.php:2100 msgid "When enabled the bulletin board will be displayed below the front cover" msgstr "开启之后公告板将在首页封面下方显示" -#: options/theme-options.php:2099 +#: options/theme-options.php:2107 msgid "Bulletin Board Style" msgstr "公告板样式" -#: options/theme-options.php:2102 +#: options/theme-options.php:2110 msgid "Picture Background" msgstr "图片背景" -#: options/theme-options.php:2103 +#: options/theme-options.php:2111 msgid "Color Background" msgstr "颜色背景" -#: options/theme-options.php:2111 +#: options/theme-options.php:2119 msgid "Bulletin Board \"Notice\" Icon" msgstr "公告板\"公告\"图标" -#: options/theme-options.php:2113 +#: options/theme-options.php:2121 msgid "" "The \"Notice\" icon will be displayed on the left side of the announcement " "bar" msgstr "\"公告\"图标将显示在公告版的左侧" -#: options/theme-options.php:2120 +#: options/theme-options.php:2128 msgid "Bulletin Board Background" msgstr "公告板背景" -#: options/theme-options.php:2125 +#: options/theme-options.php:2133 msgid "Best width 820px, best height 67px" msgstr "最佳宽度820px,最佳高度67px" -#: options/theme-options.php:2133 +#: options/theme-options.php:2141 msgid "Bulletin Board Border Color" msgstr "公告板边框颜色" -#: options/theme-options.php:2138 +#: options/theme-options.php:2146 msgid "" "Customize the colors, it is recommended to use a light color that " "corresponds with the theme color" msgstr "自定义颜色,建议使用与主题色相同色系且属于浅色系的颜色" -#: options/theme-options.php:2145 +#: options/theme-options.php:2153 msgid "Bulletin Board Text" msgstr "公告板文本" -#: options/theme-options.php:2147 +#: options/theme-options.php:2155 msgid "Fill in the announcement text, the text beyond 142 bytes will be hidden" msgstr "填写公告文本,文本超出142个字节将会被隐藏" -#: options/theme-options.php:2153 +#: options/theme-options.php:2161 msgid "Bulletin Board Alignment" msgstr "公告板对齐方向" -#: options/theme-options.php:2166 +#: options/theme-options.php:2174 msgid "Bulletin Board Text Color" msgstr "公告板文本颜色" -#: options/theme-options.php:2168 options/theme-options.php:2256 -#: options/theme-options.php:2696 options/theme-options.php:2930 -#: options/theme-options.php:2938 options/theme-options.php:3018 -#: options/theme-options.php:3026 +#: options/theme-options.php:2176 options/theme-options.php:2264 +#: options/theme-options.php:2704 options/theme-options.php:2938 +#: options/theme-options.php:2946 msgid "" "Customize the colors, suggest using a corresponding color with the " "background color" msgstr "自定义颜色,建议根据背景颜色搭配合适的颜色" -#: options/theme-options.php:2174 +#: options/theme-options.php:2182 msgid "Area Title" msgstr "区域标题" -#: options/theme-options.php:2180 +#: options/theme-options.php:2188 msgid "Display Area Icon" msgstr "展示区域图标" -#: options/theme-options.php:2181 +#: options/theme-options.php:2189 msgid "" "Default is \"fa-solid fa-laptop\", You can check the FontAwesome Website to see the icons " @@ -2406,21 +2415,21 @@ msgstr "" "默认为“fa-solid fa-laptop”,你可以前往 FontAwesome 网站 查看可以填写的图标" -#: options/theme-options.php:2188 +#: options/theme-options.php:2196 msgid "Display Area Title" msgstr "展示区域标题" -#: options/theme-options.php:2189 +#: options/theme-options.php:2197 msgid "" "Default is \"Display\", you can change it to anything else, but of course it " "CANNOT be used as an ad! Not allowed!!!" msgstr "默认为“Display”,你可以修改为其他,当然不能当广告用!不允许!!" -#: options/theme-options.php:2196 +#: options/theme-options.php:2204 msgid "Post Area Icon" msgstr "文章区域图标" -#: options/theme-options.php:2197 +#: options/theme-options.php:2205 msgid "" "Default is \"fa-regular fa-bookmark\", You can check the FontAwesome Website to see the icons " @@ -2429,29 +2438,29 @@ msgstr "" "默认为“fa-regular fa-bookmark”,你可以前往 FontAwesome 网站 查看可以填写的图标" -#: options/theme-options.php:2204 +#: options/theme-options.php:2212 msgid "Post Area Title" msgstr "文章区域标题" -#: options/theme-options.php:2205 +#: options/theme-options.php:2213 msgid "" "Default is \"Article\", you can change it to anything else, but of course it " "CANNOT be used as an ad! Not allowed!!!" msgstr "默认为“Article”,你可以修改为其他,当然不能当广告用!不允许!!" -#: options/theme-options.php:2212 +#: options/theme-options.php:2220 msgid "Area Title Font" msgstr "区域标题字体" -#: options/theme-options.php:2220 +#: options/theme-options.php:2228 msgid "Area Title Alignment" msgstr "区域标题对齐方向" -#: options/theme-options.php:2234 options/theme-options.php:2314 +#: options/theme-options.php:2242 options/theme-options.php:2322 msgid "Display Area Options" msgstr "展示区域设置" -#: options/theme-options.php:2241 +#: options/theme-options.php:2249 msgid "" "You can click here to learn " @@ -2461,77 +2470,77 @@ msgstr "" "#%E5%B1%95%E7%A4%BA%E5%8C%BA%E5%9F%9F%E8%AE%BE%E7%BD%AE\">此处 了解如何在" "此页面上设置选项" -#: options/theme-options.php:2247 +#: options/theme-options.php:2255 msgid "Display Area" msgstr "展示区域" -#: options/theme-options.php:2248 +#: options/theme-options.php:2256 msgid "Enabled by default, display area is above article area" msgstr "默认开启,展示区域显示在文章区域上方" -#: options/theme-options.php:2255 +#: options/theme-options.php:2263 msgid "Display Area Matching Color" msgstr "展示区域搭配色" -#: options/theme-options.php:2264 +#: options/theme-options.php:2272 msgid "Display Area Style" msgstr "展示区域样式" -#: options/theme-options.php:2276 +#: options/theme-options.php:2284 msgid "Display Area Compatibility Mode" msgstr "展示区域兼容模式" -#: options/theme-options.php:2281 +#: options/theme-options.php:2289 msgid "" "Enabled by default, this option avoids the problem of misaligned display " "areas" msgstr "默认开启,此选项避免了展示区域可能出现错位的问题" -#: options/theme-options.php:2288 +#: options/theme-options.php:2296 msgid "Display Area Background Color" msgstr "展示区域背景颜色" -#: options/theme-options.php:2300 +#: options/theme-options.php:2308 msgid "Display Area Rounded Corners" msgstr "展示区域圆角" -#: options/theme-options.php:2318 +#: options/theme-options.php:2326 msgid "First Display Area" msgstr "第一展示区域" -#: options/theme-options.php:2323 options/theme-options.php:2349 -#: options/theme-options.php:2375 +#: options/theme-options.php:2331 options/theme-options.php:2357 +#: options/theme-options.php:2383 msgid "image" msgstr "图片" -#: options/theme-options.php:2324 options/theme-options.php:2350 -#: options/theme-options.php:2376 +#: options/theme-options.php:2332 options/theme-options.php:2358 +#: options/theme-options.php:2384 msgid "best width 260px, best height 160px" msgstr "最佳宽度 260px,最佳高度 160px" -#: options/theme-options.php:2329 options/theme-options.php:2355 -#: options/theme-options.php:2381 +#: options/theme-options.php:2337 options/theme-options.php:2363 +#: options/theme-options.php:2389 msgid "title" msgstr "标题" -#: options/theme-options.php:2334 options/theme-options.php:2360 -#: options/theme-options.php:2386 +#: options/theme-options.php:2342 options/theme-options.php:2368 +#: options/theme-options.php:2394 msgid "description" msgstr "描述" -#: options/theme-options.php:2344 +#: options/theme-options.php:2352 msgid "Second Display Area" msgstr "第二展示区域" -#: options/theme-options.php:2370 +#: options/theme-options.php:2378 msgid "Third Display Area" msgstr "第三展示区域" -#: options/theme-options.php:2417 +#: options/theme-options.php:2425 msgid "Article Area Options" msgstr "文章区域设置" -#: options/theme-options.php:2424 +#: options/theme-options.php:2432 msgid "" "You can click here to learn " @@ -2541,99 +2550,99 @@ msgstr "" "#%E6%96%87%E7%AB%A0%E5%8C%BA%E5%9F%9F%E8%AE%BE%E7%BD%AE\">此处 了解如何在" "此页面上设置选项" -#: options/theme-options.php:2430 +#: options/theme-options.php:2438 msgid "Article Area Meta Displays" msgstr "文章区域显示元素" -#: options/theme-options.php:2431 options/theme-options.php:2676 +#: options/theme-options.php:2439 options/theme-options.php:2684 msgid "" "You can freely select the information Meta to be displayed, this option " "cannot be set on mobile" msgstr "你可以自由的选择想要显示的信息元素。此选项在移动端下不可以设置" -#: options/theme-options.php:2442 +#: options/theme-options.php:2450 msgid "Article Area Card Design" msgstr "文章区域卡片设计" -#: options/theme-options.php:2443 +#: options/theme-options.php:2451 msgid "You can choose between letter design or ticket design" msgstr "你可以选择信件设计或者票券设计" -#: options/theme-options.php:2454 +#: options/theme-options.php:2462 msgid "Article Area Card Ticket Design Title Style" msgstr "文章区域卡片票券设计风格" -#: options/theme-options.php:2455 +#: options/theme-options.php:2463 msgid "You can choose between card style or Non-card style" msgstr "你可以选择卡片式风格或者非卡片式风格" -#: options/theme-options.php:2467 +#: options/theme-options.php:2475 msgid "Article Area Featured Image Options" msgstr "文章区域装饰特色图片选项" -#: options/theme-options.php:2469 +#: options/theme-options.php:2477 msgid "Cover Random Image" msgstr "封面随机图片" -#: options/theme-options.php:2470 +#: options/theme-options.php:2478 msgid "External API Random Image" msgstr "外部API随机图片" -#: options/theme-options.php:2478 +#: options/theme-options.php:2486 msgid "Article Area Featured Image External API Random Image Address" msgstr "文章区域装饰特色图片外部API随机图片地址" -#: options/theme-options.php:2487 +#: options/theme-options.php:2495 msgid "Article Area Card Rounded Corners" msgstr "文章区域卡片圆角" -#: options/theme-options.php:2488 +#: options/theme-options.php:2496 msgid "Slide to adjust, the recommended value range is 5-15" msgstr "滑动滑块,推荐数值范围为5-15" -#: options/theme-options.php:2497 +#: options/theme-options.php:2505 msgid "Article Area Card Information Meta Background Compatible" msgstr "文章区域卡片信息元素可读性增强" -#: options/theme-options.php:2498 +#: options/theme-options.php:2506 msgid "" "When enabled, information Meta will be standardized to white on black for " "compatibility with the background, increasing readability." msgstr "开启之后卡片信息元素将变为黑底白字以增强可读性" -#: options/theme-options.php:2505 +#: options/theme-options.php:2513 msgid "Article Area Card Information Meta Rounded Corners" msgstr "文章区域卡片信息元素圆角" -#: options/theme-options.php:2506 +#: options/theme-options.php:2514 msgid "Slide to adjust, the recommended value range is 3-10" msgstr "滑动滑块,推荐数值范围为3-10" -#: options/theme-options.php:2515 +#: options/theme-options.php:2523 msgid "Article Area Card Title Meta Rounded Corners" msgstr "文章区域卡片标题元素圆角" -#: options/theme-options.php:2516 +#: options/theme-options.php:2524 msgid "Slide to adjust, the recommended value range is 0-20" msgstr "滑动滑块,推荐数值范围为0-20" -#: options/theme-options.php:2525 +#: options/theme-options.php:2533 msgid "Article Area Title Font Size" msgstr "文章区域标题字体大小" -#: options/theme-options.php:2526 +#: options/theme-options.php:2534 msgid "Slide to adjust, the recommended value range is 16-20" msgstr "滑动滑块,推荐数值范围为16-20" -#: options/theme-options.php:2539 +#: options/theme-options.php:2547 msgid "Page Options" msgstr "页面设置" -#: options/theme-options.php:2545 +#: options/theme-options.php:2553 msgid "Common Options" msgstr "综合设置" -#: options/theme-options.php:2552 +#: options/theme-options.php:2560 msgid "" "You can click here to learn how to set the " @@ -2642,63 +2651,63 @@ msgstr "" "您可以单击 此处 了解如何在此页面上设置选项" -#: options/theme-options.php:2558 +#: options/theme-options.php:2566 msgid "Page Style" msgstr "页面样式" -#: options/theme-options.php:2569 +#: options/theme-options.php:2577 msgid "Page Layout Style" msgstr "页面排版样式" -#: options/theme-options.php:2571 +#: options/theme-options.php:2579 msgid "Default Style" msgstr "默认样式" -#: options/theme-options.php:2572 +#: options/theme-options.php:2580 msgid "Github Style" msgstr "Github样式" -#: options/theme-options.php:2580 +#: options/theme-options.php:2588 msgid "Page Decoration Image" msgstr "页面装饰图片" -#: options/theme-options.php:2581 +#: options/theme-options.php:2589 msgid "" "Enabled by default, show on article pages, standalone pages and category " "pages" msgstr "默认开启,显示在文章页面,独立页面和分类页" -#: options/theme-options.php:2588 +#: options/theme-options.php:2596 msgid "Page Title Animation" msgstr "页面标题动画" -#: options/theme-options.php:2589 +#: options/theme-options.php:2597 msgid "Page title will have float-in animation when turned on" msgstr "开启之后页面标题将有浮入动画" -#: options/theme-options.php:2596 +#: options/theme-options.php:2604 msgid "Page Title Animation Time" msgstr "页面标题动画时间" -#: options/theme-options.php:2598 +#: options/theme-options.php:2606 msgid "Slide to adjust, recommended value range is 1-2" msgstr "滑动滑块,推荐数值范围为1-2" -#: options/theme-options.php:2608 +#: options/theme-options.php:2616 msgid "Page Clipboard Copyright Notice" msgstr "页面剪切板版权提示" -#: options/theme-options.php:2609 +#: options/theme-options.php:2617 msgid "" "Enabled by default, users will have copyright notice text when copying text " "content over 30 bytes" msgstr "默认开启,用户在复制文字内容超过30字节时,会有版权提示文本" -#: options/theme-options.php:2616 +#: options/theme-options.php:2624 msgid "Page LazyLoad" msgstr "页面LazyLoad" -#: options/theme-options.php:2617 +#: options/theme-options.php:2625 msgid "" "LazyLoad effect for page images, WordPress block editor already comes with " "similar effect, not recommended to turn on" @@ -2706,31 +2715,31 @@ msgstr "" "开启之后页面图片会有LazyLoad加载效果,WordPress区块编辑器已经自带相似效果,不" "建议开启" -#: options/theme-options.php:2624 +#: options/theme-options.php:2632 msgid "Page LazyLoad Placeholder SVG" msgstr "页面LazyLoad加载占位SVG" -#: options/theme-options.php:2626 +#: options/theme-options.php:2634 msgid "" "Fill in the address, this is the placeholder image that will be displayed " "when the page LazyLoad is being loaded" msgstr "填写地址,此为页面LazyLoad加载时会显示的占位图" -#: options/theme-options.php:2633 +#: options/theme-options.php:2641 msgid "Page Image Placeholder SVG" msgstr "页面图像加载占位SVG" -#: options/theme-options.php:2634 +#: options/theme-options.php:2642 msgid "" "Fill address, this is the SVG that will be displayed as a placeholder when " "the page image is being loaded" msgstr "填写地址,此为加载页面图像时占位显示的SVG" -#: options/theme-options.php:2643 +#: options/theme-options.php:2651 msgid "Article Page Options" msgstr "文章页面设置" -#: options/theme-options.php:2650 +#: options/theme-options.php:2658 msgid "" "You can click here to learn " @@ -2740,84 +2749,84 @@ msgstr "" "#%E6%96%87%E7%AB%A0%E9%A1%B5%E9%9D%A2%E8%AE%BE%E7%BD%AE\">此处 了解如何在" "此页面上设置选项" -#: options/theme-options.php:2656 +#: options/theme-options.php:2664 msgid "Article Page Title Font Size" msgstr "文章页面标题字体大小" -#: options/theme-options.php:2657 +#: options/theme-options.php:2665 msgid "" "Slide to adjust, recommended value range is 28-36. This option is only " "available for article pages that have a featured image set" msgstr "" "滑动滑块,推荐数值范围为28-36。此选项仅对已经设置了特色图片的文章页面生效" -#: options/theme-options.php:2667 +#: options/theme-options.php:2675 msgid "Article Page Title Underline Animation" msgstr "文章页面标题下划线动画" -#: options/theme-options.php:2668 +#: options/theme-options.php:2676 msgid "" "Article title will have underline animation when this is enabled and article " "has a featured image set" msgstr "开启且文章设置了特色图片之后,文章标题将有下划线动画" -#: options/theme-options.php:2675 +#: options/theme-options.php:2683 msgid "Display Article Meta before the Contents" msgstr "文章页面显示元素" -#: options/theme-options.php:2687 +#: options/theme-options.php:2695 msgid "Article Page Auto Show Menu" msgstr "文章页面自动显示菜单" -#: options/theme-options.php:2688 +#: options/theme-options.php:2696 msgid "" "Enabled by default, the article page will automatically show the menu. PHP " "extension \"DOM\" is required for this feature." msgstr "默认开启,文章页面会自动显示菜单,此功能需要 PHP 扩展\"DOM\"。" -#: options/theme-options.php:2695 +#: options/theme-options.php:2703 msgid "Inline Code Background Color" msgstr "内联代码背景色" -#: options/theme-options.php:2703 +#: options/theme-options.php:2711 msgid "Inline Code Background Color In Dark Mode" msgstr "深色模式内联代码背景色" -#: options/theme-options.php:2704 +#: options/theme-options.php:2712 msgid "" "Customize the colors, suggest using a corresponding color with the " "background color,this color is only displayed in dark mode" msgstr "自定义颜色,建议使用与深色模式背景颜色相对应的颜色" -#: options/theme-options.php:2710 +#: options/theme-options.php:2718 msgid "Article Expansion Area" msgstr "文章扩展区" -#: options/theme-options.php:2716 +#: options/theme-options.php:2724 msgid "Article Page Function Bar" msgstr "文章页面功能栏" -#: options/theme-options.php:2717 +#: options/theme-options.php:2725 msgid "" "Enabled by default, will be displayed on the article page with the features " "enabled below" msgstr "默认开启,将在文章页显示下方开启的功能" -#: options/theme-options.php:2724 +#: options/theme-options.php:2732 msgid "Article License" msgstr "文章协议" -#: options/theme-options.php:2726 +#: options/theme-options.php:2734 msgid "" "Enabled by default, Article license will appear on the function bar. License " "can also be selected by custom metadata \"license\"." msgstr "默认开启,将在文章页面功能栏中显示文章协议,你可以选择自定义你的协议" -#: options/theme-options.php:2735 +#: options/theme-options.php:2743 msgid "Not Display" msgstr "不显示" -#: options/theme-options.php:2743 +#: options/theme-options.php:2751 msgid "" "\"BY\" means reusers should give credit to the creator" "p>
\"NC\" means no commercial use
\"ND\"" @@ -2835,77 +2844,77 @@ msgstr "" "本作品产生的派生作品
你可以访问协议 官方网站 了解更多
" -#: options/theme-options.php:2754 +#: options/theme-options.php:2762 msgid "Article Page Appreciation Function (Alipay QR Code)" msgstr "文章页面赞赏功能(支付宝二维码)" -#: options/theme-options.php:2756 +#: options/theme-options.php:2764 msgid "Upload Alipay Receipt QR Code Image" msgstr "上传支付宝收款码图片" -#: options/theme-options.php:2763 +#: options/theme-options.php:2771 msgid "Article Page Appreciation Function (Wechat QR Code)" msgstr "文章页面赞赏功能(微信二维码)" -#: options/theme-options.php:2765 +#: options/theme-options.php:2773 msgid "Upload WeChat Receipt QR Code Image" msgstr "上传微信收款码图片" -#: options/theme-options.php:2772 +#: options/theme-options.php:2780 msgid "Article Page Author Avatar" msgstr "文章页面作者头像" -#: options/theme-options.php:2774 +#: options/theme-options.php:2782 msgid "Enabled by default, Author avatar will appear on the function bar" msgstr "默认开启,将在文章页面功能栏显示作者头像" -#: options/theme-options.php:2781 +#: options/theme-options.php:2789 msgid "Article Page Author Name" msgstr "文章页面作者名字" -#: options/theme-options.php:2783 +#: options/theme-options.php:2791 msgid "Author name will appear on the function bar when enabled" msgstr "开启之后文章页面功能栏将出现作者信息" -#: options/theme-options.php:2790 +#: options/theme-options.php:2798 msgid "Article Page Author Signature" msgstr "文章页面作者签名" -#: options/theme-options.php:2792 +#: options/theme-options.php:2800 msgid "Enabled by default, Author signature will appear on the function bar" msgstr "默认开启,将在文章页面功能栏显示作者签名" -#: options/theme-options.php:2799 +#: options/theme-options.php:2807 msgid "Article Last Update Time" msgstr "文章最后更新时间" -#: options/theme-options.php:2801 +#: options/theme-options.php:2809 msgid "Article last update time will appear on the function bar when enabled" msgstr "开启之后文章页面功能栏将出现文章最后更新时间" -#: options/theme-options.php:2808 +#: options/theme-options.php:2816 msgid "Article Tag" msgstr "文章标签" -#: options/theme-options.php:2810 +#: options/theme-options.php:2818 msgid "Enabled by default, Article tag will appear on the function bar" msgstr "默认开启,将在文章页面功能栏显示文章标签" -#: options/theme-options.php:2817 +#: options/theme-options.php:2825 msgid "Article Page Prev/Next Article Switcher" msgstr "文章页面上下文章切换" -#: options/theme-options.php:2818 +#: options/theme-options.php:2826 msgid "" "Enabled by default, the previous and next article switch will appear on the " "article pages" msgstr "默认开启,将在文章页面显示上下文章切换" -#: options/theme-options.php:2827 +#: options/theme-options.php:2835 msgid "Template Page Options" msgstr "模板页面设置" -#: options/theme-options.php:2834 +#: options/theme-options.php:2842 msgid "" "You can click here to learn " @@ -2915,58 +2924,58 @@ msgstr "" "#%E6%A8%A1%E6%9D%BF%E9%A1%B5%E9%9D%A2%E8%AE%BE%E7%BD%AE\">此处 了解如何在" "此页面上设置选项" -#: options/theme-options.php:2839 +#: options/theme-options.php:2847 msgid "Public Settings" msgstr "共用设置" -#: options/theme-options.php:2845 +#: options/theme-options.php:2853 msgid "Template Page Title Font Size" msgstr "模板页面标题字体大小" -#: options/theme-options.php:2846 +#: options/theme-options.php:2854 msgid "" "Slide to adjust, recommended value range is 36-48. This option is only " "available for template pages with featured images already set" msgstr "" "滑动滑块,推荐数值范围为36-48。此选项仅对已经设置了特色图片的模板页面生效" -#: options/theme-options.php:2855 +#: options/theme-options.php:2863 msgid "Bangumi Template Settings" msgstr "追番模板设置" -#: options/theme-options.php:2861 +#: options/theme-options.php:2869 msgid "Bangumi Template Source" msgstr "追番模板源" -#: options/theme-options.php:2872 +#: options/theme-options.php:2880 msgid "My Anime List Username" msgstr "My Anime List用户名" -#: options/theme-options.php:2874 +#: options/theme-options.php:2882 msgid "Username on https://myanimelist.net/" msgstr "https://myanimelist.net/ 上的用户名" -#: options/theme-options.php:2881 +#: options/theme-options.php:2889 msgid "My Anime List Sort" msgstr "My Anime List顺序" -#: options/theme-options.php:2884 +#: options/theme-options.php:2892 msgid "Status and Last Updated" msgstr "状态和上次更新" -#: options/theme-options.php:2885 +#: options/theme-options.php:2893 msgid "Last Updated" msgstr "上次更新" -#: options/theme-options.php:2886 +#: options/theme-options.php:2894 msgid "Status" msgstr "状态" -#: options/theme-options.php:2894 +#: options/theme-options.php:2902 msgid "Bilibili Account UID" msgstr "哔哩哔哩UID" -#: options/theme-options.php:2895 +#: options/theme-options.php:2903 msgid "" "Fill in your account ID, e.g. https://space.bilibili.com/13972644/, just the " "number part \"13972644\"" @@ -2974,11 +2983,11 @@ msgstr "" "填写你的帐号ID,例如:https://space.bilibili.com/13972644/,只需填写数" "字“13972644”部分" -#: options/theme-options.php:2903 +#: options/theme-options.php:2911 msgid "Bilibili Account Cookies" msgstr "哔哩哔哩帐号Cookies" -#: options/theme-options.php:2904 +#: options/theme-options.php:2912 msgid "" "Fill in your account cookies, F12 to open your browser web panel, go to your " "bilibili homepage to get cookies. If left empty, it will not show the " @@ -2987,79 +2996,79 @@ msgstr "" "填写你的帐号Cookies,F12打开浏览器网络面板,前往你的B站主页获取Cookies。如果" "留空,将不会显示追番进度" -#: options/theme-options.php:2911 +#: options/theme-options.php:2919 msgid "Friend Link Template Settings" msgstr "友情链接模板设置" -#: options/theme-options.php:2917 +#: options/theme-options.php:2925 msgid "Friend Link Template Unit Alignment" msgstr "友情链接模板单元对齐方向" -#: options/theme-options.php:2929 +#: options/theme-options.php:2937 msgid "Friend Link Template Unit Matching Color" msgstr "友情链接模板单元搭配色" -#: options/theme-options.php:2937 +#: options/theme-options.php:2945 msgid "Friend Link Template Unit Border Shadow Color" msgstr "友情链接模板单元边框阴影颜色" -#: options/theme-options.php:2945 +#: options/theme-options.php:2953 msgid "Friend Link Sorting Mode" msgstr "友情链接列表排序模式" -#: options/theme-options.php:2946 +#: options/theme-options.php:2954 msgid "Select the friend link sorting mode, \"Name\" is used by Default." msgstr "选择友情链接列表排序模式,默认使用“名称”排序。" -#: options/theme-options.php:2948 +#: options/theme-options.php:2956 msgid "Name" msgstr "名称" -#: options/theme-options.php:2949 +#: options/theme-options.php:2957 msgid "Rating" msgstr "评级" -#: options/theme-options.php:2950 +#: options/theme-options.php:2958 msgid "Updated" msgstr "更新时间" -#: options/theme-options.php:2951 +#: options/theme-options.php:2959 msgid "Rand" msgstr "随机" -#: options/theme-options.php:2959 +#: options/theme-options.php:2967 msgid "Ascending OR Descending" msgstr "升序或降序" -#: options/theme-options.php:2960 +#: options/theme-options.php:2968 msgid "Order friend link in ascending or descending." msgstr "按升序或降序排序友情链接列表" -#: options/theme-options.php:2963 +#: options/theme-options.php:2971 msgid "Ascending" msgstr "升序" -#: options/theme-options.php:2964 +#: options/theme-options.php:2972 msgid "Descending" msgstr "降序" -#: options/theme-options.php:2971 +#: options/theme-options.php:2979 msgid "Login Template Settings" msgstr "登录模板设置" -#: options/theme-options.php:2977 +#: options/theme-options.php:2985 msgid "Login Template Registration Function" msgstr "登录模板注册功能" -#: options/theme-options.php:2978 +#: options/theme-options.php:2986 msgid "Login template will allow registration when enabled" msgstr "开启之后登录模板将允许注册" -#: options/theme-options.php:2987 +#: options/theme-options.php:2995 msgid "Comment-related Options" msgstr "评论相关设置" -#: options/theme-options.php:2994 +#: options/theme-options.php:3002 msgid "" "You can click here to learn " @@ -3069,52 +3078,44 @@ msgstr "" "#%E8%AF%84%E8%AE%BA%E7%9B%B8%E5%85%B3%E8%AE%BE%E7%BD%AE\">此处 了解如何在" "此页面上设置选项" -#: options/theme-options.php:2999 +#: options/theme-options.php:3007 msgid "Comment Area Style" msgstr "评论区域样式" -#: options/theme-options.php:3005 +#: options/theme-options.php:3013 msgid "Page Comment Area Display" msgstr "页面评论区域显示" -#: options/theme-options.php:3006 +#: options/theme-options.php:3014 msgid "You can choose to expand or shirink the content of the comment area" msgstr "你可以选择展开显示或者收缩显示评论区域内容" -#: options/theme-options.php:3008 +#: options/theme-options.php:3016 msgid "Expand" msgstr "展开" -#: options/theme-options.php:3009 +#: options/theme-options.php:3017 msgid "Shrink" msgstr "收缩" -#: options/theme-options.php:3017 -msgid "Page Comment Area Matching Color" -msgstr "页面评论区域搭配色" - #: options/theme-options.php:3025 -msgid "Page Comment Area Shadow Color" -msgstr "页面评论区域阴影颜色" - -#: options/theme-options.php:3033 msgid "Page Comment Area Bottom Right Background Image" msgstr "页面评论区域右下背景图片" -#: options/theme-options.php:3034 +#: options/theme-options.php:3026 msgid "" "If this option is blank, there will be no image, no best recommendation here" msgstr "如果此选项为空白,则没有图像,无最佳推荐" -#: options/theme-options.php:3040 +#: options/theme-options.php:3032 msgid "Comment Area Function" msgstr "评论区域功能" -#: options/theme-options.php:3046 +#: options/theme-options.php:3038 msgid "Comment Area Emoticon" msgstr "评论区域表情" -#: options/theme-options.php:3047 +#: options/theme-options.php:3039 msgid "" "Select the emoticons to be displayed in the comment area input box. Uncheck " "all to turn off the comment input box emoticon function." @@ -3122,37 +3123,37 @@ msgstr "" "选择要在评论区域输入框中显示的表情。全部取消选中可关闭评论区域输入框表情功" "能。" -#: options/theme-options.php:3050 +#: options/theme-options.php:3042 msgid "BiliBili Emoticon Pack" msgstr "哔哩哔哩表情包" -#: options/theme-options.php:3051 +#: options/theme-options.php:3043 msgid "Baidu Tieba Emoticon Pack" msgstr "百度贴吧表情包" -#: options/theme-options.php:3052 +#: options/theme-options.php:3044 msgid "Emoji" msgstr "颜文字" -#: options/theme-options.php:3053 +#: options/theme-options.php:3045 msgid "Customized Emoticon Pack" msgstr "自定义表情包" -#: options/theme-options.php:3061 +#: options/theme-options.php:3053 msgid "Customized Emoticon Column Name" msgstr "自定义表情包名称" -#: options/theme-options.php:3062 +#: options/theme-options.php:3054 msgid "" "It is recommended to enter less than 4 Chinese characters in length to avoid " "causing compatibility issues on mobile terminals." msgstr "建议输入少于4个汉字的内容,以免造成移动端的兼容性问题。" -#: options/theme-options.php:3070 +#: options/theme-options.php:3062 msgid "Path To Custom Expression" msgstr "自定义表情包路径" -#: options/theme-options.php:3071 +#: options/theme-options.php:3063 msgid "" "Click here updating emoticon list. Specific usage reference: " @@ -3165,72 +3166,72 @@ msgstr "" "Sakurairo/Pages/#%E8%AF%84%E8%AE%BA%E7%9B%B8%E5%85%B3%E8%AE%BE%E7%BD%AE\" " "target=\"_blank\">评论相关设置" -#: options/theme-options.php:3078 +#: options/theme-options.php:3070 msgid "Custom Emoticon Proxy Address" msgstr "自定义表情包代理地址" -#: options/theme-options.php:3079 +#: options/theme-options.php:3071 msgid "" "Fill in the CDN address of the emoticon image. If left blank, the CDN proxy " "function will not be enabled." msgstr "填写表情图片的 CDN 地址。如果留空,则不会启用 CDN 代理功能。" -#: options/theme-options.php:3089 +#: options/theme-options.php:3081 msgid "Page Comment Area UA Info" msgstr "页面评论区域 UA 信息" -#: options/theme-options.php:3090 +#: options/theme-options.php:3082 msgid "" "When enabled, the page comment area will display the user’s browser, " "operating system information" msgstr "开启之后页面评论区域将显示用户的浏览器,操作系统信息" -#: options/theme-options.php:3097 +#: options/theme-options.php:3089 msgid "Page Comment Area Location Information" msgstr "页面评论区域位置信息" -#: options/theme-options.php:3098 +#: options/theme-options.php:3090 msgid "" "When enabled, the page comment area will show the user’s location information" msgstr "开启之后页面评论区域将显示用户的位置信息" -#: options/theme-options.php:3105 +#: options/theme-options.php:3097 msgid "Management Page Displays Location Information" msgstr "评论管理页面评论位置信息" -#: options/theme-options.php:3106 +#: options/theme-options.php:3098 msgid "" "When enabled, the commenter's IP geographical location information will be " "displayed on the comment management page" msgstr "开启之后评论管理页面将显示评论位置信息" -#: options/theme-options.php:3113 +#: options/theme-options.php:3105 msgid "Location Information Persistence" msgstr "位置信息持久化" -#: options/theme-options.php:3114 +#: options/theme-options.php:3106 msgid "" "When enabled, the commenter's IP geographical location information will be " "stored in the database" msgstr "开启之后评论位置信息将存储在数据库中" -#: options/theme-options.php:3121 +#: options/theme-options.php:3113 msgid "API To Parse Geographical Location" msgstr "位置信息解析 API" -#: options/theme-options.php:3123 +#: options/theme-options.php:3115 msgid "Theme Official" msgstr "主题官方" -#: options/theme-options.php:3124 +#: options/theme-options.php:3116 msgid "IP—API" msgstr "" -#: options/theme-options.php:3125 +#: options/theme-options.php:3117 msgid "All" msgstr "全部" -#: options/theme-options.php:3133 +#: options/theme-options.php:3125 msgid "" "Theme Official:Official API of the theme" "p>
IP-API:Provided by
全部: 优先使用主题官方 API,IP—API 作为备" "选 API 使用
" -#: options/theme-options.php:3141 +#: options/theme-options.php:3133 msgid "Private Comment Function" msgstr "私人评论功能" -#: options/theme-options.php:3142 +#: options/theme-options.php:3134 msgid "" "When enabled, users are allowed to set their comments to be invisible to " "others" msgstr "开启之后将允许用户设置自己的评论对其他人不可见" -#: options/theme-options.php:3149 +#: options/theme-options.php:3141 msgid "Page Comment Area Bot Verification" msgstr "页面评论区域机器人验证" -#: options/theme-options.php:3150 +#: options/theme-options.php:3142 msgid "After turning on user comments need to be verified before posting" msgstr "开启之后用户评论前需要经过验证后才可发布" -#: options/theme-options.php:3157 +#: options/theme-options.php:3149 msgid "QQ Avatar Link Encryption" msgstr "QQ头像链接加密" -#: options/theme-options.php:3160 +#: options/theme-options.php:3152 msgid "Redirect (low security)" msgstr "重定向(低安全性)" -#: options/theme-options.php:3161 +#: options/theme-options.php:3153 msgid "Get avatar data in the backend (medium security)" msgstr "后端获取头像数据(中安全性)" -#: options/theme-options.php:3162 +#: options/theme-options.php:3154 msgid "Parse avatar interface in the backend (high security, slow)" msgstr "后端解析头像接口(高安全性,慢速)" -#: options/theme-options.php:3170 +#: options/theme-options.php:3162 msgid "Page Comment Area Upload Image Interface" msgstr "页面评论区域上传图片接口" -#: options/theme-options.php:3184 +#: options/theme-options.php:3176 msgid "Imgur Client ID" msgstr "Imgur Client ID" -#: options/theme-options.php:3186 +#: options/theme-options.php:3178 msgid "" "Fill in Client ID here, to register please visit https://api.imgur.com/" "oauth2/addclient" msgstr "此处填写Client ID,注册请访问 https://api.imgur.com/oauth2/addclient" -#: options/theme-options.php:3192 +#: options/theme-options.php:3184 msgid "Imgur Upload Proxy" msgstr "Imgur上传代理" -#: options/theme-options.php:3194 +#: options/theme-options.php:3186 msgid "" "The proxy used by the backend when uploading images to Imgur. You can refer " "to the tutorial: https://2heng.xin/2018/06/06/javascript-upload-images-with-" @@ -3303,41 +3304,41 @@ msgstr "" "后端上传图片到 Imgur 的时候使用的代理。你可以参考教程:https://2heng." "xin/2018/06/06/javascript-upload-images-with-imgur-api/" -#: options/theme-options.php:3201 +#: options/theme-options.php:3193 msgid "SM.MS Secret Token" msgstr "SM.MS Secret Token" -#: options/theme-options.php:3203 +#: options/theme-options.php:3195 msgid "" "Fill in your Key here, to get it please visit https://sm.ms/home/apitoken" msgstr "此处填写Key,获取请访问 https://sm.ms/home/apitoken" -#: options/theme-options.php:3209 +#: options/theme-options.php:3201 msgid "Chevereto API v1 Key" msgstr "Chevereto API v1 Key" -#: options/theme-options.php:3211 +#: options/theme-options.php:3203 msgid "" "Fill in the Key here, to get please visit your Chevereto home page address/" "dashboard/settings/api" msgstr "此处填写Key,获取请访问你的Chevereto首页地址/dashboard/settings/api" -#: options/theme-options.php:3217 +#: options/theme-options.php:3209 msgid "Chevereto Address" msgstr "Chevereto地址" -#: options/theme-options.php:3219 +#: options/theme-options.php:3211 msgid "" "Your Chevereto home page address. Please note that there is no \"/\" at the " "end, e.g. https://your.cherverto.com" msgstr "" "你的Chevereto首页地址, 注意结尾没有 /, 例如:https://your.cherverto.com" -#: options/theme-options.php:3225 +#: options/theme-options.php:3217 msgid "Lsky Pro v1 Token" msgstr "Lsky Pro v1 Token" -#: options/theme-options.php:3227 +#: options/theme-options.php:3219 msgid "" "Fill in the Token here, Please note that there is no \"Bearer \" at first, " "to get please visit your Lsky Pro home page address/api" @@ -3345,41 +3346,41 @@ msgstr "" "在这里填写令牌,请注意,首先没有“Bearer”,要获得请访问您的Lsky Pro主页地址/ " "api" -#: options/theme-options.php:3233 +#: options/theme-options.php:3225 msgid "Lsky Pro Address" msgstr "Lsky Pro地址" -#: options/theme-options.php:3235 +#: options/theme-options.php:3227 msgid "" "Your Lsky Pro home page address. Please note that there is no \"/\" at the " "end, e.g. https://your.lskypro.com" msgstr "你的Lsky Pro首页地址, 注意结尾没有 /, 例如:https://your.lskypro.com" -#: options/theme-options.php:3241 +#: options/theme-options.php:3233 msgid "Comment Image Proxy" msgstr "评论图片代理" -#: options/theme-options.php:3242 +#: options/theme-options.php:3234 msgid "Proxy for the image displayed on the frontend" msgstr "前端显示的图片的代理" -#: options/theme-options.php:3249 +#: options/theme-options.php:3241 msgid "Comment Email Notification" msgstr "评论邮件通知" -#: options/theme-options.php:3255 +#: options/theme-options.php:3247 msgid "Mail Template Featured Image" msgstr "邮件模板特色图片" -#: options/theme-options.php:3256 +#: options/theme-options.php:3248 msgid "Set the background image of your reply email" msgstr "设置你的回复邮件上方背景图片" -#: options/theme-options.php:3264 +#: options/theme-options.php:3256 msgid "Mail Template Sending Address Prefix" msgstr "邮件模板发件地址前缀" -#: options/theme-options.php:3265 +#: options/theme-options.php:3257 msgid "" "Used to send system mail. The sender address will be displayed in the user's " "mailbox, don't use Non-English Characters. The default system mail address " @@ -3388,11 +3389,11 @@ msgstr "" "用于发送系统邮件,在用户的邮箱中显示的发件人地址,不要使用中文,默认系统邮件" "地址为 bibi@你的域名" -#: options/theme-options.php:3272 +#: options/theme-options.php:3264 msgid "User Mail Reply Notification" msgstr "用户邮件回复通知" -#: options/theme-options.php:3273 +#: options/theme-options.php:3265 msgid "" "By default WordPress will use email notifications to notify users when their " "comments receive a reply. After turning it on users are allowed to set " @@ -3401,25 +3402,25 @@ msgstr "" "WordPress默认会使用邮件通知用户评论收到回复,开启之后允许用户设置自己的评论收" "到回复时是否使用邮件通知" -#: options/theme-options.php:3280 +#: options/theme-options.php:3272 msgid "Admin Email Reply Notification" msgstr "管理员邮件回复通知" -#: options/theme-options.php:3281 +#: options/theme-options.php:3273 msgid "" "Use email notifications when admin comments receive a reply after turning it " "on" msgstr "开启之后当管理员评论收到回复时使用邮件通知" -#: options/theme-options.php:3290 +#: options/theme-options.php:3282 msgid "Other Options" msgstr "其他设置" -#: options/theme-options.php:3296 +#: options/theme-options.php:3288 msgid "Login Screen and Dashboard Related Options" msgstr "登录界面和仪表盘相关设置" -#: options/theme-options.php:3303 +#: options/theme-options.php:3295 msgid "" "You can click here" @@ -3429,103 +3430,103 @@ msgstr "" "#%E7%99%BB%E5%BD%95%E7%95%8C%E9%9D%A2%E5%92%8C%E4%BB%AA%E8%A1%A8%E7%9B%98%E7%9B%B8%E5%85%B3%E8%AE%BE%E7%BD%AE\">" "此处 了解如何在此页面上设置选项" -#: options/theme-options.php:3308 +#: options/theme-options.php:3300 msgid "Login Screen" msgstr "登录界面" -#: options/theme-options.php:3314 +#: options/theme-options.php:3306 msgid "Custom Login Screen" msgstr "定制登录界面" -#: options/theme-options.php:3315 +#: options/theme-options.php:3307 msgid "Default on, custom login screen will replace the default login screen" msgstr "默认开启,定制登录界面将取代默认登录界面" -#: options/theme-options.php:3322 +#: options/theme-options.php:3314 msgid "Login Screen Background Image" msgstr "登录界面背景图片" -#: options/theme-options.php:3323 +#: options/theme-options.php:3315 msgid "" "Set your login screen background image, leave this option blank to show the " "default" msgstr "设置你的登录界面背景图片,此选项留空则显示默认背景" -#: options/theme-options.php:3332 +#: options/theme-options.php:3324 msgid "Login Screen Background Blur" msgstr "登录界面背景虚化" -#: options/theme-options.php:3333 +#: options/theme-options.php:3325 msgid "Login screen background image will be blurred when enabled" msgstr "开启之后登录界面背景图片将被虚化" -#: options/theme-options.php:3341 +#: options/theme-options.php:3333 msgid "Login Screen Logo" msgstr "登录界面Logo" -#: options/theme-options.php:3342 +#: options/theme-options.php:3334 msgid "Set your login screen Logo" msgstr "设置你的登录界面Logo" -#: options/theme-options.php:3351 +#: options/theme-options.php:3343 msgid "Jump after login" msgstr "登录后跳转" -#: options/theme-options.php:3352 +#: options/theme-options.php:3344 msgid "Jump to backend for admins and home for users after turning on." msgstr "开启之后管理员跳转至后台,用户跳转至主页。" -#: options/theme-options.php:3359 +#: options/theme-options.php:3351 msgid "Login Screen Language Option" msgstr "登录界面语言选项" -#: options/theme-options.php:3360 +#: options/theme-options.php:3352 msgid "Login screen language option will be display when enabled" msgstr "开启之后登录界面将显示语言选项" -#: options/theme-options.php:3366 +#: options/theme-options.php:3358 msgid "Dashboard" msgstr "仪表盘" -#: options/theme-options.php:3372 +#: options/theme-options.php:3364 msgid "Dashboard Background Image" msgstr "仪表盘背景图片" -#: options/theme-options.php:3373 +#: options/theme-options.php:3365 msgid "" "Set your dashboard background image, leave this option blank to show white " "background" msgstr "设置你的仪表盘背景图片,此选项留空则显示白色背景" -#: options/theme-options.php:3381 +#: options/theme-options.php:3373 msgid "Dashboard Options Menu Style" msgstr "仪表板设置菜单样式" -#: options/theme-options.php:3392 +#: options/theme-options.php:3384 msgid "Dashboard Primary Menu Color" msgstr "仪表盘一级菜单颜色" -#: options/theme-options.php:3400 +#: options/theme-options.php:3392 msgid "Dashboard Secondary Menu Color" msgstr "仪表盘二级菜单颜色" -#: options/theme-options.php:3408 +#: options/theme-options.php:3400 msgid "Dashboard Emphasis Color" msgstr "仪表板强调颜色" -#: options/theme-options.php:3416 +#: options/theme-options.php:3408 msgid "Dashboard Button Color" msgstr "仪表板按钮颜色" -#: options/theme-options.php:3424 +#: options/theme-options.php:3416 msgid "Dashboard Text Color" msgstr "仪表盘文本颜色" -#: options/theme-options.php:3434 +#: options/theme-options.php:3426 msgid "ChatGPT Options" msgstr "ChatGPT 设置" -#: options/theme-options.php:3441 +#: options/theme-options.php:3433 msgid "" "You can click here to learn how to set the options on " @@ -3534,27 +3535,27 @@ msgstr "" "您可以单击 此处 了解如何在此页面上设置选项" -#: options/theme-options.php:3447 +#: options/theme-options.php:3439 msgid "ChatGPT Function" msgstr "ChatGPT 功能" -#: options/theme-options.php:3448 +#: options/theme-options.php:3440 msgid "After turning on ChatGPT Function will be available" msgstr "开启之后 ChatGPT 功能将可以使用" -#: options/theme-options.php:3455 +#: options/theme-options.php:3447 msgid "ChatGPT Base URL" msgstr "ChatGPT 访问地址" -#: options/theme-options.php:3456 +#: options/theme-options.php:3448 msgid "Fill in the ChatGPT Base URL, The default is https://openai.fuukei.org/" msgstr "填写ChatGPT访问地址,默认使用 https://openai.fuukei.org/" -#: options/theme-options.php:3464 +#: options/theme-options.php:3456 msgid "ChatGPT API keys" msgstr "ChatGPT API密钥" -#: options/theme-options.php:3465 +#: options/theme-options.php:3457 msgid "" "Fill in Your ChatGPT API keys, You can go to OpenAI Website to get your API Keys" @@ -3562,15 +3563,15 @@ msgstr "" "填写您的 ChatGPT API 密钥,您可以访问 OpenAI 网站 获取您的 API 密钥" -#: options/theme-options.php:3472 +#: options/theme-options.php:3464 msgid "ChatGPT Article Summarize" msgstr "ChatGPT 文章摘要" -#: options/theme-options.php:3473 +#: options/theme-options.php:3465 msgid "After turning on ChatGPT will automatically generate article abstracts" msgstr "开启之后 ChatGPT 会自动生成文章摘要" -#: options/theme-options.php:3480 +#: options/theme-options.php:3472 msgid "" "Each update of your post will trigger a request to generate a summary. Due " "to current API limitations, if your article exceeds 4097 Token, the system " @@ -3579,21 +3580,21 @@ msgstr "" "你的每次文章更新都会触发生成摘要请求。由于目前API限制,如果你的文章超过 4097 " "Token,系统将会只发送未超出部分以生成摘要" -#: options/theme-options.php:3490 +#: options/theme-options.php:3482 msgid "Article IDs that do not Require ChatGPT Summarize" msgstr "不需要 ChatGPT 生成摘要的文章ID" -#: options/theme-options.php:3491 +#: options/theme-options.php:3483 msgid "" "Enter the article IDs that do not need to generate ChatGPT Summarize, and " "split multiple article IDs with \",\"" msgstr "输入不需要ChatGPT 生成摘要的文章 ID,并使用“,” 拆分多个文章 ID" -#: options/theme-options.php:3502 +#: options/theme-options.php:3494 msgid "ChatGPT Article Summarize Init Prompt" msgstr "ChatGPT 文章摘要初始化提示" -#: options/theme-options.php:3507 +#: options/theme-options.php:3499 msgid "" "Init Prompt instructs AI how to generate summaries for your articles. Init " "Prompt will be passed to ChatGPT as \"system\" role" @@ -3601,11 +3602,11 @@ msgstr "" "用于指示 AI 如何为你的文章生成摘要。初始化提示将作为 “系统 ”角色传递给 " "ChatGPT" -#: options/theme-options.php:3514 +#: options/theme-options.php:3506 msgid "ChatGPT Model" msgstr "ChatGPT 模型" -#: options/theme-options.php:3515 +#: options/theme-options.php:3507 msgid "" "Only models support Chat Completion API can be used. The default is " "\"gpt-3.5-turbo\". View https://platform.openai.com/docs/models/overview for " @@ -3614,31 +3615,31 @@ msgstr "" "只有兼容 ChatGPT API 的模型才能使用。默认为 “gpt-3.5-turbo”。更多信息请查看 " "https://platform.openai.com/docs/models/overview" -#: options/theme-options.php:3527 +#: options/theme-options.php:3519 msgid "ChatGPT API self test" msgstr "ChatGPT API 测试" -#: options/theme-options.php:3531 +#: options/theme-options.php:3523 msgid "TEST" msgstr "测试" -#: options/theme-options.php:3534 +#: options/theme-options.php:3526 msgid "Results: " msgstr "结果: " -#: options/theme-options.php:3546 +#: options/theme-options.php:3538 msgid "Waiting for response..." msgstr "等待响应" -#: options/theme-options.php:3557 +#: options/theme-options.php:3549 msgid "Malformed post_id: " msgstr "错误的文章 ID" -#: options/theme-options.php:3574 +#: options/theme-options.php:3566 msgid "Low Use Options" msgstr "低使用设置" -#: options/theme-options.php:3581 +#: options/theme-options.php:3573 msgid "" "You can click here to learn how to " @@ -3648,53 +3649,53 @@ msgstr "" "#%E4%BD%8E%E4%BD%BF%E7%94%A8%E8%AE%BE%E7%BD%AE\">此处 了解如何在此页面上" "设置选项" -#: options/theme-options.php:3587 +#: options/theme-options.php:3579 msgid "Statistics API" msgstr "统计接口" -#: options/theme-options.php:3588 +#: options/theme-options.php:3580 msgid "" "You can choose WP-Statistics plugin statistics or theme built-in statistics " "to display" msgstr "你可以选择WP-Statistics插件统计或者主题内建统计作为统计结果" -#: options/theme-options.php:3590 +#: options/theme-options.php:3582 msgid "Theme Built in Statistics" msgstr "主题内建统计" -#: options/theme-options.php:3591 +#: options/theme-options.php:3583 msgid "WP-Statistics Plugin Statistics" msgstr "WP-Statistics插件统计" -#: options/theme-options.php:3599 +#: options/theme-options.php:3591 msgid "Statistics display format" msgstr "统计数据显示格式" -#: options/theme-options.php:3600 +#: options/theme-options.php:3592 msgid "You can choose from four different data display formats" msgstr "你可以选择四种不同的数据显示格式" -#: options/theme-options.php:3602 +#: options/theme-options.php:3594 msgid "23333 Visits" msgstr "23333次访问" -#: options/theme-options.php:3603 +#: options/theme-options.php:3595 msgid "23,333 Visits" msgstr "23,333次访问" -#: options/theme-options.php:3604 +#: options/theme-options.php:3596 msgid "23 333 Visits" msgstr "23 333次访问" -#: options/theme-options.php:3605 +#: options/theme-options.php:3597 msgid "23K Visits" msgstr "23K次访问" -#: options/theme-options.php:3613 +#: options/theme-options.php:3605 msgid "Live Search" msgstr "实时搜索" -#: options/theme-options.php:3614 +#: options/theme-options.php:3606 msgid "" "After turning on the live search in the frontend, call Rest API to update " "the cache once an hour. You can set the cache time manually in api.php" @@ -3702,45 +3703,45 @@ msgstr "" "开启之后将在前台实现实时搜索,调用 Rest API 每小时更新一次缓存,可在 api.php " "里手动设置缓存时间" -#: options/theme-options.php:3621 +#: options/theme-options.php:3613 msgid "Live Search Comment Support" msgstr "实时搜索评论支援" -#: options/theme-options.php:3623 +#: options/theme-options.php:3615 msgid "" "Enable to search for comments in live search (not recommended if site has " "too many comments)" msgstr "启开启之后将在可在实时搜索中搜索评论(如果网站评论数量太多不建议开启)" -#: options/theme-options.php:3630 +#: options/theme-options.php:3622 msgid "Google Analytics Id" msgstr "谷歌统计ID" -#: options/theme-options.php:3631 +#: options/theme-options.php:3623 msgid "If you already have a plugin to handle it, please keep here empty." msgstr "如果已有类似功能插件,请将此处留空" -#: options/theme-options.php:3637 +#: options/theme-options.php:3629 msgid "Custom CSS Styles" msgstr "自定义CSS样式" -#: options/theme-options.php:3638 +#: options/theme-options.php:3630 msgid "Fill in the CSS code without writing style tag" msgstr "填写CSS代码,不需要写style标签" -#: options/theme-options.php:3645 +#: options/theme-options.php:3637 msgid "Code inserted in the header" msgstr "自定义插入 Header 代码" -#: options/theme-options.php:3646 +#: options/theme-options.php:3638 msgid "Insert HTML code right before ." msgstr "在前插入HTML代码" -#: options/theme-options.php:3652 +#: options/theme-options.php:3644 msgid "Timezone Fix" msgstr "时区修正" -#: options/theme-options.php:3653 +#: options/theme-options.php:3645 msgid "" "Slide to adjust. If the comment has a time difference problem, adjust it " "here, fill in an integer. Calculation method: actual time = time of display " @@ -3749,42 +3750,42 @@ msgstr "" "滑动滑块,如果评论出现时差问题在这里调整,填入一个整数,计算方法:实际时间=显" "示错误的时间-你输入的整数(单位:小时)" -#: options/theme-options.php:3662 +#: options/theme-options.php:3654 msgid "Gravatar Service Proxy" msgstr "Gravatar服务代理" -#: options/theme-options.php:3663 +#: options/theme-options.php:3655 msgid "" "You can select multiple proxy as the Gravatar Service Proxy. By default, " "Tianli is used as the Gravatar Service Proxy." msgstr "" "你可以选择多种代理作为Gravatar服务代理。默认使用Tianli作为Gravatar服务代理。" -#: options/theme-options.php:3665 +#: options/theme-options.php:3657 msgid "Weavatar Service" msgstr "Weavatar服务" -#: options/theme-options.php:3666 +#: options/theme-options.php:3658 msgid "Cravatar Service" msgstr "Cravatar服务" -#: options/theme-options.php:3667 +#: options/theme-options.php:3659 msgid "Geekzu" msgstr "极客族" -#: options/theme-options.php:3668 +#: options/theme-options.php:3660 msgid "Loli Net" msgstr "" -#: options/theme-options.php:3669 +#: options/theme-options.php:3661 msgid "Official" msgstr "官方" -#: options/theme-options.php:3670 options/theme-options.php:3678 +#: options/theme-options.php:3662 options/theme-options.php:3670 msgid "Custom Proxy Address" msgstr "自定义代理地址" -#: options/theme-options.php:3679 +#: options/theme-options.php:3671 msgid "" "Enter your Gravatar proxy address without starting with \"http(s)://\" and " "ending with \"/\". Example: gravatar.com/avatar." @@ -3792,37 +3793,37 @@ msgstr "" "输入你的头像代理地址,请勿以\"http(s)://\" 开头 “/” 结尾。示例:gravatar.com/" "avatar。" -#: options/theme-options.php:3686 +#: options/theme-options.php:3678 msgid "Lightbox" msgstr "灯箱" -#: options/theme-options.php:3692 +#: options/theme-options.php:3684 msgid "BaguetteBox Lightbox Effect" msgstr "BaguetteBox灯箱效果" -#: options/theme-options.php:3693 +#: options/theme-options.php:3685 msgid "BaguetteBox will be used as the image lightbox effect when turned on" msgstr "开启之后将使用BaguetteBox作为图片灯箱效果" -#: options/theme-options.php:3705 +#: options/theme-options.php:3697 msgid "FancyBox Lightbox Effect" msgstr "FancyBox灯箱效果" -#: options/theme-options.php:3706 +#: options/theme-options.php:3698 msgid "" "FancyBox will be used as an image lightbox effect after turning on, " "additional JQ libraries will be loaded" msgstr "开启之后将使用FancyBox作为图片灯箱效果,将会额外加载JQ库" -#: options/theme-options.php:3718 +#: options/theme-options.php:3710 msgid "LightGallery Lightbox Effect" msgstr "LightGallery灯箱效果" -#: options/theme-options.php:3719 +#: options/theme-options.php:3711 msgid "LightGallery will be used as an image lightbox effect after turning on." msgstr "开启之后将使用LightGallery作为图片灯箱效果" -#: options/theme-options.php:3729 +#: options/theme-options.php:3721 msgid "" "Attension: Please read License Instruction before use.
提交关于 Github 的新讨论以寻求帮助。https://" "github.com/mirai-mamori/Sakurairo/discussions" -#: options/theme-options.php:3740 +#: options/theme-options.php:3732 msgid "" "Start from Sakurairo v2.4.0, plugins names in LightGallery option follow the " "form cite in official document (eg. lgHash instead of \"hash\")" @@ -3853,15 +3854,15 @@ msgstr "" "从Sakurairo v2.4.0开始,LightGallery中的插件名称会与官方文档中引用的表格保持" "一致(例如“hash”将被表示为IgHash)" -#: options/theme-options.php:3748 +#: options/theme-options.php:3740 msgid "LightGallery Lightbox Effect Options" msgstr "LightGallery灯箱效果" -#: options/theme-options.php:3759 +#: options/theme-options.php:3751 msgid "Code Highlighting" msgstr "代码高亮" -#: options/theme-options.php:3764 +#: options/theme-options.php:3756 msgid "" "Highlight.js: Default. Automatic language recognition. " "p>
Prism.js: Requires a language to be specified, see 如何代码高亮动态载入的文件。 " "p>
自定义: 适用于另有配置的情况。
" -#: options/theme-options.php:3772 +#: options/theme-options.php:3764 msgid "Code Highlight Method" msgstr "代码高亮程序" -#: options/theme-options.php:3776 +#: options/theme-options.php:3768 msgid "Custom Program" msgstr "自定义" -#: options/theme-options.php:3784 +#: options/theme-options.php:3776 msgid "Prism.js: Add Line Number Display for All Code Blocks" msgstr "Prism.js:为所有代码块增加行数显示" -#: options/theme-options.php:3788 +#: options/theme-options.php:3780 msgid "" "See the plugin " "description documentation" msgstr "" "请参阅 插件描述文档" -#: options/theme-options.php:3794 +#: options/theme-options.php:3786 msgid "Prism.js: Autoload Address" msgstr "Prism.js:自动加载地址" -#: options/theme-options.php:3798 +#: options/theme-options.php:3790 msgid "Leave blank to use default values" msgstr "留空以使用默认值" -#: options/theme-options.php:3805 +#: options/theme-options.php:3797 msgid "Prism.js: Code Highlight Theme" msgstr "Prism.js:代码高亮主题" -#: options/theme-options.php:3806 options/theme-options.php:3817 +#: options/theme-options.php:3798 options/theme-options.php:3809 msgid "Relative to autoload address. Leave blank to use default values" msgstr "相对于自动加载地址。留空以使用默认值" -#: options/theme-options.php:3816 +#: options/theme-options.php:3808 msgid "Prism.js: Code Highlight Theme (Dark Mode)" msgstr "Prism.js:代码高亮主题(深色模式)" -#: options/theme-options.php:3827 +#: options/theme-options.php:3819 msgid "" "The following Options are not recommended to be modified blindly, please use " "them under the guidance of others" msgstr "以下设置不推荐盲目进行修改,请在他人的指导下使用" -#: options/theme-options.php:3833 +#: options/theme-options.php:3825 msgid "Image CDN" msgstr "图片 CDN" -#: options/theme-options.php:3834 +#: options/theme-options.php:3826 msgid "" "Note: fill in the format https://your CDN domain/. This means that images " "with original path http://your.domain/wp-content/uploads/2018/05/xx.png will " @@ -3935,23 +3936,23 @@ msgstr "" "domain/wp-content/uploads/2018/05/xx.png 的图片将从 http://你的CDN域" "名/2018/05/xx.png 加载" -#: options/theme-options.php:3841 +#: options/theme-options.php:3833 msgid "Articles Categories (Do not display)" msgstr "文章分类(不显示)" -#: options/theme-options.php:3842 options/theme-options.php:3849 +#: options/theme-options.php:3834 options/theme-options.php:3841 msgid "Fill in category ID, seperate in English\" , \" when more than one" msgstr "填写分类ID,多个用英文“ , ”分开" -#: options/theme-options.php:3848 +#: options/theme-options.php:3840 msgid "Image Display Category" msgstr "图片展示分类" -#: options/theme-options.php:3855 +#: options/theme-options.php:3847 msgid "Specify Login Address" msgstr "指定登录地址" -#: options/theme-options.php:3856 +#: options/theme-options.php:3848 msgid "" "Force not to use the WordPress login page address to login, fill in the new " "login page address, such as: http://www.xxx.com/login. Note that before " @@ -3962,47 +3963,47 @@ msgstr "" "www.xxx.com/login。注意填写前先测试下你新建的页面是可以正常打开的,以免造成无" "法进入后台等情况。" -#: options/theme-options.php:3862 +#: options/theme-options.php:3854 msgid "Specify Registration Address" msgstr "指定注册地址" -#: options/theme-options.php:3863 +#: options/theme-options.php:3855 msgid "" "This address is used as the registration entry on the login page, if you " "specify a login address, it is recommended to fill in" msgstr "该地址在登录页面作为注册入口,如果你指定了登录地址,则建议填写" -#: options/theme-options.php:3869 +#: options/theme-options.php:3861 msgid "Version Control" msgstr "版本控制" -#: options/theme-options.php:3870 +#: options/theme-options.php:3862 msgid "Used to update front-end cookies and browser cache, can use any string" msgstr "用于更新前端Cookie和浏览器缓存,可使用任意字符串" -#: options/theme-options.php:3876 +#: options/theme-options.php:3868 msgid "Backup&Recovery" msgstr "备份恢复" -#: options/theme-options.php:3878 +#: options/theme-options.php:3870 msgid "Backup or Recovery your theme options" msgstr "备份或恢复你的主题设置" -#: options/theme-options.php:3889 +#: options/theme-options.php:3881 msgid "About Theme" msgstr "关于主题" -#: options/theme-options.php:3895 +#: options/theme-options.php:3887 msgid "Version Info" msgstr "版本信息" -#: options/theme-options.php:3900 +#: options/theme-options.php:3892 msgid "" "" msgstr "" -#: options/theme-options.php:3906 +#: options/theme-options.php:3898 #, php-format msgid "" "Theme Sakurairo Version %s | Internal Version %s | 项目地址" -#: options/theme-options.php:3911 +#: options/theme-options.php:3903 msgid "Update Related" msgstr "更新相关" -#: options/theme-options.php:3917 +#: options/theme-options.php:3909 msgid "Theme Update Source" msgstr "主题更新源" -#: options/theme-options.php:3923 +#: options/theme-options.php:3915 msgid "" "If you are using a server set up in mainland China, please use the Upyun " "source or the official theme source as your theme update source" @@ -4027,11 +4028,11 @@ msgstr "" "如果你使用的是架设在国内的服务器,请使用又拍云源或主题官方源作为你的主题更新" "源" -#: options/theme-options.php:3930 +#: options/theme-options.php:3922 msgid "Theme Update Test Channel Disclaimer" msgstr "主题更新测试通道免责声明" -#: options/theme-options.php:3936 +#: options/theme-options.php:3928 msgid "" "Please copy the text in quotes after ensure that you have carefully " "understood the risks associated with participating in the test and are " @@ -4044,55 +4045,55 @@ msgstr "" "内 \"I agree and am willing to bear all unexpected consequences\" " "strong>" -#: options/theme-options.php:3942 +#: options/theme-options.php:3934 msgid "Theme Update Channel" msgstr "主题更新频道" -#: options/theme-options.php:3949 +#: options/theme-options.php:3941 msgid "" "You can toggle the update channel here to participate in the testing of the " "new version" msgstr "你可以在此切换更新频道以参与到新版本的测试中" -#: options/theme-options.php:3951 +#: options/theme-options.php:3943 msgid "Stable Channel" msgstr "正式通道" -#: options/theme-options.php:3952 +#: options/theme-options.php:3944 msgid "Beta Channel" msgstr "公共测试频道" -#: options/theme-options.php:3953 +#: options/theme-options.php:3945 msgid "Preview Channel" msgstr "预览测试频道" -#: options/theme-options.php:3960 +#: options/theme-options.php:3952 msgid "Resource Control" msgstr "资源控制" -#: options/theme-options.php:3966 +#: options/theme-options.php:3958 msgid "Provide Critical Frontend Resource locally" msgstr "本地提供关键前端资源" -#: options/theme-options.php:3967 +#: options/theme-options.php:3959 msgid "" "Enabeld by default. Critical resources are those resources whose loading " "performance will have a significant impact on the user experience." msgstr "默认开启。关键资源是指那些其加载性能将对用户体验产生重大影响的资源。" -#: options/theme-options.php:3974 +#: options/theme-options.php:3966 msgid "Provide Other Frontend Resource locally" msgstr "本地提供其他前端资源" -#: options/theme-options.php:3975 +#: options/theme-options.php:3967 msgid "Less important frontend resource in the theme's folder." msgstr "主题文件夹中不太重要的前端资源。" -#: options/theme-options.php:3982 +#: options/theme-options.php:3974 msgid "Provide 3rd-party library from public CDN" msgstr "从公共 CDN 提供第三方库" -#: options/theme-options.php:3983 +#: options/theme-options.php:3975 msgid "" "When disabled, 3rd-party dependencies, which have been built to bundles " "along with themes's entry script, will be loaded from the exact same origin " @@ -4101,15 +4102,15 @@ msgstr "" "当禁用时,与主题脚本一起被构建打包的第三方依赖,将从与关键前端资源完全相同的" "来源加载。" -#: options/theme-options.php:3990 +#: options/theme-options.php:3982 msgid "Public CDN Basepath" msgstr "公共 CDN 路径" -#: options/theme-options.php:4002 +#: options/theme-options.php:3994 msgid "Vision Resource Basepath" msgstr "视觉资源路径" -#: options/theme-options.php:4003 +#: options/theme-options.php:3995 msgid "" "This link directory structure needs to be consistent with the Sakurairo Vision " @@ -4122,31 +4123,31 @@ msgstr "" "资源 404。默认采用 又拍云 提供的镜像" "源。" -#: options/theme-options.php:4009 +#: options/theme-options.php:4001 msgid "Theme Sponsors" msgstr "赞助信息" -#: options/theme-options.php:4014 +#: options/theme-options.php:4006 msgid "" "" msgstr "" -#: options/theme-options.php:4019 +#: options/theme-options.php:4011 msgid "Theme Contributors" msgstr "贡献者" -#: options/theme-options.php:4024 +#: options/theme-options.php:4016 msgid "" "" msgstr "" -#: options/theme-options.php:4029 +#: options/theme-options.php:4021 msgid "Privacy information" msgstr "隐私信息" -#: options/theme-options.php:4034 +#: options/theme-options.php:4026 msgid "" "The theme respects your privacy
\n" "However, when you use a service provider pre-populated by the " @@ -4162,11 +4163,11 @@ msgstr "" "
你可以通过本地化与主题相关的资源来减少发送给第三方的信息,主题提供相关选项" "配置
" -#: options/theme-options.php:4042 +#: options/theme-options.php:4034 msgid "Send Theme Version to Fuukei" msgstr "发送主题版本到 Fuukei 官方" -#: options/theme-options.php:4043 +#: options/theme-options.php:4035 msgid "" "The theme will only send time and version information to Fuukei officials " "and the data will be cleaned regularly and used only to count version " @@ -4175,11 +4176,11 @@ msgstr "" "主题只会向 Fuukei 官方发送时间和版本信息,数据将定期清理并仅用于统计版本更" "新。" -#: options/theme-options.php:4049 +#: options/theme-options.php:4041 msgid "Reference Information" msgstr "引用信息" -#: options/theme-options.php:4054 +#: options/theme-options.php:4046 msgid "" "Fluent Design Icon Referenced by Paradox Fluent Icon Pack
\n" "MUH2 Design Icon Referenced by 缄默 沐氢图标包
\n" "白猫样式Logo参考原主题作者白猫,由 Hyacm 提供方案并引用
" -#: options/theme-options.php:4061 +#: options/theme-options.php:4053 msgid "Dependency Information" msgstr "依赖信息" -#: options/theme-options.php:4066 +#: options/theme-options.php:4058 msgid "" "Options Framework Relies on the Codestar Open Source Codestar Framework Project
\n" @@ -4214,7 +4215,7 @@ msgstr "" "ChatGPT 相关能力依赖于 HaoZi-Team 开源的 ChatGPT PHP 项目
" -#: options/theme-options.php:4073 +#: options/theme-options.php:4065 msgid "" "hGq5>6 zizhG_Ru6jInerh2O(wAeQ}Iu1g7wF_5eeec#0RksMvwQrTG$a2@KsF3{rDW_nBemJ zV0+@F_$1yjQzm*|OXAr$3eN;dbRp4xlILB-4X6uVo9uaMcn(`&@)TF^Rm>#5gd?%- zR5#?GV{zge7=hVd^}I4z6eBSKYhXL9iWBis48Bi7J^c(d7G{@2Ve${K}I&{T_vG8O5#6i@DQfpX;j7H zGd-^wPQ>Q81vN5%;W&JDmMcGp1Bmm#=6OSKBtC^Vuoc#u?XI7QYlx3v4XuKqb3Csr z8LO}*{)>8omajW|VQ=Cwn1vTmi_L$-^TKeAxdC$!Z$a&z?G_)!e8eZr3+9iK`+N6D z8cQAXSZZr(F?SiQ7ya;1(8){8_jj?zigB3`W zc+(AiDi$Gbi-oZ_Y9xkZ6`Y0R@k7iPpd)i#dGmR0|M$eQl)r*nWGk=|9z%`HeT=|= zP#r1q7UN%lMD4fS;%ki6iCbAb1~mc`ES`-uiRWQKJcN(nX;j0vP>VA#-!0-u)PuyK z9;`kV#Wtvs>NB75*Qy^vhB`75b;HT1{5MdmdI9Q2D=- frt zvZ1`CI20=`boCaZrgj;sBku%BXb$(GdUzal<146b^CR-o^X^(aWRZJ?j>0(d=c1-? zFRCNgurB_DwXob`wjMr%y!^b6Q0>-V;vOK_h=iV~1FFEs(zpnta5rj1&Y(u(8jir* zsCwy3-P}$^4e3mCKC1pI)b$%tBfJyU!OxK?Wc=TD6$)WV3QD40C<& DJt)$k`)ehjt9&RF?*)C2s0;h1xo=e>-@P$M-DV|D+ uik +U$qA(MZ&FQ&1ze9JO2ankP~1-9)t$SnVF9&}znCb5xcL z%}KHqG(` Yhl9-5{k*)2$fx5wC>)eziqdJy}deSMVj=hPwa1rLl zm8cQg5G0`<@531U0?XhnjK{+3-N$YURv_+b@p!C6ya@HiJAj&kv#1gJ9o2zc@3<*> z6g48XP-`m%)q&s>B#M*hiK;Lf>)=$>$m~Hq@ljO6dEa$&UJ~CVu7bM$V^saKs1f-A zE8_zk5TLUg+=KZWUHxrXR{Q@L39a(qur?LL-*aC`ns0J9T8L_RJ! Ok(z&N8Uo)BrQF4Hm+Wur?k+ja1-$?E>b%BnkC25p{#Us5u;sap+t5ZmdXr1FK@; zEv|k;)D7CBI?@ZZX2x0^L~XYP7=}BrFz&$|+W%jY&>}f$ev8^Jmrxz~3pK|PS?)%0 zm`t32y6z>+hvUqdmOmdO$bTEdF$>j!gO~@8V6Xs*QzX=*%U19ks^UMWHIZYhGaPkc zDJ+7OQ2Rd-^ Yi^NHFNBC`SnrP4?$hO+T!3j zt59SQ?`sNLpyn_)ffiK+YUpE7YoZ!zC?7`+VJp-V_e0eiVdaxh*Du8BxW>wBeC&2f z3NnI0uPcd2Dx{%q@DgfhgXR>}_L+qm(hZm!-$!+1Cr0BjRQb=S>+hl- 3)X?AF8-)B~(Ut&Pu7L;f|Y!`HA1-aX9t7b6jK#Pz5i#t^5Vo}ed=!%>(6 z@1tH+|6pS*^dI*`9Z(O_3&Su2KfuA*9Ls;ITEGGtNZq@5@*lBTu*+wn2@+WUPaSuoHSG=_GVE@0xQ?dER^ESN)o|DSn5l z7d-rpOY}P(y4K5ahA)N`oWZ5I_$;qwO#IgQ6Rsv+@*RJqVB>Q jh7Tg5FfkY9_$M0y8BZ5Ki^Gv!)UV%s)33YS4H)>rr8J! z61PXKnKV>~2bsgnQRd6$1aqo66N6Rg;p-$a7_;3!@_mhlD&FRG8(`b~!YdTB?vTbk zzw+k8D|h)!$Em+F>|B5U54TGW+;_jE b!FOcT z$D63Q+~3X`sEQ3OZi-RF?NQrl5GLR(ERUaIHN1tBvE+Z5MqGi~Wfw3N^YWDHNb3iT ze|r++$f$!SFhdpoaUUMTQ5^`PIyS}hu`2O0i;r6TEviF#{&hEKjLF0!E#8jW-an$Q z=lfqE)U%qXIqr_SQ6{S5Xv_C4UWvMJ7nZ{xEWc2|#g)u9sE!P^cmt}v<5)!3VJQqg zAfX$V%;p++3{|n6IRL8@PsBLfYWe5QduHM6uE99eoVP&TsE6ghV9vqP i{#I1`pJ9IP z@0}x29DlHa9J$=wl|YR^N6drWFbdOA4U9+K;4O>STD%+e#9vtcS=0#qf<6|?9SFTI zR$}P$e;o-mv ?z2>Lp7v@RxTht5a5=P)1EQ4WrTwDnY5H~>8Yh`g4)C2UxM{r`E zKrnRU`DEzE>r}vtWfSTN5AgPpXHgye1@$EQ^-=X>P)}OH;#wBhH=Co@L`PIRndU@u zLB61yt4(BR&i11kJcYW!CDhR0wD_)-|AnfbE5GYd2~?bbx?yY73nv}5cIH_57Sw|r zM2*C$pe630dRU- nfsdSRY$rXUkuP>Tnin4SZ$!7tP<0>w;dc z!mgpRsG+W7aSG}QJD@r;0<~x+So{`h+pWTO_?5-w!ULgKZhP!W{u`)~xQiP4JVo4t z7RMNU{?`m8_#Ci;p%%|D-$ixc2 rKcO1R##WGdP#q|Y8j)!1j>*^qm*7JDFV4fa9(DDr6%B;`VIvWf$)AV1 z&)2B-e#OxK|JO2dM!FkDm?cmZOQW8+n%Nw+W_nsY%;K5m+vXPYAnN+lsP^ul9_*h; z_P-Kg#oT8=e%wIZ5>@dJGkbA2cZJPZ)X-MP=dc;}#Wkq*3Y2j1BdE{$G3F-oGV0?# zGK&5GB#9@ZT*eaAzCDThkogzYK=qP=(3jIbsQg{n0&k&)wobHrWxr@{Mtzz60kt?A zl?r$}@lDi+-BU3E_w_zVLJeL hO!q%;}~-R z#t?5uEv|1+Q}hR_19{50k?DqdHTOa-(%=vhdLfKP4e8sc3qL?j!RM$K#VO2<4^Z1M zXW2mLZ@?(jkUx*QZYb&rC! @U)Qu-$5cgpfOs(YJ1DUA$M^PW&`Qs!t%aO<=qXEvs zcTi7Kud;ixC(QO{7t~1gwD?8Ti{)i=mbt{-h#JY=sF6Bs@o}l1p0|u2t-_z?zo;AK ztl}CdX~v<}KpoV6ehRflo<~jPEQ`0G*2qaz2Yy98*uQ3x#~3LMMR^kX`kaLQus7bq zBdEpnVO86|s2kit?UJI^T%3yfldCW4MgveC9BJ_!)M8tLx^69MB)+P~{?`R(tl~A) zTDWU*biC_vWz>gA66%RtqZVO*D}Nc)&K%2MV(}K#jrO9R{8P(6gX++=c=o?4{6dE2 z@E&R?b5(Z@#-YmVpcYpW>U}U8wK(6yG%QoY)tiKBcn0c*b5ZTC!*JYzYVWXlJV;_N z8K*6yMNK#7PoX-Jj TYH5N<+k%d@EWMz&g^?c_B;)timF@jOh%HK-A~hMK~= zs162;J?;vspf0S3BQY5@hucwed(6sDn%|n2P&c}Xy1{+a{?5s7`HJhBO;GK%L#?R+ zNXKh>(@5yXpO}YH7am6q<$24$VfnZH(p4gY>U)_wfzUt9*G9z)Q2S*As>S`NmJXqA z{k3`9%w0DS`ZcLEYD{XP>OGBWZwTs9CSq0GiW>7vby>E07v`Zd2cb_& vNS2CiZw)P=24 zZ;B461_xXIFpEc{_QflxZvuO8HU5qo(M3sa&Ud12cmvgezmfKt|Ay{Hg-|^#ihA-` zi|e8~kcw)sJ8CG$qMmfAm2X9@fn!#F19ii^$?p1SRGffXQ>`&tA6wl>s7EiEQ&1Is z)LgAWb!;!{jd2K7|2NbtERf>j+Ned^2nS+ER0sE2`8VbjRJ(VuYA`?#Q{5t|*T`Ma z3AKu!M^&7I;nZ7?4T(Q$>^k_DS)hsQKrCtvRYi?h5^5y7m_twxHWf2)A%^yUj;4Xo zzl}tqKId9tEcUnjX{aaOg=*lCm4AntiU(#)GdD%4sHy0Qx^5JzLz9tTxxD45Pn}iG z*#EI4J|si$fwQO^Tt+RvKTr)kusCmX*HAdBUR6|iirEIW2)m-Lf8Fxuo2xBZK(VcsF8|k?G|r5>Is{oI^G)dVi#1s zK2|;)`3wkpV@Nzt!Ai4G8~1f{jJXzLDL;W)Y` IdR@$k=Ejih|8GdBfk0c=KxI_i8RIaB8*x4A$)0ZKMyv 7Vs%4C6@222YRD;V=bGQz}@POqXHjks`@U+GEP`l_K)RgAx;L1y& z+DkxvmZYFM-U5Tl=wt=mtsouMz)*`PqdvdiK)vBU!9+ZTEik;J`^lm!zDc|a^`c7X z P>hH)o%9AZgCgw%>LIZk0nDrs*FRiuEp=5F4&G*Jcm(l# q^vvu0_3=HlY^xXV0+zH8j7Hp$qPtIlH+02-FalKutx0<#)nr z#LuEW17@JM*Iv}8VYaUBPoPHFl=v8GcNOjC)>u3iAnq0 yLfOIE4Bh zT)l^Tl@37d^W~`gTc{_h_?%k
hUu=|PP6lzY}4GDz)&%ia pgVbqFmGQ0p}8bU)_iTmC2dLsiT{Jv2JATszlnZI#|E|?|7M5ulKo@`!01g zJ+=L+^&*4IDgDygVjb|WIlS(0E;g|IQhYBi%~^{0K4s&$dN%2gtVJ<~^D*+6($K$+ zJ}hEwcoR8a #BbyN-Tzs^)5*iSGll*K Ymk)Mwyw^-({eq2IS@z*ISWHm2P@`1G(<#$hrs{IQk1;{DDbpg(!#1riL7^^vz z_z>p<;_{Tw@i!*a?NWx+7*4$phEVc`UA2&OVe*4^b*!o4I;4Hh@|>eMzvfKk)X~E% z>nGKZEFEo81|@p6Jv^SHk2NT}>5r&iwq<4RqvM9vjw61Hvm@~@uE@)7Wp5E@a`lt= zf?b!LxH;uJ{fqS@5~9f6ODS(lZzH*SXaAS<&pJu}h;2E)r)&sUKF^s&`f ^TANK?M=Zj1 z!|mEqe(44g#Y+<%p@sgG{$wSDUWVVML1d6W@;zSV-cy{NsWFBce{r()yz<1+c>jN{ znoK&yV!nxmjy%Mzsr&FqBL5rC^PGJ0hW=J~jKXI*i&9T78U7~m_^z4PJ3``9&VT${ z4I N?LlHxFQ`IWaYZ}BI#q4jVApx=~VoalkX& kmdR zn%4BL*3qA{Bzbu_4{{#n 7f0 PT z0+^li4bE9=nxh!`qlm{*FO#zgdHwt)4Xea`ORkPra1JFpN?4xKACT5Z?Nt9x!^rY+ z)W}6nS#p}tW;mygzsXz8*_F7FUo|- 7?~pD-&9bC(`x(hG>Dx%HrVRcA)ACb3(xQ~A;IX+O)k4~wZ z^apw4$*Yh0Akp^&9i@qr$gjnDhIAHr)$k&5Lp)D>-G4nLvde#n^pRBu_ux!yKrcFR z9w)BL6*_ivmLzW#@g3^i59KnhRz4PYauy_i0_7Y0Kx#yumq@)p&Qd=*HL^fQq7=?a z)bst+)cEk~q$<(sGngAk_~TO}69!Y~e~*#GGpM1X80NEd0#~Gyr>|pY$otDb&OIZk zO@Wuozm;0HD&J8;M_0Rs?;c*diaCl|*?%c3OkQC>sZrTHTP^pJpV6pp;7@;fqxjN% z+x6b(iZsmP+{G11#LGyRB;C`$( pIP#!5JylW(=&e(JO*FVX*^Nv+cLh-Q(iqX=H+>_%R1YUrr$mu?!>^iiu( zoRS>mZbcpSEPos61(w&0yadumELOe0N!RknH!WMB2Bp6c@ukg+_1|wARrM69&&k<= z`c9u4bu^Him!S%-#JBzXO=IFbYIosWMb2J)8y8ZeE$Ky^&kz^FqJC<#$gpXYWb?Z> zi!AUNsa>4EanAL}H;asWmz0k7oR4xv6`p!2K0G#&ZcAQ8e_ykRr20gw9~PPKk$2Ww z$*?OQSbT!GhSeMIhx5;*UHrJ_QN@3!yftP2aPB63&gzu&yEm^GykJ*Xq4XT-7b#uG z`Ge*6pg-$LH^x1dw+<7jvjD@$UyRS9j>%R>>00E~!+GQtR|ZEo_xT=2aPH3L`Po~9 zXC9#ZE8?-7F{ImbK2G}K@g=d2AGmg?-KW3h 瞭解如何在" "此頁面上設定選項" -#: options/theme-options.php:423 +#: options/theme-options.php:431 msgid "Nav Menu Style" msgstr "導航菜單樣式" -#: options/theme-options.php:434 +#: options/theme-options.php:442 msgid "Nav Menu Radius" msgstr "導航菜單圆角" -#: options/theme-options.php:436 options/theme-options.php:531 -#: options/theme-options.php:2306 +#: options/theme-options.php:444 options/theme-options.php:539 +#: options/theme-options.php:2314 msgid "Slide to adjust, the recommended value is 15" msgstr "滑動滑塊,推薦數值範圍為15" -#: options/theme-options.php:445 +#: options/theme-options.php:453 msgid "Nav Menu Content Display Method" msgstr "導航菜單內容顯示" -#: options/theme-options.php:446 +#: options/theme-options.php:454 msgid "You can choose to unfold or fold the nav menu contents" msgstr "您可以選擇展開或折疊導航功能表" -#: options/theme-options.php:448 +#: options/theme-options.php:456 msgid "Unfold" msgstr "展開" -#: options/theme-options.php:449 +#: options/theme-options.php:457 msgid "Fold" msgstr "折疊" -#: options/theme-options.php:457 +#: options/theme-options.php:465 msgid "Nav Menu Animation Effects" msgstr "導航菜單動畫" -#: options/theme-options.php:458 +#: options/theme-options.php:466 msgid "" "It is on by default. If it is off, the nav menu content will be displayed " "directly without effects" msgstr "默認打開。如果關閉,導航內容將直接顯示" -#: options/theme-options.php:465 +#: options/theme-options.php:473 msgid "Nav Menu Animation Time" msgstr "導航菜單動畫時間" -#: options/theme-options.php:467 options/theme-options.php:1432 +#: options/theme-options.php:475 options/theme-options.php:1440 msgid "Slide to adjust, the recommended value range is 1-2" msgstr "滑動滑塊,推薦數值範圍為1-2" -#: options/theme-options.php:477 +#: options/theme-options.php:485 msgid "Nav Menu Font" msgstr "導航菜單字體" -#: options/theme-options.php:485 +#: options/theme-options.php:493 msgid "Nav Menu Search" msgstr "導航菜單搜尋" -#: options/theme-options.php:486 +#: options/theme-options.php:494 msgid "It is on by default. Click to enter the search area" msgstr "默認開啟,點擊進入搜尋區域" -#: options/theme-options.php:493 +#: options/theme-options.php:501 msgid "Search Area Background Image" msgstr "搜尋區域背景圖像" -#: options/theme-options.php:494 +#: options/theme-options.php:502 msgid "" "Set the background image of your search area. Leave this option blank to " "display a white background" msgstr "設定搜尋區域的背景圖像。將此選項留空則顯示白色背景" -#: options/theme-options.php:503 +#: options/theme-options.php:511 msgid "Nav Menu User Avatar" msgstr "導航菜單用戶頭貼" -#: options/theme-options.php:504 +#: options/theme-options.php:512 msgid "It is on by default. Click to enter the login interface" msgstr "默認開啟,點擊將進入登入介面" -#: options/theme-options.php:511 +#: options/theme-options.php:519 msgid "Nav Menu Unlisted User Avatar" msgstr "導航菜單未登入用戶頭貼" -#: options/theme-options.php:521 +#: options/theme-options.php:529 msgid "Secondary Menu Prompt Arrow" msgstr "二级菜單提示箭頭" -#: options/theme-options.php:522 +#: options/theme-options.php:530 msgid "" "After turning on, the menu prompt arrow will appear in the secondary menu of " "the navigation menu" msgstr "開啟後菜單提示箭頭將顯示在二级菜單" -#: options/theme-options.php:529 +#: options/theme-options.php:537 msgid "Secondary Menu Radius" msgstr "二级菜單圆角" -#: options/theme-options.php:540 +#: options/theme-options.php:548 msgid "Mashiro Logo Style" msgstr "白貓樣式Logo" -#: options/theme-options.php:541 +#: options/theme-options.php:549 msgid "" "After turning on, the Mashiro Logo will appear and replace the navigation " "menu logo position" msgstr "開啟後白貓樣式Logo將出現並替換導航菜單Logo位置" -#: options/theme-options.php:548 +#: options/theme-options.php:556 msgid "Nav Menu Text Logo Options" msgstr "導航菜單文字Logo選項" -#: options/theme-options.php:554 +#: options/theme-options.php:562 msgid "Text A" msgstr "文本A" -#: options/theme-options.php:559 +#: options/theme-options.php:567 msgid "Text B" msgstr "文本B" -#: options/theme-options.php:564 +#: options/theme-options.php:572 msgid "Text C" msgstr "文本C" -#: options/theme-options.php:569 +#: options/theme-options.php:577 msgid "Secondary Text" msgstr "次要文字" -#: options/theme-options.php:575 +#: options/theme-options.php:583 msgid "Font Name" msgstr "字體名稱" -#: options/theme-options.php:592 +#: options/theme-options.php:600 msgid "Widgets Panel and Frontend Related Options" msgstr "小部件面板和前台相關設定" -#: options/theme-options.php:599 +#: options/theme-options.php:607 msgid "" "You can click here" @@ -1202,131 +1212,131 @@ msgstr "" "#%E6%A0%B7%E5%BC%8F%E8%8F%9C%E5%8D%95%E5%92%8C%E5%89%8D%E5%8F%B0%E8%83%8C%E6%99%AF%E7%9B%B8%E5%85%B3%E8%AE%BE%E7%BD%AE\">" "此處 瞭解如何在此頁面上設定選項" -#: options/theme-options.php:604 +#: options/theme-options.php:612 msgid "Widgets Panel" msgstr "小部件面板" -#: options/theme-options.php:610 +#: options/theme-options.php:618 msgid "Widgets Panel Button Radius" msgstr "小部件面板按鈕圓角" -#: options/theme-options.php:611 options/theme-options.php:621 +#: options/theme-options.php:619 options/theme-options.php:629 msgid "Slide to adjust, the recommended value is 10" msgstr "滑動滑塊,推薦數值為10" -#: options/theme-options.php:620 +#: options/theme-options.php:628 msgid "Widgets Panel Widget Radius" msgstr "小部件面板部件圓角" -#: options/theme-options.php:630 +#: options/theme-options.php:638 msgid "Widgets Panel Font" msgstr "小部件面板字體" -#: options/theme-options.php:638 +#: options/theme-options.php:646 msgid "Widgets Panel WP Widget Area" msgstr "小部件面板 WP 小工具區域" -#: options/theme-options.php:639 +#: options/theme-options.php:647 msgid "When turned on, the WP Widget Area will be displayed in Widgets Panel" msgstr "開啟之後WP小工具區域將顯示在小部件面板中" -#: options/theme-options.php:646 +#: options/theme-options.php:654 msgid "Widgets Panel Day&Night Switching" msgstr "小部件面板晝夜切換" -#: options/theme-options.php:647 +#: options/theme-options.php:655 msgid "" "Enabled by default, the Day&Night Switching will be displayed in Widgets " "Panel" msgstr "默認開啟,晝夜切換將顯示在小部件面板中" -#: options/theme-options.php:654 +#: options/theme-options.php:662 msgid "Widgets Panel Font Switching" msgstr "小部件面板字體切換" -#: options/theme-options.php:655 +#: options/theme-options.php:663 msgid "" "Enabled by default, the Font Switching will be displayed in Widgets Panel" msgstr "默認開啟,字體切換將顯示在小部件面板中" -#: options/theme-options.php:661 +#: options/theme-options.php:669 msgid "Frontend Background" msgstr "前台背景" -#: options/theme-options.php:672 +#: options/theme-options.php:680 msgid "Frontend Background Scaling Method" msgstr "前台背景縮放方式" -#: options/theme-options.php:673 +#: options/theme-options.php:681 msgid "" "You can choose two ways to scale the frontend background, the default is " "auto-scaling" msgstr "你可以選擇兩種方式縮放前台背景,默認自動縮放" -#: options/theme-options.php:680 +#: options/theme-options.php:688 msgid "Background Transparency Blur" msgstr "前台背景模糊" -#: options/theme-options.php:681 +#: options/theme-options.php:689 msgid "After opening Background Transparency Blur" msgstr "開啟之後前台背景模糊" -#: options/theme-options.php:688 +#: options/theme-options.php:696 msgid "Widgets Panel Background Switching(Frontend Background)" msgstr "小部件面板背景切換(前台背景)" -#: options/theme-options.php:697 options/theme-options.php:713 -#: options/theme-options.php:729 options/theme-options.php:745 -#: options/theme-options.php:761 +#: options/theme-options.php:705 options/theme-options.php:721 +#: options/theme-options.php:737 options/theme-options.php:753 +#: options/theme-options.php:769 msgid "Image" msgstr "圖像" -#: options/theme-options.php:702 +#: options/theme-options.php:710 msgid "Heart Shaped" msgstr "心形形狀" -#: options/theme-options.php:708 options/theme-options.php:724 -#: options/theme-options.php:740 options/theme-options.php:756 +#: options/theme-options.php:716 options/theme-options.php:732 +#: options/theme-options.php:748 options/theme-options.php:764 msgid "Switch" msgstr "開關" -#: options/theme-options.php:718 +#: options/theme-options.php:726 msgid "Star Shaped" msgstr "星形形狀" -#: options/theme-options.php:734 +#: options/theme-options.php:742 msgid "Square Shaped" msgstr "方形形狀" -#: options/theme-options.php:750 +#: options/theme-options.php:758 msgid "Lemon Shaped" msgstr "檸檬形形狀" -#: options/theme-options.php:781 +#: options/theme-options.php:789 msgid "Background Transparency in the Frontend" msgstr "前台背景透明度" -#: options/theme-options.php:782 +#: options/theme-options.php:790 msgid "Slide to adjust, the recommended sliding value range is 0.6-0.8" msgstr "滑動滑塊,推薦數值範圍為0.6-0.8" -#: options/theme-options.php:791 +#: options/theme-options.php:799 msgid "Frontend Font" msgstr "前台字體" -#: options/theme-options.php:797 +#: options/theme-options.php:805 msgid "Global Default Font/Widgets Panel Font Switching A" msgstr "默認字體/小部件面板字體切換A" -#: options/theme-options.php:804 +#: options/theme-options.php:812 msgid "Widgets Panel Font Switching B" msgstr "小部件面板字體切換B" -#: options/theme-options.php:814 +#: options/theme-options.php:822 msgid "Footer Options" msgstr "頁尾設定" -#: options/theme-options.php:821 +#: options/theme-options.php:829 msgid "" "You can click here to learn how to set the " @@ -1335,48 +1345,48 @@ msgstr "" "您可以按下 此處 瞭解如何在此頁面上設定選項" -#: options/theme-options.php:827 +#: options/theme-options.php:835 msgid "Footer Online Music Player" msgstr "頁尾線上音樂播放器" -#: options/theme-options.php:828 +#: options/theme-options.php:836 msgid "" "A button will appear at the bottom left corner of the footer after turning " "on, click it and the footer online player will be displayed" msgstr "開啟之後頁尾左下角將出現按鈕,點擊按鈕後頁尾線上播放器將顯示" -#: options/theme-options.php:831 +#: options/theme-options.php:839 msgid "Netease Cloud Music" msgstr "網易云音樂" -#: options/theme-options.php:832 +#: options/theme-options.php:840 msgid "Kugou Music(may not be available)" msgstr "酷狗音樂(可能無法使用)" -#: options/theme-options.php:833 +#: options/theme-options.php:841 msgid "Baidu Music(not available on servers overseas)" msgstr "千千音樂(海外伺服器無法使用)" -#: options/theme-options.php:834 +#: options/theme-options.php:842 msgid "QQ Music(may not be available)" msgstr "QQ音樂(可能無法使用)" -#: options/theme-options.php:842 +#: options/theme-options.php:850 msgid "Footer Online Music Player Proxy" msgstr "頁尾線上音樂播放器代理" -#: options/theme-options.php:844 +#: options/theme-options.php:852 msgid "" "Ex. http://127.0.0.1:8080. Reference: https://curl.se/libcurl/c/" "CURLOPT_PROXY.html" msgstr "" "例:http://127.0.0.1:8080 參考:https://curl.se/libcurl/c/CURLOPT_PROXY.html" -#: options/theme-options.php:851 +#: options/theme-options.php:859 msgid "Footer Online Music Player Songlist ID" msgstr "頁尾線上播放器歌單ID" -#: options/theme-options.php:853 +#: options/theme-options.php:861 msgid "" "Fill in the song ID, e.g. https://music.163.com/#/playlist?id=5380675133 " "SongID:5380675133" @@ -1384,112 +1394,112 @@ msgstr "" "填寫歌單ID,例如:https://music.163.com/#/playlist?id=5380675133的歌單ID是" "5380675133" -#: options/theme-options.php:860 +#: options/theme-options.php:868 msgid "Footer Online Music Player Mode" msgstr "尾頁線上音樂播放器模式" -#: options/theme-options.php:862 +#: options/theme-options.php:870 msgid "Select music player mode" msgstr "設定音樂播放器模式" -#: options/theme-options.php:864 +#: options/theme-options.php:872 msgid "List" msgstr "列表播放" -#: options/theme-options.php:865 +#: options/theme-options.php:873 msgid "Random" msgstr "隨機播放" -#: options/theme-options.php:873 +#: options/theme-options.php:881 msgid "Footer Online Music Player Preload" msgstr "尾頁線上音樂播放器預載入" -#: options/theme-options.php:875 +#: options/theme-options.php:883 msgid "Whether to preload songs" msgstr "選擇是否預載入歌曲" -#: options/theme-options.php:878 +#: options/theme-options.php:886 msgid "Preload Metadata" msgstr "預載入元資料" -#: options/theme-options.php:887 +#: options/theme-options.php:895 msgid "Default Volume of Footer Online Music Player" msgstr "頁尾線上播放器默認音量" -#: options/theme-options.php:889 +#: options/theme-options.php:897 msgid "Slide to adjust, the recommended sliding value range is 0.4-0.6" msgstr "滑動滑塊,推薦數值範圍為0.4-0.6" -#: options/theme-options.php:898 +#: options/theme-options.php:906 msgid "Netease Cloud Music Cookies" msgstr "網易云音樂Cookies" -#: options/theme-options.php:900 +#: options/theme-options.php:908 msgid "" "If you want to play VIP music on Netease Cloud Music Platform, please fill " "in your account cookies in this option." msgstr "如果你想播放網易云音樂會員專享音樂,請在此選項填入你的帳號Cookies。" -#: options/theme-options.php:906 +#: options/theme-options.php:914 msgid "Footer Sakura Icon" msgstr "頁尾櫻花圖示" -#: options/theme-options.php:907 +#: options/theme-options.php:915 msgid "Enabled by default, sakura icon will appear on the footer" msgstr "默認啟用,櫻花圖示將顯示在頁尾上" -#: options/theme-options.php:914 +#: options/theme-options.php:922 msgid "Footer Info" msgstr "頁尾資訊" -#: options/theme-options.php:915 +#: options/theme-options.php:923 msgid "Footer description text, supports HTML code" msgstr "頁尾說明文字,支持HTML代碼" -#: options/theme-options.php:922 +#: options/theme-options.php:930 msgid "Footer Text Font" msgstr "頁尾文字字體" -#: options/theme-options.php:930 +#: options/theme-options.php:938 msgid "Footer Load Occupancy Query" msgstr "頁尾負載佔用查詢" -#: options/theme-options.php:931 +#: options/theme-options.php:939 msgid "" "Load occupancy information will appear at the end of the page after turning " "it on. Not recommended in production environment." msgstr "開啟佔用資訊之後,該資訊將顯示在頁面末尾。不建議在生產環境中使用。" -#: options/theme-options.php:938 +#: options/theme-options.php:946 msgid "Footer Upyun League Logo" msgstr "頁尾Upyun League Logo" -#: options/theme-options.php:939 +#: options/theme-options.php:947 msgid "Upyun Logo will appear at the end of the page after turning it on" msgstr "開啟之後Upyun Logo將出現在頁面末尾" -#: options/theme-options.php:947 +#: options/theme-options.php:955 msgid "Footer Addition" msgstr "尾頁附加程式碼" -#: options/theme-options.php:948 +#: options/theme-options.php:956 msgid "" "Add HTML code at the end of the page. Useful for adding customize JavaScript." msgstr "在尾頁添加HTML程式碼。可用於添加 JavaScript " -#: options/theme-options.php:953 +#: options/theme-options.php:961 msgid "Hitokoto" msgstr "一言" -#: options/theme-options.php:959 +#: options/theme-options.php:967 msgid "Footer Hitokoto" msgstr "尾頁一言" -#: options/theme-options.php:960 +#: options/theme-options.php:968 msgid "Hitokoto will appear at the end of the page after turning it on" msgstr "開啟之後頁尾將出現一言" -#: options/theme-options.php:967 +#: options/theme-options.php:975 msgid "" "J8hs*Z9 z^T)TS82&!FuaZ-NE1%(f#Q%`oapblo_g&5r &fzI<8S zle>)Ie429-c`>xm6l>sJ%t`)9uGvUBf>XzQvxA?}GOB7rYE y7(8fL?8uCP17mxo$Br15-X}I~ zSZv?4fdhM`^?p9K(#ZZ91Jh%B4}LLyXlzDiT0hchg9Z&AuG&M>)B42rdMS2T@1Yq( zh7XI&+A?}U!E#MU4Ii4;dw6We{^^ D37fuD`j?WyV&zK6l%V$ywJHZ@4~b`L(RMH{Kg}b@sfgo5$Z=vf}FQ_peTz zeQm*nxb43@8c4}s@#>zXuH@#z+1D2Dyt;Va^=VVDP2bHGS9W}KbNS4h%V*!1wq<*K PnZV_!?QI(d5^Mh-2uYH; delta 15327 zcmY+~37k%4|HtujTQb8~#$Yg*VQhmjcE(_gWti++mh4LmS+e#I-N?Rk+9+#Lcx(xU zNu`v?nx2LTJwgvjp;UVQpYMJByk5_9Ua#|dU%%gVopY{po$EUHJvS?_=U#9v_l|{O z!Iqxq?Rw7hO5y`7hD9cOUS6z<`LP~`V+#z!_85WPu`~|GSe${8xE^EhT`Ynpu@qj# z!kA- u|Le3NPQh88Ksc4UCxCE=?18jwr z7rGG{gVTslqw2dXau=L|V~B5I2kg7p^B%`-sN)~tMoe4cM&dg5A}+a9kA&wvfr9Sf zp!p3BBEEyWu-h^>$- b`Q0TBYihFs-fmWTa3feSP_?E0o;qh!W0fu zD1_Olk@yj-V$K&mj|uH1VZHzzLDgry zMi4GJGx;tpyAez!RHE1p-2I0Dt 6 Bo6fm>!Ui@Do8;+>V;Z11CW=Tmuc}2Sc>>3Ou&4vxo21xb%EYk z9|vM>T!{nmIP#M7YQFByy90Ft@1bt!h~ gcx^je&I>izP4_yP_V!VpIn|MlI{3sAqoG;;X1faT_DKKA)Fvofk%Rq%`V6 z4N sCMt7+MPlT?S0gRbHCx*6+lh8vRDQiphm1aszbdoSdzli6m&;( zFc#OKp4~xI!!OMXs0-af9rqV%#G>DHtEH~_IO=@;Q0JM1x{+C^N3;U BpN>bdr^OXEx*KU=wnnX{9vd0| zoD^n|(9q4s9JmDaOqXK{9z&M27xtFBz AhBBi%emp&W%ln1r*j1n$9#coO6AH`FsMzRA_s$I8T=P;bEJP>*COYQ(mnI+TTa zL`P90bOZI7av#;9U|_R5VKG#L8dwh-qn`bE)CkN(o%lo495{_H;$>8aCvI`=m!clQ zTC9S*aCpG;E~0KUW2 af0}}NdIxoZQajx >byU;;1=P%i_AIN7n&!<0veI<1rW4_hwPhq?vCnLoJ_IQIl&2>KPwF zUFbVZ#oMUkl6JXCRnKgO%D2ZT?1qt;iR!>)49Dph%uitf1@&l!RcuBzd>1t*_L-kq z{a09+{6*AUxPyApc<;K&6^*$F%b_k*3Du#RW&_kCPkop1SA*UpbfKp(3df;d6mw8_ z{s!to?_+=b9M$oJ-EM^H<4od?sF68~eX-~sH|fS>QQ}un&weYa1E23<{Hsy8N@5Te z-pg>|L{!6L*afelhCbyzw{F{@?q~#RXvd;%WG1R(i%}!+Iws*doQ|hZ9qsbI>*zN@ zD-_@7I?@9*xn^0s3u_Ty!a5kW-+i36#udcVur`)F;AVGwbEdh^{26t8#VmLHlc+f8 zQ>aVfb3BNDV_y8=12?ITpoab|YEJwMHIzSMDbzu_hRZ;Z~F&}os`Pkd)uc4Of zePjfKUZD@&Y>!4=APF_Jb `o#8L#*W0vhghmOAB$o9C+-d# zqDG)AYPIx7jnFuJ4reIl`rbndMKI!1H~Y(CdE&aL1AF1~I1;1rCZ-3t+rw_vwE4`v zaC%@K>Yqfl8-!^%88sqVs1AIBdGHJdRdJp|JYF#$``pduDyS3G!Rj~>wHh{H2Yi6M z*1e1)bO`UE=0u|}+zs?Z&5h?#L%tBT%wNZ j>X+r0bAjDoQd&Ydfq&I8^>X- QRjiM{qFz{4Pq}Z&tx%6H6Ez}JP?LCt#qXiopAAx| zLg5ZZV5!sY0txs8aWmBVUV(M-OVkB(o^d0Pg7t`l*bVpK>lpEsbCa2VmcNL}e~-6t z`PZ&KIPIUVQ2HCbdQ-6vnb_WvY(D9*^Es9f-Z9so=lK(N`IdJ9KEP#o@dB?^9COiG z<~z@OjrbTUKkSnG!=~6}_lt>-GqnDHr7)2O6R)@*2yUTPL(A{o9O#ABh{vLy?HU|~ z8*l^`p%= c#RK&cUKr zUAtB08yHD`lg0Z{7yiiNPjO!kzItI4`PtXqjjco-w_S35?;{Gj;2HB9%uRg3;_p#C zzHa`Gn)P8f+?W^-Hm^|3 zyu(t$@xSoq! iB&@3R?fyQO`Ka3xqBdk7`&0mCvxaC+fhlSRU6}{!@!DnmGf3P)91G+6_dV zZw?mLaaaa}yC~=ar%?^Bpc>}M;f%u?#L1X|!!7@!xz#+3I^lO%6#qtDs7OwiuVkiU zS@J`W5e<5CDCilzh;8r`#$f4OfzY#0Ms={M#T`){>TdB|)P Lh6LPF2}S=0#^pf2z#hT|HGH(C7-RQoJchfZ328+E}P5rNRM zjzP_xbX5Ccs2iD#8i@r#E4+p3;UO~{)sfrgU#JU(=XWQnj5=`&>VkdDiKr7VL7i`l z#UG*CUqDU9|6nBymM`E=*cNr7e&(~N4lFZQTYiiA3F?k6pf30`W?)1?mwy7);Y`#V zm}~i0%+1JgK`+Y^*{GquY4LqjkHZVOj#NcWng$lPLoK^r*a_!ad=68I!y*G-e{78! ziA|`XKZv@~6Bw)Ye?3&-fWoe#GRD#%%^ZLliRq|2U5q-xX7iBczeUZN-%&U6AJm1z zqnxp3UDU|5!5FRo;VR&4Yp@=5qW8>$s16)PjmR17gZHp6c45h^#CPyzY**B^{}*Z` z?x4 +<*H9l~O@guR1f#JBiA^{ebHur4{XCW;UW*#aEG&&*n|Cpm zxNuoFscNAfQ72Rf2BU_259*big_@j4QSX7^Sqd7`KTro2D(8ki9>a)hVCY?q9f;eb zPPiJ?ego>x-a`%PJzR_};@ySLpzibncE$qb-S>zA*i`F(0fjD99K&%KS0NDkUGGKI z&}Ly8{)UY)xuP5TNvI3US3rsyM!qTlZ^G?E{tF$91aN9Y>NMjf-^T1q!;85ee?j zo;PQi3sEEFTf7N1DR-D3nkUUmsM-EAYNQ@ooU4k TynKWXt*)P;UQo#%n&Ba&Q)N}%fFQID`n66;?>*^q=z z*xMRpq9)fE)O%nnYI0u20objEJJDX$oqmA2;OD3lpT|i2H|l~9&0IAD-e}@{sQlz0 z1wHc_sE)jfak$SKoJS4e71ZZ-{#tHT)Wy!kqfsaN7 AO@8$XC|Re*a&qe-Ea^Nv-lWlB)>x)e-Cy1U#R24>p9Dr zDOgDBzbgeTqaju?A9aB@P Jb#J@7|1!Q5Q-_jYvC-`=BQ8VALEKXZcyE zjx0ot$Oeqo`u~K2I`AzP!axJpfx@T*Dp=eEb-_-S?}0keGZrtk`c0@i-+{W3EUQ0h z-mrX*WY)hL6r~_5n<=Odo%X0nIRe#@MW_yLM77_Gy7Mp0b6AY{N6dqPhVGGsqaJOn z#R(RtHe~(lL>X4m8#VdHqV9B}HJpmNqdBPdFXAD5%j!p@xC=}`9T!BsH)f;Gx8Cv_ zE#8V+B|B4C|N8vDLt+C~ZsdmaIO>_-LR~PXvFku})CE$^W~e*MK;3y4i-)5+Fdp@Y zmZC;-J8F`ivifU5Yml>vYgi8Tj!r`z&=b{x$*2=9ws bP8~ z?$Je~I$8tuK52+*9~?qKZ@96R*od07yYOlJ6xHKeP2B;l&2FeUF%WsZdy`RfW>cDL ze;7lP8r3e)jPug2BsL+g);!d~pf|!5yysCpT85fbt5J8n4K=i1n3qv^_B&=`z7{T? zfVGI{qDEvt#$mSQ|3IBTv88L@5aYD|+fgV>#VB(r>Y2TRdK9Nn2i`z+=sxnJmsdF5 zeJB;hIN~a(Z%l1a9qfvlD??GokFt0&>O3>Bu-5--Yp~P&05vI(qE3*bl{-PWSqznr zx44Q~-|{UiZi5=h9u^Nn&4CH1RT0F{@Bc4Q& Lk)UDPxG6V<**YuBy}>bzA^^-Wsa`tNQHhGSPMCRuz8HB{L+1@B=q9Gejc{Vcy5 z^{D ~A!{%|ze~mi+dyDU*KF)J?aWA+!n4 ( NVBx+l z-xqa5ul8mAr%sz(ULKGrva7g +fDD<*^+3G}KTJMm_6k zs1e$L8j*LfGae06&>fT+;GSh?)GVE9ZbNn8JJh4eKQIvbXSI&zO>^!bx4z2{4tO_d zcN$;AgF~E8J{9oJ5dVfB;nAT1Zxsd?4GVbNDOAmLp2s(d7Yq-0SFpy2fVUK*p0=N8 z%uXZSk4}H%Kd4_Z%KdPWKH9y)KgJ2 0hoNU0459r{$`RiT*#^Wa6!4Ub5^K+UhsK+J0h#=-?V^ zPuRJb7+xpJh43Y8X!$aHB`C{YiugC`rg8KV%KPn%VlsObay;wMzokB^Vy<}8*~hcj zpuQmI`31FA3-CW_DiVB5FfNqhPZO)$=3i(KQ}a0vTfyF$Y)8Du{%E^Mxg7a?obnw@ z{_H0t$COw?O((M2zGL5Q=Pcp(Nsg)e6Seus o;x~T{gy| zOltIM)7Fe!Kl+%2*Zc_$<1-Stj<)O8x-#)g>|Kd}c2!=$>Rurp$ }@5hclIBYZ?gYH`381izeL>_jvT?hi*hYLF(sw~>(86VuI(Wf zV4q5@wtMWO*%SSdDKUZL{=Af!+#9I>(chGk6gcH)rzGixANtqiuAH?H$BnmROZ#OT zMU{vpI!cRS)ZVlj9Wm5z*C;wzhja1n_u8{RL5s<>_=BCL>Qx{vg%AGgs9BVoSj< a-XY82g$m$ml^ zr>jMi&+s<8KEI0KacqItP+L9PKHAn=xuhldob?{}J2j3U(w5RkRyz}O(;}Vy4bD`X zxDp+D+Uj-ica%?3_Z;PKD5v4??0h%z&XZrnUY}Us5A?aA?Q1`~aZ+* cIP KgT|fYc--xL+bZpq_v^wy-)5P;(`9H)TBT~zjV|3jqj41PA(bs zL88Anw8aspkgv)9Ps+Q J_`r>8|H^LhV2+XUhTw9r-z!>ydm5ktu7`&c%)-~Cfuvly+Z@N)aN(&7{O z(h}Nw*)e<<;XekrT(s5wMO`6s1^mX%;=|vu>?J?5S^dC$e_gYrvV2YUc5+ZZ$$o$% z8WXRkT#|BM|4y^m#&ML6l6kZ>rTjMg2}|UpzWRUFEBzC>r?_@azg_c~+=r<>?T>6; zyL4Xi|FYvU?3hW!Cn^8S&uShM7~y9(k14&?>UvsR{e|`^$7*ZrN4BV4`X982=L*X) zi#?sa616vIHPs)`BC6+lGWrg?k^M>b@70PUZc*0Ol)VADv-q~1`&Y{KXj7bgDpta| z?0gOOKBi4)a>@ReEozsoN3?*fwn)6p{v^3Uw9uC1mu(r-vWT^arY0BJcTrn?%kQDQ z!gBmN;?<{o)MB;!lX5M8ddv9yHK_fWXbi^sJ6pyio}u(PnLViQ^kJwiMY4YnRqzd5 z -ituuQRM^xpmSL35?JLQh#D)=9zM>TFhwBb>exsBW;J0jEk)6RN^xTduW`jM@o z1Ks_ERxu@hrM@k7f3xqWe8Jkp`+Ztf3SO|I6R15;c_OuMvtPG-U;6VF<>q+6avL#) zHm_iA@++}7YJ0)js9c*|1ALKO=yREJL9TNNC$MMb@cf*uBS(Hr{b}MU>}4o-Vy{E_ z(e@>=wjVimtX=0R%jF e&F9}9W`V&S#1lk2L9XPeW5J> %IhacN_R42bJ8Y{1~rlgK?idhD)gn|^GR zr&e6eIt}a8+4am1N0auxQY_FUV(-Ipfh#f9udZ2hb>aIrW-Yq0Zprm|?|3)XPQS5g g{k4}?Tz`Ao533GRePhLrt64i;_1+Ur0&VL4KfF&fga7~l diff --git a/opt/languages/zh_TW.po b/opt/languages/zh_TW.po index 811c4751..93cf7a7c 100644 --- a/opt/languages/zh_TW.po +++ b/opt/languages/zh_TW.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: Codestar Framework Modified by Fuukei\n" -"POT-Creation-Date: 2024-10-02 14:44+0900\n" -"PO-Revision-Date: 2024-10-02 14:44+0900\n" +"POT-Creation-Date: 2024-10-08 13:52+0900\n" +"PO-Revision-Date: 2024-10-08 13:53+0900\n" "Last-Translator: \n" "Language-Team: \n" "Language: zh_TW\n" @@ -224,16 +224,16 @@ msgstr "固定" msgid "Background Size" msgstr "背景尺寸" -#: fields/background/background.php:219 options/theme-options.php:668 +#: fields/background/background.php:219 options/theme-options.php:676 msgid "Cover" msgstr "覆蓋" -#: fields/background/background.php:220 options/theme-options.php:669 +#: fields/background/background.php:220 options/theme-options.php:677 msgid "Contain" msgstr "包含" -#: fields/background/background.php:221 options/theme-options.php:670 -#: options/theme-options.php:879 +#: fields/background/background.php:221 options/theme-options.php:678 +#: options/theme-options.php:887 msgid "Auto" msgstr "自動" @@ -476,10 +476,10 @@ msgstr "停用" msgid "On" msgstr "開" -#: fields/switcher/switcher.php:21 options/theme-options.php:830 -#: options/theme-options.php:877 options/theme-options.php:1099 -#: options/theme-options.php:1279 options/theme-options.php:3159 -#: options/theme-options.php:3172 +#: fields/switcher/switcher.php:21 options/theme-options.php:838 +#: options/theme-options.php:885 options/theme-options.php:1107 +#: options/theme-options.php:1287 options/theme-options.php:3151 +#: options/theme-options.php:3164 msgid "Off" msgstr "關" @@ -499,7 +499,7 @@ msgstr "匯出設定" #: fields/typography/typography.php:150 fields/typography/typography.php:164 #: fields/typography/typography.php:180 fields/typography/typography.php:193 #: fields/typography/typography.php:207 fields/typography/typography.php:225 -#: options/theme-options.php:691 +#: options/theme-options.php:699 msgid "Default" msgstr "默認" @@ -730,9 +730,9 @@ msgstr "" msgid "Personal Avatar" msgstr "個人頭貼" -#: options/theme-options.php:71 options/theme-options.php:513 -#: options/theme-options.php:1870 options/theme-options.php:2023 -#: options/theme-options.php:2048 +#: options/theme-options.php:71 options/theme-options.php:521 +#: options/theme-options.php:1878 options/theme-options.php:2031 +#: options/theme-options.php:2056 msgid "The best length-width ratio of is 1:1" msgstr "最佳比例1比1" @@ -764,10 +764,10 @@ msgstr "文本內容建議不要過長,推薦長度為16個字節。" msgid "Font" msgstr "字體" -#: options/theme-options.php:99 options/theme-options.php:478 -#: options/theme-options.php:631 options/theme-options.php:798 -#: options/theme-options.php:806 options/theme-options.php:923 -#: options/theme-options.php:1522 options/theme-options.php:2213 +#: options/theme-options.php:99 options/theme-options.php:486 +#: options/theme-options.php:639 options/theme-options.php:806 +#: options/theme-options.php:814 options/theme-options.php:931 +#: options/theme-options.php:1530 options/theme-options.php:2221 msgid "Fill in the font name. For example: Noto Serif SC" msgstr "填寫字體名稱。例如:Noto Serif SC" @@ -779,8 +779,8 @@ msgstr "大小" msgid "Slide to adjust, the recommended value range is 70-90" msgstr "滑動滑塊,推薦數值範圍為70-90" -#: options/theme-options.php:114 options/theme-options.php:1471 -#: options/theme-options.php:1717 options/theme-options.php:2293 +#: options/theme-options.php:114 options/theme-options.php:1479 +#: options/theme-options.php:1725 options/theme-options.php:2301 msgid "Customize the colors, light colors are recommended" msgstr "自定義顏色,建議使用淺色系顏色" @@ -854,38 +854,48 @@ msgid "Color Schemes" msgstr "色彩設定" #: options/theme-options.php:193 +msgid "Extract Theme Color from Cover Image" +msgstr "從封面随机圖片抽取主題顏色" + +#: options/theme-options.php:194 +msgid "" +"Default on, Following options will be used as fallback (while cover image " +"cannot be read by scripts)" +msgstr "預設為開啟,以下選項將作為備用選項 (當腳本無法讀取封面影像時)" + +#: options/theme-options.php:201 msgid "Theme Color" msgstr "主題色" -#: options/theme-options.php:194 options/theme-options.php:202 -#: options/theme-options.php:215 options/theme-options.php:1070 -#: options/theme-options.php:1079 options/theme-options.php:3393 -#: options/theme-options.php:3401 options/theme-options.php:3409 -#: options/theme-options.php:3417 options/theme-options.php:3425 +#: options/theme-options.php:202 options/theme-options.php:210 +#: options/theme-options.php:223 options/theme-options.php:1078 +#: options/theme-options.php:1087 options/theme-options.php:3385 +#: options/theme-options.php:3393 options/theme-options.php:3401 +#: options/theme-options.php:3409 options/theme-options.php:3417 msgid "Customize the colors" msgstr "自訂顏色" -#: options/theme-options.php:201 +#: options/theme-options.php:209 msgid "Matching Color" msgstr "主題搭配顏色" -#: options/theme-options.php:208 +#: options/theme-options.php:216 msgid "Dark Mode" msgstr "深色模式" -#: options/theme-options.php:214 +#: options/theme-options.php:222 msgid "Dark Mode Theme Color" msgstr "深色模式主題顏色" -#: options/theme-options.php:221 +#: options/theme-options.php:229 msgid "Automatically Switch to Dark Mode" msgstr "深色模式自動切換" -#: options/theme-options.php:222 options/theme-options.php:1391 +#: options/theme-options.php:230 options/theme-options.php:1399 msgid "Default on" msgstr "默認開啟" -#: options/theme-options.php:228 +#: options/theme-options.php:236 msgid "" " Client local time:Dark mode will switch on automatically " "from 22:00 to 7:00
Follow client settings:Follow " @@ -896,39 +906,39 @@ msgstr "" "p>
關注客戶端設定:關注用戶端瀏覽器設定
始終" "開啟:始終打開,除非用戶端另有配置
" -#: options/theme-options.php:237 +#: options/theme-options.php:245 msgid "Automatic Switch Strategy of Dark Mode" msgstr "深色模式自動切換策略" -#: options/theme-options.php:240 +#: options/theme-options.php:248 msgid "Client local time" msgstr "客戶端當地時間" -#: options/theme-options.php:241 +#: options/theme-options.php:249 msgid "Follow client settings" msgstr "關注客戶端設定" -#: options/theme-options.php:242 +#: options/theme-options.php:250 msgid "Always on" msgstr "始終開啟" -#: options/theme-options.php:250 +#: options/theme-options.php:258 msgid "Dark Mode Image Brightness" msgstr "深色模式圖像亮度" -#: options/theme-options.php:251 options/theme-options.php:262 +#: options/theme-options.php:259 options/theme-options.php:270 msgid "Slide to adjust, the recommended value range is 0.6-0.8" msgstr "滑動滑塊,推薦數值範圍為0.6-0.8" -#: options/theme-options.php:261 +#: options/theme-options.php:269 msgid "Dark Mode Component Transparency" msgstr "深色模式元件透明度" -#: options/theme-options.php:271 +#: options/theme-options.php:279 msgid "Dark mode Background Transparency" msgstr "深色模式背景透明度" -#: options/theme-options.php:272 +#: options/theme-options.php:280 msgid "" "Slide to adjust, the recommended value range is 0.6-0.8. In order to ensure " "the best appearance, please keep the display of the frontend background image" @@ -936,33 +946,33 @@ msgstr "" "滑動滑塊,建議的滑動值範圍是 0.6-0.8。以確保最佳外觀,最好保持前景背景圖像的" "顯示" -#: options/theme-options.php:281 +#: options/theme-options.php:289 msgid "Other Appearance Related" msgstr "其他外觀相關" -#: options/theme-options.php:287 +#: options/theme-options.php:295 msgid "Commemorate Mode" msgstr "紀念模式" -#: options/theme-options.php:288 +#: options/theme-options.php:296 msgid "" "After turning on, a black and white filter will be added to the global theme" msgstr "開啟後主題全局將添加黑白濾鏡" -#: options/theme-options.php:295 +#: options/theme-options.php:303 msgid "Occupying SVG while Loading Control Units" msgstr "載入控件單元佔位SVG" -#: options/theme-options.php:296 +#: options/theme-options.php:304 msgid "" "Fill in the address, which is the SVG displayed when loading control units" msgstr "填寫地址,此為載入控制項單元時占位顯示的SVG" -#: options/theme-options.php:305 +#: options/theme-options.php:313 msgid "Font Options" msgstr "字體設定" -#: options/theme-options.php:312 +#: options/theme-options.php:320 msgid "" "You can click here to learn how to set the " @@ -971,69 +981,69 @@ msgstr "" "您可以按下 此處 瞭解如何在此頁面上設定選項" -#: options/theme-options.php:317 +#: options/theme-options.php:325 msgid "Global" msgstr "全局設定" -#: options/theme-options.php:323 +#: options/theme-options.php:331 msgid "Non-Emphasis Text Weight" msgstr "非強調文本字重" -#: options/theme-options.php:324 +#: options/theme-options.php:332 msgid "Slide to adjust, the recommended value range is 300-500" msgstr "滑動滑塊,推薦數值範圍為300-500" -#: options/theme-options.php:334 +#: options/theme-options.php:342 msgid "Text Font Size" msgstr "文本字體大小" -#: options/theme-options.php:335 options/theme-options.php:1534 +#: options/theme-options.php:343 options/theme-options.php:1542 msgid "Slide to adjust, the recommended value range is 15-18" msgstr "滑動滑塊,推薦數值範圍為15-18" -#: options/theme-options.php:345 +#: options/theme-options.php:353 msgid "External Fonts" msgstr "外部字體" -#: options/theme-options.php:351 +#: options/theme-options.php:359 msgid "Reference External Fonts" msgstr "引用外部字體" -#: options/theme-options.php:352 +#: options/theme-options.php:360 msgid "" "After turning on, you can use external fonts as the default font or other " "component fonts, but it may affect performance" msgstr "開啟之後可以使用外部字體作為預設字體或其他元件字體,但它可能會影響性能" -#: options/theme-options.php:359 +#: options/theme-options.php:367 msgid "External Font Options" msgstr "外部字體選項" -#: options/theme-options.php:365 +#: options/theme-options.php:373 msgid "Font 1 Name" msgstr "字體 1 名稱" -#: options/theme-options.php:370 +#: options/theme-options.php:378 msgid "Font 1 Link" msgstr "字體 1 連結" -#: options/theme-options.php:375 +#: options/theme-options.php:383 msgid "Font 2 Name" msgstr "字體 2 名稱" -#: options/theme-options.php:380 +#: options/theme-options.php:388 msgid "Font 2 Link" msgstr "字體 2 連結" -#: options/theme-options.php:394 +#: options/theme-options.php:402 msgid "Google Fonts Api Link" msgstr "Google 字型庫 API 連結" -#: options/theme-options.php:401 +#: options/theme-options.php:409 msgid "Google Fonts Name" msgstr "Google 字體 名稱" -#: options/theme-options.php:402 +#: options/theme-options.php:410 msgid "" "Please make sure that the added fonts can be referenced in Google Fonts " "library. Fill in the font names. The added fonts must be preceded by \"|\". " @@ -1045,11 +1055,11 @@ msgstr "" "\"|\"。如果引用多個字體,請使用\"|\"作為分離器。如果字體名稱有空格,請改為使" "用加號。例如: | zcool + xiaowei| Ma + Shan + Zheng" -#: options/theme-options.php:410 +#: options/theme-options.php:418 msgid "Navigation Menu Options" msgstr "導航菜單設定" -#: options/theme-options.php:417 +#: options/theme-options.php:425 msgid "" "You can click here to learn " @@ -1059,140 +1069,140 @@ msgstr "" "#%E5%AF%BC%E8%88%AA%E8%8F%9C%E5%8D%95%E8%AE%BE%E7%BD%AE\">此處Hitokoto API Setup Instructions
Fill in as the example:
" "[\"https://api.nmxc.ltd/yiyan/\", \"https://v1.hitokoto.cn/\"]
, where " @@ -1510,19 +1520,19 @@ msgstr "" "Maho API:官方API的反代鏡像。https://api.nmxc.ltd/yiyan/
" -#: options/theme-options.php:976 +#: options/theme-options.php:984 msgid "Hitokoto API address" msgstr "一言API地址" -#: options/theme-options.php:978 +#: options/theme-options.php:986 msgid "Fill in the address in JavaScript array format" msgstr "填寫地址,格式為JavaScript陣列" -#: options/theme-options.php:987 +#: options/theme-options.php:995 msgid "Cursor Options" msgstr "滑鼠光標設定" -#: options/theme-options.php:994 +#: options/theme-options.php:1002 msgid "" "You can click here to learn how to set the " @@ -1531,51 +1541,51 @@ msgstr "" "您可以按下 此處 瞭解如何在此頁面上設定選項" -#: options/theme-options.php:1000 +#: options/theme-options.php:1008 msgid "Standard Cursor Style" msgstr "標準光標樣式" -#: options/theme-options.php:1001 +#: options/theme-options.php:1009 msgid "Apply to global, fill in \".cur\" mouse file link" msgstr "應用於全局,填寫Cur滑鼠檔案連結" -#: options/theme-options.php:1008 +#: options/theme-options.php:1016 msgid "Selected Cursor Style" msgstr "選定光標樣式" -#: options/theme-options.php:1009 +#: options/theme-options.php:1017 msgid "Apply to multiple styles, fill in \".cur\" file link" msgstr "應用於多種樣式,填寫Cur滑鼠檔案連結" -#: options/theme-options.php:1016 +#: options/theme-options.php:1024 msgid "Selected Control Unit Cursor Style" msgstr "選中控件單元滑鼠樣式" -#: options/theme-options.php:1017 +#: options/theme-options.php:1025 msgid "Apply to selected control unit, fill in \".cur\" file link" msgstr "應用於選中某個控件單元,填寫Cur滑鼠檔案連結" -#: options/theme-options.php:1024 +#: options/theme-options.php:1032 msgid "Selected Text Cursor Style" msgstr "選中文本光標樣式" -#: options/theme-options.php:1025 +#: options/theme-options.php:1033 msgid "Apply to selected text, fill in \".cur\" file link" msgstr "應用於選中文本,填寫Cur滑鼠檔案連結" -#: options/theme-options.php:1032 +#: options/theme-options.php:1040 msgid "Work Status Cursor Style" msgstr "工作狀態滑鼠樣式" -#: options/theme-options.php:1033 +#: options/theme-options.php:1041 msgid "Apply to load control unit, fill in \".cur\" file link" msgstr "應用於載入控件單元,填寫Cur滑鼠檔案連結" -#: options/theme-options.php:1042 +#: options/theme-options.php:1050 msgid "Additional Options" msgstr "額外設定" -#: options/theme-options.php:1049 +#: options/theme-options.php:1057 msgid "" "You can click here to learn how to set the " @@ -1584,72 +1594,72 @@ msgstr "" "您可以按下 此處 瞭解如何在此頁面上設定選項" -#: options/theme-options.php:1054 +#: options/theme-options.php:1062 msgid "Effects&Animations" msgstr "特效及動畫" -#: options/theme-options.php:1060 +#: options/theme-options.php:1068 msgid "Preload Animation" msgstr "預載入動畫" -#: options/theme-options.php:1061 +#: options/theme-options.php:1069 msgid "" "Preload animation before new pages load; To enable this option, ensure your " "page resources can load properly." msgstr "開啟之後新頁面載入前會有預載入動畫,此選項需確保你的頁面資源正常載入。" -#: options/theme-options.php:1068 +#: options/theme-options.php:1076 msgid "Preload Animation Color A" msgstr "預載入動畫顏色A" -#: options/theme-options.php:1077 +#: options/theme-options.php:1085 msgid "Preload Animation Color B" msgstr "預載入動畫顏色B" -#: options/theme-options.php:1085 +#: options/theme-options.php:1093 msgid "Preload Animation Blur Transition Effect" msgstr "預載入模糊過度效果" -#: options/theme-options.php:1087 +#: options/theme-options.php:1095 msgid "Blur transition duration in milliseconds ms, off when set to 0." msgstr "模糊過渡持續時間,單位毫秒ms,為0時關閉" -#: options/theme-options.php:1097 +#: options/theme-options.php:1105 msgid "Sakura Falling Effects" msgstr "櫻花飄落特效" -#: options/theme-options.php:1100 +#: options/theme-options.php:1108 msgid "Native Quantity" msgstr "原生數量" -#: options/theme-options.php:1101 +#: options/theme-options.php:1109 msgid "Quarter Quantity" msgstr "四分之一數量" -#: options/theme-options.php:1102 +#: options/theme-options.php:1110 msgid "Half Quantity" msgstr "二分之一數量" -#: options/theme-options.php:1103 +#: options/theme-options.php:1111 msgid "Less Quantity" msgstr "較少數量" -#: options/theme-options.php:1111 +#: options/theme-options.php:1119 msgid "Particles Effects" msgstr "粒子效應" -#: options/theme-options.php:1113 +#: options/theme-options.php:1121 msgid "" "Particles effects will appear in the global background. Please open the " "Cover-and-Frontend-Background-Integration Options to get the best experience" msgstr "" "粒子效應將出現在全局背景下。請打開封面和正面背景集成選項,以獲得最佳體驗" -#: options/theme-options.php:1121 +#: options/theme-options.php:1129 msgid "Particles JSON" msgstr "粒子效應 JSON" -#: options/theme-options.php:1123 +#: options/theme-options.php:1131 msgid "" "You can go to the Project Address to generate your unique Particles Effects" @@ -1657,160 +1667,160 @@ msgstr "" "您可以前往 項目位址 " "以產生您獨特的粒子效應" -#: options/theme-options.php:1240 +#: options/theme-options.php:1248 msgid "Note Touch Effects" msgstr "音符觸動特效" -#: options/theme-options.php:1241 +#: options/theme-options.php:1249 msgid "" "After turning on, there will be a note sound alert when the back to top " "button and Mashiro style logo touch" msgstr "開啟之後返回頂部按鈕和白貓樣式Logo觸碰時將有音符聲音提示" -#: options/theme-options.php:1247 +#: options/theme-options.php:1255 msgid "Feature" msgstr "功能" -#: options/theme-options.php:1253 +#: options/theme-options.php:1261 msgid "PJAX Partial Refresh" msgstr "PJAX局部重新載入" -#: options/theme-options.php:1254 +#: options/theme-options.php:1262 msgid "Enabled by default, clicking to a new page will not require reloading" msgstr "默認開啟,點擊新內容將不需要重新載入" -#: options/theme-options.php:1261 +#: options/theme-options.php:1269 msgid "NProgress Loading Progress Bar" msgstr "NProgress加载进度条" -#: options/theme-options.php:1262 +#: options/theme-options.php:1270 msgid "" "Enabled by default, when loading page there will be a progress bar alert" msgstr "默认開啟,加載頁面將有進度條提示" -#: options/theme-options.php:1269 +#: options/theme-options.php:1277 msgid "Global Smooth Scroll" msgstr "全局平滑滾動" -#: options/theme-options.php:1270 +#: options/theme-options.php:1278 msgid "Enabled by default, page scrolling will be smoother" msgstr "默認開啟,頁面滾動將更加平滑" -#: options/theme-options.php:1277 +#: options/theme-options.php:1285 msgid "Captcha Selection" msgstr "驗證碼選項" -#: options/theme-options.php:1280 +#: options/theme-options.php:1288 msgid "Theme Built in Captcha" msgstr "主題內建驗證碼" -#: options/theme-options.php:1281 +#: options/theme-options.php:1289 msgid "Vaptcha" msgstr "" -#: options/theme-options.php:1289 +#: options/theme-options.php:1297 msgid "Vaptcha VID" msgstr "" -#: options/theme-options.php:1291 +#: options/theme-options.php:1299 msgid "Fill in your Vaptcha VID" msgstr "填寫你的Vaptcha VID" -#: options/theme-options.php:1297 +#: options/theme-options.php:1305 msgid "Vaptcha KEY" msgstr "" -#: options/theme-options.php:1299 +#: options/theme-options.php:1307 msgid "Fill in your Vaptcha KEY" msgstr "填寫你的Vaptcha KEY" -#: options/theme-options.php:1305 +#: options/theme-options.php:1313 msgid "Vaptcha Scene" msgstr "Vaptcha場景" -#: options/theme-options.php:1321 +#: options/theme-options.php:1329 msgid "Pagination Mode" msgstr "分頁模式" -#: options/theme-options.php:1323 +#: options/theme-options.php:1331 msgid "Ajax Load" msgstr "Ajax載入" -#: options/theme-options.php:1324 +#: options/theme-options.php:1332 msgid "Page Up/Down" msgstr "上下頁" -#: options/theme-options.php:1332 +#: options/theme-options.php:1340 msgid "Next Page Auto Load" msgstr "下一頁自動載入" -#: options/theme-options.php:1335 +#: options/theme-options.php:1343 msgid "do not autoload" msgstr "不自動載入" -#: options/theme-options.php:1336 +#: options/theme-options.php:1344 msgid "0 Sec" msgstr "0秒" -#: options/theme-options.php:1337 +#: options/theme-options.php:1345 msgid "1 Sec" msgstr "1秒" -#: options/theme-options.php:1338 +#: options/theme-options.php:1346 msgid "2 Sec" msgstr "2秒" -#: options/theme-options.php:1339 +#: options/theme-options.php:1347 msgid "3 Sec" msgstr "3秒" -#: options/theme-options.php:1340 +#: options/theme-options.php:1348 msgid "4 Sec" msgstr "4秒" -#: options/theme-options.php:1341 +#: options/theme-options.php:1349 msgid "5 Sec" msgstr "5秒" -#: options/theme-options.php:1342 +#: options/theme-options.php:1350 msgid "6 Sec" msgstr "6秒" -#: options/theme-options.php:1343 +#: options/theme-options.php:1351 msgid "7 Sec" msgstr "7秒" -#: options/theme-options.php:1344 +#: options/theme-options.php:1352 msgid "8 Sec" msgstr "8秒" -#: options/theme-options.php:1345 +#: options/theme-options.php:1353 msgid "9 Sec" msgstr "9秒" -#: options/theme-options.php:1346 +#: options/theme-options.php:1354 msgid "10 Sec" msgstr "10秒" -#: options/theme-options.php:1354 +#: options/theme-options.php:1362 msgid "Placeholder SVG when loading the next page" msgstr "載入下一頁佔位SVG" -#: options/theme-options.php:1355 +#: options/theme-options.php:1363 msgid "" "Fill in the address, this is the SVG that will be displayed as a placeholder " "when the next page is loading" msgstr "填寫地址,此為載入下一頁時佔位顯示的SVG" -#: options/theme-options.php:1363 +#: options/theme-options.php:1371 msgid "HomePage Options" msgstr "主頁設定" -#: options/theme-options.php:1369 +#: options/theme-options.php:1377 msgid "Cover Options" msgstr "封面設定" -#: options/theme-options.php:1376 +#: options/theme-options.php:1384 msgid "" "You can click here to learn how to set the " @@ -1819,165 +1829,165 @@ msgstr "" "您可以按下 此處 瞭解如何在此頁面上設定選項" -#: options/theme-options.php:1382 +#: options/theme-options.php:1390 msgid "Cover Switch" msgstr "封面開關" -#: options/theme-options.php:1383 +#: options/theme-options.php:1391 msgid "On by default, if off, all options below will be disabled" msgstr "默認開啟,如果關閉,則下文所有選項均將失效" -#: options/theme-options.php:1390 +#: options/theme-options.php:1398 msgid "Cover Full Screen" msgstr "封面全屏顯示" -#: options/theme-options.php:1399 +#: options/theme-options.php:1407 msgid "Cover Arc Occlusion (Below)" msgstr "封面弧形遮擋(下方)" -#: options/theme-options.php:1400 +#: options/theme-options.php:1408 msgid "An arc occlusion will appear below the cover when turned on" msgstr "開啟之後封面下方將出現弧形遮擋" -#: options/theme-options.php:1411 +#: options/theme-options.php:1419 msgid "Cover Radius" msgstr "封面圓角" -#: options/theme-options.php:1412 +#: options/theme-options.php:1420 msgid "Slide to adjust, the recommended value range is 15-20" msgstr "滑動滑塊,推薦數值範圍為15-20" -#: options/theme-options.php:1422 +#: options/theme-options.php:1430 msgid "Cover Animation" msgstr "封面動畫" -#: options/theme-options.php:1423 +#: options/theme-options.php:1431 msgid "On by default, if off, the cover will be displayed directly" msgstr "默認開啟,如果關閉,則封面將直接顯示" -#: options/theme-options.php:1431 +#: options/theme-options.php:1439 msgid "Cover Animation Time" msgstr "封面動畫時間" -#: options/theme-options.php:1446 +#: options/theme-options.php:1454 msgid "Cover Info Bar" msgstr "封面資訊欄" -#: options/theme-options.php:1447 +#: options/theme-options.php:1455 msgid "" "Enabled by default, show avatar, Mashiro effects text, signature bar, " "shuoshuo bar, social area" msgstr "默認開啟,顯示頭貼、白貓特效文字、簽名欄、说说欄、社交區域" -#: options/theme-options.php:1455 +#: options/theme-options.php:1463 msgid "Cover Info Bar Style" msgstr "封面資訊欄樣式" -#: options/theme-options.php:1470 +#: options/theme-options.php:1478 msgid "Cover Info Bar Background Color" msgstr "封面資訊欄背景顏色" -#: options/theme-options.php:1482 +#: options/theme-options.php:1490 msgid "Cover Info Bar Avatar Radius" msgstr "封面資訊欄頭貼圓角" -#: options/theme-options.php:1483 +#: options/theme-options.php:1491 msgid "Slide to adjust, the recommended value is 100" msgstr "滑動滑塊,推薦數值為100" -#: options/theme-options.php:1495 +#: options/theme-options.php:1503 msgid "Cover Info Bar Rounded" msgstr "封面資訊欄圓角" -#: options/theme-options.php:1496 +#: options/theme-options.php:1504 msgid "Slide to adjust, the recommended value range 10-20" msgstr "滑動滑塊,推薦數值範圍為10-20" -#: options/theme-options.php:1509 +#: options/theme-options.php:1517 msgid "Cover Signature Field Text" msgstr "封面簽名欄文本" -#: options/theme-options.php:1510 +#: options/theme-options.php:1518 msgid "A self-descriptive quote" msgstr "一段自我描述的話" -#: options/theme-options.php:1521 +#: options/theme-options.php:1529 msgid "Cover Signature Field Text Font" msgstr "封面簽名欄文本字體" -#: options/theme-options.php:1533 +#: options/theme-options.php:1541 msgid "Cover Signature Field Text Font Size" msgstr "封面簽名欄文本字體大小" -#: options/theme-options.php:1548 +#: options/theme-options.php:1556 msgid "Cover Signature Bar Typing Effects" msgstr "封面簽名欄打字特效" -#: options/theme-options.php:1549 +#: options/theme-options.php:1557 msgid "" "When turned on, the signature bar text will have an additional paragraph of " "text and will be rendered with typing effects" msgstr "開啟之後簽名欄文本將增加一段文本並呈現打字特效" -#: options/theme-options.php:1560 +#: options/theme-options.php:1568 msgid "Cover Signature Field Typing Effects Double Quotes" msgstr "封面簽名欄打字特效雙引號" -#: options/theme-options.php:1566 +#: options/theme-options.php:1574 msgid "Typing effects will be appended with double quotes when turned on" msgstr "開啟之後打字特效將追加雙引號" -#: options/theme-options.php:1573 +#: options/theme-options.php:1581 msgid "Cover Signature Field Typing Effects Placeholder" msgstr "封面簽名欄打字特效占位語句" -#: options/theme-options.php:1586 +#: options/theme-options.php:1594 msgid "Typed.js initial option" msgstr "Typed.js初始化選項" -#: options/theme-options.php:1598 +#: options/theme-options.php:1606 msgid "Cover Random Image Options" msgstr "封面隨機圖像設定" -#: options/theme-options.php:1600 +#: options/theme-options.php:1608 msgid "External API" msgstr "外部API" -#: options/theme-options.php:1601 +#: options/theme-options.php:1609 msgid "Webp optimized" msgstr "Webp優化" -#: options/theme-options.php:1602 +#: options/theme-options.php:1610 msgid "Local" msgstr "本地隨機圖像" -#: options/theme-options.php:1611 +#: options/theme-options.php:1619 msgid "Cover Random Image Multi-terminal Separation" msgstr "封面隨機圖像多終端分離" -#: options/theme-options.php:1612 +#: options/theme-options.php:1620 msgid "" "Enabled by default, desktop and mobile devices will use separate random " "image addresses" msgstr "默認開啟,桌面端和行動端會分別使用不同的隨機圖像地址" -#: options/theme-options.php:1620 +#: options/theme-options.php:1628 msgid "Webp Optimization/External API Desktop Side Random Graphics Address" msgstr "Webp優化/外部API桌面端隨機圖像地址" -#: options/theme-options.php:1621 options/theme-options.php:1640 +#: options/theme-options.php:1629 options/theme-options.php:1648 msgid "Fill in an URL" msgstr "填寫URL" -#: options/theme-options.php:1634 +#: options/theme-options.php:1642 msgid "External API Mobile Devices Random Image Address" msgstr "外部API行動端隨機圖像地址" -#: options/theme-options.php:1649 +#: options/theme-options.php:1657 msgid "Cover Random Background Image Cache" msgstr "封面隨機背景圖像快取" -#: options/theme-options.php:1650 +#: options/theme-options.php:1658 msgid "" "Enabled by default, this feature will cache a cover image locally, which can " "improve the loading speed of the first cover after entering the homepage. " @@ -1986,111 +1996,111 @@ msgstr "" "默認開啟,此功能會在本地快取一份封面圖像,可提升進入主頁後第一張封面的載入速" "度。注意:此功能需要封面API能接受跨來源資源共享。" -#: options/theme-options.php:1658 +#: options/theme-options.php:1666 msgid "Cover and Frontend Background Integration" msgstr "封面與前台背景一體化" -#: options/theme-options.php:1659 +#: options/theme-options.php:1667 msgid "" "When enabled, the background of the cover will be set to transparent, while " "the frontend background will use the cover's random image API" msgstr "開啟之後,封面的背景將設定為透明,同時前台背景將使用封面的隨機圖像API" -#: options/theme-options.php:1667 +#: options/theme-options.php:1675 msgid "Cover Random Images Filter" msgstr "封面隨機圖像濾鏡" -#: options/theme-options.php:1669 +#: options/theme-options.php:1677 msgid "No filter" msgstr "無濾鏡" -#: options/theme-options.php:1670 +#: options/theme-options.php:1678 msgid "Light filter" msgstr "淺色濾鏡" -#: options/theme-options.php:1671 +#: options/theme-options.php:1679 msgid "Dimmed filter" msgstr "暗淡濾鏡" -#: options/theme-options.php:1672 +#: options/theme-options.php:1680 msgid "Grid filter" msgstr "網格濾鏡" -#: options/theme-options.php:1673 +#: options/theme-options.php:1681 msgid "Dot filter" msgstr "點狀濾鏡" -#: options/theme-options.php:1682 +#: options/theme-options.php:1690 msgid "Cover Wave Effects" msgstr "封面波浪特效" -#: options/theme-options.php:1683 +#: options/theme-options.php:1691 msgid "" "Wave effect will appear at the bottom of the cover of the home page after " "turning on, and it will be forced off in the dark mode" msgstr "開啟之後首頁封面底部將出現波浪特效,深色模式下將強制關閉" -#: options/theme-options.php:1691 +#: options/theme-options.php:1699 msgid "Cover Dropdown Arrow" msgstr "封面下拉箭頭" -#: options/theme-options.php:1692 +#: options/theme-options.php:1700 msgid "Enabled by default, show a dropdown arrow at bottom of home cover" msgstr "默認開啟,首頁封面底部顯示下拉箭頭" -#: options/theme-options.php:1700 +#: options/theme-options.php:1708 msgid "Cover Dropdown Arrow Display on Mobile Devices" msgstr "封面下拉箭頭行動端顯示" -#: options/theme-options.php:1705 +#: options/theme-options.php:1713 msgid "" "Drop down arrow will appear at the bottom of the mobile devices' home cover " "after turning it on" msgstr "開啟之後行動端首頁封面底部將出現下拉箭頭" -#: options/theme-options.php:1712 +#: options/theme-options.php:1720 msgid "Cover Dropdown Arrow Color" msgstr "封面下拉箭頭顏色" -#: options/theme-options.php:1724 +#: options/theme-options.php:1732 msgid "Cover Dropdown Arrow Color (Dark Mode)" msgstr "封面下拉箭頭顏色(深色模式)" -#: options/theme-options.php:1729 +#: options/theme-options.php:1737 msgid "Customize the colors, dark colors are recommended" msgstr "自定義顏色,建議使用深色系顏色" -#: options/theme-options.php:1736 +#: options/theme-options.php:1744 msgid "Cover Video" msgstr "封面影片" -#: options/theme-options.php:1737 +#: options/theme-options.php:1745 msgid "Use a video instead of the images as the cover" msgstr "開啟之後將替代隨機圖像作為封面顯示" -#: options/theme-options.php:1745 +#: options/theme-options.php:1753 msgid "Cover Video Loop" msgstr "封面影片循環" -#: options/theme-options.php:1750 +#: options/theme-options.php:1758 msgid "Video will loop automatically when enabled." msgstr "開啟之後影片將自動循環" -#: options/theme-options.php:1757 +#: options/theme-options.php:1765 msgid "Cover Video Auto Resume" msgstr "封面影片自動恢復" -#: options/theme-options.php:1762 +#: options/theme-options.php:1770 msgid "" "Cover Video will resume automatically when coming back to homepage while " "Pjax enabled." msgstr "開啟之後返回首頁時視頻將恢復播放,需要開啟Pjax功能" -#: options/theme-options.php:1769 +#: options/theme-options.php:1777 msgid "Cover Video URL Base Path" msgstr "封面影片URL連結路徑" -#: options/theme-options.php:1775 +#: options/theme-options.php:1783 msgid "" "Fill in the base path your video located at. For example: https://localhost. " "Your site's URL is used as default. Please pay attention to the protocol " @@ -2099,22 +2109,22 @@ msgstr "" "填寫影片所在的根路徑。例如:https://localhost. 你站點的URL將作為默認URL。請注" "意URL的協議名稱。" -#: options/theme-options.php:1781 +#: options/theme-options.php:1789 msgid "Cover Video File Name" msgstr "封面影片檔案名稱" -#: options/theme-options.php:1786 +#: options/theme-options.php:1794 msgid "" "For example: abc.mp4. Multiple videos should be separated by English commas " "like \"abc.mp4,efg.mp4,\" Random play is on by default." msgstr "" "例如:abc.mp4,多個影片請用英文逗號隔開,如:abc.mp4,efg.mp4。默認隨機播放。" -#: options/theme-options.php:1794 +#: options/theme-options.php:1802 msgid "Cover Social Area Options" msgstr "封面社交區域設定" -#: options/theme-options.php:1801 +#: options/theme-options.php:1809 msgid "" "You can click here" @@ -2124,167 +2134,167 @@ msgstr "" "#%E5%B0%81%E9%9D%A2%E7%A4%BE%E4%BA%A4%E5%8C%BA%E5%9F%9F%E8%AE%BE%E7%BD%AE\">" "此處 瞭解如何在此頁面上設定選項" -#: options/theme-options.php:1806 +#: options/theme-options.php:1814 msgid "Related Options" msgstr "相关設定" -#: options/theme-options.php:1812 +#: options/theme-options.php:1820 msgid "Cover Social Area" msgstr "封面社交區域" -#: options/theme-options.php:1813 +#: options/theme-options.php:1821 msgid "" "Enabled by default, show cover random image toggle button and social network " "icons" msgstr "默認開啟,顯示封面隨機圖像切換按鈕和社交網絡圖標" -#: options/theme-options.php:1820 +#: options/theme-options.php:1828 msgid "Social Icon" msgstr "社交網絡圖標" -#: options/theme-options.php:1821 +#: options/theme-options.php:1829 msgid "" "Select your favorite icon pack. Icon pack references are detailed in the " "\"About Theme\" section" msgstr "選擇你喜歡的圖標包。圖標包引用資訊詳見關於主題" -#: options/theme-options.php:1843 +#: options/theme-options.php:1851 msgid "Cover Social Area Rounded Corners" msgstr "封面社交區域圓角" -#: options/theme-options.php:1845 +#: options/theme-options.php:1853 msgid "Slide to adjust, the recommended value range is 10-20" msgstr "滑動滑塊,推薦數值範圍為10-20" -#: options/theme-options.php:1854 +#: options/theme-options.php:1862 msgid "Switch Button of Random Images" msgstr "封面隨機圖像切換按鈕" -#: options/theme-options.php:1856 +#: options/theme-options.php:1864 msgid "Enabled by default, show cover random image toggle button" msgstr "默認開啟,顯示封面隨機圖切換按鈕" -#: options/theme-options.php:1862 +#: options/theme-options.php:1870 msgid "Social Network" msgstr "社交網絡" -#: options/theme-options.php:1868 +#: options/theme-options.php:1876 msgid "Wechat" msgstr "微信" -#: options/theme-options.php:1877 +#: options/theme-options.php:1885 msgid "QQ" msgstr "QQ" -#: options/theme-options.php:1879 +#: options/theme-options.php:1887 msgid "" "Please note the format of filling out the form, e.g. tencent://message/?" "uin=123456" msgstr "請注意填寫格式,例如:tencent://message/?uin=123456" -#: options/theme-options.php:1885 +#: options/theme-options.php:1893 msgid "Bilibili" msgstr "嗶哩嗶哩" -#: options/theme-options.php:1887 options/theme-options.php:1895 -#: options/theme-options.php:1903 options/theme-options.php:1911 -#: options/theme-options.php:1919 options/theme-options.php:1927 -#: options/theme-options.php:1935 options/theme-options.php:1943 -#: options/theme-options.php:1951 options/theme-options.php:1959 -#: options/theme-options.php:1967 options/theme-options.php:1975 -#: options/theme-options.php:1983 options/theme-options.php:1991 -#: options/theme-options.php:1999 options/theme-options.php:2007 -#: options/theme-options.php:2032 options/theme-options.php:2339 -#: options/theme-options.php:2365 options/theme-options.php:2391 -#: options/theme-options.php:2479 +#: options/theme-options.php:1895 options/theme-options.php:1903 +#: options/theme-options.php:1911 options/theme-options.php:1919 +#: options/theme-options.php:1927 options/theme-options.php:1935 +#: options/theme-options.php:1943 options/theme-options.php:1951 +#: options/theme-options.php:1959 options/theme-options.php:1967 +#: options/theme-options.php:1975 options/theme-options.php:1983 +#: options/theme-options.php:1991 options/theme-options.php:1999 +#: options/theme-options.php:2007 options/theme-options.php:2015 +#: options/theme-options.php:2040 options/theme-options.php:2347 +#: options/theme-options.php:2373 options/theme-options.php:2399 +#: options/theme-options.php:2487 msgid "add URL" msgstr "填寫地址" -#: options/theme-options.php:1893 +#: options/theme-options.php:1901 msgid "NetEase Music" msgstr "網易云音樂" -#: options/theme-options.php:1901 +#: options/theme-options.php:1909 msgid "Weibo" msgstr "新浪微博" -#: options/theme-options.php:1909 +#: options/theme-options.php:1917 msgid "Github" msgstr "Github" -#: options/theme-options.php:1917 +#: options/theme-options.php:1925 msgid "Telegram" msgstr "Telegram" -#: options/theme-options.php:1925 +#: options/theme-options.php:1933 msgid "Steam" msgstr "Steam" -#: options/theme-options.php:1933 +#: options/theme-options.php:1941 msgid "ZhiHu" msgstr "知乎" -#: options/theme-options.php:1941 +#: options/theme-options.php:1949 msgid "QZone" msgstr "QQ空間" -#: options/theme-options.php:1949 +#: options/theme-options.php:1957 msgid "Lofter" msgstr "乐乎" -#: options/theme-options.php:1957 +#: options/theme-options.php:1965 msgid "Youku" msgstr "優酷" -#: options/theme-options.php:1965 +#: options/theme-options.php:1973 msgid "Linkedin" msgstr "領英" -#: options/theme-options.php:1973 +#: options/theme-options.php:1981 msgid "Twitter" msgstr "Twitter" -#: options/theme-options.php:1981 +#: options/theme-options.php:1989 msgid "Facebook" msgstr "Facebook" -#: options/theme-options.php:1989 +#: options/theme-options.php:1997 msgid "CSDN" msgstr "CSDN" -#: options/theme-options.php:1997 +#: options/theme-options.php:2005 msgid "JianShu" msgstr "簡書" -#: options/theme-options.php:2005 +#: options/theme-options.php:2013 msgid "Customized Social Network Ⅰ" msgstr "自定義社交網絡Ⅰ" -#: options/theme-options.php:2013 +#: options/theme-options.php:2021 msgid "Customized Social Network Ⅰ Title" msgstr "自定義社交網絡Ⅰ 標題" -#: options/theme-options.php:2021 +#: options/theme-options.php:2029 msgid "Customized Social Network Ⅰ icon" msgstr "自定義社交網絡Ⅰ 圖標" -#: options/theme-options.php:2030 +#: options/theme-options.php:2038 msgid "Customized Social Network Ⅱ" msgstr "自定義社交網絡Ⅱ" -#: options/theme-options.php:2038 +#: options/theme-options.php:2046 msgid "Customized Social Network Ⅱ Title" msgstr "自定義社交網絡Ⅱ 標題" -#: options/theme-options.php:2046 +#: options/theme-options.php:2054 msgid "Customized Social Network Ⅱ icon" msgstr "自定義社交網絡Ⅱ 圖標" -#: options/theme-options.php:2055 +#: options/theme-options.php:2063 msgid "Email Username" msgstr "電子郵箱用戶名" -#: options/theme-options.php:2057 +#: options/theme-options.php:2065 msgid "" "name@domain.com fo name, the full address can be known only when there is a " "js runtime in the frontend, you can fill in with confidence" @@ -2292,19 +2302,19 @@ msgstr "" "name@domain.com的name部分,前端僅具有 js 運行環境時才能獲取完整地址,可放心填" "寫" -#: options/theme-options.php:2063 +#: options/theme-options.php:2071 msgid "Email Domain" msgstr "電子郵箱域" -#: options/theme-options.php:2065 +#: options/theme-options.php:2073 msgid "name@domain.com fo domain.com" msgstr "name@domain.com的domain.com部分" -#: options/theme-options.php:2073 +#: options/theme-options.php:2081 msgid "Bulletin Board and Area Title Options" msgstr "公告欄和區域標題設定" -#: options/theme-options.php:2080 +#: options/theme-options.php:2088 msgid "" "You can click here" @@ -2314,88 +2324,87 @@ msgstr "" "#%E5%85%AC%E5%91%8A%E6%A0%8F%E5%92%8C%E5%8C%BA%E5%9F%9F%E6%A0%87%E9%A2%98%E8%AE%BE%E7%BD%AE\">" "此處 瞭解如何在此頁面上設定選項" -#: options/theme-options.php:2085 options/theme-options.php:2091 +#: options/theme-options.php:2093 options/theme-options.php:2099 msgid "Bulletin Board" msgstr "公告欄" -#: options/theme-options.php:2092 +#: options/theme-options.php:2100 msgid "When enabled the bulletin board will be displayed below the front cover" msgstr "開啟之後公告欄將在首頁封面下方顯示" -#: options/theme-options.php:2099 +#: options/theme-options.php:2107 msgid "Bulletin Board Style" msgstr "公告欄樣式" -#: options/theme-options.php:2102 +#: options/theme-options.php:2110 msgid "Picture Background" msgstr "圖像背景" -#: options/theme-options.php:2103 +#: options/theme-options.php:2111 msgid "Color Background" msgstr "純色背景" -#: options/theme-options.php:2111 +#: options/theme-options.php:2119 msgid "Bulletin Board \"Notice\" Icon" msgstr "公告欄“公告”圖標" -#: options/theme-options.php:2113 +#: options/theme-options.php:2121 msgid "" "The \"Notice\" icon will be displayed on the left side of the announcement " "bar" msgstr "“公告”圖標將顯示在公告欄的左側" -#: options/theme-options.php:2120 +#: options/theme-options.php:2128 msgid "Bulletin Board Background" msgstr "公告欄背景" -#: options/theme-options.php:2125 +#: options/theme-options.php:2133 msgid "Best width 820px, best height 67px" msgstr "最佳寬度820px,最佳高度67px" -#: options/theme-options.php:2133 +#: options/theme-options.php:2141 msgid "Bulletin Board Border Color" msgstr "公告欄邊框顏色" -#: options/theme-options.php:2138 +#: options/theme-options.php:2146 msgid "" "Customize the colors, it is recommended to use a light color that " "corresponds with the theme color" msgstr "自定義顏色,建議使用與主題色相同色系且屬於淺色系的顏色" -#: options/theme-options.php:2145 +#: options/theme-options.php:2153 msgid "Bulletin Board Text" msgstr "公告文本" -#: options/theme-options.php:2147 +#: options/theme-options.php:2155 msgid "Fill in the announcement text, the text beyond 142 bytes will be hidden" msgstr "填寫公告文本,文本超出142個字節將會被隱藏" -#: options/theme-options.php:2153 +#: options/theme-options.php:2161 msgid "Bulletin Board Alignment" msgstr "公告板對齊方向" -#: options/theme-options.php:2166 +#: options/theme-options.php:2174 msgid "Bulletin Board Text Color" msgstr "公告板文本顏色" -#: options/theme-options.php:2168 options/theme-options.php:2256 -#: options/theme-options.php:2696 options/theme-options.php:2930 -#: options/theme-options.php:2938 options/theme-options.php:3018 -#: options/theme-options.php:3026 +#: options/theme-options.php:2176 options/theme-options.php:2264 +#: options/theme-options.php:2704 options/theme-options.php:2938 +#: options/theme-options.php:2946 msgid "" "Customize the colors, suggest using a corresponding color with the " "background color" msgstr "自定義顏色,建議根據背景顏色搭配合適的顏色" -#: options/theme-options.php:2174 +#: options/theme-options.php:2182 msgid "Area Title" msgstr "區域標題" -#: options/theme-options.php:2180 +#: options/theme-options.php:2188 msgid "Display Area Icon" msgstr "展示區域圖標" -#: options/theme-options.php:2181 +#: options/theme-options.php:2189 msgid "" "Default is \"fa-solid fa-laptop\", You can check the FontAwesome Website to see the icons " @@ -2404,21 +2413,21 @@ msgstr "" "默認為“fa-solid fa-laptop”,可以前往 FontAwesome網站 查看可以填寫的圖示" -#: options/theme-options.php:2188 +#: options/theme-options.php:2196 msgid "Display Area Title" msgstr "展示區域標題" -#: options/theme-options.php:2189 +#: options/theme-options.php:2197 msgid "" "Default is \"Display\", you can change it to anything else, but of course it " "CANNOT be used as an ad! Not allowed!!!" msgstr "默認為“Display”,你可以修改為其他,當然不能當廣告用!不允許!!" -#: options/theme-options.php:2196 +#: options/theme-options.php:2204 msgid "Post Area Icon" msgstr "文章區域圖標" -#: options/theme-options.php:2197 +#: options/theme-options.php:2205 msgid "" "Default is \"fa-regular fa-bookmark\", You can check the FontAwesome Website to see the icons " @@ -2427,29 +2436,29 @@ msgstr "" "默認為“fa-regular fa-bookmark”,可以前往 FontAwesome網站 查看可以填寫的圖示" -#: options/theme-options.php:2204 +#: options/theme-options.php:2212 msgid "Post Area Title" msgstr "文章區域標題" -#: options/theme-options.php:2205 +#: options/theme-options.php:2213 msgid "" "Default is \"Article\", you can change it to anything else, but of course it " "CANNOT be used as an ad! Not allowed!!!" msgstr "默認為“文章”,你可以修改為其他,當然不能當廣告用!不允許!!" -#: options/theme-options.php:2212 +#: options/theme-options.php:2220 msgid "Area Title Font" msgstr "區域標題字" -#: options/theme-options.php:2220 +#: options/theme-options.php:2228 msgid "Area Title Alignment" msgstr "區域標題對齊方向" -#: options/theme-options.php:2234 options/theme-options.php:2314 +#: options/theme-options.php:2242 options/theme-options.php:2322 msgid "Display Area Options" msgstr "展示區域設定" -#: options/theme-options.php:2241 +#: options/theme-options.php:2249 msgid "" "You can click here to learn " @@ -2459,77 +2468,77 @@ msgstr "" "#%E5%B1%95%E7%A4%BA%E5%8C%BA%E5%9F%9F%E8%AE%BE%E7%BD%AE\">此處 瞭解如何在" "此頁面上設定選項" -#: options/theme-options.php:2247 +#: options/theme-options.php:2255 msgid "Display Area" msgstr "展示區域" -#: options/theme-options.php:2248 +#: options/theme-options.php:2256 msgid "Enabled by default, display area is above article area" msgstr "默認開啟,展示區域顯示在文章區域上方" -#: options/theme-options.php:2255 +#: options/theme-options.php:2263 msgid "Display Area Matching Color" msgstr "展示區域匹配顏色" -#: options/theme-options.php:2264 +#: options/theme-options.php:2272 msgid "Display Area Style" msgstr "展示區域樣式" -#: options/theme-options.php:2276 +#: options/theme-options.php:2284 msgid "Display Area Compatibility Mode" msgstr "展示區域兼容模式" -#: options/theme-options.php:2281 +#: options/theme-options.php:2289 msgid "" "Enabled by default, this option avoids the problem of misaligned display " "areas" msgstr "默認開啟,此選項避免了展示區域錯位的問題" -#: options/theme-options.php:2288 +#: options/theme-options.php:2296 msgid "Display Area Background Color" msgstr "展示區域背景顏色" -#: options/theme-options.php:2300 +#: options/theme-options.php:2308 msgid "Display Area Rounded Corners" msgstr "展示區域圓角" -#: options/theme-options.php:2318 +#: options/theme-options.php:2326 msgid "First Display Area" msgstr "第一展示區域" -#: options/theme-options.php:2323 options/theme-options.php:2349 -#: options/theme-options.php:2375 +#: options/theme-options.php:2331 options/theme-options.php:2357 +#: options/theme-options.php:2383 msgid "image" msgstr "圖像" -#: options/theme-options.php:2324 options/theme-options.php:2350 -#: options/theme-options.php:2376 +#: options/theme-options.php:2332 options/theme-options.php:2358 +#: options/theme-options.php:2384 msgid "best width 260px, best height 160px" msgstr "最佳寬度260px,最佳高度160px" -#: options/theme-options.php:2329 options/theme-options.php:2355 -#: options/theme-options.php:2381 +#: options/theme-options.php:2337 options/theme-options.php:2363 +#: options/theme-options.php:2389 msgid "title" msgstr "標題" -#: options/theme-options.php:2334 options/theme-options.php:2360 -#: options/theme-options.php:2386 +#: options/theme-options.php:2342 options/theme-options.php:2368 +#: options/theme-options.php:2394 msgid "description" msgstr "描述" -#: options/theme-options.php:2344 +#: options/theme-options.php:2352 msgid "Second Display Area" msgstr "第二展示區域" -#: options/theme-options.php:2370 +#: options/theme-options.php:2378 msgid "Third Display Area" msgstr "第三展示區域" -#: options/theme-options.php:2417 +#: options/theme-options.php:2425 msgid "Article Area Options" msgstr "文章區域設定" -#: options/theme-options.php:2424 +#: options/theme-options.php:2432 msgid "" "You can click here to learn " @@ -2539,99 +2548,99 @@ msgstr "" "#%E6%96%87%E7%AB%A0%E5%8C%BA%E5%9F%9F%E8%AE%BE%E7%BD%AE\">此處 瞭解如何在" "此頁面上設定選項" -#: options/theme-options.php:2430 +#: options/theme-options.php:2438 msgid "Article Area Meta Displays" msgstr "文章區域顯示元素" -#: options/theme-options.php:2431 options/theme-options.php:2676 +#: options/theme-options.php:2439 options/theme-options.php:2684 msgid "" "You can freely select the information Meta to be displayed, this option " "cannot be set on mobile" msgstr "您可以自由選擇要顯示的資訊元素,此選項無法在手機上設定。" -#: options/theme-options.php:2442 +#: options/theme-options.php:2450 msgid "Article Area Card Design" msgstr "文章區域卡片設計" -#: options/theme-options.php:2443 +#: options/theme-options.php:2451 msgid "You can choose between letter design or ticket design" msgstr "您可以選擇信件設計或票券設計" -#: options/theme-options.php:2454 +#: options/theme-options.php:2462 msgid "Article Area Card Ticket Design Title Style" msgstr "文章區域卡片票券設計風格" -#: options/theme-options.php:2455 +#: options/theme-options.php:2463 msgid "You can choose between card style or Non-card style" msgstr "您可以選擇卡片式風格或非卡片式風格" -#: options/theme-options.php:2467 +#: options/theme-options.php:2475 msgid "Article Area Featured Image Options" msgstr "文章區域裝飾特色圖像選項" -#: options/theme-options.php:2469 +#: options/theme-options.php:2477 msgid "Cover Random Image" msgstr "封面隨機圖像" -#: options/theme-options.php:2470 +#: options/theme-options.php:2478 msgid "External API Random Image" msgstr "外部API隨機圖像" -#: options/theme-options.php:2478 +#: options/theme-options.php:2486 msgid "Article Area Featured Image External API Random Image Address" msgstr "文章區域裝飾特色圖像外部API隨機圖像地址" -#: options/theme-options.php:2487 +#: options/theme-options.php:2495 msgid "Article Area Card Rounded Corners" msgstr "文章區域卡片圓角" -#: options/theme-options.php:2488 +#: options/theme-options.php:2496 msgid "Slide to adjust, the recommended value range is 5-15" msgstr "滑動滑塊,推薦數值範圍為5-15" -#: options/theme-options.php:2497 +#: options/theme-options.php:2505 msgid "Article Area Card Information Meta Background Compatible" msgstr "文章區域卡片資訊元素可讀性增強" -#: options/theme-options.php:2498 +#: options/theme-options.php:2506 msgid "" "When enabled, information Meta will be standardized to white on black for " "compatibility with the background, increasing readability." msgstr "啟用後,資訊元素將標準化為黑底白字,以便與背景相容,增加可讀性。" -#: options/theme-options.php:2505 +#: options/theme-options.php:2513 msgid "Article Area Card Information Meta Rounded Corners" msgstr "文章區域卡片資訊元素圓角" -#: options/theme-options.php:2506 +#: options/theme-options.php:2514 msgid "Slide to adjust, the recommended value range is 3-10" msgstr "滑動滑塊,推薦數值範圍為3-10" -#: options/theme-options.php:2515 +#: options/theme-options.php:2523 msgid "Article Area Card Title Meta Rounded Corners" msgstr "文章區域卡片標題元素圓角" -#: options/theme-options.php:2516 +#: options/theme-options.php:2524 msgid "Slide to adjust, the recommended value range is 0-20" msgstr "滑動滑塊,推薦數值範圍為0-20" -#: options/theme-options.php:2525 +#: options/theme-options.php:2533 msgid "Article Area Title Font Size" msgstr "文章區域標題字體大小" -#: options/theme-options.php:2526 +#: options/theme-options.php:2534 msgid "Slide to adjust, the recommended value range is 16-20" msgstr "滑動滑塊,推薦數值範圍為16-20" -#: options/theme-options.php:2539 +#: options/theme-options.php:2547 msgid "Page Options" msgstr "頁面設定" -#: options/theme-options.php:2545 +#: options/theme-options.php:2553 msgid "Common Options" msgstr "綜合設定" -#: options/theme-options.php:2552 +#: options/theme-options.php:2560 msgid "" "You can click here to learn how to set the " @@ -2640,63 +2649,63 @@ msgstr "" "您可以按下 此處 瞭解如何在此頁面上設定選項" -#: options/theme-options.php:2558 +#: options/theme-options.php:2566 msgid "Page Style" msgstr "頁面樣式" -#: options/theme-options.php:2569 +#: options/theme-options.php:2577 msgid "Page Layout Style" msgstr "頁面排版樣式" -#: options/theme-options.php:2571 +#: options/theme-options.php:2579 msgid "Default Style" msgstr "默認樣式" -#: options/theme-options.php:2572 +#: options/theme-options.php:2580 msgid "Github Style" msgstr "Github樣式" -#: options/theme-options.php:2580 +#: options/theme-options.php:2588 msgid "Page Decoration Image" msgstr "頁面裝飾圖像" -#: options/theme-options.php:2581 +#: options/theme-options.php:2589 msgid "" "Enabled by default, show on article pages, standalone pages and category " "pages" msgstr "默認開啟,顯示在文章頁面,獨立頁面和分類頁" -#: options/theme-options.php:2588 +#: options/theme-options.php:2596 msgid "Page Title Animation" msgstr "頁面標題動畫" -#: options/theme-options.php:2589 +#: options/theme-options.php:2597 msgid "Page title will have float-in animation when turned on" msgstr "開啟之後頁面標題將有浮入動畫" -#: options/theme-options.php:2596 +#: options/theme-options.php:2604 msgid "Page Title Animation Time" msgstr "頁面標題動畫時間" -#: options/theme-options.php:2598 +#: options/theme-options.php:2606 msgid "Slide to adjust, recommended value range is 1-2" msgstr "滑動滑塊,推薦數值範圍為1-2" -#: options/theme-options.php:2608 +#: options/theme-options.php:2616 msgid "Page Clipboard Copyright Notice" msgstr "頁面剪切板版權提示" -#: options/theme-options.php:2609 +#: options/theme-options.php:2617 msgid "" "Enabled by default, users will have copyright notice text when copying text " "content over 30 bytes" msgstr "默認開啟,用戶在復製文字內容超過30字節時,會有版權提示文本" -#: options/theme-options.php:2616 +#: options/theme-options.php:2624 msgid "Page LazyLoad" msgstr "頁面LazyLoad" -#: options/theme-options.php:2617 +#: options/theme-options.php:2625 msgid "" "LazyLoad effect for page images, WordPress block editor already comes with " "similar effect, not recommended to turn on" @@ -2704,31 +2713,31 @@ msgstr "" "開啟之後頁面圖像會有LazyLoad載入效果,WordPress區塊編輯器已經自帶相似效果,不" "建議開啟" -#: options/theme-options.php:2624 +#: options/theme-options.php:2632 msgid "Page LazyLoad Placeholder SVG" msgstr "頁面LazyLoad載入佔位SVG" -#: options/theme-options.php:2626 +#: options/theme-options.php:2634 msgid "" "Fill in the address, this is the placeholder image that will be displayed " "when the page LazyLoad is being loaded" msgstr "填寫地址,此為頁面LazyLoad載入時會顯示的佔位圖" -#: options/theme-options.php:2633 +#: options/theme-options.php:2641 msgid "Page Image Placeholder SVG" msgstr "頁面圖像載入佔位SVG" -#: options/theme-options.php:2634 +#: options/theme-options.php:2642 msgid "" "Fill address, this is the SVG that will be displayed as a placeholder when " "the page image is being loaded" msgstr "填寫地址,此為載入頁面圖像時佔位顯示的SVG" -#: options/theme-options.php:2643 +#: options/theme-options.php:2651 msgid "Article Page Options" msgstr "文章頁面設定" -#: options/theme-options.php:2650 +#: options/theme-options.php:2658 msgid "" "You can click here to learn " @@ -2738,84 +2747,84 @@ msgstr "" "#%E6%96%87%E7%AB%A0%E9%A1%B5%E9%9D%A2%E8%AE%BE%E7%BD%AE\">此處 瞭解如何在" "此頁面上設定選項" -#: options/theme-options.php:2656 +#: options/theme-options.php:2664 msgid "Article Page Title Font Size" msgstr "文章頁面標題字體大小" -#: options/theme-options.php:2657 +#: options/theme-options.php:2665 msgid "" "Slide to adjust, recommended value range is 28-36. This option is only " "available for article pages that have a featured image set" msgstr "" "滑動滑塊,推薦數值範圍為28-36。此選項僅對已經設定了特色圖像的文章頁面生效" -#: options/theme-options.php:2667 +#: options/theme-options.php:2675 msgid "Article Page Title Underline Animation" msgstr "文章頁面標題下劃線動畫" -#: options/theme-options.php:2668 +#: options/theme-options.php:2676 msgid "" "Article title will have underline animation when this is enabled and article " "has a featured image set" msgstr "開啟且文章設定了特色圖像之後,文章標題將有下劃線動" -#: options/theme-options.php:2675 +#: options/theme-options.php:2683 msgid "Display Article Meta before the Contents" msgstr "文章頁面顯示元素" -#: options/theme-options.php:2687 +#: options/theme-options.php:2695 msgid "Article Page Auto Show Menu" msgstr "文章頁面自動顯示菜單" -#: options/theme-options.php:2688 +#: options/theme-options.php:2696 msgid "" "Enabled by default, the article page will automatically show the menu. PHP " "extension \"DOM\" is required for this feature." msgstr "默認開啟,文章頁面會自動顯示菜單,此功能需要PHP擴展“DOM”。" -#: options/theme-options.php:2695 +#: options/theme-options.php:2703 msgid "Inline Code Background Color" msgstr "內聯代碼背景色" -#: options/theme-options.php:2703 +#: options/theme-options.php:2711 msgid "Inline Code Background Color In Dark Mode" msgstr "深色模式內聯代碼背景色" -#: options/theme-options.php:2704 +#: options/theme-options.php:2712 msgid "" "Customize the colors, suggest using a corresponding color with the " "background color,this color is only displayed in dark mode" msgstr "自訂顏色,建議使用與背景顏色對應的顏色,此顏色僅在深色模式下顯示" -#: options/theme-options.php:2710 +#: options/theme-options.php:2718 msgid "Article Expansion Area" msgstr "文章擴展區" -#: options/theme-options.php:2716 +#: options/theme-options.php:2724 msgid "Article Page Function Bar" msgstr "文章頁面功能列" -#: options/theme-options.php:2717 +#: options/theme-options.php:2725 msgid "" "Enabled by default, will be displayed on the article page with the features " "enabled below" msgstr "默認啟用,將在文章頁顯示下方開啟的功能" -#: options/theme-options.php:2724 +#: options/theme-options.php:2732 msgid "Article License" msgstr "文章知識共享協定" -#: options/theme-options.php:2726 +#: options/theme-options.php:2734 msgid "" "Enabled by default, Article license will appear on the function bar. License " "can also be selected by custom metadata \"license\"." msgstr "默認開啟,將在文章頁面功能欄中顯示文章協定,你可以選擇自定義你的協定" -#: options/theme-options.php:2735 +#: options/theme-options.php:2743 msgid "Not Display" msgstr "不顯示" -#: options/theme-options.php:2743 +#: options/theme-options.php:2751 msgid "" "\"BY\" means reusers should give credit to the creator" "p>
\"NC\" means no commercial use
\"ND\"" @@ -2833,77 +2842,77 @@ msgstr "" "散布由本作品產生的衍生作品
你可以訪問協定 官方網站 瞭解更多
" -#: options/theme-options.php:2754 +#: options/theme-options.php:2762 msgid "Article Page Appreciation Function (Alipay QR Code)" msgstr "文章頁面讚賞功能(支付寶二維碼)" -#: options/theme-options.php:2756 +#: options/theme-options.php:2764 msgid "Upload Alipay Receipt QR Code Image" msgstr "上傳支付寶收款碼圖像" -#: options/theme-options.php:2763 +#: options/theme-options.php:2771 msgid "Article Page Appreciation Function (Wechat QR Code)" msgstr "文章頁面讚賞功能(微信QR碼)" -#: options/theme-options.php:2765 +#: options/theme-options.php:2773 msgid "Upload WeChat Receipt QR Code Image" msgstr "上傳微信收款碼圖像" -#: options/theme-options.php:2772 +#: options/theme-options.php:2780 msgid "Article Page Author Avatar" msgstr "文章頁面作者頭像" -#: options/theme-options.php:2774 +#: options/theme-options.php:2782 msgid "Enabled by default, Author avatar will appear on the function bar" msgstr "默認啟用,作者頭像將出現在功能欄上" -#: options/theme-options.php:2781 +#: options/theme-options.php:2789 msgid "Article Page Author Name" msgstr "文章頁面作者姓名" -#: options/theme-options.php:2783 +#: options/theme-options.php:2791 msgid "Author name will appear on the function bar when enabled" msgstr "啟用后,作者姓名將顯示在功能欄上" -#: options/theme-options.php:2790 +#: options/theme-options.php:2798 msgid "Article Page Author Signature" msgstr "文章頁面作者簽名" -#: options/theme-options.php:2792 +#: options/theme-options.php:2800 msgid "Enabled by default, Author signature will appear on the function bar" msgstr "默認啟用,作者簽名將顯示在功能列上" -#: options/theme-options.php:2799 +#: options/theme-options.php:2807 msgid "Article Last Update Time" msgstr "文章最後更新時間" -#: options/theme-options.php:2801 +#: options/theme-options.php:2809 msgid "Article last update time will appear on the function bar when enabled" msgstr "啟用后,文章上次更新時間將顯示在功能列上" -#: options/theme-options.php:2808 +#: options/theme-options.php:2816 msgid "Article Tag" msgstr "文章標籤" -#: options/theme-options.php:2810 +#: options/theme-options.php:2818 msgid "Enabled by default, Article tag will appear on the function bar" msgstr "默認啟用,文章標籤將顯示在功能欄上" -#: options/theme-options.php:2817 +#: options/theme-options.php:2825 msgid "Article Page Prev/Next Article Switcher" msgstr "文章頁面上下文章切換" -#: options/theme-options.php:2818 +#: options/theme-options.php:2826 msgid "" "Enabled by default, the previous and next article switch will appear on the " "article pages" msgstr "默認啟用,上一篇文章和下一篇文章開關將顯示在文章頁面上" -#: options/theme-options.php:2827 +#: options/theme-options.php:2835 msgid "Template Page Options" msgstr "模板頁面設定" -#: options/theme-options.php:2834 +#: options/theme-options.php:2842 msgid "" "You can click here to learn " @@ -2913,58 +2922,58 @@ msgstr "" "#%E6%A8%A1%E6%9D%BF%E9%A1%B5%E9%9D%A2%E8%AE%BE%E7%BD%AE\">此處 瞭解如何在" "此頁面上設定選項" -#: options/theme-options.php:2839 +#: options/theme-options.php:2847 msgid "Public Settings" msgstr "共用設置" -#: options/theme-options.php:2845 +#: options/theme-options.php:2853 msgid "Template Page Title Font Size" msgstr "模板頁面標題字體大小" -#: options/theme-options.php:2846 +#: options/theme-options.php:2854 msgid "" "Slide to adjust, recommended value range is 36-48. This option is only " "available for template pages with featured images already set" msgstr "" "滑動滑塊,推薦數值範圍為36-48。此選項僅對已經設定了特色圖像的模板頁面生效" -#: options/theme-options.php:2855 +#: options/theme-options.php:2863 msgid "Bangumi Template Settings" msgstr "動漫模板設置" -#: options/theme-options.php:2861 +#: options/theme-options.php:2869 msgid "Bangumi Template Source" msgstr "動漫模板源" -#: options/theme-options.php:2872 +#: options/theme-options.php:2880 msgid "My Anime List Username" msgstr "我的動漫清單使用者名" -#: options/theme-options.php:2874 +#: options/theme-options.php:2882 msgid "Username on https://myanimelist.net/" msgstr "https://myanimelist.net/ 上的使用者名" -#: options/theme-options.php:2881 +#: options/theme-options.php:2889 msgid "My Anime List Sort" msgstr "我的動漫清單顺序" -#: options/theme-options.php:2884 +#: options/theme-options.php:2892 msgid "Status and Last Updated" msgstr "狀態和上次更新時間" -#: options/theme-options.php:2885 +#: options/theme-options.php:2893 msgid "Last Updated" msgstr "最後更新" -#: options/theme-options.php:2886 +#: options/theme-options.php:2894 msgid "Status" msgstr "狀態" -#: options/theme-options.php:2894 +#: options/theme-options.php:2902 msgid "Bilibili Account UID" msgstr "嗶哩嗶哩帳戶UID" -#: options/theme-options.php:2895 +#: options/theme-options.php:2903 msgid "" "Fill in your account ID, e.g. https://space.bilibili.com/13972644/, just the " "number part \"13972644\"" @@ -2972,11 +2981,11 @@ msgstr "" "填寫你的帳號ID,例如:https://space.bilibili.com/13972644/,只需填寫數" "字“13972644”部分" -#: options/theme-options.php:2903 +#: options/theme-options.php:2911 msgid "Bilibili Account Cookies" msgstr "嗶哩嗶哩帳戶Cookies" -#: options/theme-options.php:2904 +#: options/theme-options.php:2912 msgid "" "Fill in your account cookies, F12 to open your browser web panel, go to your " "bilibili homepage to get cookies. If left empty, it will not show the " @@ -2985,79 +2994,79 @@ msgstr "" "填寫你的帳號Cookies,F12打開瀏覽器網路面板,前往你的B站主頁獲取Cookies。如果" "留空,將不會顯示追番進度" -#: options/theme-options.php:2911 +#: options/theme-options.php:2919 msgid "Friend Link Template Settings" msgstr "友情連結模板設置" -#: options/theme-options.php:2917 +#: options/theme-options.php:2925 msgid "Friend Link Template Unit Alignment" msgstr "友情連結模板單元對齊方向" -#: options/theme-options.php:2929 +#: options/theme-options.php:2937 msgid "Friend Link Template Unit Matching Color" msgstr "友情連結模板單元匹配顏色" -#: options/theme-options.php:2937 +#: options/theme-options.php:2945 msgid "Friend Link Template Unit Border Shadow Color" msgstr "友情連結模板單元邊框陰影顏色" -#: options/theme-options.php:2945 +#: options/theme-options.php:2953 msgid "Friend Link Sorting Mode" msgstr "友情連結列表排序模式" -#: options/theme-options.php:2946 +#: options/theme-options.php:2954 msgid "Select the friend link sorting mode, \"Name\" is used by Default." msgstr "選擇友情連結列表排序模式,預設使用“名稱”。" -#: options/theme-options.php:2948 +#: options/theme-options.php:2956 msgid "Name" msgstr "名稱" -#: options/theme-options.php:2949 +#: options/theme-options.php:2957 msgid "Rating" msgstr "評級" -#: options/theme-options.php:2950 +#: options/theme-options.php:2958 msgid "Updated" msgstr "更新时间" -#: options/theme-options.php:2951 +#: options/theme-options.php:2959 msgid "Rand" msgstr "隨機" -#: options/theme-options.php:2959 +#: options/theme-options.php:2967 msgid "Ascending OR Descending" msgstr "升序或降序" -#: options/theme-options.php:2960 +#: options/theme-options.php:2968 msgid "Order friend link in ascending or descending." msgstr "按升序或降序排序友情連結列表。" -#: options/theme-options.php:2963 +#: options/theme-options.php:2971 msgid "Ascending" msgstr "升序" -#: options/theme-options.php:2964 +#: options/theme-options.php:2972 msgid "Descending" msgstr "降序" -#: options/theme-options.php:2971 +#: options/theme-options.php:2979 msgid "Login Template Settings" msgstr "登入模板設置" -#: options/theme-options.php:2977 +#: options/theme-options.php:2985 msgid "Login Template Registration Function" msgstr "登入模板註冊功能" -#: options/theme-options.php:2978 +#: options/theme-options.php:2986 msgid "Login template will allow registration when enabled" msgstr "開啟之後登入模板將允許註冊" -#: options/theme-options.php:2987 +#: options/theme-options.php:2995 msgid "Comment-related Options" msgstr "留言相關設定" -#: options/theme-options.php:2994 +#: options/theme-options.php:3002 msgid "" "You can click here to learn " @@ -3067,52 +3076,44 @@ msgstr "" "#%E8%AF%84%E8%AE%BA%E7%9B%B8%E5%85%B3%E8%AE%BE%E7%BD%AE\">此處 瞭解如何在" "此頁面上設定選項" -#: options/theme-options.php:2999 +#: options/theme-options.php:3007 msgid "Comment Area Style" msgstr "留言板區域樣式" -#: options/theme-options.php:3005 +#: options/theme-options.php:3013 msgid "Page Comment Area Display" msgstr "頁面留言板顯示" -#: options/theme-options.php:3006 +#: options/theme-options.php:3014 msgid "You can choose to expand or shirink the content of the comment area" msgstr "你可以選擇展開或者摺疊留言板內容" -#: options/theme-options.php:3008 +#: options/theme-options.php:3016 msgid "Expand" msgstr "展開" -#: options/theme-options.php:3009 +#: options/theme-options.php:3017 msgid "Shrink" msgstr "摺疊" -#: options/theme-options.php:3017 -msgid "Page Comment Area Matching Color" -msgstr "頁面留言板域匹配顏色" - #: options/theme-options.php:3025 -msgid "Page Comment Area Shadow Color" -msgstr "頁面留言板域陰影顏色" - -#: options/theme-options.php:3033 msgid "Page Comment Area Bottom Right Background Image" msgstr "頁面留言板右下背景圖像" -#: options/theme-options.php:3034 +#: options/theme-options.php:3026 msgid "" "If this option is blank, there will be no image, no best recommendation here" msgstr "如果此選項為空白,則沒有圖像,無最佳推薦" -#: options/theme-options.php:3040 +#: options/theme-options.php:3032 msgid "Comment Area Function" msgstr "留言板區域功能" -#: options/theme-options.php:3046 +#: options/theme-options.php:3038 msgid "Comment Area Emoticon" msgstr "留言板區域表情包" -#: options/theme-options.php:3047 +#: options/theme-options.php:3039 msgid "" "Select the emoticons to be displayed in the comment area input box. Uncheck " "all to turn off the comment input box emoticon function." @@ -3120,37 +3121,37 @@ msgstr "" "選擇要在留言板區域輸入框中顯示的表情。 全部取消選中可關閉留言板區域輸入框表情" "功能。" -#: options/theme-options.php:3050 +#: options/theme-options.php:3042 msgid "BiliBili Emoticon Pack" msgstr "嗶哩嗶哩表情包" -#: options/theme-options.php:3051 +#: options/theme-options.php:3043 msgid "Baidu Tieba Emoticon Pack" msgstr "百度貼吧表情包" -#: options/theme-options.php:3052 +#: options/theme-options.php:3044 msgid "Emoji" msgstr "" -#: options/theme-options.php:3053 +#: options/theme-options.php:3045 msgid "Customized Emoticon Pack" msgstr "自訂表情包" -#: options/theme-options.php:3061 +#: options/theme-options.php:3053 msgid "Customized Emoticon Column Name" msgstr "自訂表情包名稱" -#: options/theme-options.php:3062 +#: options/theme-options.php:3054 msgid "" "It is recommended to enter less than 4 Chinese characters in length to avoid " "causing compatibility issues on mobile terminals." msgstr "建議輸入少於4個漢字的內容,以免造成移動端的相容性問題。" -#: options/theme-options.php:3070 +#: options/theme-options.php:3062 msgid "Path To Custom Expression" msgstr "自訂表情包路徑" -#: options/theme-options.php:3071 +#: options/theme-options.php:3063 msgid "" "Click here updating emoticon list. Specific usage reference: " @@ -3163,72 +3164,72 @@ msgstr "" "Sakurairo/Pages/#%E8%AF%84%E8%AE%BA%E7%9B%B8%E5%85%B3%E8%AE%BE%E7%BD%AE\" " "target=\"_blank\">留言相關設定" -#: options/theme-options.php:3078 +#: options/theme-options.php:3070 msgid "Custom Emoticon Proxy Address" msgstr "自訂表情包代理位址" -#: options/theme-options.php:3079 +#: options/theme-options.php:3071 msgid "" "Fill in the CDN address of the emoticon image. If left blank, the CDN proxy " "function will not be enabled." msgstr "填寫表情圖片的CDN位址。 如果留空,則不會啟用CDN代理功能。" -#: options/theme-options.php:3089 +#: options/theme-options.php:3081 msgid "Page Comment Area UA Info" msgstr "頁面留言板UA資訊" -#: options/theme-options.php:3090 +#: options/theme-options.php:3082 msgid "" "When enabled, the page comment area will display the user’s browser, " "operating system information" msgstr "開啟之後頁面留言板將顯示用戶的瀏覽器,作業系統資訊" -#: options/theme-options.php:3097 +#: options/theme-options.php:3089 msgid "Page Comment Area Location Information" msgstr "頁面留言板位置資訊" -#: options/theme-options.php:3098 +#: options/theme-options.php:3090 msgid "" "When enabled, the page comment area will show the user’s location information" msgstr "開啟之後頁面留言板將顯示用戶的位置資訊" -#: options/theme-options.php:3105 +#: options/theme-options.php:3097 msgid "Management Page Displays Location Information" msgstr "評論管理頁面評論位置資訊" -#: options/theme-options.php:3106 +#: options/theme-options.php:3098 msgid "" "When enabled, the commenter's IP geographical location information will be " "displayed on the comment management page" msgstr "開啟之後評論管理頁面將顯示評論位置資訊" -#: options/theme-options.php:3113 +#: options/theme-options.php:3105 msgid "Location Information Persistence" msgstr "位置資訊持久化" -#: options/theme-options.php:3114 +#: options/theme-options.php:3106 msgid "" "When enabled, the commenter's IP geographical location information will be " "stored in the database" msgstr "開啟之後評論位置資訊將存儲在資料庫中" -#: options/theme-options.php:3121 +#: options/theme-options.php:3113 msgid "API To Parse Geographical Location" msgstr "位置資訊解析API" -#: options/theme-options.php:3123 +#: options/theme-options.php:3115 msgid "Theme Official" msgstr "主題官方" -#: options/theme-options.php:3124 +#: options/theme-options.php:3116 msgid "IP—API" msgstr "" -#: options/theme-options.php:3125 +#: options/theme-options.php:3117 msgid "All" msgstr "全部" -#: options/theme-options.php:3133 +#: options/theme-options.php:3125 msgid "" "Theme Official:Official API of the theme" "p>
IP-API:Provided by
全部: 優先使用主題官方API,IP—API 作為備選 " "API 使用
" -#: options/theme-options.php:3141 +#: options/theme-options.php:3133 msgid "Private Comment Function" msgstr "私人留言功能" -#: options/theme-options.php:3142 +#: options/theme-options.php:3134 msgid "" "When enabled, users are allowed to set their comments to be invisible to " "others" msgstr "開啟之後將允許用戶設定自己的留言對其他人不可見" -#: options/theme-options.php:3149 +#: options/theme-options.php:3141 msgid "Page Comment Area Bot Verification" msgstr "頁面留言板機器人驗證" -#: options/theme-options.php:3150 +#: options/theme-options.php:3142 msgid "After turning on user comments need to be verified before posting" msgstr "開啟之後用戶留言前需要經過驗證後才可發布" -#: options/theme-options.php:3157 +#: options/theme-options.php:3149 msgid "QQ Avatar Link Encryption" msgstr "QQ頭貼連結加密" -#: options/theme-options.php:3160 +#: options/theme-options.php:3152 msgid "Redirect (low security)" msgstr "重定向(低安全性)" -#: options/theme-options.php:3161 +#: options/theme-options.php:3153 msgid "Get avatar data in the backend (medium security)" msgstr "後端獲取頭貼數據(中安全性)" -#: options/theme-options.php:3162 +#: options/theme-options.php:3154 msgid "Parse avatar interface in the backend (high security, slow)" msgstr "後端解析頭貼接口(高安全性,慢速)" -#: options/theme-options.php:3170 +#: options/theme-options.php:3162 msgid "Page Comment Area Upload Image Interface" msgstr "頁面留言板上傳圖像接口" -#: options/theme-options.php:3184 +#: options/theme-options.php:3176 msgid "Imgur Client ID" msgstr "Imgur Client ID" -#: options/theme-options.php:3186 +#: options/theme-options.php:3178 msgid "" "Fill in Client ID here, to register please visit https://api.imgur.com/" "oauth2/addclient" msgstr "此處填寫Client ID,註冊請訪問 https://api.imgur.com/oauth2/addclient" -#: options/theme-options.php:3192 +#: options/theme-options.php:3184 msgid "Imgur Upload Proxy" msgstr "Imgur上傳代理" -#: options/theme-options.php:3194 +#: options/theme-options.php:3186 msgid "" "The proxy used by the backend when uploading images to Imgur. You can refer " "to the tutorial: https://2heng.xin/2018/06/06/javascript-upload-images-with-" @@ -3301,41 +3302,41 @@ msgstr "" "後端上傳圖像到 Imgur 的時候使用的代理。你可以參考教程:https://2heng." "xin/2018/06/06/javascript-upload-images-with-imgur-api/" -#: options/theme-options.php:3201 +#: options/theme-options.php:3193 msgid "SM.MS Secret Token" msgstr "SM.MS Secret Token" -#: options/theme-options.php:3203 +#: options/theme-options.php:3195 msgid "" "Fill in your Key here, to get it please visit https://sm.ms/home/apitoken" msgstr "此處填寫Key,獲取請訪問 https://sm.ms/home/apitoken" -#: options/theme-options.php:3209 +#: options/theme-options.php:3201 msgid "Chevereto API v1 Key" msgstr "Chevereto API v1 Key" -#: options/theme-options.php:3211 +#: options/theme-options.php:3203 msgid "" "Fill in the Key here, to get please visit your Chevereto home page address/" "dashboard/settings/api" msgstr "此處填寫Key,獲取請訪問你的Chevereto首頁地址/dashboard/settings/api" -#: options/theme-options.php:3217 +#: options/theme-options.php:3209 msgid "Chevereto Address" msgstr "Chevereto地址" -#: options/theme-options.php:3219 +#: options/theme-options.php:3211 msgid "" "Your Chevereto home page address. Please note that there is no \"/\" at the " "end, e.g. https://your.cherverto.com" msgstr "" "你的Chevereto首頁地址, 注意結尾沒有 /, 例如:https://your.cherverto.com" -#: options/theme-options.php:3225 +#: options/theme-options.php:3217 msgid "Lsky Pro v1 Token" msgstr "Lsky Pro v1 Token" -#: options/theme-options.php:3227 +#: options/theme-options.php:3219 msgid "" "Fill in the Token here, Please note that there is no \"Bearer \" at first, " "to get please visit your Lsky Pro home page address/api" @@ -3343,41 +3344,41 @@ msgstr "" "在這裡填寫令牌,請注意,首先沒有“持有者”,要獲得請訪問您的Lsky Pro主頁位址/ " "api" -#: options/theme-options.php:3233 +#: options/theme-options.php:3225 msgid "Lsky Pro Address" msgstr "Lsky Pro地址" -#: options/theme-options.php:3235 +#: options/theme-options.php:3227 msgid "" "Your Lsky Pro home page address. Please note that there is no \"/\" at the " "end, e.g. https://your.lskypro.com" msgstr "你的Lsky Pro首頁地址, 注意結尾沒有 /, 例如:https://your.lskypro.com" -#: options/theme-options.php:3241 +#: options/theme-options.php:3233 msgid "Comment Image Proxy" msgstr "留言圖像代理" -#: options/theme-options.php:3242 +#: options/theme-options.php:3234 msgid "Proxy for the image displayed on the frontend" msgstr "前端顯示的圖像的代理" -#: options/theme-options.php:3249 +#: options/theme-options.php:3241 msgid "Comment Email Notification" msgstr "留言板郵件通知" -#: options/theme-options.php:3255 +#: options/theme-options.php:3247 msgid "Mail Template Featured Image" msgstr "郵件模板特色圖像" -#: options/theme-options.php:3256 +#: options/theme-options.php:3248 msgid "Set the background image of your reply email" msgstr "設定你的回復郵件上方背景圖像" -#: options/theme-options.php:3264 +#: options/theme-options.php:3256 msgid "Mail Template Sending Address Prefix" msgstr "郵件模板發件地址前綴" -#: options/theme-options.php:3265 +#: options/theme-options.php:3257 msgid "" "Used to send system mail. The sender address will be displayed in the user's " "mailbox, don't use Non-English Characters. The default system mail address " @@ -3386,11 +3387,11 @@ msgstr "" "用於發送系統郵件,在用戶的郵箱中顯示的發件人地址,不要使用中文,默認系統郵件" "地址為 bibi@你的域名" -#: options/theme-options.php:3272 +#: options/theme-options.php:3264 msgid "User Mail Reply Notification" msgstr "用戶郵件回復通知" -#: options/theme-options.php:3273 +#: options/theme-options.php:3265 msgid "" "By default WordPress will use email notifications to notify users when their " "comments receive a reply. After turning it on users are allowed to set " @@ -3399,25 +3400,25 @@ msgstr "" "WordPress默認會使用郵件通知用戶留言收到回復,開啟之後允許用戶設定自己的留言收" "到回復時是否使用郵件通知" -#: options/theme-options.php:3280 +#: options/theme-options.php:3272 msgid "Admin Email Reply Notification" msgstr "管理員郵件回復通知" -#: options/theme-options.php:3281 +#: options/theme-options.php:3273 msgid "" "Use email notifications when admin comments receive a reply after turning it " "on" msgstr "開啟之後當管理員留言收到回復時使用郵件通知" -#: options/theme-options.php:3290 +#: options/theme-options.php:3282 msgid "Other Options" msgstr "其他設定" -#: options/theme-options.php:3296 +#: options/theme-options.php:3288 msgid "Login Screen and Dashboard Related Options" msgstr "登入介面和儀錶盤相關設定" -#: options/theme-options.php:3303 +#: options/theme-options.php:3295 msgid "" "You can click here" @@ -3427,103 +3428,103 @@ msgstr "" "#%E7%99%BB%E5%BD%95%E7%95%8C%E9%9D%A2%E5%92%8C%E4%BB%AA%E8%A1%A8%E7%9B%98%E7%9B%B8%E5%85%B3%E8%AE%BE%E7%BD%AE\">" "此處 瞭解如何在此頁面上設定選項" -#: options/theme-options.php:3308 +#: options/theme-options.php:3300 msgid "Login Screen" msgstr "登入介面" -#: options/theme-options.php:3314 +#: options/theme-options.php:3306 msgid "Custom Login Screen" msgstr "自訂登錄螢幕" -#: options/theme-options.php:3315 +#: options/theme-options.php:3307 msgid "Default on, custom login screen will replace the default login screen" msgstr "默認開啟,自定義登錄螢幕將取代預設登錄螢幕" -#: options/theme-options.php:3322 +#: options/theme-options.php:3314 msgid "Login Screen Background Image" msgstr "登入介面背景圖像" -#: options/theme-options.php:3323 +#: options/theme-options.php:3315 msgid "" "Set your login screen background image, leave this option blank to show the " "default" msgstr "設定你的登入介面背景圖像,此選項留空則顯示默認背景" -#: options/theme-options.php:3332 +#: options/theme-options.php:3324 msgid "Login Screen Background Blur" msgstr "登入介面背景虛化" -#: options/theme-options.php:3333 +#: options/theme-options.php:3325 msgid "Login screen background image will be blurred when enabled" msgstr "開啟之後登入介面背景圖像將被虛化" -#: options/theme-options.php:3341 +#: options/theme-options.php:3333 msgid "Login Screen Logo" msgstr "登入介面Logo" -#: options/theme-options.php:3342 +#: options/theme-options.php:3334 msgid "Set your login screen Logo" msgstr "設定你的登入介面Logo" -#: options/theme-options.php:3351 +#: options/theme-options.php:3343 msgid "Jump after login" msgstr "登入後跳轉" -#: options/theme-options.php:3352 +#: options/theme-options.php:3344 msgid "Jump to backend for admins and home for users after turning on." msgstr "啟用后,跳轉到管理員的後端和使用者的主頁。" -#: options/theme-options.php:3359 +#: options/theme-options.php:3351 msgid "Login Screen Language Option" msgstr "登入介面語言選項" -#: options/theme-options.php:3360 +#: options/theme-options.php:3352 msgid "Login screen language option will be display when enabled" msgstr "開啟之後將顯示登入介面語言選項" -#: options/theme-options.php:3366 +#: options/theme-options.php:3358 msgid "Dashboard" msgstr "儀錶盤" -#: options/theme-options.php:3372 +#: options/theme-options.php:3364 msgid "Dashboard Background Image" msgstr "儀錶盤背景圖像" -#: options/theme-options.php:3373 +#: options/theme-options.php:3365 msgid "" "Set your dashboard background image, leave this option blank to show white " "background" msgstr "設定你的儀錶盤背景圖像,此選項留空則顯示白色背景" -#: options/theme-options.php:3381 +#: options/theme-options.php:3373 msgid "Dashboard Options Menu Style" msgstr "儀錶盤選項功能表樣式" -#: options/theme-options.php:3392 +#: options/theme-options.php:3384 msgid "Dashboard Primary Menu Color" msgstr "儀錶盤一級菜單顏色" -#: options/theme-options.php:3400 +#: options/theme-options.php:3392 msgid "Dashboard Secondary Menu Color" msgstr "儀錶盤二級菜單顏色" -#: options/theme-options.php:3408 +#: options/theme-options.php:3400 msgid "Dashboard Emphasis Color" msgstr "儀錶盤強調顏色" -#: options/theme-options.php:3416 +#: options/theme-options.php:3408 msgid "Dashboard Button Color" msgstr "儀錶盤按鈕顏色" -#: options/theme-options.php:3424 +#: options/theme-options.php:3416 msgid "Dashboard Text Color" msgstr "儀錶盤文本顏色" -#: options/theme-options.php:3434 +#: options/theme-options.php:3426 msgid "ChatGPT Options" msgstr "ChatGPT設定" -#: options/theme-options.php:3441 +#: options/theme-options.php:3433 msgid "" "You can click here to learn how to set the options on " @@ -3532,27 +3533,27 @@ msgstr "" "您可以按下 此處 瞭解如何設定此頁面上的選項" -#: options/theme-options.php:3447 +#: options/theme-options.php:3439 msgid "ChatGPT Function" msgstr "ChatGPT功能" -#: options/theme-options.php:3448 +#: options/theme-options.php:3440 msgid "After turning on ChatGPT Function will be available" msgstr "開啟之後ChatGPT功能后將可用" -#: options/theme-options.php:3455 +#: options/theme-options.php:3447 msgid "ChatGPT Base URL" msgstr "ChatGPT基本網址" -#: options/theme-options.php:3456 +#: options/theme-options.php:3448 msgid "Fill in the ChatGPT Base URL, The default is https://openai.fuukei.org/" msgstr "填寫ChatGPT基本網址,預設為 https://openai.fuukei.org/" -#: options/theme-options.php:3464 +#: options/theme-options.php:3456 msgid "ChatGPT API keys" msgstr "" -#: options/theme-options.php:3465 +#: options/theme-options.php:3457 msgid "" "Fill in Your ChatGPT API keys, You can go to OpenAI Website to get your API Keys" @@ -3560,15 +3561,15 @@ msgstr "" "填寫您的 ChatGPT API Keys,您可以存取 OpenAI 網站 取得您的 API Keys" -#: options/theme-options.php:3472 +#: options/theme-options.php:3464 msgid "ChatGPT Article Summarize" msgstr "ChatGPT文章摘要" -#: options/theme-options.php:3473 +#: options/theme-options.php:3465 msgid "After turning on ChatGPT will automatically generate article abstracts" msgstr "開啟之後ChatGPT會自動生成文章摘要" -#: options/theme-options.php:3480 +#: options/theme-options.php:3472 msgid "" "Each update of your post will trigger a request to generate a summary. Due " "to current API limitations, if your article exceeds 4097 Token, the system " @@ -3577,21 +3578,21 @@ msgstr "" "帖子的每次更新都會觸發生成摘要的請求。由於當前 API 限制,如果您的文章超過 " "4097 Token,系統只會發送未超出的部分以生成摘要" -#: options/theme-options.php:3490 +#: options/theme-options.php:3482 msgid "Article IDs that do not Require ChatGPT Summarize" msgstr "不需要 ChatGPT 摘要的文章 ID" -#: options/theme-options.php:3491 +#: options/theme-options.php:3483 msgid "" "Enter the article IDs that do not need to generate ChatGPT Summarize, and " "split multiple article IDs with \",\"" msgstr "輸入不需要生成 ChatGPT 摘要的文章 ID,並用“,” 拆分多個文章 ID" -#: options/theme-options.php:3502 +#: options/theme-options.php:3494 msgid "ChatGPT Article Summarize Init Prompt" msgstr "ChatGPT文章摘要初始化提示" -#: options/theme-options.php:3507 +#: options/theme-options.php:3499 msgid "" "Init Prompt instructs AI how to generate summaries for your articles. Init " "Prompt will be passed to ChatGPT as \"system\" role" @@ -3599,11 +3600,11 @@ msgstr "" "Init Prompt 會指示 AI 如何為您的文章產生摘要。Init Prompt 會以「系統」角色傳" "給 ChatGPT" -#: options/theme-options.php:3514 +#: options/theme-options.php:3506 msgid "ChatGPT Model" msgstr "ChatGPT 模型" -#: options/theme-options.php:3515 +#: options/theme-options.php:3507 msgid "" "Only models support Chat Completion API can be used. The default is " "\"gpt-3.5-turbo\". View https://platform.openai.com/docs/models/overview for " @@ -3612,31 +3613,31 @@ msgstr "" "只有支援 Chat Completion API 的機型才能使用。「gpt-3.5-turbo」為預設。檢視 " "https://platform.openai.com/docs/models/overview 以取得更多資訊" -#: options/theme-options.php:3527 +#: options/theme-options.php:3519 msgid "ChatGPT API self test" msgstr "ChatGPT 測試" -#: options/theme-options.php:3531 +#: options/theme-options.php:3523 msgid "TEST" msgstr "測試" -#: options/theme-options.php:3534 +#: options/theme-options.php:3526 msgid "Results: " msgstr "結果:" -#: options/theme-options.php:3546 +#: options/theme-options.php:3538 msgid "Waiting for response..." msgstr "等待回應..." -#: options/theme-options.php:3557 +#: options/theme-options.php:3549 msgid "Malformed post_id: " msgstr "不正確的 post_id:" -#: options/theme-options.php:3574 +#: options/theme-options.php:3566 msgid "Low Use Options" msgstr "低使用設定" -#: options/theme-options.php:3581 +#: options/theme-options.php:3573 msgid "" "You can click here to learn how to " @@ -3646,53 +3647,53 @@ msgstr "" "#%E4%BD%8E%E4%BD%BF%E7%94%A8%E8%AE%BE%E7%BD%AE\">此處 瞭解如何在此頁面上" "設定選項" -#: options/theme-options.php:3587 +#: options/theme-options.php:3579 msgid "Statistics API" msgstr "統計接口" -#: options/theme-options.php:3588 +#: options/theme-options.php:3580 msgid "" "You can choose WP-Statistics plugin statistics or theme built-in statistics " "to display" msgstr "你可以選擇WP-Statistics插件統計或者主題內建統計作為統計結果" -#: options/theme-options.php:3590 +#: options/theme-options.php:3582 msgid "Theme Built in Statistics" msgstr "主題內建統計" -#: options/theme-options.php:3591 +#: options/theme-options.php:3583 msgid "WP-Statistics Plugin Statistics" msgstr "WP-Statistics插件統計" -#: options/theme-options.php:3599 +#: options/theme-options.php:3591 msgid "Statistics display format" msgstr "統計數據顯示格式" -#: options/theme-options.php:3600 +#: options/theme-options.php:3592 msgid "You can choose from four different data display formats" msgstr "你可以選擇四種不同的數據顯示格式" -#: options/theme-options.php:3602 +#: options/theme-options.php:3594 msgid "23333 Visits" msgstr "23333次訪問" -#: options/theme-options.php:3603 +#: options/theme-options.php:3595 msgid "23,333 Visits" msgstr "23,333次訪問" -#: options/theme-options.php:3604 +#: options/theme-options.php:3596 msgid "23 333 Visits" msgstr "23 333次訪問" -#: options/theme-options.php:3605 +#: options/theme-options.php:3597 msgid "23K Visits" msgstr "23K次訪問" -#: options/theme-options.php:3613 +#: options/theme-options.php:3605 msgid "Live Search" msgstr "實時搜尋" -#: options/theme-options.php:3614 +#: options/theme-options.php:3606 msgid "" "After turning on the live search in the frontend, call Rest API to update " "the cache once an hour. You can set the cache time manually in api.php" @@ -3700,45 +3701,45 @@ msgstr "" "開啟之後將在前台實現實時搜尋,調用 Rest API 每小時更新一次快取,可在 api.php " "里手動設定快取時間" -#: options/theme-options.php:3621 +#: options/theme-options.php:3613 msgid "Live Search Comment Support" msgstr "實時搜尋留言支援" -#: options/theme-options.php:3623 +#: options/theme-options.php:3615 msgid "" "Enable to search for comments in live search (not recommended if site has " "too many comments)" msgstr "開啟之後將在可在實時搜尋中搜尋留言(如果網站留言數量太多不建議開啟)" -#: options/theme-options.php:3630 +#: options/theme-options.php:3622 msgid "Google Analytics Id" msgstr "谷歌統計ID" -#: options/theme-options.php:3631 +#: options/theme-options.php:3623 msgid "If you already have a plugin to handle it, please keep here empty." msgstr "如果已有類似功能挿件,請將此處留空" -#: options/theme-options.php:3637 +#: options/theme-options.php:3629 msgid "Custom CSS Styles" msgstr "自定義CSS樣式" -#: options/theme-options.php:3638 +#: options/theme-options.php:3630 msgid "Fill in the CSS code without writing style tag" msgstr "填寫CSS代碼,不需要寫style標籤" -#: options/theme-options.php:3645 +#: options/theme-options.php:3637 msgid "Code inserted in the header" msgstr "自定義插入Header程式碼" -#: options/theme-options.php:3646 +#: options/theme-options.php:3638 msgid "Insert HTML code right before ." msgstr "在前插入HTML程式碼" -#: options/theme-options.php:3652 +#: options/theme-options.php:3644 msgid "Timezone Fix" msgstr "時區修正" -#: options/theme-options.php:3653 +#: options/theme-options.php:3645 msgid "" "Slide to adjust. If the comment has a time difference problem, adjust it " "here, fill in an integer. Calculation method: actual time = time of display " @@ -3747,42 +3748,42 @@ msgstr "" "滑動滑塊,如果留言出現時差問題在這裡調整,填入一個整數,計算方法:實際時間=顯" "示錯誤的時間-你輸入的整數(單位:小時)" -#: options/theme-options.php:3662 +#: options/theme-options.php:3654 msgid "Gravatar Service Proxy" msgstr "Gravatar服務代理" -#: options/theme-options.php:3663 +#: options/theme-options.php:3655 msgid "" "You can select multiple proxy as the Gravatar Service Proxy. By default, " "Tianli is used as the Gravatar Service Proxy." msgstr "" "你可以選擇多種代理作為Gravatar服務代理。默認使用Tianli作為Gravatar服務代理。" -#: options/theme-options.php:3665 +#: options/theme-options.php:3657 msgid "Weavatar Service" msgstr "Weavatar服務" -#: options/theme-options.php:3666 +#: options/theme-options.php:3658 msgid "Cravatar Service" msgstr "Cravatar服務" -#: options/theme-options.php:3667 +#: options/theme-options.php:3659 msgid "Geekzu" msgstr "極客族" -#: options/theme-options.php:3668 +#: options/theme-options.php:3660 msgid "Loli Net" msgstr "Loli Net" -#: options/theme-options.php:3669 +#: options/theme-options.php:3661 msgid "Official" msgstr "官方" -#: options/theme-options.php:3670 options/theme-options.php:3678 +#: options/theme-options.php:3662 options/theme-options.php:3670 msgid "Custom Proxy Address" msgstr "自訂代理位址" -#: options/theme-options.php:3679 +#: options/theme-options.php:3671 msgid "" "Enter your Gravatar proxy address without starting with \"http(s)://\" and " "ending with \"/\". Example: gravatar.com/avatar." @@ -3790,37 +3791,37 @@ msgstr "" "輸入您的頭像代理位址,请勿以“HTTP(s)://”開頭,以“/”結尾。示例:gravatar." "com/avatar。" -#: options/theme-options.php:3686 +#: options/theme-options.php:3678 msgid "Lightbox" msgstr "燈箱" -#: options/theme-options.php:3692 +#: options/theme-options.php:3684 msgid "BaguetteBox Lightbox Effect" msgstr "BaguetteBox燈箱效果" -#: options/theme-options.php:3693 +#: options/theme-options.php:3685 msgid "BaguetteBox will be used as the image lightbox effect when turned on" msgstr "開啟之後將使用BaguetteBox作為圖像燈箱效果" -#: options/theme-options.php:3705 +#: options/theme-options.php:3697 msgid "FancyBox Lightbox Effect" msgstr "FancyBox燈箱效果" -#: options/theme-options.php:3706 +#: options/theme-options.php:3698 msgid "" "FancyBox will be used as an image lightbox effect after turning on, " "additional JQ libraries will be loaded" msgstr "開啟之後將使用FancyBox作為圖像燈箱效果,將會額外載入JQ庫" -#: options/theme-options.php:3718 +#: options/theme-options.php:3710 msgid "LightGallery Lightbox Effect" msgstr "LightGallery燈箱效果" -#: options/theme-options.php:3719 +#: options/theme-options.php:3711 msgid "LightGallery will be used as an image lightbox effect after turning on." msgstr "開啟之後將使用LightGallery作為圖像燈箱效果" -#: options/theme-options.php:3729 +#: options/theme-options.php:3721 msgid "" "Attension: Please read License Instruction before use.
提交關於 Github 的新討論" "以尋求説明。https://github.com/mirai-mamori/Sakurairo/discussions" -#: options/theme-options.php:3740 +#: options/theme-options.php:3732 msgid "" "Start from Sakurairo v2.4.0, plugins names in LightGallery option follow the " "form cite in official document (eg. lgHash instead of \"hash\")" @@ -3851,15 +3852,15 @@ msgstr "" "從Sakurairo v2.4.0開始,LightGallery中的挿件名稱會與官方檔案中引用的表格保持" "一致(例如“hash”將被表示為IgHash)" -#: options/theme-options.php:3748 +#: options/theme-options.php:3740 msgid "LightGallery Lightbox Effect Options" msgstr "LightGallery燈箱效果選項" -#: options/theme-options.php:3759 +#: options/theme-options.php:3751 msgid "Code Highlighting" msgstr "程式碼高亮" -#: options/theme-options.php:3764 +#: options/theme-options.php:3756 msgid "" "Highlight.js: Default. Automatic language recognition. " "p>
Prism.js: Requires a language to be specified, see 如何程式碼高亮顯示動態載入的檔案" "a>。
自定義: 適用於另有配置的情況。
" -#: options/theme-options.php:3772 +#: options/theme-options.php:3764 msgid "Code Highlight Method" msgstr "程式碼高亮程式" -#: options/theme-options.php:3776 +#: options/theme-options.php:3768 msgid "Custom Program" msgstr "自定義" -#: options/theme-options.php:3784 +#: options/theme-options.php:3776 msgid "Prism.js: Add Line Number Display for All Code Blocks" msgstr "Prism.js:為所有程式碼塊增加行數顯示" -#: options/theme-options.php:3788 +#: options/theme-options.php:3780 msgid "" "See the plugin " "description documentation" msgstr "" "請查閱 外掛描述文件" -#: options/theme-options.php:3794 +#: options/theme-options.php:3786 msgid "Prism.js: Autoload Address" msgstr "Prism.js:自動載入地址" -#: options/theme-options.php:3798 +#: options/theme-options.php:3790 msgid "Leave blank to use default values" msgstr "留空以使用默認值" -#: options/theme-options.php:3805 +#: options/theme-options.php:3797 msgid "Prism.js: Code Highlight Theme" msgstr "Prism.js:程式碼高亮主題" -#: options/theme-options.php:3806 options/theme-options.php:3817 +#: options/theme-options.php:3798 options/theme-options.php:3809 msgid "Relative to autoload address. Leave blank to use default values" msgstr "相對於自動載入地址。留空以使用默認值" -#: options/theme-options.php:3816 +#: options/theme-options.php:3808 msgid "Prism.js: Code Highlight Theme (Dark Mode)" msgstr "Prism.js:程式碼高亮主題(深色模式)" -#: options/theme-options.php:3827 +#: options/theme-options.php:3819 msgid "" "The following Options are not recommended to be modified blindly, please use " "them under the guidance of others" msgstr "以下設定不推薦盲目進行修改,請在他人的指導下使用" -#: options/theme-options.php:3833 +#: options/theme-options.php:3825 msgid "Image CDN" msgstr "圖像CDN" -#: options/theme-options.php:3834 +#: options/theme-options.php:3826 msgid "" "Note: fill in the format https://your CDN domain/. This means that images " "with original path http://your.domain/wp-content/uploads/2018/05/xx.png will " @@ -3933,23 +3934,23 @@ msgstr "" "domain/wp-content/uploads/2018/05/xx.png 的圖像將從 http://你的CDN域" "名/2018/05/xx.png 載入" -#: options/theme-options.php:3841 +#: options/theme-options.php:3833 msgid "Articles Categories (Do not display)" msgstr "文章分類(不顯示)" -#: options/theme-options.php:3842 options/theme-options.php:3849 +#: options/theme-options.php:3834 options/theme-options.php:3841 msgid "Fill in category ID, seperate in English\" , \" when more than one" msgstr "'填寫分類ID,多個用英文“ , ”分開" -#: options/theme-options.php:3848 +#: options/theme-options.php:3840 msgid "Image Display Category" msgstr "圖像展示分類" -#: options/theme-options.php:3855 +#: options/theme-options.php:3847 msgid "Specify Login Address" msgstr "指定登入地址" -#: options/theme-options.php:3856 +#: options/theme-options.php:3848 msgid "" "Force not to use the WordPress login page address to login, fill in the new " "login page address, such as: http://www.xxx.com/login. Note that before " @@ -3960,47 +3961,47 @@ msgstr "" "www.xxx.com/login。注意填寫前先測試下你新建的頁面是可以正常打開的,以免造成無" "法進入後台等情況。" -#: options/theme-options.php:3862 +#: options/theme-options.php:3854 msgid "Specify Registration Address" msgstr "指定註冊地址" -#: options/theme-options.php:3863 +#: options/theme-options.php:3855 msgid "" "This address is used as the registration entry on the login page, if you " "specify a login address, it is recommended to fill in" msgstr "該地址在登入頁面作為註冊入口,如果你指定了登入地址,則建議填寫" -#: options/theme-options.php:3869 +#: options/theme-options.php:3861 msgid "Version Control" msgstr "版本控制" -#: options/theme-options.php:3870 +#: options/theme-options.php:3862 msgid "Used to update front-end cookies and browser cache, can use any string" msgstr "用於更新前端Cookie和瀏覽器快取,可使用任意字符串" -#: options/theme-options.php:3876 +#: options/theme-options.php:3868 msgid "Backup&Recovery" msgstr "備份恢復" -#: options/theme-options.php:3878 +#: options/theme-options.php:3870 msgid "Backup or Recovery your theme options" msgstr "備份或恢復你的主題設定" -#: options/theme-options.php:3889 +#: options/theme-options.php:3881 msgid "About Theme" msgstr "關於主題" -#: options/theme-options.php:3895 +#: options/theme-options.php:3887 msgid "Version Info" msgstr "版本資訊" -#: options/theme-options.php:3900 +#: options/theme-options.php:3892 msgid "" "" msgstr "" -#: options/theme-options.php:3906 +#: options/theme-options.php:3898 #, php-format msgid "" "Theme Sakurairo Version %s | Internal Version %s | 項目地址" -#: options/theme-options.php:3911 +#: options/theme-options.php:3903 msgid "Update Related" msgstr "更新相關" -#: options/theme-options.php:3917 +#: options/theme-options.php:3909 msgid "Theme Update Source" msgstr "主題更新源" -#: options/theme-options.php:3923 +#: options/theme-options.php:3915 msgid "" "If you are using a server set up in mainland China, please use the Upyun " "source or the official theme source as your theme update source" @@ -4025,11 +4026,11 @@ msgstr "" "如果你使用的是架設在中國的伺服器,請使用 UPYUN 源或主題官方源作為你的主題更新" "源" -#: options/theme-options.php:3930 +#: options/theme-options.php:3922 msgid "Theme Update Test Channel Disclaimer" msgstr "主題更新測試通道免責聲明" -#: options/theme-options.php:3936 +#: options/theme-options.php:3928 msgid "" "Please copy the text in quotes after ensure that you have carefully " "understood the risks associated with participating in the test and are " @@ -4042,55 +4043,55 @@ msgstr "" "內 \"I agree and am willing to bear all unexpected consequences\" " "strong>" -#: options/theme-options.php:3942 +#: options/theme-options.php:3934 msgid "Theme Update Channel" msgstr "主題更新頻道" -#: options/theme-options.php:3949 +#: options/theme-options.php:3941 msgid "" "You can toggle the update channel here to participate in the testing of the " "new version" msgstr "你可以在此切換更新頻道以參與到新版本的測試中" -#: options/theme-options.php:3951 +#: options/theme-options.php:3943 msgid "Stable Channel" msgstr "正式通道" -#: options/theme-options.php:3952 +#: options/theme-options.php:3944 msgid "Beta Channel" msgstr "公共測試頻道" -#: options/theme-options.php:3953 +#: options/theme-options.php:3945 msgid "Preview Channel" msgstr "預覽測試頻道" -#: options/theme-options.php:3960 +#: options/theme-options.php:3952 msgid "Resource Control" msgstr "資源控制" -#: options/theme-options.php:3966 +#: options/theme-options.php:3958 msgid "Provide Critical Frontend Resource locally" msgstr "在本地提供關鍵前端資源" -#: options/theme-options.php:3967 +#: options/theme-options.php:3959 msgid "" "Enabeld by default. Critical resources are those resources whose loading " "performance will have a significant impact on the user experience." msgstr "預設為 Enabeld。關鍵資源是載入性能將對用戶體驗產生重大影響的資源。" -#: options/theme-options.php:3974 +#: options/theme-options.php:3966 msgid "Provide Other Frontend Resource locally" msgstr "在本地提供其他前端資源" -#: options/theme-options.php:3975 +#: options/theme-options.php:3967 msgid "Less important frontend resource in the theme's folder." msgstr "主題資料夾中不太重要的前端資源。" -#: options/theme-options.php:3982 +#: options/theme-options.php:3974 msgid "Provide 3rd-party library from public CDN" msgstr "從公共 CDN 提供第三方庫" -#: options/theme-options.php:3983 +#: options/theme-options.php:3975 msgid "" "When disabled, 3rd-party dependencies, which have been built to bundles " "along with themes's entry script, will be loaded from the exact same origin " @@ -4099,15 +4100,15 @@ msgstr "" "禁用后,第三方依賴項(已構建為與主題入口腳本捆綁在一起)將從與關鍵前端資源完" "全相同的源載入。" -#: options/theme-options.php:3990 +#: options/theme-options.php:3982 msgid "Public CDN Basepath" msgstr "公共 CDN 基本路徑" -#: options/theme-options.php:4002 +#: options/theme-options.php:3994 msgid "Vision Resource Basepath" msgstr "視覺資源基本路徑" -#: options/theme-options.php:4003 +#: options/theme-options.php:3995 msgid "" "This link directory structure needs to be consistent with the Sakurairo Vision " @@ -4119,31 +4120,31 @@ msgstr "" "Sakurairo_Vision\">櫻井眼視覺 存儲庫保持一致,否則可能會出現一些資源404。" "默認採用 UPYUN 提供的镜像源。" -#: options/theme-options.php:4009 +#: options/theme-options.php:4001 msgid "Theme Sponsors" msgstr "贊助資訊" -#: options/theme-options.php:4014 +#: options/theme-options.php:4006 msgid "" "" msgstr "" -#: options/theme-options.php:4019 +#: options/theme-options.php:4011 msgid "Theme Contributors" msgstr "貢獻者" -#: options/theme-options.php:4024 +#: options/theme-options.php:4016 msgid "" "" msgstr "" -#: options/theme-options.php:4029 +#: options/theme-options.php:4021 msgid "Privacy information" msgstr "隱私資訊" -#: options/theme-options.php:4034 +#: options/theme-options.php:4026 msgid "" "The theme respects your privacy
\n" "However, when you use a service provider pre-populated by the " @@ -4159,11 +4160,11 @@ msgstr "" "
您可以通過本地化與主題相關的資源來減少發送給第三方的資訊,這些資源" "預先配置了供您修改的選項
" -#: options/theme-options.php:4042 +#: options/theme-options.php:4034 msgid "Send Theme Version to Fuukei" msgstr "發送主題版到 Fuukei 官方" -#: options/theme-options.php:4043 +#: options/theme-options.php:4035 msgid "" "The theme will only send time and version information to Fuukei officials " "and the data will be cleaned regularly and used only to count version " @@ -4172,11 +4173,11 @@ msgstr "" "該主題只會向 Fuukei 官方發送時間和版本資訊,數據將定期清理並僅用於計算版本更" "新。" -#: options/theme-options.php:4049 +#: options/theme-options.php:4041 msgid "Reference Information" msgstr "引用資訊" -#: options/theme-options.php:4054 +#: options/theme-options.php:4046 msgid "" "Fluent Design Icon Referenced by Paradox Fluent Icon Pack
\n" "MUH2 Design Icon Referenced by 缄默 沐氫圖標包
\n" "白貓樣式Logo參考原主題作者白貓,由 Hyacm 提供方案並引用
" -#: options/theme-options.php:4061 +#: options/theme-options.php:4053 msgid "Dependency Information" msgstr "依賴資訊" -#: options/theme-options.php:4066 +#: options/theme-options.php:4058 msgid "" "Options Framework Relies on the Codestar Open Source Codestar Framework Project
\n" @@ -4211,7 +4212,7 @@ msgstr "" "ChatGPT 相關能力依賴 HaoZi-Team 開源 ChatGPT PHP 專案
" -#: options/theme-options.php:4073 +#: options/theme-options.php:4065 msgid "" " 'extract_theme_skin_from_cover', 'type' => 'switcher', 'title' => __('Extract Theme Color from Cover Image','sakurairo_csf'), - 'label' => __('Following options will be used as fallback (while cover image cannot be read by scripts)','sakurairo_csf'), - 'default' => false + 'label' => __('Default on, Following options will be used as fallback (while cover image cannot be read by scripts)','sakurairo_csf'), + 'default' => true ), array( @@ -3019,14 +3019,6 @@ function iro_validate_optional_url( $value ) { 'default' => 'unfold' ), - array( - 'id' => 'comment_area_shadow_color', - 'type' => 'color', - 'title' => __('Page Comment Area Shadow Color','sakurairo_csf'), - 'desc' => __('Customize the colors, suggest using a corresponding color with the background color','sakurairo_csf'), - 'default' => '#e8e8e8' - ), - array( 'id' => 'comment_area_image', 'type' => 'upload', From 64c2145d7e960b091b3dcb0d625a8cd92e7c16fd Mon Sep 17 00:00:00 2001 From: KotoriK <52659125+KotoriK@users.noreply.github.com> Date: Wed, 9 Oct 2024 11:03:45 +0800 Subject: [PATCH 008/122] =?UTF-8?q?fix(=E5=88=86=E7=B1=BB=E7=9B=AE?= =?UTF-8?q?=E5=BD=95):=20=E6=96=87=E7=AB=A0=E9=87=8D=E5=A4=8D=E6=B8=B2?= =?UTF-8?q?=E6=9F=93;=20=E4=B8=8D=E5=BA=94=E8=AF=A5=E6=B8=B2=E6=9F=93?= =?UTF-8?q?=E8=AF=B4=E8=AF=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- archive.php | 37 ++++--- tpl/content-thumb.php | 199 +------------------------------------- tpl/content-thumbcard.php | 193 ++++++++++++++++++++++++++++++++++++ 3 files changed, 219 insertions(+), 210 deletions(-) create mode 100644 tpl/content-thumbcard.php diff --git a/archive.php b/archive.php index e7302186..da920192 100644 --- a/archive.php +++ b/archive.php @@ -28,26 +28,31 @@ - - - - - + while (have_posts()) : the_post(); + get_template_part('tpl/content', 'thumbcard'); + endwhile; + } */ + // TODO: 'image_category'功能待实现 + $i = 0; + while (have_posts()) : the_post(); + $article_class = ''; + if ($i == 1) { + $article_class = ' post-list-show'; + } else { + $i++; + } + get_template_part('tpl/content', 'thumbcard'); + endwhile; ?> + + diff --git a/tpl/content-thumb.php b/tpl/content-thumb.php index e3fce131..50adaaf1 100644 --- a/tpl/content-thumb.php +++ b/tpl/content-thumb.php @@ -1,4 +1,5 @@ = esc_html(get_post_views(get_the_ID()) . ' ' . _n('Hit', 'Hits', get_post_views(get_the_ID()), 'sakurairo'))/*热度*/ ?>= esc_html($str) ?>">= esc_html($str) ?>' - . __('Your browser does not support HTML5 video.', 'sakurairo') - . ''; - break; - case 'normal': - $video_cover = get_post_meta(get_the_ID(), 'video_cover', true); - $cover_html = ''; - break; - default: - $post_img = ''; - if (has_post_thumbnail()) { - $post_thumbnail_id = get_post_thumbnail_id($post->ID); - $large_image_url = wp_get_attachment_image_src($post_thumbnail_id, 'large'); - if ($large_image_url == false) { - $large_image_url = wp_get_attachment_image_src($post_thumbnail_id, 'medium'); - if ($large_image_url == false) { - $large_image_url = wp_get_attachment_image_src($post_thumbnail_id); - if ($large_image_url == false) { - $post_img = DEFAULT_FEATURE_IMAGE(); - } - } - } - $post_img = $large_image_url[0] ?? DEFAULT_FEATURE_IMAGE('th'); - } else { - $post_img = DEFAULT_FEATURE_IMAGE('th'); - } - $cover_html = ''; - break; - } - return $cover_html; - } -} - // Combine posts and shuoshuo $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $args = array( @@ -115,112 +26,12 @@ function get_post_cover_html() { if ($combined_query->have_posts()) : while ($combined_query->have_posts()) : $combined_query->the_post(); - $i++; + $article_class = ''; if ($i == 1) { - $class = ' post-list-show'; - } - - // Determine post type - $post_type = get_post_type(); - if ($post_type == 'shuoshuo') { - // shuoshuo 样式 - $cover_html = get_post_cover_html(); - $emotion = get_post_meta(get_the_ID(), 'emotion', true); - if (empty($emotion)) { - $emotion = '\f86d'; // 默认值 - } - $emotion_color = get_post_meta(get_the_ID(), 'emotion_color', true); - if (empty($emotion_color)) { - $emotion_color = iro_opt('theme_skin_matching'); - } - $unique_id = 'shuoshuo-' . get_the_ID(); - ?> -- - - ID, POST_METADATA_KEY, true); - $excerpt = has_excerpt(); - ?> -- - \ No newline at end of file diff --git a/tpl/content-thumbcard.php b/tpl/content-thumbcard.php new file mode 100644 index 00000000..79988601 --- /dev/null +++ b/tpl/content-thumbcard.php @@ -0,0 +1,193 @@ += esc_html(get_post_views(get_the_ID()) . ' ' . _n('Hit', 'Hits', get_post_views(get_the_ID()), 'sakurairo'))/*热度*/ ?>= esc_html($str) ?>">= esc_html($str) ?>' + . __('Your browser does not support HTML5 video.', 'sakurairo') + . ''; + break; + case 'normal': + $video_cover = get_post_meta(get_the_ID(), 'video_cover', true); + $cover_html = ''; + break; + default: + $post_img = ''; + if (has_post_thumbnail()) { + $post_thumbnail_id = get_post_thumbnail_id($post->ID); + $large_image_url = wp_get_attachment_image_src($post_thumbnail_id, 'large'); + if ($large_image_url == false) { + $large_image_url = wp_get_attachment_image_src($post_thumbnail_id, 'medium'); + if ($large_image_url == false) { + $large_image_url = wp_get_attachment_image_src($post_thumbnail_id); + if ($large_image_url == false) { + $post_img = DEFAULT_FEATURE_IMAGE(); + } + } + } + $post_img = $large_image_url[0] ?? DEFAULT_FEATURE_IMAGE('th'); + } else { + $post_img = DEFAULT_FEATURE_IMAGE('th'); + } + $cover_html = ''; + break; + } + return $cover_html; + } +} + +global $article_class; + // Determine post type + $post_type = get_post_type(); + if ($post_type == 'shuoshuo') { + // shuoshuo 样式 + $cover_html = get_post_cover_html(); + $emotion = get_post_meta(get_the_ID(), 'emotion', true); + if (empty($emotion)) { + $emotion = '\f86d'; // 默认值 + } + $emotion_color = get_post_meta(get_the_ID(), 'emotion_color', true); + if (empty($emotion_color)) { + $emotion_color = iro_opt('theme_skin_matching'); + } + $unique_id = 'shuoshuo-' . get_the_ID(); + ?> +- - - --- = esc_html(poi_time_since(strtotime($post->post_date))) ?> - -- - -- -- - - --- --- - -- - -+ + + ID, POST_METADATA_KEY, true); + $excerpt = has_excerpt(); + ?> ++ + Date: Wed, 9 Oct 2024 13:57:36 +0800 Subject: [PATCH 009/122] chore --- tpl/content-thumbcard.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tpl/content-thumbcard.php b/tpl/content-thumbcard.php index 79988601..00cfac66 100644 --- a/tpl/content-thumbcard.php +++ b/tpl/content-thumbcard.php @@ -158,7 +158,7 @@ function get_post_cover_html() { $ai_excerpt = get_post_meta($post->ID, POST_METADATA_KEY, true); $excerpt = has_excerpt(); ?> -+ + + +++ = esc_html(poi_time_since(strtotime($post->post_date))) ?> + ++ + ++ ++ + + +++ +++ + ++ + ++ From 61e64cfc3ade06d704d6d9492d5af7abac5599ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9F=93=E5=B7=9D=20=E7=9E=B3?= Date: Wed, 9 Oct 2024 16:26:02 +0900 Subject: [PATCH 013/122] Daily Update --- inc/decorate.php | 13 +++++++++---- opt/options/theme-options.php | 9 --------- style.css | 12 ++++++++++-- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/inc/decorate.php b/inc/decorate.php index ea88daca..97ffb80b 100644 --- a/inc/decorate.php +++ b/inc/decorate.php @@ -345,16 +345,21 @@ function customizer_css() { ?> /*深色模式控件透明度*/ body.dark .header-info, body.dark .header-shuo, -body.dark .top-social img, +body.dark .top-social img +{color:#fff;background:rgba(51,51,51,=iro_opt('theme_darkmode_widget_transparency'); ?>);transition: all 0.6s ease-in-out;} + +body.dark .top-social_v2 i +{color:#ababab;transition: all 0.6s ease-in-out;} + body.dark .top-social i -{color:#fff;background:rgba(51,51,51,=iro_opt('theme_darkmode_widget_transparency'); ?>);} +{color:#ababab;background:rgba(51,51,51,=iro_opt('theme_darkmode_widget_transparency'); ?>);transition: all 0.6s ease-in-out;} body.dark .the-feature.from_left_and_right .info -{background-color: rgba(51,51,51,=iro_opt('theme_darkmode_widget_transparency'); ?>);} +{background-color: rgba(51,51,51,=iro_opt('theme_darkmode_widget_transparency'); ?>);transition: all 0.6s ease-in-out;} body.dark .yya, body.dark input[type=submit] -{background-color:rgba(38,38,38,=iro_opt('theme_darkmode_widget_transparency'); ?>) !important;} +{background-color:rgba(38,38,38,=iro_opt('theme_darkmode_widget_transparency'); ?>) !important;transition: all 0.6s ease-in-out;} /*深色模式自定义颜色*/ body.dark .headertop-down svg path diff --git a/opt/options/theme-options.php b/opt/options/theme-options.php index f6754707..d6ad625d 100644 --- a/opt/options/theme-options.php +++ b/opt/options/theme-options.php @@ -838,7 +838,6 @@ function iro_validate_optional_url( $value ) { 'off' => __('Off','sakurairo_csf'), 'netease' => __('Netease Cloud Music','sakurairo_csf'), 'kugou' => __('Kugou Music(may not be available)','sakurairo_csf'), - 'baidu' => __('Baidu Music(not available on servers overseas)','sakurairo_csf'), 'tencent' => __('QQ Music(may not be available)','sakurairo_csf'), ), 'default' => 'off' @@ -1833,14 +1832,6 @@ function iro_validate_optional_url( $value ) { 'display_icon/muh2' => 'https://s.nmxc.ltd/sakurairo_vision/@2.7/options/display_icon_h2.gif', 'display_icon/flat_colorful' => 'https://s.nmxc.ltd/sakurairo_vision/@2.7/options/display_icon_fc.gif', 'display_icon/sakura' => 'https://s.nmxc.ltd/sakurairo_vision/@2.7/options/display_icon_sa.gif', - 'display_icon/macaronblue' => 'https://s.nmxc.ltd/sakurairo_vision/@2.7/options/display_icon_mb.webp', - 'display_icon/macarongreen' => 'https://s.nmxc.ltd/sakurairo_vision/@2.7/options/display_icon_mg.webp', - 'display_icon/macaronpurple' => 'https://s.nmxc.ltd/sakurairo_vision/@2.7/options/display_icon_mp.webp', - 'display_icon/pink' => 'https://s.nmxc.ltd/sakurairo_vision/@2.7/options/display_icon_sp.webp', - 'display_icon/orange' => 'https://s.nmxc.ltd/sakurairo_vision/@2.7/options/display_icon_so.webp', - 'display_icon/sangosyu' => 'https://s.nmxc.ltd/sakurairo_vision/@2.7/options/display_icon_sg.webp', - 'display_icon/sora' => 'https://s.nmxc.ltd/sakurairo_vision/@2.7/options/display_icon_ts.webp', - 'display_icon/nae' => 'https://s.nmxc.ltd/sakurairo_vision/@2.7/options/display_icon_nn.webp', ), 'default' => 'display_icon/fluent_design' ), diff --git a/style.css b/style.css index 6e345ffb..4231fe19 100644 --- a/style.css +++ b/style.css @@ -2763,14 +2763,22 @@ h1.main-title { margin-bottom: -15px; list-style: none; display: inline-block; + transition: all 0.6s ease-in-out; } .top-social_v2 img, -.top-social_v2 img { +.top-social_v2 i { height: 35px; width: 35px; padding: 6px; background: 0 0; + transition: all 0.6s ease-in-out; +} + +.top-social_v2 i { + font-size: 22px; + color: var(--theme-skin-matching); + transition: all 0.6s ease-in-out; } .wechatInner img { @@ -10479,7 +10487,7 @@ body.dark .top-social img{ border: 0.5px solid rgba(51,51,51,0.7); } -body.dark .top-social i, +body.dark .top-social i:hover, body.dark .top-social img:hover { box-shadow: 0 1px 30px 2px var(--theme-skin-dark) !important; background: rgba(51, 51, 51, 0.95); From 7b3a2bfc33b49b163e3c1726150b5af4540fd05b Mon Sep 17 00:00:00 2001 From: KotoriK <52659125+KotoriK@users.noreply.github.com> Date: Wed, 9 Oct 2024 15:25:16 +0800 Subject: [PATCH 014/122] =?UTF-8?q?perf:=20=E8=BD=AC=E7=A7=BB=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E5=AE=9A=E4=B9=89=E5=88=B0css?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- functions.php | 5 ++--- style.css | 10 +++++++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/functions.php b/functions.php index 65ed1d5d..53dfa31b 100644 --- a/functions.php +++ b/functions.php @@ -2311,7 +2311,6 @@ function show_card($attr, $content = '') add_shortcode('conversations', 'conversations'); function conversations($attr, $content = '') { - $size = 40; extract(shortcode_atts(array("avatar" => "", "direction" => "", "username" => ""), $attr)); if ($avatar == "" && $username != "") { $user_id = get_user_by('login', $username)->ID; @@ -2319,9 +2318,9 @@ function conversations($attr, $content = '') $avatar = get_avatar_url($user_id, 40); } } - $output = ' Date: Thu, 10 Oct 2024 23:48:58 +0800 Subject: [PATCH 032/122] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E7=AB=AF=E5=A4=B4?= =?UTF-8?q?=E5=83=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- footer.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/footer.php b/footer.php index 201c2d6b..e455eaad 100644 --- a/footer.php +++ b/footer.php @@ -57,11 +57,14 @@'; - $output .= ""; $output .= '' . - '' . - __("Previous Post",'sakurairo') . - '' . - '' . $content . ''; + $output = ''; + $output .= ""; $output .= ''; return $output; diff --git a/style.css b/style.css index 4231fe19..22106c13 100644 --- a/style.css +++ b/style.css @@ -7602,7 +7602,15 @@ a.toc-link { transition: all 0.6s ease-in-out; -webkit-transition: all 0.6s ease-in-out; } - +.conversations-code{ + display: flex; + padding: 10px; +} +.conversations-code img{ + border-radius: 50%; + width:40px; + height: 40px; +} .conversations-code-text { margin: auto 10px; padding: 8px 14px; From 209a50fe4881aa1149084c5a85d08d04cadc7568 Mon Sep 17 00:00:00 2001 From: KotoriK <52659125+KotoriK@users.noreply.github.com> Date: Wed, 9 Oct 2024 15:25:59 +0800 Subject: [PATCH 015/122] =?UTF-8?q?feat(conversations):=20=E5=BD=93?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E4=BA=86username=E6=97=B6=EF=BC=8C=E4=BC=9A?= =?UTF-8?q?=E5=8A=A0=E5=85=A5=E4=BE=9B=E9=98=85=E8=AF=BB=E5=99=A8=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E7=9A=84=E6=8F=90=E7=A4=BA=E6=96=87=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- functions.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/functions.php b/functions.php index 53dfa31b..9af438e4 100644 --- a/functions.php +++ b/functions.php @@ -2318,9 +2318,10 @@ function conversations($attr, $content = '') $avatar = get_avatar_url($user_id, 40); } } - $output .= '' . $content . ''; + $speaker_alt = $username?''.sprintf(__("%s says: ","sakurairo"),$username).'':""; $output = ''; $output .= ""; + $output .= ''; return $output; From b5af39ef0836457293721d740898c67cf828b10e Mon Sep 17 00:00:00 2001 From: KotoriK <52659125+KotoriK@users.noreply.github.com> Date: Wed, 9 Oct 2024 15:47:10 +0800 Subject: [PATCH 016/122] =?UTF-8?q?fix(chatgpt):=20=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E4=B8=AD=E6=96=87=E6=97=B6=E5=AD=97=E7=AC=A6=E4=B8=B2=E5=88=86?= =?UTF-8?q?=E5=89=B2=E4=B8=8D=E6=AD=A3=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/chatgpt/hooks.php | 45 ++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/inc/chatgpt/hooks.php b/inc/chatgpt/hooks.php index 756c3e63..9184074f 100644 --- a/inc/chatgpt/hooks.php +++ b/inc/chatgpt/hooks.php @@ -42,43 +42,40 @@ function summon_article_excerpt(WP_Post $post) $chatGPT_access_token = iro_opt('chatgpt_access_token'); $chatGPT_prompt_init = iro_opt('chatgpt_init_prompt', DEFAULT_INIT_PROMPT); $chatGPT_model = iro_opt('chatgpt_model', DEFAULT_MODEL); - + if (empty($chatGPT_base_url) || empty($chatGPT_access_token) || empty($chatGPT_prompt_init) || empty($chatGPT_model)) { throw new Exception("Missing required ChatGPT configuration."); } - + $open_ai = new OpenAi($chatGPT_access_token); - if (str_ends_with($chatGPT_base_url, '/')) { $chatGPT_base_url = substr($chatGPT_base_url, 0, -1); } $open_ai->setBaseURL($chatGPT_base_url); - - $chat = $open_ai->chat( - [ - "model" => $chatGPT_model, - "messages" => [ - [ - "role" => "system", - "content" => $chatGPT_prompt_init - ], - [ - "role" => "user", - "content" => "Title: " . $post->post_title - ], - [ - "role" => "user", - "content" => "Context: " . substr(wp_strip_all_tags(apply_filters('the_content', $post->post_content)), 0, 4050) - ], - ] + + $chat = $open_ai->chat([ + "model" => $chatGPT_model, + "messages" => [ + [ + "role" => "system", + "content" => $chatGPT_prompt_init + ], + [ + "role" => "user", + "content" => "Title: " . $post->post_title + ], + [ + "role" => "user", + "content" => "Context: " . mb_substr(wp_strip_all_tags(apply_filters('the_content', $post->post_content)), 0, 4050) + ], ] - ); - + ]); + $decoded_chat = json_decode($chat); if (is_null($decoded_chat) || isset($decoded_chat->error)) { throw new Exception("ChatGPT error: " . json_encode($decoded_chat)); } - + return $decoded_chat->choices[0]->message->content; } } From bd6363b18bcc23e84d267f09500b737310a15416 Mon Sep 17 00:00:00 2001 From: KotoriK <52659125+KotoriK@users.noreply.github.com> Date: Wed, 9 Oct 2024 16:07:25 +0800 Subject: [PATCH 017/122] chore: update js bundle to bc27893 --- js/app.js | 2 +- js/app.js.LICENSE.txt | 2 +- js/app.js.map | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/js/app.js b/js/app.js index d539bb40..42d06fca 100644 --- a/js/app.js +++ b/js/app.js @@ -1,3 +1,3 @@ /*! For license information please see app.js.LICENSE.txt */ -(()=>{var e,t,n,o,r,s={3542:function(e){var t;t=function(){return function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={exports:{},id:o,loaded:!1};return e[o].call(r.exports,r,r.exports,n),r.loaded=!0,r.exports}return n.m=e,n.c=t,n.p="",n(0)}([function(e,t,n){var o=document.createElement("canvas");o.width=window.innerWidth,o.height=window.innerHeight,o.style.cssText="position:fixed;top:0;left:0;pointer-events:none;z-index:999999",window.addEventListener("resize",(function(){o.width=window.innerWidth,o.height=window.innerHeight})),document.body.appendChild(o);var r=o.getContext("2d"),s=[],i=0,a=!1;function c(e,t){return Math.random()*(t-e)+e}function l(e){if(u.colorful){var t=c(0,360);return"hsla("+c(t-10,t+10)+", 100%, "+c(50,80)+"%, 1)"}return window.getComputedStyle(e).color}function d(e,t,n){return{x:e,y:t,alpha:1,color:n,velocity:{x:2*Math.random()-1,y:2*Math.random()-3.5}}}function u(){for(var e=function(){var e,t=document.activeElement;if("TEXTAREA"===t.tagName||"INPUT"===t.tagName&&"text"===t.getAttribute("type")){var o=n(1)(t,t.selectionEnd);return e=t.getBoundingClientRect(),{x:o.left+e.left,y:o.top+e.top,color:l(t)}}var r=window.getSelection();if(r.rangeCount){var s=r.getRangeAt(0),i=s.startContainer;return i.nodeType===document.TEXT_NODE&&(i=i.parentNode),{x:(e=s.getBoundingClientRect()).left,y:e.top,color:l(i)}}return{x:0,y:0,color:"transparent"}}(),t=5+Math.round(10*Math.random());t--;)s[i]=d(e.x,e.y,e.color),i=(i+1)%500;if(u.shake){var o=1+2*Math.random(),r=o*(Math.random()>.5?-1:1),c=o*(Math.random()>.5?-1:1);document.body.style.marginLeft=r+"px",document.body.style.marginTop=c+"px",setTimeout((function(){document.body.style.marginLeft="",document.body.style.marginTop=""}),75)}a||requestAnimationFrame(m)}function m(){a=!0,r.clearRect(0,0,o.width,o.height);for(var e=!1,t=o.getBoundingClientRect(),n=0;n'. $speaker_alt . $content . ''; $output .= 'parseInt(l.height)&&(c.overflowY="scroll"):c.overflow="hidden",a.textContent=e.value.substring(0,o),"INPUT"===e.nodeName&&(a.textContent=a.textContent.replace(/\s/g," "));var d=document.createElement("span");d.textContent=e.value.substring(o)||".",a.appendChild(d);var u={top:d.offsetTop+parseInt(l.borderTopWidth),left:d.offsetLeft+parseInt(l.borderLeftWidth)};return s?d.style.backgroundColor="#aaa":document.body.removeChild(a),u}void 0!==e&&void 0!==e.exports?e.exports=o:window.getCaretCoordinates=o}()}])},e.exports=t()},7721:(e,t,n)=>{n.d(t,{t:()=>i,T:()=>s});n(9138);const o=_iro.cookie_version_control||"";const r=Array.from(navigator.userAgent.matchAll(/(Firefox|Chrome|Version|OPR|Edg)\/(\d+)/gi));function s(e){for(const[t,n,o]of r)if(parseFloat(o)>=e[n])return!0;return!1}const i=function(){const e=["image/*,*/*;q=0.8"];return s({Chrome:59,OPR:46,Firefox:3,Edg:79,Version:8})&&(e.push("image/apng"),s({Chrome:32,OPR:19,Firefox:65,Edg:18,Version:14})&&(!function(e,t,n){const r=n?"; expires="+new Date(Date.now()+24*n*60*60*1e3).toUTCString():"";document.cookie=e+o+"="+(t||"")+r+"; path=/"}("su_webp","1",114514),e.push("image/webp"),s({Chrome:85,OPR:71,Firefox:93})&&e.push("image/avif"))),e.reverse().join(",")}()},3451:(e,t,n)=>{n.d(t,{A:()=>a});var o=n(7925),r=n(4351);const s=["# 商业转载请联系作者获得授权,非商业转载请注明出处。","# For commercial use, please contact the author for authorization. For non-commercial use, please indicate the source.","# 协议(License):署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)","# 作者(Author):"+_iro.author_name,"# 链接(URL):"+window.location.href,"# 来源(Source):"+_iro.site_name];function i(e){const t=window.getSelection();if(t){const n=t.toString();n.length>30&&(!function(e,t){e.preventDefault();const n=s.join("
")+"
"+t.replace(/\r\n/g,"
"),o=s.join("\n")+"\n\n"+t.toString().replace(/\r\n/g,"\n");if(e.clipboardData)e.clipboardData.setData("text/html",n),e.clipboardData.setData("text/plain",o);else if(window.clipboardData)window.clipboardData.setData("text",o)}(e,n),(0,o.I)((0,r.__)("复制成功!"),1e3))}}function a(){_iro.clipboardCopyright&&(document.body.removeEventListener("copy",i),document.body.addEventListener("copy",i))}},4895:(e,t,n)=>{n.d(t,{vI:()=>p,LN:()=>w,t9:()=>v,LY:()=>h,rZ:()=>f});n(9261),n(3700),n(3632),n(1531),n(3678),n(4145);function o(e){return new Promise(((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)}))}function r(e,t){const n=indexedDB.open(e);n.onupgradeneeded=()=>n.result.createObjectStore(t);const r=o(n);return(e,n)=>r.then((o=>n(o.transaction(t,e).objectStore(t))))}const s=r("sakurairo","cache");var i=n(7721),a=n(4351),c=n(2818),l=n(7925),d=n(7156);let u=1,m="";async function h(){p(await w(!0)),u++}async function f(){u--,p(await w(!0))}const g=document.querySelector(".centerbg"),p=_iro.site_bg_as_cover?e=>{document.body.style.backgroundImage=`url(${e})`,document.dispatchEvent(new CustomEvent("coverBG_change",{detail:e}))}:g?e=>{g.style.backgroundImage=`url(${e})`,document.dispatchEvent(new CustomEvent("coverBG_change",{detail:e}))}:d.lQ;function y(e){const t=e?.match(/^url\("(.+)"\)$/);if(t)return t[1]}const v=_iro.site_bg_as_cover?()=>y(document.body.style.backgroundImage):g?()=>y(g.style.backgroundImage):d.lQ;function b(e=!1){const t=new URL(_iro.cover_api);return(0,c.F)()&&1==_iro.random_graphs_mts?(t.searchParams.set("type","mobile"),t.toString()+(e?"&"+u:"")):t.toString()+(e?(""===t.search?"?":"&")+u:"")}const w=_iro.cache_cover?(e=!1)=>{return(t="cover",s("readonly",(e=>o(e.get(t))))).then((t=>t&&t instanceof ArrayBuffer?(URL.revokeObjectURL(m),m="",m=URL.createObjectURL(new Blob([t])),m):b(e))).finally((()=>{!async function(e=!1){try{const t=await fetch(b(e),{headers:{Accept:i.t}});if(500==t.status){const e=await t.json();(0,l.I)(e.message),console.warn(e.message)}else if(t.ok){const e=await t.arrayBuffer();try{((e,t)=>{s("readwrite",(n=>(n.put(t,e),o(n.transaction))))})("cover",e)}catch(e){console.warn(e)}}}catch(e){e instanceof TypeError&&(console.warn((0,a.__)("你的封面API好像不支持跨域调用,这种情况下缓存是不会生效的哦")),(e=>{s("readwrite",(t=>(t.delete(e),o(t.transaction))))})("cover"))}}(e)}));var t}:b},9655:(e,t,n)=>{n.d(t,{ig:()=>m,jJ:()=>s,uO:()=>l,yi:()=>d});const o=window.matchMedia("(prefers-color-scheme:dark)");let r=!1;const s=()=>r;function i(e){e!==r&&(document.dispatchEvent(new CustomEvent("darkmode",{detail:e})),r=e)}function a(){localStorage.getItem("dark")||(o.matches&&_iro.darkmode?l():d())}function c(e){e==u()?localStorage.removeItem("dark"):1==e?localStorage.setItem("dark","1"):localStorage.setItem("dark","0")}function l(e){document.documentElement.style.backgroundColor="#333",document.getElementsByClassName("site-content")[0].style.backgroundColor="#333",document.body.classList.add("dark"),e&&c(!0),i(!0)}function d(e){document.documentElement.style.backgroundColor="",document.getElementsByClassName("site-content")[0].style.backgroundColor="rgba(255, 255, 255, .8)",document.body.classList.remove("dark"),document.body.classList.remove("dynamic"),i(!1),e&&c(!1)}function u(){switch(_iro.dm_strategy){case"client":return o.matches;case"eien":return!0;default:return function(){const e=new Date;return e.getHours()>21||e.getHours()<7}()}}function m(){const e=localStorage.getItem("dark");e?"1"==e?l():d():u()&&_iro.darkmode?l():d()}"client"===_iro.dm_strategy&&(o.removeEventListener?o.removeEventListener("change",a):o.removeListener(a),o.addEventListener?o.addEventListener("change",a):o.addListener(a))},8195:(e,t,n)=>{n.d(t,{J:()=>u,S:()=>l});var o=n(7925),r=n(4351),s=n(2818);let i,a;function c(e){return()=>{const{name:t}=e.dataset;t!=localStorage.getItem("font_family")&&("serif"==t?((0,s.F)()&&(0,o.I)((0,r.__)("将从网络加载字体,流量请注意")),document.body.classList.add("serif"),localStorage.setItem("font_family","serif"),d("serif")):(document.body.classList.remove("serif"),localStorage.setItem("font_family","sans-serif"),d("sans-serif")))}}function l(){const e=localStorage.getItem("font_family");e&&"serif"!=e||document.body.classList.add("serif")}function d(e){"sans-serif"===e||"sans-serif"==localStorage.getItem("font_family")?(i.classList.remove("selected"),a.classList.add("selected")):(a.classList.remove("selected"),i.classList.add("selected"))}function u(){const e=(i=document.getElementsByClassName("control-btn-serif")[0],a=document.getElementsByClassName("control-btn-sans-serif")[0],a&&i);e||localStorage.removeItem("font_family"),l(),e&&(d(),i.addEventListener("click",c(i)),a.addEventListener("click",c(a)))}},9509:(e,t,n)=>{async function o(){const e=document.getElementById("footer_yiyan");if(e){const t=_iro.yiyan_api||["https://api.maho.cc/yiyan/"];0==t.length&&console.warn("一言API: 路径为空");for(const n of t)try{const t=await r(n);e.innerText=t;break}catch(e){console.warn(`一言API: 尝试联系"${n}"时出错。 `,e);continue}}}n.d(t,{A:()=>o});const r=async e=>{const t=await fetch(e,{headers:{Accept:"application/json"}});if(t.ok){const e=await t.json(),n=("null"==e.from_who?null:e.from_who)||"",o=e.from!=e.from_who?`「${e.from}」`:"";return e.hitokoto+"——"+n+o}throw t.status}},2818:(e,t,n)=>{n.d(t,{F:()=>i,P:()=>r});let o=!1;function r(){const e=window.matchMedia("(max-width:860px)");o=e.matches,e.addEventListener?e.addEventListener("change",s):e.addListener(s)}function s(e){o=e.matches}const i=()=>o},2341:(e,t,n)=>{n.d(t,{U:()=>h,X:()=>u});var o=n(7156),r=n(2821),s=n(4351),i=n(3867),a=n(9311);const c=([e,t,n,o])=>{const r=`${e}deg,${t}%,${n}%`;return o&&1!==o?`hsla(${r},${o})`:`hsl(${r})`};let l;const d=(0,o.ai)((async function(){const e=document.location.href,t=document.querySelector("#pagination a");if(t.classList.contains("loading"))return;t.classList.add("loading"),t.innerText="";const n=await fetch(t.getAttribute("href")+"#main"),o=await n.text();if(e!=document.location.href)return;const a=(new DOMParser).parseFromString(o,"text/html"),c=a.querySelectorAll("#main .post, #shuoshuo_post"),l=a.querySelector("#pagination a"),d=l&&l.innerText,m=l&&l.getAttribute("href"),h=document.getElementById("main");for(let e=0;e"+(0,s.__)("很高兴你翻到这里,但是真的没有了...")+""}));function u(){const e=document.querySelectorAll("article.post-list-thumb");if(e){const t=new IntersectionObserver((e=>{for(const n of e){if(n.isIntersecting)n.target.classList.add("post-list-show");else if(!n.target.classList.contains("post-list-show"))return;const e=n.target;e.style.willChange="auto",t.unobserve(e);const o=e.querySelector(".post-thumb img");if(o){let t=o;o.classList.contains("lazyload")&&(t=document.createElement("img"),t.src=o.getAttribute("data-src"),t.crossOrigin="anonymous"),(0,a.Ud)(t).then((t=>{if(!t)return;const n=e.style;n.setProperty("--article-theme",`rgba(${t[0]},${t[1]},${t[2]},${t[3]/255})`),n.setProperty("--article-theme-highlight",c((0,a.hC)(t))),n.setProperty("--article-theme-foreground",c((0,a.Ot)(t)))}))}}}),{root:null,threshold:[.66]});for(const n of e)t.observe(n)}}function m(e){"pagination"==e.target.parentElement.id&&(e.preventDefault(),e.stopPropagation(),clearTimeout(l),d())}function h(){new IntersectionObserver((e=>{if(e[0].intersectionRatio<=0)return;const t=document.querySelector("#pagination a");if(t){const e=t.getAttribute("href"),n=document.getElementById("add_post_time");if(null!=e&&n){const e=n.title;"233"!=e&&(console.log("%c 自动加载时倒计时 %c","background:#9a9da2; color:#ffffff; border-radius:4px;","","",e),l=setTimeout(d,1e3*parseInt(e,10)))}}})).observe(document.querySelector(".footer-device")),document.body.removeEventListener("click",m),document.body.addEventListener("click",m)}},2036:(e,t,n)=>{function o(){for(const e of document.querySelectorAll(".showcard")){const t=e.querySelector(".img"),n=e.querySelector(".showcard-button");if(!t||!n)throw new Error("invalid structure for .showcard");t.addEventListener("mouseover",(function(){n.classList.add("hover")})),t.addEventListener("mouseout",(function(){n.classList.remove("hover")}))}}n.d(t,{A:()=>o})},9311:(e,t,n)=>{n.d(t,{Ot:()=>E,hC:()=>L,Ud:()=>y,HK:()=>_,st:()=>b});n(1531),n(3678),n(4145);let o=0;class r{w;cb={};[Symbol.dispose];constructor(e){this.w=e;const t=e=>{const t=e.data,n=t[0],o=this.cb[n];o&&(delete this.cb[n],o(t[1],t[2]))};e.addEventListener("message",t),this.postMessage=(e,...t)=>{const n=o++,r=[n,e];return new Promise(((e,o)=>{this.cb[n]=(t,n)=>{if(t)return o(new Error(t.message));e(n)},this.w.postMessage(r,...t)}))},this[Symbol.dispose]=()=>{e.removeEventListener("message",t)}}postMessage}var s=n(9655);const i={name:"rgb",min:[0,0,0],max:[255,255,255],channel:["red","green","blue"],alias:["RGB"]};i.hsl=function(e){var t,n,o=e[0]/255,r=e[1]/255,s=e[2]/255,i=Math.min(o,r,s),a=Math.max(o,r,s),c=a-i;return a===i?t=0:o===a?t=(r-s)/c:r===a?t=2+(s-o)/c:s===a&&(t=4+(o-r)/c),(t=Math.min(60*t,360))<0&&(t+=360),n=(i+a)/2,[t,100*(a===i?0:n<=.5?c/(a+i):c/(2-a-i)),100*n]};var a={name:"xyz",min:[0,0,0],channel:["X","Y","Z"],alias:["XYZ","ciexyz","cie1931"],whitepoint:{2:{A:[109.85,100,35.585],C:[98.074,100,118.232],D50:[96.422,100,82.521],D55:[95.682,100,92.149],D65:[95.045592705167,100,108.9057750759878],D75:[94.972,100,122.638],F2:[99.187,100,67.395],F7:[95.044,100,108.755],F11:[100.966,100,64.37],E:[100,100,100]},10:{A:[111.144,100,35.2],C:[97.285,100,116.145],D50:[96.72,100,81.427],D55:[95.799,100,90.926],D65:[94.811,100,107.304],D75:[94.416,100,120.641],F2:[103.28,100,69.026],F7:[95.792,100,107.687],F11:[103.866,100,65.627],E:[100,100,100]}}};a.max=a.whitepoint[2].D65,a.rgb=function(e,t){t=t||a.whitepoint[2].E;var n,o,r,s=e[0]/t[0],i=e[1]/t[1],c=e[2]/t[2];return o=-.96924363628087*s+1.87596750150772*i+.041555057407175*c,r=.055630079696993*s+-.20397695888897*i+1.056971514242878*c,n=(n=3.240969941904521*s+-1.537383177570093*i+-.498610760293*c)>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,o=o>.0031308?1.055*Math.pow(o,1/2.4)-.055:o*=12.92,r=r>.0031308?1.055*Math.pow(r,1/2.4)-.055:r*=12.92,[255*(n=Math.min(Math.max(0,n),1)),255*(o=Math.min(Math.max(0,o),1)),255*(r=Math.min(Math.max(0,r),1))]},i.xyz=function(e,t){var n=e[0]/255,o=e[1]/255,r=e[2]/255,s=.21263900587151*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.71516867876775*(o=o>.04045?Math.pow((o+.055)/1.055,2.4):o/12.92)+.072192315360733*(r=r>.04045?Math.pow((r+.055)/1.055,2.4):r/12.92),i=.019330818715591*n+.11919477979462*o+.95053215224966*r;return[(.41239079926595*n+.35758433938387*o+.18048078840183*r)*(t=t||a.whitepoint[2].E)[0],s*t[1],i*t[2]]};a.lab=function(e){var t=e[0],n=e[1],o=e[2];return n/=100,o/=108.883,t=(t/=95.047)>.008856?Math.pow(t,1/3):7.787*t+16/116,[116*(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116)-16,500*(t-n),200*(n-(o=o>.008856?Math.pow(o,1/3):7.787*o+16/116))]};Math.max(499,491,487,503);function c(e,t){const n=document.createElement("canvas"),o=n.getContext("2d");return n.height=t,n.width=e,o}function l(e,t){return new OffscreenCanvas(e,t).getContext("2d")}function d(e,t){const{naturalWidth:n,naturalHeight:o}=t,r=e(n,o);return r.drawImage(t,0,0,n,o),r.getImageData(0,0,n,o)}d.bind(void 0,c),d.bind(void 0,l);function u(e,t,n){let{naturalWidth:o,naturalHeight:r}=t;const s=o*r/n;if(s>1){const e=Math.sqrt(s);o=o/e|0,r=r/e|0}const i=e(o,r);return i.drawImage(t,0,0,o,r),i.getImageData(0,0,o,r)}const m=u.bind(void 0,c);u.bind(void 0,l);const h=getComputedStyle(document.documentElement).getPropertyValue("--theme-skin-matching"),f=new r(new Worker(new URL(n.p+n.u(8503),n.b)));let g=[0,0,0,0];function p([e,t,n,o]){return o?"hsla("+e+"deg,"+t+"%,"+n+"%,"+o+")":"hsl("+e+"deg,"+t+"%,"+n+"%)"}async function y(e){try{await function(e){return new Promise(((t,n)=>{e.complete?t():(e.addEventListener("load",(e=>{t(e)})),e.addEventListener("error",(e=>{n(e)})))}))}(e);const t=m(e,1e4);return await f.postMessage(t.data,{transfer:[t.data.buffer]})}catch(e){return console.error(e),null}}function v(e){const t=document.querySelector("meta[name=theme-color]");t&&(t.content=e)}async function b(e){const t=document.createElement("img");t.src=e,t.crossOrigin="anonymous";const n=await y(t);n?(g=n,w()):v(h)}function w(e){let t=i.hsl(g);const n=[...t];n[2]*=.5,(void 0===e?(0,s.jJ)():e)&&(t=n),v(p(t)),_iro.extract_theme_skin&&(document.documentElement.style.setProperty("--theme-skin-matching",p(t)),document.documentElement.style.setProperty("--theme-skin-dark",p(n)))}function _(){document.addEventListener("coverBG_change",(({detail:e})=>b(e))),document.addEventListener("darkmode",(({detail:e})=>w(e)))}function E(e){return i.hsl(e)[2]>40?[0,0,0,1]:[0,100,100,1]}function L(e){const t=i.hsl(e);return t[2]=Math.min(100,1.1*t[2]),t}},7894:(e,t,n)=>{n.d(t,{A:()=>i,o:()=>s});var o=n(6564);let r;function s(){r&&(r.destroy(),r=null)}async function i(){const e=document.getElementById("typed-js-initial");if(e){s();try{const t=JSON.parse(e.innerHTML),s=document.querySelector(".element");if(s.innerText="",_iro.ext_shared_lib)window.Typed||await(0,o.J)("dist/typed.umd.js","typed.js"),r=new window.Typed(s,t);else{const{default:e}=await n.e(7186).then(n.bind(n,7186));r=new e(s,t)}}catch(e){console.error("请检查typed.js设置",e)}}}},9257:(e,t,n)=>{n.d(t,{Br:()=>y,PW:()=>p,Zg:()=>f,lJ:()=>g});n(1531),n(3678),n(4145);var o=n(7156),r=n(4351),s=n(6564);const i=document.getElementById("bgvideo"),a=_iro.movies.name?.split(",")||[];let c=new Array(a.length).fill(0).map(((e,t)=>t)),l=[];const d=()=>{0==c.length&&(c=new Array(a.length).fill(0).map(((e,t)=>t)));const e=Math.floor(Math.random()*c.length);return a[c.splice(e,1)[0]]};function u(){const e=document.getElementsByClassName("video-stu")[0],t=d();e.innerHTML=(0,r.__)("正在载入视频 ..."),e.style.bottom="0px",i.setAttribute("src",new URL(t,_iro.movies.url||location.origin).toString()),i.setAttribute("video-name",(0,o.J)(t))}function m(){const e=document.getElementById("video-btn");e&&(e.classList.add("video-pause"),e.classList.remove("video-play"),e.style.display="");try{if(document.querySelector(".video-stu").style.bottom="-100px",document.querySelector(".focusinfo").style.top="-999px",_iro.float_player_on)return void Promise.all([n.e(8619),n.e(2563)]).then(n.bind(n,4052)).then((({pauseAllPlayer:e})=>{l=e(),i.play()}))}catch(e){console.warn(e)}i.play()}function h(){const e=document.getElementById("video-btn");e&&(e.classList.add("video-play"),e.classList.remove("video-pause"));try{document.querySelector(".focusinfo").style.top="49.3%"}catch{}i.pause();for(const e of l)e.play()}function f(){i&&null!=i.oncanplay&&document.querySelector(".haslive")&&document.querySelector(".videolive")&&m()}function g(){if(i&&null!=i.oncanplay&&document.querySelector(".haslive")){h();const e=document.getElementsByClassName("video-stu")[0];e.style.bottom="0px",e.innerHTML=(0,r.__)("已暂停...")}}function p(){const e=document.getElementById("video-btn");e&&e.addEventListener("click",(function(){this.classList.contains("loadvideo")?(this.classList.add("video-pause"),this.classList.remove("loadvideo"),u(),i.oncanplay=()=>{m(),document.getElementById("video-add").style.display="block",e.classList.add("videolive","haslive")}):this.classList.contains("video-pause")?(h(),e.classList.remove("videolive"),document.getElementsByClassName("video-stu")[0].style.bottom="0px",document.getElementsByClassName("video-stu")[0].innerHTML=(0,r.__)("已暂停...")):(m(),e.classList.add("videolive")),i.onended=function(){i.setAttribute("src",""),document.getElementById("video-add").style.display="none",document.querySelector(".focusinfo").style.top="49.3%",e&&(e.classList.add("loadvideo"),e.classList.remove("video-pause","videolive","haslive"),_iro.movies.loop&&e.click())}}));const t=document.getElementById("video-add");t&&t.addEventListener("click",u)}async function y(){!async function(){const e=document.querySelectorAll("video.hls");if(0==e.length)return;if(e[0].canPlayType("application/vnd.apple.mpegurl"))for(const t of e)t.src=t.dataset.src||t.src,t.autoplay=!0;else{if(!window.Hls)try{if(_iro.ext_shared_lib)await(0,s.J)("dist/hls.light.min.js","hls.js");else{const{default:e}=await n.e(4189).then(n.t.bind(n,4189,23));window.Hls=e}}catch(e){console.warn("Hls load failed: ",e)}Hls.isSupported()||console.error("Hls: Media Source Extensions is unsupported.");for(const t of e){const e=new Hls;e.loadSource(t.dataset.src||t.src),e.attachMedia(t),e.on(Hls.Events.MANIFEST_PARSED,(()=>{t.play()}))}}}(),async function(){document.querySelectorAll("video.lazyload").forEach((e=>e.addEventListener("canplay",v)))}()}function v(){this.poster=""}},7361:(e,t,n)=>{n.d(t,{u:()=>r});var o=n(4351);function r(){if(!_iro.audio)return;const e=window.AudioContext||window.webkitAudioContext;if(e){let t=0;const n=1,r=function(){const e=o.h.opt.web_audio?.sheet;return"string"==typeof e?e.split(" "):e instanceof Array?e:"880 987 1046 987 1046 1318 987 659 659 880 784 880 1046 784 659 659 698 659 698 1046 659 1046 1046 1046 987 698 698 987 987 880 987 1046 987 1046 1318 987 659 659 880 784 880 1046 784 659 698 1046 987 1046 1174 1174 1174 1046 1046 880 987 784 880 1046 1174 1318 1174 1318 1567 1046 987 1046 1318 1318 1174 784 784 880 1046 987 1174 1046 784 784 1396 1318 1174 659 1318 1046 1318 1760 1567 1567 1318 1174 1046 1046 1174 1046 1174 1567 1318 1318 1760 1567 1318 1174 1046 1046 1174 1046 1174 987 880 880 987 880".split(" ")}(),s=document.querySelectorAll(".site-title, #moblieGoTop, .site-branding, .searchbox, .changeSkin-gear, .menu-list li"),i="♪♩♫♬♭€§¶♯",a=o.h.opt.web_audio?.main_gain||1,c=new e,l=c.createGain(),d=c.createOscillator();let u;l.connect(c.destination),d.connect(l),d.type="sine",d.start(c.currentTime);let m=null;const h=e=>{if(e.currentTarget===m)return;c.resume(),m=e.currentTarget;const o=Math.round(i.length*Math.random()),s=e.pageX,h=e.pageY-5,f=document.createElement("b");f.textContent=i[o],f.style.zIndex="99999",f.style.top=h-100+"px",f.style.left=s+"px",f.style.position="absolute",f.style.color="#FF6EB4",f.style.pointerEvents="none",document.body.appendChild(f),f.animate([{top:h+"px"},{opacity:0}],{duration:500});const g=r[t]||r[t=0];t+=n,l.gain.cancelScheduledValues(c.currentTime),d.frequency.setValueAtTime(g,c.currentTime),l.gain.exponentialRampToValueAtTime(a,c.currentTime+.01),l.gain.exponentialRampToValueAtTime(.001,c.currentTime+2),l.gain.setValueAtTime(0,c.currentTime+2.1),setTimeout((()=>{f.remove(),m===e.currentTarget&&(m=null),clearTimeout(u),u=setTimeout((()=>{c.suspend(),u=void 0}),1e3)}),500)};s.forEach((e=>e.addEventListener("pointerenter",h)))}}},7925:(e,t,n)=>{function o(){const e=document.getElementsByClassName("butterBar");if(e.length>0)for(let t=0;t {o()}),"number"==typeof t?t:6e3),n}n.d(t,{I:()=>r})},2821:(e,t,n)=>{n.d(t,{A:()=>i});const o={src:"data-src",srcset:"data-srcset",selector:".lazyload",root:null,rootMargin:"0px",threshold:0};class r{constructor(e,t){this.opts={...o,...t},this.elms=e||document.querySelectorAll(this.opts.selector),this.init()}elms;obs=null;opts;init(){IntersectionObserver?(this.obs=new IntersectionObserver((e=>{for(const t of e)t.isIntersecting&&(this.obs.unobserve(t.target),this.doLoad(t.target))}),{root:this.opts.root,rootMargin:this.opts.rootMargin,threshold:[this.opts.threshold]}),this.elms.forEach((e=>{this.obs.observe(e)}))):this.load()}load(){this.opts&&this.elms.forEach(this.doLoad)}doLoad=e=>{const t=e.getAttribute(this.opts.src),n=e.getAttribute(this.opts.srcset),o=e.tagName.toLowerCase();if(t){if(e.src===t||e.style.backgroundImage.includes(t))return;"video"===o||"img"===o?e.src=t:e.style.backgroundImage="url('"+t+"')"}"img"===o&&n&&(e.srcset=n)};destroy(){this.opts&&(this.obs.disconnect(),this.opts=null)}}let s;function i(){s&&s.destroy(),s=new r}},6564:(e,t,n)=>{n.d(t,{J:()=>c,o:()=>a});const o="sakurairo_prefer_cdn",r=[["https://jsd.nmxc.ltd/npm/","@","/",""],["https://cdn.jsdelivr.net/npm/","@","/",""],["https://unpkg.com/","@","/",""]];const s=function(){const e=localStorage.getItem(o);if(e){const t=parseInt(e);return isNaN(t)||t>=r.length?(localStorage.removeItem(o),0):t}return 0}(),i={raw:r[s]},a=(e,t,n)=>String.raw(i,t,n||{"@fancyapps/fancybox":"3.5.7",prismjs:"1.29.0",lightgallery:"2.7.2",mathjax:"3.2.2","baguettebox.js":"1.11.0"}[t]||"latest",e);const c=(e,t,n)=>{const o=`${t}${n?"@"+n:""}${e}`;if(document.getElementById(o))return Promise.resolve();const r=document.createElement("script");return r.id=o,r.src=a(e,t,n),r.async=!0,new Promise(((e,n)=>{r.onload=()=>e(),r.onerror=()=>{r.remove(),n(new Error(t+"加载失败"))},document.body.append(r)})).finally((()=>{r.onload=r.onerror=null}))}},4351:(e,t,n)=>{n.d(t,{E:()=>i,_$:()=>r,__:()=>o,h:()=>s});const o=e=>window._sakurairoi18n&&_sakurairoi18n[e]||e,r=(e,...t)=>{let n=o(e);for(const e in t)n=n.replace("{"+e+"}",t[e]);return n},s={opt:{},build:{hash:"6a3b3ef",date:"2024/10/7"}},i=(e,t)=>Object.defineProperty(s,e,{value:t,writable:!1,enumerable:!0});if("_sakurairo"in window){const e=window._sakurairo;"opt"in e&&(s.opt=e.opt)}window._sakurairo=s},7156:(e,t,n)=>{n.d(t,{Gc:()=>i,J:()=>a,ai:()=>r,lQ:()=>d,mf:()=>c,tG:()=>l});n(9138),n(1531),n(3678),n(4145);let o=[];const r=e=>{let t=!1;return(...n)=>{if(!t){t=!0;try{const o=e(...n);return o instanceof Promise?o.finally((()=>t=!1)):t=!1,o}catch(e){console.warn(e),t=!1}}}},s=()=>{document.removeEventListener("DOMContentLoaded",s);for(const e of o)e();o=[]},i=function(e){if("loading"!==document.readyState)return e();0==o.length&&document.addEventListener("DOMContentLoaded",s,!1),o.push(e)},a=e=>e.replace(/\.\w+$/,"");function c(e,t=1e3,n=""){const o=e;o.status=o.status||getComputedStyle(o,null).display;const r="none"!=o.status;1==r&&"show"==n||0==r&&"hide"==n||(o.status=r?"none":"block",o.style.transition="height "+t/1e3+"s",o.style.overflow="hidden",clearTimeout(o.tagTimer),o.tagTimer=o.tagTimer||null,o.style.display="block",o.tagHeight=o.tagHeight||o.clientHeight+"px",o.style.display="",o.style.height=r?o.tagHeight:"0px",setTimeout((()=>{o.style.height=r?"0px":o.tagHeight}),0),o.tagTimer=setTimeout((()=>{o.style.display=r?"none":"block",o.style.transition="",o.style.overflow="",o.style.height="",o.status=o.tagHeight=null}),t))}function l(e,t={},n=!0){const o=new URL(e),{searchParams:r}=o;for(const[e,n]of Object.entries(t))r.set(e,n);return n&&r.set("_wpnonce",_iro.nonce),o.toString()}function d(){}},9319:(e,t,n)=>{n.d(t,{CE:()=>T,MN:()=>L,se:()=>S,PE:()=>x,uL:()=>I,of:()=>k,Zi:()=>_,p0:()=>B,oo:()=>j,sA:()=>b,Dl:()=>A,Vg:()=>C,sX:()=>E});var o=n(2821),r=n(7156),s=n(4895),i=n(2818);const a=document.getElementById("main-container");function c(){document.body.classList.toggle("navOpen"),a.classList.toggle("open"),document.getElementById("mo-nav").classList.toggle("open"),document.querySelector(".openNav").classList.toggle("open"),document.querySelector(".site-header").classList.toggle("open")}function l(){c(),document.documentElement.style.overflow="unset",a.removeEventListener("click",l)}var d=n(9257),u=n(4351);let m;function h(e,t,n,o,r,s,i){if(e){const t=e.trim().split(" "),n=o.indexOf(t[t.length-1]),r=i.indexOf(t[t.length-1]);o=(o=n<60?o.slice(0,80):o.slice(n-30,n+30)).replace(t[t.length-1],' '+t[t.length-1].toUpperCase()+" "),i=(i=r<60?i.slice(0,80):i.slice(r-30,r+30)).replace(t[t.length-1],' '+t[t.length-1].toUpperCase()+" ")}return` `}function f(e,t){let n="",o="",r="",s="",i="",a="";const c='${o}${s} ${i}
",d="",m=function(e,t){for(let e=0;e ',l=" Object.values(e).some((e=>new RegExp(t+"").test(e)))))}(e,t.trim());for(const e of m)switch(e.type){case"post":o+=h(t,e.link,"fa-inbox",e.title,"fa-comments",e.comments,e.text);break;case"tag":i+=h("",e.link,"fa-tag",e.title,"none","","");break;case"category":s+=h("",e.link,"fa-folder",e.title,"none","","");break;case"page":r+=h(t,e.link,"fa-file",e.title,"fa-comments",e.comments,e.text);break;case"comment":a+=h(t,e.link,"fa-comment",e.title,"none","",e.text)}o&&(n=n+c+(0,u.__)("文章")+d+o+l),r&&(n=n+c+(0,u.__)("页面")+d+r+l),s&&(n=n+c+(0,u.__)("分类")+d+s+l),i&&(n=n+c+(0,u.__)("标签")+d+i+l),a&&(n=n+c+(0,u.__)("评论")+d+a+l),document.getElementById("PostlistBox").innerHTML=n}function g(){const e=document.querySelector(".search_close"),t=document.getElementById("Ty");for(const n of document.getElementsByClassName("ins-selectable"))n.addEventListener("click",(()=>{t.href=n.getAttribute("href"),t.click(),e.click()}))}function p(){if(document.getElementsByClassName("js-toggle-search")[0].classList.toggle("is-active"),document.getElementsByClassName("js-search")[0].classList.toggle("is-visible"),document.documentElement.style.overflowY="hidden",_iro.live_search){m=[],function(e){const t=document.getElementById("search-input");null!=sessionStorage.getItem("search")?(m=JSON.parse(sessionStorage.getItem("search")),f(m,t.value),g()):fetch(e).then((async e=>{if(e.ok){const n=await e.text();""!=n&&(sessionStorage.setItem("search",n),m=JSON.parse(n),f(m,t.value),g())}else console.warn("HTTP "+e.status)})).catch((e=>console.warn(e)))}((0,r.tG)(_iro.api+"sakura/v1/cache_search/json"));let e=document.getElementById("search-input"),t=null;e.oninput=function(){null!=t&&clearTimeout(t),t=setTimeout((function(){f(m,e.value),g()}),250)}}}var y=n(9655),v=!0;function b(){if(!1===v){const e=document.querySelector(".pattern-center"),t=document.querySelector(".headertop-bar");e&&(e.classList.remove("pattern-center"),e.classList.add("pattern-center-sakura")),t&&(t.classList.remove("headertop-bar"),t.classList.add("headertop-bar-sakura"))}else{const e=document.querySelector(".pattern-center-sakura"),t=document.querySelector(".headertop-bar-sakura");e&&(e.classList.remove("pattern-center-sakura"),e.classList.add("pattern-center")),t&&(t.classList.remove("headertop-bar-sakura"),t.classList.add("headertop-bar"))}}async function w(e){let t;switch(v="white-bg"==e||"dark-bg"==e,b(),e){case"white-bg":if(_iro.site_bg_as_cover)return void(0,s.vI)(await(0,s.LN)());t=_iro.skin_bg0;break;case"diy1-bg":t=_iro.skin_bg1;break;case"diy2-bg":t=_iro.skin_bg2;break;case"diy3-bg":t=_iro.skin_bg3;break;case"diy4-bg":t=_iro.skin_bg4}document.body.style.backgroundImage=t?`url(${t})`:""}function _(){const e=document.getElementById("bg-next"),t=document.getElementById("bg-pre");e&&(e.onclick=s.LY),t&&(t.onclick=s.rZ)}function E(e){const t=document.getElementById("archives");if(!t)return;const n=t.getElementsByClassName("al_mon");if(e)t.addEventListener("click",(e=>{e.target.classList.contains("al_mon")&&(e.preventDefault(),(0,r.mf)(e.target.nextElementSibling,500))})),(0,o.A)();else{let e=document.getElementById("al_expand_collapse");e.style.cursor="s-resize";for(let e=0;e {e.target.classList.contains("al_mon")&&((0,r.mf)(e.target.nextElementSibling,500),e.preventDefault())})),!(0,i.F)()){for(let e=0;e ((0,r.mf)(t,500,"show"),!1)))}0}let a=!1;e.addEventListener("click",(()=>{for(const e of o)(0,r.mf)(e,500,a?"hide":"show");a=!a}))}}function L(){const e=document.querySelector(".iconflat");e&&e.addEventListener("click",(e=>{e.stopPropagation(),document.body.classList.contains("navOpen")?l():(c(),document.documentElement.style.overflow="hidden",a.addEventListener("click",l))}))}function S(){document.body.classList.contains("navOpen")&&l()}function k(){if("auto"==_iro.windowheight){if(document.querySelector("h1.main-title")){const e=document.getElementById("centerbg"),t=document.getElementById("bgvideo");e&&(e.style.height="100vh"),t&&(t.style.minHeight="100vh")}}else{const e=document.querySelector(".headertop");e&&e.classList.add("headertop-bar")}}function x(){const e=document.querySelector(".headertop");if(e){let t=document.querySelector(".blank");if(document.querySelector(".main-title")){try{t.style.paddingTop="0px"}catch(e){}e.style.height="auto",e.style.display="",_iro.movies.live&&(0,d.Zg)()}else{try{t.style.paddingTop="75px"}catch(e){}e.style.height="0px",e.style.display="none",(0,d.lJ)()}}}function T(){let e=document.querySelector(".comments-fold"),t=document.querySelector(".comments-main");null!=e&&(e.style.display="block",t.style.display="none",e.addEventListener("click",(()=>{(0,r.mf)(t,500,"show"),e.style.display="none"})));let n=document.getElementsByClassName("archives");if(n.length>0){for(let e=1;e {e.preventDefault(),e.stopPropagation(),(0,r.mf)(e.target.nextElementSibling,300)};for(let n=0;n {let e=document.getElementsByClassName("js-search")[0];e.classList.contains("is-visible")&&(document.getElementsByClassName("js-toggle-search")[0].classList.toggle("is-active"),e.classList.toggle("is-visible"),document.documentElement.style.overflowY="unset")}));try{const e=document.getElementById("loading");e.addEventListener("click",(()=>{e.classList.add("hide"),e.classList.remove("show")}))}catch(e){}}function C(){const e=document.getElementById("show-nav");e&&e.addEventListener("click",(()=>{const t=document.querySelector(".site-top .lower nav");e.classList.contains("showNav")?(e.classList.remove("showNav"),e.classList.add("hideNav"),t&&t.classList.add("navbar")):(e.classList.remove("hideNav"),e.classList.add("showNav"),t&&t.classList.remove("navbar"))}))}function I(){const e=document.querySelectorAll(".menu-list li"),t=e=>{const t=e.target.id||e.target.parentElement.id;"dark-bg"==t?(0,y.uO)(!0):((0,y.yi)(!0),w(t),localStorage.setItem("bgImgSetting",t)),A()};for(const n of e)n.addEventListener("click",t)}function B(){return w(localStorage.getItem("bgImgSetting")||"white-bg")}async function j(){_iro.site_bg_as_cover||_iro.land_at_home&&((0,s.t9)()||(0,s.vI)(await(0,s.LN)()))}function A(){document.querySelector(".skin-menu").classList.remove("show"),setTimeout((()=>{const e=document.querySelector(".changeSkin-gear");null!=e&&(e.style.visibility="visible")}),300)}},545:()=>{window.imgError=function(e,t){switch(t){case 1:e.src="https://s.nmxc.ltd/sakurairo_vision/@2.6/basic/friendlink.jpg";break;case 2:e.src="https://weavatar.com/avatar/?s=80&d=mm&r=g";break;default:e.src="https://s.nmxc.ltd/sakurairo_vision/@2.6/basic/image-404.png"}},window.cmt_showPopup=function(e){let t=e.querySelector("#thePopup");t.classList.add("show"),e.querySelector("input").onblur=()=>{t.classList.remove("show")}},window.coverVideo=function(){let e=document.getElementById("coverVideo"),t=document.getElementById("cv-pc");if(e.paused){e.play();try{t.innerHTML=''}catch{}}else{e.pause();try{t.innerHTML=''}catch{}}},window.coverVideoMute=function(){const e=document.getElementById("coverVideo"),t=document.getElementById("cv-vc");e.muted?(e.muted=!1,t.innerHTML=''):(e.muted=!0,t.innerHTML='')},window.killCoverVideo=function(){var e=document.getElementById("coverVideo"),t=document.getElementById("cv-pc");if(e.paused);else{e.pause();try{t.innerHTML=''}catch(e){}}},window.mail_me=function(){window.open("mailto:"+_iro.email_name+"@"+_iro.email_domain)},window.headertop_down=function(){let e=document.getElementById("content").getBoundingClientRect().top+window.pageYOffset;window.scrollTo({top:e,behavior:"smooth"})}},5679:(e,t,n)=>{var o=n(4895),r=n(3451),s=(n(4237),n(2821)),i=(n(545),n(7156));var a=n(7721),c=n(9509),l=n(7361),d=n(2341),u=n(9311);function m(){const{effect:e}=_iro;e&&("yuki"==e.type?n.e(7193).then(n.bind(n,7193)):n.e(4808).then(n.bind(n,4808))),async function(){const e=document.getElementById("particles-js-cfg");if(e)try{await n.e(3428).then(n.t.bind(n,3428,23)),particlesJS("particles-js",JSON.parse(e.innerHTML))}catch(e){console.error(e)}}()}var h=n(2818),f=n(8195);var g=n(9655),p=n(9319),y=n(7894),v=n(2036),b=n(3542),w=n.n(b),_=n(9257);(0,h.P)(),_iro.pjax=_iro.pjax&&(0,a.T)({Firefox:60,Edg:79,Chrome:66,OPR:53,Version:12}),_iro.pjax&&n.e(2496).then(n.bind(n,2496)).then((({default:e})=>e())),(0,p.sX)(),(0,r.A)(),setTimeout((function(){!function(){let e=document.getElementById("secondary");if((0,h.F)())e&&e.remove();else{let t=document.querySelector(".show-hide");t&&t.addEventListener("click",(()=>{e&&e.classList.toggle("active")}))}}()}),100),window.addEventListener("hashchange",(()=>{const e=location.hash.substring(1);if(!/^[A-z0-9_-]+$/.test(e))return;const t=document.getElementById(e);t&&(/^(?:a|select|input|button|textarea)$/i.test(t.tagName)||(t.tabIndex=-1),t.focus())}),!1),(0,g.ig)(),(0,i.Gc)((function(){_iro.float_player_on&&((0,h.F)()||Promise.all([n.e(8619),n.e(2563)]).then(n.bind(n,4052)).then((({aplayerInit:e})=>e()))),_iro.land_at_home&&(0,y.A)(),Promise.all([(0,p.oo)(),(0,p.p0)()]).then((()=>{if(_iro.extract_theme_skin||(0,a.T)({Version:15})){(0,u.HK)();const e=(0,o.t9)();e&&(0,u.st)(e)}})),(0,p.uL)();let e=document.querySelector("#changskin"),t=document.querySelector(".skin-menu #close-skinMenu");e&&e.addEventListener("click",(function(){document.querySelector(".skin-menu").classList.toggle("show")})),t&&t.addEventListener("click",p.Dl),function(){const e=document.querySelector(".site-header"),t=document.querySelector(".skin-menu"),n=document.querySelector("#changskin"),o=document.querySelector("#moblieGoTop"),r=t=>{t>0?e.classList.add("yya"):e.classList.remove("yya");const r=t>20?"scale(1)":"scale(0)";o.style.transform=r,n.style.transform=r};if((0,h.F)()){const e=()=>{const e=document.documentElement.scrollTop||document.body.scrollTop;t&&t.classList.remove("show"),r(e)};window.addEventListener("scroll",e)}else{const e=document.getElementById("bar"),n=n=>{const o=document.documentElement.scrollHeight||document.body.scrollHeight,r=Math.round(n/(o-window.innerHeight)*100);e.style.width=r+"%",t&&t.classList.remove("show")},o=()=>{const e=document.documentElement.scrollTop||document.body.scrollTop;n(e),r(e)};window.addEventListener("scroll",o)}}();const r=document.querySelector("#moblieGoTop");r&&(r.onclick=()=>{window.scrollTo({top:0,behavior:"smooth"})}),(0,d.U)(),(0,p.MN)(),(0,_.PW)(),(0,c.A)(),(0,p.Zi)(),(0,f.J)(),(0,p.of)(),(0,p.PE)(),(0,p.CE)(),(0,p.Vg)(),(0,l.u)(),function(){const e=document.getElementById("preload");if(e){let t=!1;const n=()=>{if(!t){if(document.documentElement.style.overflowY="unset",0!=_iro.preload_blur)try{return void(e.animate([{filter:"blur(0px)",backdropFilter:"blur(10px)",opacity:1},{backdropFilter:"blur(0px)grayscale(0)",opacity:.1},{opacity:0,filter:"blur(100px)"}],{duration:_iro.preload_blur,fill:"forwards",easing:"ease"}).onfinish=()=>{e.remove()})}catch(e){console.warn(e)}e.classList.add("hide"),e.classList.remove("show"),t=!0,setTimeout((()=>e.remove()),233)}};if("complete"===document.readyState)return n();window.addEventListener("load",n,{once:!0}),setTimeout(n,3e3)}}(),(0,s.A)(),(0,v.A)(),w().colorful=!0,w().shake=!1,document.body.addEventListener("input",w()),(0,d.X)(),(0,_.Br)(),(0,p.sA)(),m(),function(){const e="background:linear-gradient(to bottom right,#212349,#2f459d,#6486c7,#a1aec9);",t=e+"color:#fff;font-size:16px;font-family:sans-serif;font-size: 12px;border-radius: 8px; padding: 4px; box-shadow:aliceblue 0 20px;border:#6486c7 solid 1px;font-weight:bold";console.log("%cNon, le grand amour ne suffit pas.\nSeul un adieu fleurira.\nC'est notre histoire de vie, douce et amère.\n⌜La vaguelette⌟ ",e+"color:#0000;background:linear-gradient(to bottom right,#6486c7,#a1aec9) text;font-size:14px;font-family:sans-serif"),console.log("%c Sakurairo %c https://github.com/mirai-mamori/Sakurairo",t,"")}()}))},3867:(e,t,n)=>{n.d(t,{xI:()=>b});n(1531),n(3678),n(4145);var o=n(9655),r=n(4237),s=n(6564),i=n(4351);const a="1.29.0",c={autocomplete:"off",autocorrect:"off",autocapitalize:"off",spellcheck:"false",contenteditable:"false",design:"by Mashiro"};function l(e,t){if(!e.children[0])return;let n="text";const o=e.children[0].className.match(/language-(\w+)/i);o&&(n=o[1]),e.classList.add("highlight-wrap");for(const t in c)e.setAttribute(t,c[t]);t.setAttribute("data-rel",n.toUpperCase())}const d=e=>{const t=e.target;if(t.classList.contains("highlight-wrap")){if(t.classList.contains("code-block-fullscreen"))t.remove();else{const e=t.cloneNode(!0);e.classList.toggle("code-block-fullscreen"),document.body.append(e)}document.documentElement.classList.toggle("code-block-fullscreen-html-scroll")}};async function u(e,t){try{await async function(){try{window.hljs||(window.hljs=(await Promise.all([n.e(7181),n.e(1313),n.e(2803),n.e(4727),n.e(8482),n.e(1858),n.e(1869),n.e(2964),n.e(5249),n.e(2499),n.e(1004)]).then(n.bind(n,9616))).default,await n.e(1075).then(n.t.bind(n,1075,23)))}catch(e){console.warn(e)}}();for(let e=0;e {const{light:e,dark:t}=_iro.code_highlight_prism?.theme||{},n={light:e||"themes/prism.min.css",dark:t||"themes/prism-tomorrow.min.css"};for(const e in n)n[e]=new URL(n[e],m).toString();return n})();function g(e){const t=e?f.dark:f.light;if(h){if(h.href!==t){const e=(0,r.loadCSS)(t);e.addEventListener("load",(()=>{h.remove(),h=e}))}}else h=(0,r.loadCSS)(t)}const p=e=>{g(e.detail)},y=()=>document.removeEventListener("darkmode",p);async function v(){try{window.Prism||(g((0,o.jJ)()),document.addEventListener("darkmode",p),(0,r.loadCSS)(new URL("plugins/toolbar/prism-toolbar.min.css",m).toString()),(0,r.loadCSS)(new URL("plugins/previewers/prism-previewers.min.css",m).toString()),_iro.ext_shared_lib?await Promise.all([(0,s.J)("components/prism-core.min.js","prismjs",a),(0,s.J)("plugins/autoloader/prism-autoloader.min.js","prismjs",a),(0,s.J)("plugins/toolbar/prism-toolbar.min.js","prismjs",a),(0,s.J)("plugins/previewers/prism-previewers.min.js","prismjs",a),(0,s.J)("plugins/show-language/prism-show-language.min.js","prismjs",a)]):await n.e(8040).then(n.bind(n,8040)),Prism.plugins.autoloader.languages_path=new URL("components/",m).toString())}catch(e){console.warn(e)}}async function b(){const e=document.getElementsByTagName("pre"),t=document.querySelectorAll("pre code");if(!e.length)switch(_iro.code_highlight){case"hljs":return void document.body.removeEventListener("click",d);case"prism":return void y()}switch(_iro.code_highlight){case"hljs":await u(e,t);break;case"prism":await async function(e){try{let t=!1,o=!1,i=!1;_iro.code_highlight_prism.line_number_all&&(document.querySelector(".entry-content").classList.add("line-numbers"),t=!0);for(const n of e)n.parentElement.classList.contains("line-numbers")&&(t=!0),n.classList.contains("match-braces")&&(o=!0),(n.dataset.prompt||n.dataset.host||n.dataset.user)&&(i=!0);await Promise.all([v(),t&&((0,r.loadCSS)(new URL("plugins/line-numbers/prism-line-numbers.min.css",m).toString()),_iro.ext_shared_lib?(0,s.J)("plugins/line-numbers/prism-line-numbers.min.js","prismjs",a):n.e(663).then(n.t.bind(n,663,23))),o&&((0,r.loadCSS)(new URL("plugins/match-braces/prism-match-braces.min.css",m).toString()),_iro.ext_shared_lib?(0,s.J)("plugins/match-braces/prism-match-braces.min.js","prismjs",a):n.e(729).then(n.t.bind(n,729,23))),i&&((0,r.loadCSS)(new URL("plugins/command-line/prism-command-line.css",m).toString()),_iro.ext_shared_lib?(0,s.J)("plugins/command-line/prism-command-line.min.js","prismjs",a):n.e(8217).then(n.t.bind(n,8217,23)))]);for(const t of e)t.firstChild?.classList?.contains("token")||Prism.highlightElement(t);Prism.plugins.fileHighlight&&Prism.plugins.fileHighlight.highlight()}catch(e){console.warn(e)}}(t);break;case"custom":return;default:console.warn(`_iro.code_highlight这咋填的是个${_iro.code_highlight}啊🤔`)}if(t.length>0){for(let e=0;e ')}if(_iro.ext_shared_lib)await(0,s.J)("dist/clipboard.min.js","clipboard"),new ClipboardJS(".copy-code");else{new(0,(await n.e(2122).then(n.t.bind(n,2122,23))).default)(".copy-code")}}}},4237:function(e,t,n){var o;o=void 0!==n.g?n.g:this,t.loadCSS=function(e,t,n,r){var s,i=o.document,a=i.createElement("link");if(t)s=t;else{var c=(i.body||i.getElementsByTagName("head")[0]).childNodes;s=c[c.length-1]}var l=i.styleSheets;if(r)for(var d in r)r.hasOwnProperty(d)&&a.setAttribute(d,r[d]);a.rel="stylesheet",a.href=e,a.media="only x",function e(t){if(i.body)return t();setTimeout((function(){e(t)}))}((function(){s.parentNode.insertBefore(a,t?s:s.nextSibling)}));var u=function(e){for(var t=a.href,n=l.length;n--;)if(l[n].href===t)return e();setTimeout((function(){u(e)}))};function m(){a.addEventListener&&a.removeEventListener("load",m),a.media=n||"all"}return a.addEventListener&&a.addEventListener("load",m),a.onloadcssdefined=u,u(m),a}}},i={};function a(e){var t=i[e];if(void 0!==t)return t.exports;var n=i[e]={exports:{}};return s[e].call(n.exports,n,n.exports,a),n.exports}a.m=s,e=[],a.O=(t,n,o,r)=>{if(!n){var s=1/0;for(d=0;d =r)&&Object.keys(a.O).every((e=>a.O[e](n[c])))?n.splice(c--,1):(i=!1,r 0&&e[d-1][2]>r;d--)e[d]=e[d-1];e[d]=[n,o,r]},a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},n=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,a.t=function(e,o){if(1&o&&(e=this(e)),8&o)return e;if("object"==typeof e&&e){if(4&o&&e.__esModule)return e;if(16&o&&"function"==typeof e.then)return e}var r=Object.create(null);a.r(r);var s={};t=t||[null,n({}),n([]),n(n)];for(var i=2&o&&e;"object"==typeof i&&!~t.indexOf(i);i=n(i))Object.getOwnPropertyNames(i).forEach((t=>s[t]=()=>e[t]));return s.default=()=>e,a.d(r,s),r},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((t,n)=>(a.f[n](e,t),t)),[])),a.u=e=>(({2065:"lg-2",2236:"lg-12",2661:"lg-6",3042:"lg-9",5459:"lg-0",5470:"lg-5",6458:"lg-1",7435:"lg-8",8268:"lg-7",8279:"lg-4",8599:"lg-11",9256:"lg-3",9438:"lg-10"}[e]||e)+".js"),a.miniCssF=e=>e+".css",a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o={},r="sakurairo-scripts:",a.l=(e,t,n,s)=>{if(o[e])o[e].push(t);else{var i,c;if(void 0!==n)for(var l=document.getElementsByTagName("script"),d=0;d{i.onerror=i.onload=null,clearTimeout(h);var r=o[e];if(delete o[e],i.parentNode&&i.parentNode.removeChild(i),r&&r.forEach((e=>e(n))),t)return t(n)},h=setTimeout(m.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=m.bind(null,i.onerror),i.onload=m.bind(null,i.onload),c&&document.head.appendChild(i)}},a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var t=a.g.document;if(!e&&t&&(t.currentScript&&"SCRIPT"===t.currentScript.tagName.toUpperCase()&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");if(n.length)for(var o=n.length-1;o>-1&&(!e||!/^http(s?):/.test(e));)e=n[o--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})(),(()=>{if("undefined"!=typeof document){var e=e=>new Promise(((t,n)=>{var o=a.miniCssF(e),r=a.p+o;if(((e,t)=>{for(var n=document.getElementsByTagName("link"),o=0;o {var s=document.createElement("link");s.rel="stylesheet",s.type="text/css",a.nc&&(s.nonce=a.nc),s.onerror=s.onload=n=>{if(s.onerror=s.onload=null,"load"===n.type)o();else{var i=n&&n.type,a=n&&n.target&&n.target.href||t,c=new Error("Loading CSS chunk "+e+" failed.\n("+i+": "+a+")");c.name="ChunkLoadError",c.code="CSS_CHUNK_LOAD_FAILED",c.type=i,c.request=a,s.parentNode&&s.parentNode.removeChild(s),r(c)}},s.href=t,n?n.parentNode.insertBefore(s,n.nextSibling):document.head.appendChild(s)})(e,r,null,t,n)})),t={3524:0};a.f.miniCss=(n,o)=>{t[n]?o.push(t[n]):0!==t[n]&&{2563:1,9160:1}[n]&&o.push(t[n]=e(n).then((()=>{t[n]=0}),(e=>{throw delete t[n],e})))}}})(),(()=>{a.b=document.baseURI||self.location.href;var e={3524:0};a.f.j=(t,n)=>{var o=a.o(e,t)?e[t]:void 0;if(0!==o)if(o)n.push(o[2]);else if(9160!=t){var r=new Promise(((n,r)=>o=e[t]=[n,r]));n.push(o[2]=r);var s=a.p+a.u(t),i=new Error;a.l(s,(n=>{if(a.o(e,t)&&(0!==(o=e[t])&&(e[t]=void 0),o)){var r=n&&("load"===n.type?"missing":n.type),s=n&&n.target&&n.target.src;i.message="Loading chunk "+t+" failed.\n("+r+": "+s+")",i.name="ChunkLoadError",i.type=r,i.request=s,o[1](i)}}),"chunk-"+t,t)}else e[t]=0},a.O.j=t=>0===e[t];var t=(t,n)=>{var o,r,[s,i,c]=n,l=0;if(s.some((t=>0!==e[t]))){for(o in i)a.o(i,o)&&(a.m[o]=i[o]);if(c)var d=c(a)}for(t&&t(n);l a(5679)));c=a.O(c)})(); +(()=>{var e,t,n,o,r,s={3542:function(e){var t;t=function(){return function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={exports:{},id:o,loaded:!1};return e[o].call(r.exports,r,r.exports,n),r.loaded=!0,r.exports}return n.m=e,n.c=t,n.p="",n(0)}([function(e,t,n){var o=document.createElement("canvas");o.width=window.innerWidth,o.height=window.innerHeight,o.style.cssText="position:fixed;top:0;left:0;pointer-events:none;z-index:999999",window.addEventListener("resize",(function(){o.width=window.innerWidth,o.height=window.innerHeight})),document.body.appendChild(o);var r=o.getContext("2d"),s=[],i=0,a=!1;function c(e,t){return Math.random()*(t-e)+e}function l(e){if(u.colorful){var t=c(0,360);return"hsla("+c(t-10,t+10)+", 100%, "+c(50,80)+"%, 1)"}return window.getComputedStyle(e).color}function d(e,t,n){return{x:e,y:t,alpha:1,color:n,velocity:{x:2*Math.random()-1,y:2*Math.random()-3.5}}}function u(){for(var e=function(){var e,t=document.activeElement;if("TEXTAREA"===t.tagName||"INPUT"===t.tagName&&"text"===t.getAttribute("type")){var o=n(1)(t,t.selectionEnd);return e=t.getBoundingClientRect(),{x:o.left+e.left,y:o.top+e.top,color:l(t)}}var r=window.getSelection();if(r.rangeCount){var s=r.getRangeAt(0),i=s.startContainer;return i.nodeType===document.TEXT_NODE&&(i=i.parentNode),{x:(e=s.getBoundingClientRect()).left,y:e.top,color:l(i)}}return{x:0,y:0,color:"transparent"}}(),t=5+Math.round(10*Math.random());t--;)s[i]=d(e.x,e.y,e.color),i=(i+1)%500;if(u.shake){var o=1+2*Math.random(),r=o*(Math.random()>.5?-1:1),c=o*(Math.random()>.5?-1:1);document.body.style.marginLeft=r+"px",document.body.style.marginTop=c+"px",setTimeout((function(){document.body.style.marginLeft="",document.body.style.marginTop=""}),75)}a||requestAnimationFrame(m)}function m(){a=!0,r.clearRect(0,0,o.width,o.height);for(var e=!1,t=o.getBoundingClientRect(),n=0;n parseInt(l.height)&&(c.overflowY="scroll"):c.overflow="hidden",a.textContent=e.value.substring(0,o),"INPUT"===e.nodeName&&(a.textContent=a.textContent.replace(/\s/g," "));var d=document.createElement("span");d.textContent=e.value.substring(o)||".",a.appendChild(d);var u={top:d.offsetTop+parseInt(l.borderTopWidth),left:d.offsetLeft+parseInt(l.borderLeftWidth)};return s?d.style.backgroundColor="#aaa":document.body.removeChild(a),u}void 0!==e&&void 0!==e.exports?e.exports=o:window.getCaretCoordinates=o}()}])},e.exports=t()},7721:(e,t,n)=>{n.d(t,{t:()=>i,T:()=>s});n(9138);const o=_iro.cookie_version_control||"";const r=Array.from(navigator.userAgent.matchAll(/(Firefox|Chrome|Version|OPR|Edg)\/(\d+)/gi));function s(e){for(const[t,n,o]of r)if(parseFloat(o)>=e[n])return!0;return!1}const i=function(){const e=["image/*,*/*;q=0.8"];return s({Chrome:59,OPR:46,Firefox:3,Edg:79,Version:8})&&(e.push("image/apng"),s({Chrome:32,OPR:19,Firefox:65,Edg:18,Version:14})&&(!function(e,t,n){const r=n?"; expires="+new Date(Date.now()+24*n*60*60*1e3).toUTCString():"";document.cookie=e+o+"="+(t||"")+r+"; path=/"}("su_webp","1",114514),e.push("image/webp"),s({Chrome:85,OPR:71,Firefox:93})&&e.push("image/avif"))),e.reverse().join(",")}()},3451:(e,t,n)=>{n.d(t,{A:()=>a});var o=n(7925),r=n(4351);const s=["# 商业转载请联系作者获得授权,非商业转载请注明出处。","# For commercial use, please contact the author for authorization. For non-commercial use, please indicate the source.","# 协议(License):署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)","# 作者(Author):"+_iro.author_name,"# 链接(URL):"+window.location.href,"# 来源(Source):"+_iro.site_name];function i(e){const t=window.getSelection();if(t){const n=t.toString();n.length>30&&(!function(e,t){e.preventDefault();const n=s.join("
")+"
"+t.replace(/\r\n/g,"
"),o=s.join("\n")+"\n\n"+t.toString().replace(/\r\n/g,"\n");if(e.clipboardData)e.clipboardData.setData("text/html",n),e.clipboardData.setData("text/plain",o);else if(window.clipboardData)window.clipboardData.setData("text",o)}(e,n),(0,o.I)((0,r.__)("复制成功!"),1e3))}}function a(){_iro.clipboardCopyright&&(document.body.removeEventListener("copy",i),document.body.addEventListener("copy",i))}},4895:(e,t,n)=>{n.d(t,{vI:()=>p,LN:()=>w,t9:()=>v,LY:()=>h,rZ:()=>f});n(9261),n(3700),n(3632),n(1531),n(3678),n(4145);function o(e){return new Promise(((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)}))}function r(e,t){const n=indexedDB.open(e);n.onupgradeneeded=()=>n.result.createObjectStore(t);const r=o(n);return(e,n)=>r.then((o=>n(o.transaction(t,e).objectStore(t))))}const s=r("sakurairo","cache");var i=n(7721),a=n(4351),c=n(2818),l=n(7925),d=n(7156);let u=1,m="";async function h(){p(await w(!0)),u++}async function f(){u--,p(await w(!0))}const g=document.querySelector(".centerbg"),p=_iro.site_bg_as_cover?e=>{document.body.style.backgroundImage=`url(${e})`,document.dispatchEvent(new CustomEvent("coverBG_change",{detail:e}))}:g?e=>{g.style.backgroundImage=`url(${e})`,document.dispatchEvent(new CustomEvent("coverBG_change",{detail:e}))}:d.lQ;function y(e){const t=e?.match(/^url\("(.+)"\)$/);if(t)return t[1]}const v=_iro.site_bg_as_cover?()=>y(document.body.style.backgroundImage):g?()=>y(g.style.backgroundImage):d.lQ;function b(e=!1){const t=new URL(_iro.cover_api);return(0,c.F)()&&1==_iro.random_graphs_mts?(t.searchParams.set("type","mobile"),t.toString()+(e?"&"+u:"")):t.toString()+(e?(""===t.search?"?":"&")+u:"")}const w=_iro.cache_cover?(e=!1)=>{return(t="cover",s("readonly",(e=>o(e.get(t))))).then((t=>t&&t instanceof ArrayBuffer?(URL.revokeObjectURL(m),m="",m=URL.createObjectURL(new Blob([t])),m):b(e))).finally((()=>{!async function(e=!1){try{const t=await fetch(b(e),{headers:{Accept:i.t}});if(500==t.status){const e=await t.json();(0,l.I)(e.message),console.warn(e.message)}else if(t.ok){const e=await t.arrayBuffer();try{((e,t)=>{s("readwrite",(n=>(n.put(t,e),o(n.transaction))))})("cover",e)}catch(e){console.warn(e)}}}catch(e){e instanceof TypeError&&(console.warn((0,a.__)("你的封面API好像不支持跨域调用,这种情况下缓存是不会生效的哦")),(e=>{s("readwrite",(t=>(t.delete(e),o(t.transaction))))})("cover"))}}(e)}));var t}:b},9655:(e,t,n)=>{n.d(t,{ig:()=>m,jJ:()=>s,uO:()=>l,yi:()=>d});const o=window.matchMedia("(prefers-color-scheme:dark)");let r=!1;const s=()=>r;function i(e){e!==r&&(document.dispatchEvent(new CustomEvent("darkmode",{detail:e})),r=e)}function a(){localStorage.getItem("dark")||(o.matches&&_iro.darkmode?l():d())}function c(e){e==u()?localStorage.removeItem("dark"):1==e?localStorage.setItem("dark","1"):localStorage.setItem("dark","0")}function l(e){document.documentElement.style.backgroundColor="#333",document.getElementsByClassName("site-content")[0].style.backgroundColor="#333",document.body.classList.add("dark"),e&&c(!0),i(!0)}function d(e){document.documentElement.style.backgroundColor="",document.getElementsByClassName("site-content")[0].style.backgroundColor="rgba(255, 255, 255, .8)",document.body.classList.remove("dark"),document.body.classList.remove("dynamic"),i(!1),e&&c(!1)}function u(){switch(_iro.dm_strategy){case"client":return o.matches;case"eien":return!0;default:return function(){const e=new Date;return e.getHours()>21||e.getHours()<7}()}}function m(){const e=localStorage.getItem("dark");e?"1"==e?l():d():u()&&_iro.darkmode?l():d()}"client"===_iro.dm_strategy&&(o.removeEventListener?o.removeEventListener("change",a):o.removeListener(a),o.addEventListener?o.addEventListener("change",a):o.addListener(a))},8195:(e,t,n)=>{n.d(t,{J:()=>u,S:()=>l});var o=n(7925),r=n(4351),s=n(2818);let i,a;function c(e){return()=>{const{name:t}=e.dataset;t!=localStorage.getItem("font_family")&&("serif"==t?((0,s.F)()&&(0,o.I)((0,r.__)("将从网络加载字体,流量请注意")),document.body.classList.add("serif"),localStorage.setItem("font_family","serif"),d("serif")):(document.body.classList.remove("serif"),localStorage.setItem("font_family","sans-serif"),d("sans-serif")))}}function l(){const e=localStorage.getItem("font_family");e&&"serif"!=e||document.body.classList.add("serif")}function d(e){"sans-serif"===e||"sans-serif"==localStorage.getItem("font_family")?(i.classList.remove("selected"),a.classList.add("selected")):(a.classList.remove("selected"),i.classList.add("selected"))}function u(){const e=(i=document.getElementsByClassName("control-btn-serif")[0],a=document.getElementsByClassName("control-btn-sans-serif")[0],a&&i);e||localStorage.removeItem("font_family"),l(),e&&(d(),i.addEventListener("click",c(i)),a.addEventListener("click",c(a)))}},9509:(e,t,n)=>{async function o(){const e=document.getElementById("footer_yiyan");if(e){const t=_iro.yiyan_api||["https://api.maho.cc/yiyan/"];0==t.length&&console.warn("一言API: 路径为空");for(const n of t)try{const t=await r(n);e.innerText=t;break}catch(e){console.warn(`一言API: 尝试联系"${n}"时出错。 `,e);continue}}}n.d(t,{A:()=>o});const r=async e=>{const t=await fetch(e,{headers:{Accept:"application/json"}});if(t.ok){const e=await t.json(),n=("null"==e.from_who?null:e.from_who)||"",o=e.from!=e.from_who?`「${e.from}」`:"";return e.hitokoto+"——"+n+o}throw t.status}},2818:(e,t,n)=>{n.d(t,{F:()=>i,P:()=>r});let o=!1;function r(){const e=window.matchMedia("(max-width:860px)");o=e.matches,e.addEventListener?e.addEventListener("change",s):e.addListener(s)}function s(e){o=e.matches}const i=()=>o},2341:(e,t,n)=>{n.d(t,{U:()=>h,X:()=>u});var o=n(7156),r=n(2821),s=n(4351),i=n(3867),a=n(9311);const c=([e,t,n,o])=>{const r=`${e}deg,${t}%,${n}%`;return o&&1!==o?`hsla(${r},${o})`:`hsl(${r})`};let l;const d=(0,o.ai)((async function(){const e=document.location.href,t=document.querySelector("#pagination a");if(t.classList.contains("loading"))return;t.classList.add("loading"),t.innerText="";const n=await fetch(t.getAttribute("href")+"#main"),o=await n.text();if(e!=document.location.href)return;const a=(new DOMParser).parseFromString(o,"text/html"),c=a.querySelectorAll("#main .post, #shuoshuo_post"),l=a.querySelector("#pagination a"),d=l&&l.innerText,m=l&&l.getAttribute("href"),h=document.getElementById("main");for(let e=0;e"+(0,s.__)("很高兴你翻到这里,但是真的没有了...")+""}));function u(){const e=document.querySelectorAll("article.post-list-thumb,article.shuoshuo-item");if(e){const t=new IntersectionObserver((e=>{for(const n of e){if(!n.isIntersecting)continue;n.target.classList.add("post-list-show");const e=n.target,o=e.querySelector(".post-thumb img");if(t.unobserve(e),o){let t=o;o.classList.contains("lazyload")&&(t=document.createElement("img"),t.src=o.getAttribute("data-src"),t.crossOrigin="anonymous"),(0,a.Ud)(t).then((t=>{if(!t)return;const n=e.style;n.setProperty("--article-theme",`rgba(${t[0]},${t[1]},${t[2]},${t[3]/255})`),n.setProperty("--article-theme-highlight",c((0,a.hC)(t))),n.setProperty("--article-theme-foreground",c((0,a.Ot)(t)))}))}}}),{threshold:[.42]});for(const n of e)t.observe(n)}}function m(e){"pagination"==e.target.parentElement.id&&(e.preventDefault(),e.stopPropagation(),clearTimeout(l),d())}function h(){new IntersectionObserver((e=>{if(e[0].intersectionRatio<=0)return;const t=document.querySelector("#pagination a");if(t){const e=t.getAttribute("href"),n=document.getElementById("add_post_time");if(null!=e&&n){const e=n.title;"233"!=e&&(console.log("%c 自动加载时倒计时 %c","background:#9a9da2; color:#ffffff; border-radius:4px;","","",e),l=setTimeout(d,1e3*parseInt(e,10)))}}})).observe(document.querySelector(".footer-device")),document.body.removeEventListener("click",m),document.body.addEventListener("click",m)}},2036:(e,t,n)=>{function o(){for(const e of document.querySelectorAll(".showcard")){const t=e.querySelector(".img"),n=e.querySelector(".showcard-button");if(!t||!n)throw new Error("invalid structure for .showcard");t.addEventListener("mouseover",(function(){n.classList.add("hover")})),t.addEventListener("mouseout",(function(){n.classList.remove("hover")}))}}n.d(t,{A:()=>o})},9311:(e,t,n)=>{n.d(t,{Ot:()=>E,hC:()=>L,Ud:()=>y,HK:()=>_,st:()=>b});n(1531),n(3678),n(4145);let o=0;class r{w;cb={};[Symbol.dispose];constructor(e){this.w=e;const t=e=>{const t=e.data,n=t[0],o=this.cb[n];o&&(delete this.cb[n],o(t[1],t[2]))};e.addEventListener("message",t),this.postMessage=(e,...t)=>{const n=o++,r=[n,e];return new Promise(((e,o)=>{this.cb[n]=(t,n)=>{if(t)return o(new Error(t.message));e(n)},this.w.postMessage(r,...t)}))},this[Symbol.dispose]=()=>{e.removeEventListener("message",t)}}postMessage}var s=n(9655);const i={name:"rgb",min:[0,0,0],max:[255,255,255],channel:["red","green","blue"],alias:["RGB"]};i.hsl=function(e){var t,n,o=e[0]/255,r=e[1]/255,s=e[2]/255,i=Math.min(o,r,s),a=Math.max(o,r,s),c=a-i;return a===i?t=0:o===a?t=(r-s)/c:r===a?t=2+(s-o)/c:s===a&&(t=4+(o-r)/c),(t=Math.min(60*t,360))<0&&(t+=360),n=(i+a)/2,[t,100*(a===i?0:n<=.5?c/(a+i):c/(2-a-i)),100*n]};var a={name:"xyz",min:[0,0,0],channel:["X","Y","Z"],alias:["XYZ","ciexyz","cie1931"],whitepoint:{2:{A:[109.85,100,35.585],C:[98.074,100,118.232],D50:[96.422,100,82.521],D55:[95.682,100,92.149],D65:[95.045592705167,100,108.9057750759878],D75:[94.972,100,122.638],F2:[99.187,100,67.395],F7:[95.044,100,108.755],F11:[100.966,100,64.37],E:[100,100,100]},10:{A:[111.144,100,35.2],C:[97.285,100,116.145],D50:[96.72,100,81.427],D55:[95.799,100,90.926],D65:[94.811,100,107.304],D75:[94.416,100,120.641],F2:[103.28,100,69.026],F7:[95.792,100,107.687],F11:[103.866,100,65.627],E:[100,100,100]}}};a.max=a.whitepoint[2].D65,a.rgb=function(e,t){t=t||a.whitepoint[2].E;var n,o,r,s=e[0]/t[0],i=e[1]/t[1],c=e[2]/t[2];return o=-.96924363628087*s+1.87596750150772*i+.041555057407175*c,r=.055630079696993*s+-.20397695888897*i+1.056971514242878*c,n=(n=3.240969941904521*s+-1.537383177570093*i+-.498610760293*c)>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,o=o>.0031308?1.055*Math.pow(o,1/2.4)-.055:o*=12.92,r=r>.0031308?1.055*Math.pow(r,1/2.4)-.055:r*=12.92,[255*(n=Math.min(Math.max(0,n),1)),255*(o=Math.min(Math.max(0,o),1)),255*(r=Math.min(Math.max(0,r),1))]},i.xyz=function(e,t){var n=e[0]/255,o=e[1]/255,r=e[2]/255,s=.21263900587151*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.71516867876775*(o=o>.04045?Math.pow((o+.055)/1.055,2.4):o/12.92)+.072192315360733*(r=r>.04045?Math.pow((r+.055)/1.055,2.4):r/12.92),i=.019330818715591*n+.11919477979462*o+.95053215224966*r;return[(.41239079926595*n+.35758433938387*o+.18048078840183*r)*(t=t||a.whitepoint[2].E)[0],s*t[1],i*t[2]]};a.lab=function(e){var t=e[0],n=e[1],o=e[2];return n/=100,o/=108.883,t=(t/=95.047)>.008856?Math.pow(t,1/3):7.787*t+16/116,[116*(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116)-16,500*(t-n),200*(n-(o=o>.008856?Math.pow(o,1/3):7.787*o+16/116))]};Math.max(499,491,487,503);function c(e,t){const n=document.createElement("canvas"),o=n.getContext("2d");return n.height=t,n.width=e,o}function l(e,t){return new OffscreenCanvas(e,t).getContext("2d")}function d(e,t){const{naturalWidth:n,naturalHeight:o}=t,r=e(n,o);return r.drawImage(t,0,0,n,o),r.getImageData(0,0,n,o)}d.bind(void 0,c),d.bind(void 0,l);function u(e,t,n){let{naturalWidth:o,naturalHeight:r}=t;const s=o*r/n;if(s>1){const e=Math.sqrt(s);o=o/e|0,r=r/e|0}const i=e(o,r);return i.drawImage(t,0,0,o,r),i.getImageData(0,0,o,r)}const m=u.bind(void 0,c);u.bind(void 0,l);const h=getComputedStyle(document.documentElement).getPropertyValue("--theme-skin-matching"),f=new r(new Worker(new URL(n.p+n.u(8503),n.b)));let g=[0,0,0,0];function p([e,t,n,o]){return o?"hsla("+e+"deg,"+t+"%,"+n+"%,"+o+")":"hsl("+e+"deg,"+t+"%,"+n+"%)"}async function y(e){try{await function(e){return new Promise(((t,n)=>{e.complete?t():(e.addEventListener("load",(e=>{t(e)})),e.addEventListener("error",(e=>{n(e)})))}))}(e);const t=m(e,1e4);return await f.postMessage(t.data,{transfer:[t.data.buffer]})}catch(e){return console.error(e),null}}function v(e){const t=document.querySelector("meta[name=theme-color]");t&&(t.content=e)}async function b(e){const t=document.createElement("img");t.src=e,t.crossOrigin="anonymous";const n=await y(t);n?(g=n,w()):v(h)}function w(e){let t=i.hsl(g);const n=[...t];n[2]*=.5,(void 0===e?(0,s.jJ)():e)&&(t=n),v(p(t)),_iro.extract_theme_skin&&(document.documentElement.style.setProperty("--theme-skin-matching",p(t)),document.documentElement.style.setProperty("--theme-skin-dark",p(n)))}function _(){document.addEventListener("coverBG_change",(({detail:e})=>b(e))),document.addEventListener("darkmode",(({detail:e})=>w(e)))}function E(e){return i.hsl(e)[2]>40?[0,0,0,1]:[0,100,100,1]}function L(e){const t=i.hsl(e);return t[2]=Math.min(100,1.1*t[2]),t}},7894:(e,t,n)=>{n.d(t,{A:()=>i,o:()=>s});var o=n(6564);let r;function s(){r&&(r.destroy(),r=null)}async function i(){const e=document.getElementById("typed-js-initial");if(e){s();try{const t=JSON.parse(e.innerHTML),s=document.querySelector(".element");if(s.innerText="",_iro.ext_shared_lib)window.Typed||await(0,o.J)("dist/typed.umd.js","typed.js"),r=new window.Typed(s,t);else{const{default:e}=await n.e(7186).then(n.bind(n,7186));r=new e(s,t)}}catch(e){console.error("请检查typed.js设置",e)}}}},9257:(e,t,n)=>{n.d(t,{Br:()=>y,PW:()=>p,Zg:()=>f,lJ:()=>g});n(1531),n(3678),n(4145);var o=n(7156),r=n(4351),s=n(6564);const i=document.getElementById("bgvideo"),a=_iro.movies.name?.split(",")||[];let c=new Array(a.length).fill(0).map(((e,t)=>t)),l=[];const d=()=>{0==c.length&&(c=new Array(a.length).fill(0).map(((e,t)=>t)));const e=Math.floor(Math.random()*c.length);return a[c.splice(e,1)[0]]};function u(){const e=document.getElementsByClassName("video-stu")[0],t=d();e.innerHTML=(0,r.__)("正在载入视频 ..."),e.style.bottom="0px",i.setAttribute("src",new URL(t,_iro.movies.url||location.origin).toString()),i.setAttribute("video-name",(0,o.J)(t))}function m(){const e=document.getElementById("video-btn");e&&(e.classList.add("video-pause"),e.classList.remove("video-play"),e.style.display="");try{if(document.querySelector(".video-stu").style.bottom="-100px",document.querySelector(".focusinfo").style.top="-999px",_iro.float_player_on)return void Promise.all([n.e(8619),n.e(2563)]).then(n.bind(n,4052)).then((({pauseAllPlayer:e})=>{l=e(),i.play()}))}catch(e){console.warn(e)}i.play()}function h(){const e=document.getElementById("video-btn");e&&(e.classList.add("video-play"),e.classList.remove("video-pause"));try{document.querySelector(".focusinfo").style.top="49.3%"}catch{}i.pause();for(const e of l)e.play()}function f(){i&&null!=i.oncanplay&&document.querySelector(".haslive")&&document.querySelector(".videolive")&&m()}function g(){if(i&&null!=i.oncanplay&&document.querySelector(".haslive")){h();const e=document.getElementsByClassName("video-stu")[0];e.style.bottom="0px",e.innerHTML=(0,r.__)("已暂停...")}}function p(){const e=document.getElementById("video-btn");e&&e.addEventListener("click",(function(){this.classList.contains("loadvideo")?(this.classList.add("video-pause"),this.classList.remove("loadvideo"),u(),i.oncanplay=()=>{m(),document.getElementById("video-add").style.display="block",e.classList.add("videolive","haslive")}):this.classList.contains("video-pause")?(h(),e.classList.remove("videolive"),document.getElementsByClassName("video-stu")[0].style.bottom="0px",document.getElementsByClassName("video-stu")[0].innerHTML=(0,r.__)("已暂停...")):(m(),e.classList.add("videolive")),i.onended=function(){i.setAttribute("src",""),document.getElementById("video-add").style.display="none",document.querySelector(".focusinfo").style.top="49.3%",e&&(e.classList.add("loadvideo"),e.classList.remove("video-pause","videolive","haslive"),_iro.movies.loop&&e.click())}}));const t=document.getElementById("video-add");t&&t.addEventListener("click",u)}async function y(){!async function(){const e=document.querySelectorAll("video.hls");if(0==e.length)return;if(e[0].canPlayType("application/vnd.apple.mpegurl"))for(const t of e)t.src=t.dataset.src||t.src,t.autoplay=!0;else{if(!window.Hls)try{if(_iro.ext_shared_lib)await(0,s.J)("dist/hls.light.min.js","hls.js");else{const{default:e}=await n.e(4189).then(n.t.bind(n,4189,23));window.Hls=e}}catch(e){console.warn("Hls load failed: ",e)}Hls.isSupported()||console.error("Hls: Media Source Extensions is unsupported.");for(const t of e){const e=new Hls;e.loadSource(t.dataset.src||t.src),e.attachMedia(t),e.on(Hls.Events.MANIFEST_PARSED,(()=>{t.play()}))}}}(),async function(){document.querySelectorAll("video.lazyload").forEach((e=>e.addEventListener("canplay",v)))}()}function v(){this.poster=""}},7361:(e,t,n)=>{n.d(t,{u:()=>r});var o=n(4351);function r(){if(!_iro.audio)return;const e=window.AudioContext||window.webkitAudioContext;if(e){let t=0;const n=1,r=function(){const e=o.h.opt.web_audio?.sheet;return"string"==typeof e?e.split(" "):e instanceof Array?e:"880 987 1046 987 1046 1318 987 659 659 880 784 880 1046 784 659 659 698 659 698 1046 659 1046 1046 1046 987 698 698 987 987 880 987 1046 987 1046 1318 987 659 659 880 784 880 1046 784 659 698 1046 987 1046 1174 1174 1174 1046 1046 880 987 784 880 1046 1174 1318 1174 1318 1567 1046 987 1046 1318 1318 1174 784 784 880 1046 987 1174 1046 784 784 1396 1318 1174 659 1318 1046 1318 1760 1567 1567 1318 1174 1046 1046 1174 1046 1174 1567 1318 1318 1760 1567 1318 1174 1046 1046 1174 1046 1174 987 880 880 987 880".split(" ")}(),s=document.querySelectorAll(".site-title, #moblieGoTop, .site-branding, .searchbox, .changeSkin-gear, .menu-list li"),i="♪♩♫♬♭€§¶♯",a=o.h.opt.web_audio?.main_gain||1,c=new e,l=c.createGain(),d=c.createOscillator();let u;l.connect(c.destination),d.connect(l),d.type="sine",d.start(c.currentTime);let m=null;const h=e=>{if(e.currentTarget===m)return;c.resume(),m=e.currentTarget;const o=Math.round(i.length*Math.random()),s=e.pageX,h=e.pageY-5,f=document.createElement("b");f.textContent=i[o],f.style.zIndex="99999",f.style.top=h-100+"px",f.style.left=s+"px",f.style.position="absolute",f.style.color="#FF6EB4",f.style.pointerEvents="none",document.body.appendChild(f),f.animate([{top:h+"px"},{opacity:0}],{duration:500});const g=r[t]||r[t=0];t+=n,l.gain.cancelScheduledValues(c.currentTime),d.frequency.setValueAtTime(g,c.currentTime),l.gain.exponentialRampToValueAtTime(a,c.currentTime+.01),l.gain.exponentialRampToValueAtTime(.001,c.currentTime+2),l.gain.setValueAtTime(0,c.currentTime+2.1),setTimeout((()=>{f.remove(),m===e.currentTarget&&(m=null),clearTimeout(u),u=setTimeout((()=>{c.suspend(),u=void 0}),1e3)}),500)};s.forEach((e=>e.addEventListener("pointerenter",h)))}}},7925:(e,t,n)=>{function o(){const e=document.getElementsByClassName("butterBar");if(e.length>0)for(let t=0;t {o()}),"number"==typeof t?t:6e3),n}n.d(t,{I:()=>r})},2821:(e,t,n)=>{n.d(t,{A:()=>i});const o={src:"data-src",srcset:"data-srcset",selector:".lazyload",root:null,rootMargin:"0px",threshold:0};class r{constructor(e,t){this.opts={...o,...t},this.elms=e||document.querySelectorAll(this.opts.selector),this.init()}elms;obs=null;opts;init(){IntersectionObserver?(this.obs=new IntersectionObserver((e=>{for(const t of e)t.isIntersecting&&(this.obs.unobserve(t.target),this.doLoad(t.target))}),{root:this.opts.root,rootMargin:this.opts.rootMargin,threshold:[this.opts.threshold]}),this.elms.forEach((e=>{this.obs.observe(e)}))):this.load()}load(){this.opts&&this.elms.forEach(this.doLoad)}doLoad=e=>{const t=e.getAttribute(this.opts.src),n=e.getAttribute(this.opts.srcset),o=e.tagName.toLowerCase();if(t){if(e.src===t||e.style.backgroundImage.includes(t))return;"video"===o||"img"===o?e.src=t:e.style.backgroundImage="url('"+t+"')"}"img"===o&&n&&(e.srcset=n)};destroy(){this.opts&&(this.obs.disconnect(),this.opts=null)}}let s;function i(){s&&s.destroy(),s=new r}},6564:(e,t,n)=>{n.d(t,{J:()=>c,o:()=>a});const o="sakurairo_prefer_cdn",r=[["https://jsd.nmxc.ltd/npm/","@","/",""],["https://cdn.jsdelivr.net/npm/","@","/",""],["https://unpkg.com/","@","/",""]];const s=function(){const e=localStorage.getItem(o);if(e){const t=parseInt(e);return isNaN(t)||t>=r.length?(localStorage.removeItem(o),0):t}return 0}(),i={raw:r[s]},a=(e,t,n)=>String.raw(i,t,n||{"@fancyapps/fancybox":"3.5.7",prismjs:"1.29.0",lightgallery:"2.7.2",mathjax:"3.2.2","baguettebox.js":"1.11.0"}[t]||"latest",e);const c=(e,t,n)=>{const o=`${t}${n?"@"+n:""}${e}`;if(document.getElementById(o))return Promise.resolve();const r=document.createElement("script");return r.id=o,r.src=a(e,t,n),r.async=!0,new Promise(((e,n)=>{r.onload=()=>e(),r.onerror=()=>{r.remove(),n(new Error(t+"加载失败"))},document.body.append(r)})).finally((()=>{r.onload=r.onerror=null}))}},4351:(e,t,n)=>{n.d(t,{E:()=>i,_$:()=>r,__:()=>o,h:()=>s});const o=e=>window._sakurairoi18n&&_sakurairoi18n[e]||e,r=(e,...t)=>{let n=o(e);for(const e in t)n=n.replace("{"+e+"}",t[e]);return n},s={opt:{},build:{hash:"bc27893",date:"2024/10/9"}},i=(e,t)=>Object.defineProperty(s,e,{value:t,writable:!1,enumerable:!0});if("_sakurairo"in window){const e=window._sakurairo;"opt"in e&&(s.opt=e.opt)}window._sakurairo=s},7156:(e,t,n)=>{n.d(t,{Gc:()=>i,J:()=>a,ai:()=>r,lQ:()=>d,mf:()=>c,tG:()=>l});n(9138),n(1531),n(3678),n(4145);let o=[];const r=e=>{let t=!1;return(...n)=>{if(!t){t=!0;try{const o=e(...n);return o instanceof Promise?o.finally((()=>t=!1)):t=!1,o}catch(e){console.warn(e),t=!1}}}},s=()=>{document.removeEventListener("DOMContentLoaded",s);for(const e of o)e();o=[]},i=function(e){if("loading"!==document.readyState)return e();0==o.length&&document.addEventListener("DOMContentLoaded",s,!1),o.push(e)},a=e=>e.replace(/\.\w+$/,"");function c(e,t=1e3,n=""){const o=e;o.status=o.status||getComputedStyle(o,null).display;const r="none"!=o.status;1==r&&"show"==n||0==r&&"hide"==n||(o.status=r?"none":"block",o.style.transition="height "+t/1e3+"s",o.style.overflow="hidden",clearTimeout(o.tagTimer),o.tagTimer=o.tagTimer||null,o.style.display="block",o.tagHeight=o.tagHeight||o.clientHeight+"px",o.style.display="",o.style.height=r?o.tagHeight:"0px",setTimeout((()=>{o.style.height=r?"0px":o.tagHeight}),0),o.tagTimer=setTimeout((()=>{o.style.display=r?"none":"block",o.style.transition="",o.style.overflow="",o.style.height="",o.status=o.tagHeight=null}),t))}function l(e,t={},n=!0){const o=new URL(e),{searchParams:r}=o;for(const[e,n]of Object.entries(t))r.set(e,n);return n&&r.set("_wpnonce",_iro.nonce),o.toString()}function d(){}},9319:(e,t,n)=>{n.d(t,{CE:()=>T,MN:()=>L,se:()=>S,PE:()=>x,uL:()=>I,of:()=>k,Zi:()=>_,p0:()=>B,oo:()=>j,sA:()=>b,Dl:()=>A,Vg:()=>C,sX:()=>E});var o=n(2821),r=n(7156),s=n(4895),i=n(2818);const a=document.getElementById("main-container");function c(){document.body.classList.toggle("navOpen"),a.classList.toggle("open"),document.getElementById("mo-nav").classList.toggle("open"),document.querySelector(".openNav").classList.toggle("open"),document.querySelector(".site-header").classList.toggle("open")}function l(){c(),document.documentElement.style.overflow="unset",a.removeEventListener("click",l)}var d=n(9257),u=n(4351);let m;function h(e,t,n,o,r,s,i){if(e){const t=e.trim().split(" "),n=o.indexOf(t[t.length-1]),r=i.indexOf(t[t.length-1]);o=(o=n<60?o.slice(0,80):o.slice(n-30,n+30)).replace(t[t.length-1],' '+t[t.length-1].toUpperCase()+" "),i=(i=r<60?i.slice(0,80):i.slice(r-30,r+30)).replace(t[t.length-1],' '+t[t.length-1].toUpperCase()+" ")}return` `}function f(e,t){let n="",o="",r="",s="",i="",a="";const c='${o}${s} ${i}
",d="",m=function(e,t){for(let e=0;e ',l=" Object.values(e).some((e=>new RegExp(t+"").test(e)))))}(e,t.trim());for(const e of m)switch(e.type){case"post":o+=h(t,e.link,"fa-inbox",e.title,"fa-comments",e.comments,e.text);break;case"tag":i+=h("",e.link,"fa-tag",e.title,"none","","");break;case"category":s+=h("",e.link,"fa-folder",e.title,"none","","");break;case"page":r+=h(t,e.link,"fa-file",e.title,"fa-comments",e.comments,e.text);break;case"comment":a+=h(t,e.link,"fa-comment",e.title,"none","",e.text)}o&&(n=n+c+(0,u.__)("文章")+d+o+l),r&&(n=n+c+(0,u.__)("页面")+d+r+l),s&&(n=n+c+(0,u.__)("分类")+d+s+l),i&&(n=n+c+(0,u.__)("标签")+d+i+l),a&&(n=n+c+(0,u.__)("评论")+d+a+l),document.getElementById("PostlistBox").innerHTML=n}function g(){const e=document.querySelector(".search_close"),t=document.getElementById("Ty");for(const n of document.getElementsByClassName("ins-selectable"))n.addEventListener("click",(()=>{t.href=n.getAttribute("href"),t.click(),e.click()}))}function p(){if(document.getElementsByClassName("js-toggle-search")[0].classList.toggle("is-active"),document.getElementsByClassName("js-search")[0].classList.toggle("is-visible"),document.documentElement.style.overflowY="hidden",_iro.live_search){m=[],function(e){const t=document.getElementById("search-input");null!=sessionStorage.getItem("search")?(m=JSON.parse(sessionStorage.getItem("search")),f(m,t.value),g()):fetch(e).then((async e=>{if(e.ok){const n=await e.text();""!=n&&(sessionStorage.setItem("search",n),m=JSON.parse(n),f(m,t.value),g())}else console.warn("HTTP "+e.status)})).catch((e=>console.warn(e)))}((0,r.tG)(_iro.api+"sakura/v1/cache_search/json"));let e=document.getElementById("search-input"),t=null;e.oninput=function(){null!=t&&clearTimeout(t),t=setTimeout((function(){f(m,e.value),g()}),250)}}}var y=n(9655),v=!0;function b(){if(!1===v){const e=document.querySelector(".pattern-center"),t=document.querySelector(".headertop-bar");e&&(e.classList.remove("pattern-center"),e.classList.add("pattern-center-sakura")),t&&(t.classList.remove("headertop-bar"),t.classList.add("headertop-bar-sakura"))}else{const e=document.querySelector(".pattern-center-sakura"),t=document.querySelector(".headertop-bar-sakura");e&&(e.classList.remove("pattern-center-sakura"),e.classList.add("pattern-center")),t&&(t.classList.remove("headertop-bar-sakura"),t.classList.add("headertop-bar"))}}async function w(e){let t;switch(v="white-bg"==e||"dark-bg"==e,b(),e){case"white-bg":if(_iro.site_bg_as_cover)return void(0,s.vI)(await(0,s.LN)());t=_iro.skin_bg0;break;case"diy1-bg":t=_iro.skin_bg1;break;case"diy2-bg":t=_iro.skin_bg2;break;case"diy3-bg":t=_iro.skin_bg3;break;case"diy4-bg":t=_iro.skin_bg4}document.body.style.backgroundImage=t?`url(${t})`:""}function _(){const e=document.getElementById("bg-next"),t=document.getElementById("bg-pre");e&&(e.onclick=s.LY),t&&(t.onclick=s.rZ)}function E(e){const t=document.getElementById("archives");if(!t)return;const n=t.getElementsByClassName("al_mon");if(e)t.addEventListener("click",(e=>{e.target.classList.contains("al_mon")&&(e.preventDefault(),(0,r.mf)(e.target.nextElementSibling,500))})),(0,o.A)();else{let e=document.getElementById("al_expand_collapse");e.style.cursor="s-resize";for(let e=0;e {e.target.classList.contains("al_mon")&&((0,r.mf)(e.target.nextElementSibling,500),e.preventDefault())})),!(0,i.F)()){for(let e=0;e ((0,r.mf)(t,500,"show"),!1)))}0}let a=!1;e.addEventListener("click",(()=>{for(const e of o)(0,r.mf)(e,500,a?"hide":"show");a=!a}))}}function L(){const e=document.querySelector(".iconflat");e&&e.addEventListener("click",(e=>{e.stopPropagation(),document.body.classList.contains("navOpen")?l():(c(),document.documentElement.style.overflow="hidden",a.addEventListener("click",l))}))}function S(){document.body.classList.contains("navOpen")&&l()}function k(){if("auto"==_iro.windowheight){if(document.querySelector("h1.main-title")){const e=document.getElementById("centerbg"),t=document.getElementById("bgvideo");e&&(e.style.height="100vh"),t&&(t.style.minHeight="100vh")}}else{const e=document.querySelector(".headertop");e&&e.classList.add("headertop-bar")}}function x(){const e=document.querySelector(".headertop");if(e){let t=document.querySelector(".blank");if(document.querySelector(".main-title")){try{t.style.paddingTop="0px"}catch(e){}e.style.height="auto",e.style.display="",_iro.movies.live&&(0,d.Zg)()}else{try{t.style.paddingTop="75px"}catch(e){}e.style.height="0px",e.style.display="none",(0,d.lJ)()}}}function T(){let e=document.querySelector(".comments-fold"),t=document.querySelector(".comments-main");null!=e&&(e.style.display="block",t.style.display="none",e.addEventListener("click",(()=>{(0,r.mf)(t,500,"show"),e.style.display="none"})));let n=document.getElementsByClassName("archives");if(n.length>0){for(let e=1;e {e.preventDefault(),e.stopPropagation(),(0,r.mf)(e.target.nextElementSibling,300)};for(let n=0;n {let e=document.getElementsByClassName("js-search")[0];e.classList.contains("is-visible")&&(document.getElementsByClassName("js-toggle-search")[0].classList.toggle("is-active"),e.classList.toggle("is-visible"),document.documentElement.style.overflowY="unset")}));try{const e=document.getElementById("loading");e.addEventListener("click",(()=>{e.classList.add("hide"),e.classList.remove("show")}))}catch(e){}}function C(){const e=document.getElementById("show-nav");e&&e.addEventListener("click",(()=>{const t=document.querySelector(".site-top .lower nav");e.classList.contains("showNav")?(e.classList.remove("showNav"),e.classList.add("hideNav"),t&&t.classList.add("navbar")):(e.classList.remove("hideNav"),e.classList.add("showNav"),t&&t.classList.remove("navbar"))}))}function I(){const e=document.querySelectorAll(".menu-list li"),t=e=>{const t=e.target.id||e.target.parentElement.id;"dark-bg"==t?(0,y.uO)(!0):((0,y.yi)(!0),w(t),localStorage.setItem("bgImgSetting",t)),A()};for(const n of e)n.addEventListener("click",t)}function B(){return w(localStorage.getItem("bgImgSetting")||"white-bg")}async function j(){_iro.site_bg_as_cover||_iro.land_at_home&&((0,s.t9)()||(0,s.vI)(await(0,s.LN)()))}function A(){document.querySelector(".skin-menu").classList.remove("show"),setTimeout((()=>{const e=document.querySelector(".changeSkin-gear");null!=e&&(e.style.visibility="visible")}),300)}},545:()=>{window.imgError=function(e,t){switch(t){case 1:e.src="https://s.nmxc.ltd/sakurairo_vision/@2.6/basic/friendlink.jpg";break;case 2:e.src="https://weavatar.com/avatar/?s=80&d=mm&r=g";break;default:e.src="https://s.nmxc.ltd/sakurairo_vision/@2.6/basic/image-404.png"}},window.cmt_showPopup=function(e){let t=e.querySelector("#thePopup");t.classList.add("show"),e.querySelector("input").onblur=()=>{t.classList.remove("show")}},window.coverVideo=function(){let e=document.getElementById("coverVideo"),t=document.getElementById("cv-pc");if(e.paused){e.play();try{t.innerHTML=''}catch{}}else{e.pause();try{t.innerHTML=''}catch{}}},window.coverVideoMute=function(){const e=document.getElementById("coverVideo"),t=document.getElementById("cv-vc");e.muted?(e.muted=!1,t.innerHTML=''):(e.muted=!0,t.innerHTML='')},window.killCoverVideo=function(){var e=document.getElementById("coverVideo"),t=document.getElementById("cv-pc");if(e.paused);else{e.pause();try{t.innerHTML=''}catch(e){}}},window.mail_me=function(){window.open("mailto:"+_iro.email_name+"@"+_iro.email_domain)},window.headertop_down=function(){let e=document.getElementById("content").getBoundingClientRect().top+window.pageYOffset;window.scrollTo({top:e,behavior:"smooth"})}},5679:(e,t,n)=>{var o=n(4895),r=n(3451),s=(n(4237),n(2821)),i=(n(545),n(7156));var a=n(7721),c=n(9509),l=n(7361),d=n(2341),u=n(9311);function m(){const{effect:e}=_iro;e&&("yuki"==e.type?n.e(7193).then(n.bind(n,7193)):n.e(4808).then(n.bind(n,4808))),async function(){const e=document.getElementById("particles-js-cfg");if(e)try{await n.e(3428).then(n.t.bind(n,3428,23)),particlesJS("particles-js",JSON.parse(e.innerHTML))}catch(e){console.error(e)}}()}var h=n(2818),f=n(8195);var g=n(9655),p=n(9319),y=n(7894),v=n(2036),b=n(3542),w=n.n(b),_=n(9257);(0,h.P)(),_iro.pjax=_iro.pjax&&(0,a.T)({Firefox:60,Edg:79,Chrome:66,OPR:53,Version:12}),_iro.pjax&&n.e(2496).then(n.bind(n,2496)).then((({default:e})=>e())),(0,p.sX)(),(0,r.A)(),setTimeout((function(){!function(){let e=document.getElementById("secondary");if((0,h.F)())e&&e.remove();else{let t=document.querySelector(".show-hide");t&&t.addEventListener("click",(()=>{e&&e.classList.toggle("active")}))}}()}),100),window.addEventListener("hashchange",(()=>{const e=location.hash.substring(1);if(!/^[A-z0-9_-]+$/.test(e))return;const t=document.getElementById(e);t&&(/^(?:a|select|input|button|textarea)$/i.test(t.tagName)||(t.tabIndex=-1),t.focus())}),!1),(0,g.ig)(),(0,i.Gc)((function(){_iro.float_player_on&&((0,h.F)()||Promise.all([n.e(8619),n.e(2563)]).then(n.bind(n,4052)).then((({aplayerInit:e})=>e()))),_iro.land_at_home&&(0,y.A)(),Promise.all([(0,p.oo)(),(0,p.p0)()]).then((()=>{if(_iro.extract_theme_skin||(0,a.T)({Version:15})){(0,u.HK)();const e=(0,o.t9)();e&&(0,u.st)(e)}})),(0,p.uL)();let e=document.querySelector("#changskin"),t=document.querySelector(".skin-menu #close-skinMenu");e&&e.addEventListener("click",(function(){document.querySelector(".skin-menu").classList.toggle("show")})),t&&t.addEventListener("click",p.Dl),function(){const e=document.querySelector(".site-header"),t=document.querySelector(".skin-menu"),n=document.querySelector("#changskin"),o=document.querySelector("#moblieGoTop"),r=t=>{t>0?e.classList.add("yya"):e.classList.remove("yya");const r=t>20?"scale(1)":"scale(0)";o.style.transform=r,n.style.transform=r};if((0,h.F)()){const e=()=>{const e=document.documentElement.scrollTop||document.body.scrollTop;t&&t.classList.remove("show"),r(e)};window.addEventListener("scroll",e)}else{const e=document.getElementById("bar"),n=n=>{const o=document.documentElement.scrollHeight||document.body.scrollHeight,r=Math.round(n/(o-window.innerHeight)*100);e.style.width=r+"%",t&&t.classList.remove("show")},o=()=>{const e=document.documentElement.scrollTop||document.body.scrollTop;n(e),r(e)};window.addEventListener("scroll",o)}}();const r=document.querySelector("#moblieGoTop");r&&(r.onclick=()=>{window.scrollTo({top:0,behavior:"smooth"})}),(0,d.U)(),(0,p.MN)(),(0,_.PW)(),(0,c.A)(),(0,p.Zi)(),(0,f.J)(),(0,p.of)(),(0,p.PE)(),(0,p.CE)(),(0,p.Vg)(),(0,l.u)(),function(){const e=document.getElementById("preload");if(e){let t=!1;const n=()=>{if(!t){if(document.documentElement.style.overflowY="unset",0!=_iro.preload_blur)try{return void(e.animate([{filter:"blur(0px)",backdropFilter:"blur(10px)",opacity:1},{backdropFilter:"blur(0px)grayscale(0)",opacity:.1},{opacity:0,filter:"blur(100px)"}],{duration:_iro.preload_blur,fill:"forwards",easing:"ease"}).onfinish=()=>{e.remove()})}catch(e){console.warn(e)}e.classList.add("hide"),e.classList.remove("show"),t=!0,setTimeout((()=>e.remove()),233)}};if("complete"===document.readyState)return n();window.addEventListener("load",n,{once:!0}),setTimeout(n,3e3)}}(),(0,s.A)(),(0,v.A)(),w().colorful=!0,w().shake=!1,document.body.addEventListener("input",w()),(0,d.X)(),(0,_.Br)(),(0,p.sA)(),m(),function(){const e="background:linear-gradient(to bottom right,#212349,#2f459d,#6486c7,#a1aec9);",t=e+"color:#fff;font-size:16px;font-family:sans-serif;font-size: 12px;border-radius: 8px; padding: 4px; box-shadow:aliceblue 0 20px;border:#6486c7 solid 1px;font-weight:bold";console.log("%cNon, le grand amour ne suffit pas.\nSeul un adieu fleurira.\nC'est notre histoire de vie, douce et amère.\n⌜La vaguelette⌟ ",e+"color:#0000;background:linear-gradient(to bottom right,#6486c7,#a1aec9) text;font-size:14px;font-family:sans-serif"),console.log("%c Sakurairo %c https://github.com/mirai-mamori/Sakurairo",t,"")}()}))},3867:(e,t,n)=>{n.d(t,{xI:()=>b});n(1531),n(3678),n(4145);var o=n(9655),r=n(4237),s=n(6564),i=n(4351);const a="1.29.0",c={autocomplete:"off",autocorrect:"off",autocapitalize:"off",spellcheck:"false",contenteditable:"false",design:"by Mashiro"};function l(e,t){if(!e.children[0])return;let n="text";const o=e.children[0].className.match(/language-(\w+)/i);o&&(n=o[1]),e.classList.add("highlight-wrap");for(const t in c)e.setAttribute(t,c[t]);t.setAttribute("data-rel",n.toUpperCase())}const d=e=>{const t=e.target;if(t.classList.contains("highlight-wrap")){if(t.classList.contains("code-block-fullscreen"))t.remove();else{const e=t.cloneNode(!0);e.classList.toggle("code-block-fullscreen"),document.body.append(e)}document.documentElement.classList.toggle("code-block-fullscreen-html-scroll")}};async function u(e,t){try{await async function(){try{window.hljs||(window.hljs=(await Promise.all([n.e(7181),n.e(1313),n.e(2803),n.e(4727),n.e(8482),n.e(1858),n.e(1869),n.e(2964),n.e(5249),n.e(2499),n.e(1004)]).then(n.bind(n,9616))).default,await n.e(1075).then(n.t.bind(n,1075,23)))}catch(e){console.warn(e)}}();for(let e=0;e {const{light:e,dark:t}=_iro.code_highlight_prism?.theme||{},n={light:e||"themes/prism.min.css",dark:t||"themes/prism-tomorrow.min.css"};for(const e in n)n[e]=new URL(n[e],m).toString();return n})();function g(e){const t=e?f.dark:f.light;if(h){if(h.href!==t){const e=(0,r.loadCSS)(t);e.addEventListener("load",(()=>{h.remove(),h=e}))}}else h=(0,r.loadCSS)(t)}const p=e=>{g(e.detail)},y=()=>document.removeEventListener("darkmode",p);async function v(){try{window.Prism||(g((0,o.jJ)()),document.addEventListener("darkmode",p),(0,r.loadCSS)(new URL("plugins/toolbar/prism-toolbar.min.css",m).toString()),(0,r.loadCSS)(new URL("plugins/previewers/prism-previewers.min.css",m).toString()),_iro.ext_shared_lib?await Promise.all([(0,s.J)("components/prism-core.min.js","prismjs",a),(0,s.J)("plugins/autoloader/prism-autoloader.min.js","prismjs",a),(0,s.J)("plugins/toolbar/prism-toolbar.min.js","prismjs",a),(0,s.J)("plugins/previewers/prism-previewers.min.js","prismjs",a),(0,s.J)("plugins/show-language/prism-show-language.min.js","prismjs",a)]):await n.e(8040).then(n.bind(n,8040)),Prism.plugins.autoloader.languages_path=new URL("components/",m).toString())}catch(e){console.warn(e)}}async function b(){const e=document.getElementsByTagName("pre"),t=document.querySelectorAll("pre code");if(!e.length)switch(_iro.code_highlight){case"hljs":return void document.body.removeEventListener("click",d);case"prism":return void y()}switch(_iro.code_highlight){case"hljs":await u(e,t);break;case"prism":await async function(e){try{let t=!1,o=!1,i=!1;_iro.code_highlight_prism.line_number_all&&(document.querySelector(".entry-content").classList.add("line-numbers"),t=!0);for(const n of e)n.parentElement.classList.contains("line-numbers")&&(t=!0),n.classList.contains("match-braces")&&(o=!0),(n.dataset.prompt||n.dataset.host||n.dataset.user)&&(i=!0);await Promise.all([v(),t&&((0,r.loadCSS)(new URL("plugins/line-numbers/prism-line-numbers.min.css",m).toString()),_iro.ext_shared_lib?(0,s.J)("plugins/line-numbers/prism-line-numbers.min.js","prismjs",a):n.e(663).then(n.t.bind(n,663,23))),o&&((0,r.loadCSS)(new URL("plugins/match-braces/prism-match-braces.min.css",m).toString()),_iro.ext_shared_lib?(0,s.J)("plugins/match-braces/prism-match-braces.min.js","prismjs",a):n.e(729).then(n.t.bind(n,729,23))),i&&((0,r.loadCSS)(new URL("plugins/command-line/prism-command-line.css",m).toString()),_iro.ext_shared_lib?(0,s.J)("plugins/command-line/prism-command-line.min.js","prismjs",a):n.e(8217).then(n.t.bind(n,8217,23)))]);for(const t of e)t.firstChild?.classList?.contains("token")||Prism.highlightElement(t);Prism.plugins.fileHighlight&&Prism.plugins.fileHighlight.highlight()}catch(e){console.warn(e)}}(t);break;case"custom":return;default:console.warn(`_iro.code_highlight这咋填的是个${_iro.code_highlight}啊🤔`)}if(t.length>0){for(let e=0;e ')}if(_iro.ext_shared_lib)await(0,s.J)("dist/clipboard.min.js","clipboard"),new ClipboardJS(".copy-code");else{new(0,(await n.e(2122).then(n.t.bind(n,2122,23))).default)(".copy-code")}}}},4237:function(e,t,n){var o;o=void 0!==n.g?n.g:this,t.loadCSS=function(e,t,n,r){var s,i=o.document,a=i.createElement("link");if(t)s=t;else{var c=(i.body||i.getElementsByTagName("head")[0]).childNodes;s=c[c.length-1]}var l=i.styleSheets;if(r)for(var d in r)r.hasOwnProperty(d)&&a.setAttribute(d,r[d]);a.rel="stylesheet",a.href=e,a.media="only x",function e(t){if(i.body)return t();setTimeout((function(){e(t)}))}((function(){s.parentNode.insertBefore(a,t?s:s.nextSibling)}));var u=function(e){for(var t=a.href,n=l.length;n--;)if(l[n].href===t)return e();setTimeout((function(){u(e)}))};function m(){a.addEventListener&&a.removeEventListener("load",m),a.media=n||"all"}return a.addEventListener&&a.addEventListener("load",m),a.onloadcssdefined=u,u(m),a}}},i={};function a(e){var t=i[e];if(void 0!==t)return t.exports;var n=i[e]={exports:{}};return s[e].call(n.exports,n,n.exports,a),n.exports}a.m=s,e=[],a.O=(t,n,o,r)=>{if(!n){var s=1/0;for(d=0;d =r)&&Object.keys(a.O).every((e=>a.O[e](n[c])))?n.splice(c--,1):(i=!1,r 0&&e[d-1][2]>r;d--)e[d]=e[d-1];e[d]=[n,o,r]},a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},n=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,a.t=function(e,o){if(1&o&&(e=this(e)),8&o)return e;if("object"==typeof e&&e){if(4&o&&e.__esModule)return e;if(16&o&&"function"==typeof e.then)return e}var r=Object.create(null);a.r(r);var s={};t=t||[null,n({}),n([]),n(n)];for(var i=2&o&&e;"object"==typeof i&&!~t.indexOf(i);i=n(i))Object.getOwnPropertyNames(i).forEach((t=>s[t]=()=>e[t]));return s.default=()=>e,a.d(r,s),r},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((t,n)=>(a.f[n](e,t),t)),[])),a.u=e=>(({2065:"lg-2",2236:"lg-12",2661:"lg-6",3042:"lg-9",5459:"lg-0",5470:"lg-5",6458:"lg-1",7435:"lg-8",8268:"lg-7",8279:"lg-4",8599:"lg-11",9256:"lg-3",9438:"lg-10"}[e]||e)+".js"),a.miniCssF=e=>e+".css",a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o={},r="sakurairo-scripts:",a.l=(e,t,n,s)=>{if(o[e])o[e].push(t);else{var i,c;if(void 0!==n)for(var l=document.getElementsByTagName("script"),d=0;d{i.onerror=i.onload=null,clearTimeout(h);var r=o[e];if(delete o[e],i.parentNode&&i.parentNode.removeChild(i),r&&r.forEach((e=>e(n))),t)return t(n)},h=setTimeout(m.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=m.bind(null,i.onerror),i.onload=m.bind(null,i.onload),c&&document.head.appendChild(i)}},a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var t=a.g.document;if(!e&&t&&(t.currentScript&&"SCRIPT"===t.currentScript.tagName.toUpperCase()&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");if(n.length)for(var o=n.length-1;o>-1&&(!e||!/^http(s?):/.test(e));)e=n[o--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})(),(()=>{if("undefined"!=typeof document){var e=e=>new Promise(((t,n)=>{var o=a.miniCssF(e),r=a.p+o;if(((e,t)=>{for(var n=document.getElementsByTagName("link"),o=0;o {var s=document.createElement("link");s.rel="stylesheet",s.type="text/css",a.nc&&(s.nonce=a.nc),s.onerror=s.onload=n=>{if(s.onerror=s.onload=null,"load"===n.type)o();else{var i=n&&n.type,a=n&&n.target&&n.target.href||t,c=new Error("Loading CSS chunk "+e+" failed.\n("+i+": "+a+")");c.name="ChunkLoadError",c.code="CSS_CHUNK_LOAD_FAILED",c.type=i,c.request=a,s.parentNode&&s.parentNode.removeChild(s),r(c)}},s.href=t,n?n.parentNode.insertBefore(s,n.nextSibling):document.head.appendChild(s)})(e,r,null,t,n)})),t={3524:0};a.f.miniCss=(n,o)=>{t[n]?o.push(t[n]):0!==t[n]&&{2563:1,9160:1}[n]&&o.push(t[n]=e(n).then((()=>{t[n]=0}),(e=>{throw delete t[n],e})))}}})(),(()=>{a.b=document.baseURI||self.location.href;var e={3524:0};a.f.j=(t,n)=>{var o=a.o(e,t)?e[t]:void 0;if(0!==o)if(o)n.push(o[2]);else if(9160!=t){var r=new Promise(((n,r)=>o=e[t]=[n,r]));n.push(o[2]=r);var s=a.p+a.u(t),i=new Error;a.l(s,(n=>{if(a.o(e,t)&&(0!==(o=e[t])&&(e[t]=void 0),o)){var r=n&&("load"===n.type?"missing":n.type),s=n&&n.target&&n.target.src;i.message="Loading chunk "+t+" failed.\n("+r+": "+s+")",i.name="ChunkLoadError",i.type=r,i.request=s,o[1](i)}}),"chunk-"+t,t)}else e[t]=0},a.O.j=t=>0===e[t];var t=(t,n)=>{var o,r,[s,i,c]=n,l=0;if(s.some((t=>0!==e[t]))){for(o in i)a.o(i,o)&&(a.m[o]=i[o]);if(c)var d=c(a)}for(t&&t(n);l a(5679)));c=a.O(c)})(); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/js/app.js.LICENSE.txt b/js/app.js.LICENSE.txt index f9ce47c7..63b92010 100644 --- a/js/app.js.LICENSE.txt +++ b/js/app.js.LICENSE.txt @@ -1,4 +1,4 @@ -/*! iro 6a3b3ef 2024/10/7*/ +/*! iro bc27893 2024/10/9*/ /*! loadCSS. [c]2020 Filament Group, Inc. MIT License */ diff --git a/js/app.js.map b/js/app.js.map index 2fb13df5..e4c86d18 100644 --- a/js/app.js.map +++ b/js/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.js","mappings":"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","sources":["webpack://sakurairo-scripts/webpack/runtime/chunk loaded","webpack://sakurairo-scripts/webpack/runtime/create fake namespace object","webpack://sakurairo-scripts/webpack/runtime/load script","webpack://sakurairo-scripts/./node_modules/.pnpm/activate-power-mode@git+ssh+++git@github.com+Fuukei+activate-power-mode.git\u0000#af3f686f10267f8ec_xa76km7eox4vi7payqxroumraa/node_modules/activate-power-mode/dist/activate-power-mode.js","webpack://sakurairo-scripts/./src/common/cookie.ts","webpack://sakurairo-scripts/./src/app/compatibility.ts","webpack://sakurairo-scripts/./src/app/copyright.ts","webpack://sakurairo-scripts/./node_modules/.pnpm/idb-keyval@6.2.1/node_modules/idb-keyval/dist/index.js","webpack://sakurairo-scripts/./src/app/cache.ts","webpack://sakurairo-scripts/./src/app/coverBackground.ts","webpack://sakurairo-scripts/./src/app/darkmode.ts","webpack://sakurairo-scripts/./src/app/font_control.ts","webpack://sakurairo-scripts/./src/app/hitokoto.ts","webpack://sakurairo-scripts/./src/app/mobile.ts","webpack://sakurairo-scripts/./src/app/post_list.ts","webpack://sakurairo-scripts/./src/app/showcard.ts","webpack://sakurairo-scripts/./node_modules/.pnpm/@kotorik+promise-worker@0.1.0/node_modules/@kotorik/promise-worker/dist/index.mjs","webpack://sakurairo-scripts/./node_modules/.pnpm/color-space@2.0.1/node_modules/color-space/rgb.js","webpack://sakurairo-scripts/./node_modules/.pnpm/color-space@2.0.1/node_modules/color-space/hsl.js","webpack://sakurairo-scripts/./node_modules/.pnpm/color-space@2.0.1/node_modules/color-space/xyz.js","webpack://sakurairo-scripts/./node_modules/.pnpm/color-space@2.0.1/node_modules/color-space/lab.js","webpack://sakurairo-scripts/./node_modules/.pnpm/@kotorik+palette@3.0.4/node_modules/@kotorik/palette/dist/index.js","webpack://sakurairo-scripts/./src/app/theme-color/index.ts","webpack://sakurairo-scripts/./src/app/typed.ts","webpack://sakurairo-scripts/./src/app/video.ts","webpack://sakurairo-scripts/./src/app/web_audio.ts","webpack://sakurairo-scripts/./src/common/butterbar.ts","webpack://sakurairo-scripts/./node_modules/.pnpm/lazyload@https+++codeload.github.com+KotoriK+lazyload+tar.gz+82d55720d3076d66f0efa3ee44505a00_zlmltryyoiytzoax633icq5k7m/node_modules/lazyload/src/lazyload.ts","webpack://sakurairo-scripts/./src/common/lazyload.ts","webpack://sakurairo-scripts/./src/common/npmLib.ts","webpack://sakurairo-scripts/./src/common/sakurairo_global.ts","webpack://sakurairo-scripts/./src/common/util.ts","webpack://sakurairo-scripts/./src/app/mobile_nav.ts","webpack://sakurairo-scripts/./src/app/search.ts","webpack://sakurairo-scripts/./src/app/func.js","webpack://sakurairo-scripts/./src/app/global-func.js","webpack://sakurairo-scripts/./src/app/effect.js","webpack://sakurairo-scripts/./src/app/index.js","webpack://sakurairo-scripts/./src/app/scroll_handler.ts","webpack://sakurairo-scripts/./src/app/preload_screen.ts","webpack://sakurairo-scripts/./src/app/about_us.ts","webpack://sakurairo-scripts/./src/common/code-highlight.js","webpack://sakurairo-scripts/./node_modules/.pnpm/fg-loadcss@3.1.0/node_modules/fg-loadcss/src/loadCSS.js","webpack://sakurairo-scripts/webpack/bootstrap","webpack://sakurairo-scripts/webpack/runtime/compat get default export","webpack://sakurairo-scripts/webpack/runtime/define property getters","webpack://sakurairo-scripts/webpack/runtime/ensure chunk","webpack://sakurairo-scripts/webpack/runtime/get javascript chunk filename","webpack://sakurairo-scripts/webpack/runtime/get mini-css chunk filename","webpack://sakurairo-scripts/webpack/runtime/global","webpack://sakurairo-scripts/webpack/runtime/hasOwnProperty shorthand","webpack://sakurairo-scripts/webpack/runtime/make namespace object","webpack://sakurairo-scripts/webpack/runtime/publicPath","webpack://sakurairo-scripts/webpack/runtime/css loading","webpack://sakurairo-scripts/webpack/runtime/jsonp chunk loading","webpack://sakurairo-scripts/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"sakurairo-scripts:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"POWERMODE\"] = factory();\n\telse\n\t\troot[\"POWERMODE\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar canvas = document.createElement('canvas');\n\tcanvas.width = window.innerWidth;\n\tcanvas.height = window.innerHeight;\n\tcanvas.style.cssText = 'position:fixed;top:0;left:0;pointer-events:none;z-index:999999';\n\twindow.addEventListener('resize', function () {\n\t canvas.width = window.innerWidth;\n\t canvas.height = window.innerHeight;\n\t});\n\tdocument.body.appendChild(canvas);\n\tvar context = canvas.getContext('2d');\n\tvar particles = [];\n\tvar particlePointer = 0;\n\tvar rendering = false;\n\n\tPOWERMODE.shake = true;\n\n\tfunction getRandom(min, max) {\n\t return Math.random() * (max - min) + min;\n\t}\n\n\tfunction getColor(el) {\n\t if (POWERMODE.colorful) {\n\t var u = getRandom(0, 360);\n\t return 'hsla(' + getRandom(u - 10, u + 10) + ', 100%, ' + getRandom(50, 80) + '%, ' + 1 + ')';\n\t } else {\n\t return window.getComputedStyle(el).color;\n\t }\n\t}\n\n\tfunction getCaret() {\n\t var el = document.activeElement;\n\t var bcr;\n\t if (el.tagName === 'TEXTAREA' ||\n\t (el.tagName === 'INPUT' && el.getAttribute('type') === 'text')) {\n\t var offset = __webpack_require__(1)(el, el.selectionEnd);\n\t bcr = el.getBoundingClientRect();\n\t return {\n\t x: offset.left + bcr.left,\n\t y: offset.top + bcr.top,\n\t color: getColor(el)\n\t };\n\t }\n\t var selection = window.getSelection();\n\t if (selection.rangeCount) {\n\t var range = selection.getRangeAt(0);\n\t var startNode = range.startContainer;\n\t if (startNode.nodeType === document.TEXT_NODE) {\n\t startNode = startNode.parentNode;\n\t }\n\t bcr = range.getBoundingClientRect();\n\t return {\n\t x: bcr.left,\n\t y: bcr.top,\n\t color: getColor(startNode)\n\t };\n\t }\n\t return { x: 0, y: 0, color: 'transparent' };\n\t}\n\n\tfunction createParticle(x, y, color) {\n\t return {\n\t x: x,\n\t y: y,\n\t alpha: 1,\n\t color: color,\n\t velocity: {\n\t x: -1 + Math.random() * 2,\n\t y: -3.5 + Math.random() * 2\n\t }\n\t };\n\t}\n\n\tfunction POWERMODE() {\n\t { // spawn particles\n\t var caret = getCaret();\n\t var numParticles = 5 + Math.round(Math.random() * 10);\n\t while (numParticles--) {\n\t particles[particlePointer] = createParticle(caret.x, caret.y, caret.color);\n\t particlePointer = (particlePointer + 1) % 500;\n\t }\n\t }\n\t { // shake screen\n\t if (POWERMODE.shake) {\n\t var intensity = 1 + 2 * Math.random();\n\t var x = intensity * (Math.random() > 0.5 ? -1 : 1);\n\t var y = intensity * (Math.random() > 0.5 ? -1 : 1);\n\t document.body.style.marginLeft = x + 'px';\n\t document.body.style.marginTop = y + 'px';\n\t setTimeout(function() {\n\t document.body.style.marginLeft = '';\n\t document.body.style.marginTop = '';\n\t }, 75);\n\t }\n\t }\n\t if(!rendering){\n\t requestAnimationFrame(loop);\n\t }\n\t};\n\tPOWERMODE.colorful = false;\n\n\tfunction loop() {\n\t rendering = true;\n\t context.clearRect(0, 0, canvas.width, canvas.height);\n\t var rendered = false;\n\t var rect = canvas.getBoundingClientRect();\n\t for (var i = 0; i < particles.length; ++i) {\n\t var particle = particles[i];\n\t if (particle.alpha <= 0.1) continue;\n\t particle.velocity.y += 0.075;\n\t particle.x += particle.velocity.x;\n\t particle.y += particle.velocity.y;\n\t particle.alpha *= 0.96;\n\t context.globalAlpha = particle.alpha;\n\t context.fillStyle = particle.color;\n\t context.fillRect(\n\t Math.round(particle.x - 1.5) - rect.left,\n\t Math.round(particle.y - 1.5) - rect.top,\n\t 3, 3\n\t );\n\t rendered = true;\n\t }\n\t if(rendered){\n\t requestAnimationFrame(loop);\n\t }else{\n\t rendering = false;\n\t }\n\t}\n\n\tmodule.exports = POWERMODE;\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports) {\n\n\t/* jshint browser: true */\n\n\t(function () {\n\n\t// The properties that we copy into a mirrored div.\n\t// Note that some browsers, such as Firefox,\n\t// do not concatenate properties, i.e. padding-top, bottom etc. -> padding,\n\t// so we have to do every single property specifically.\n\tvar properties = [\n\t 'direction', // RTL support\n\t 'boxSizing',\n\t 'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does\n\t 'height',\n\t 'overflowX',\n\t 'overflowY', // copy the scrollbar for IE\n\n\t 'borderTopWidth',\n\t 'borderRightWidth',\n\t 'borderBottomWidth',\n\t 'borderLeftWidth',\n\t 'borderStyle',\n\n\t 'paddingTop',\n\t 'paddingRight',\n\t 'paddingBottom',\n\t 'paddingLeft',\n\n\t // https://developer.mozilla.org/en-US/docs/Web/CSS/font\n\t 'fontStyle',\n\t 'fontVariant',\n\t 'fontWeight',\n\t 'fontStretch',\n\t 'fontSize',\n\t 'fontSizeAdjust',\n\t 'lineHeight',\n\t 'fontFamily',\n\n\t 'textAlign',\n\t 'textTransform',\n\t 'textIndent',\n\t 'textDecoration', // might not make a difference, but better be safe\n\n\t 'letterSpacing',\n\t 'wordSpacing',\n\n\t 'tabSize',\n\t 'MozTabSize'\n\n\t];\n\n\tvar isFirefox = window.mozInnerScreenX != null;\n\n\tfunction getCaretCoordinates(element, position, options) {\n\n\t var debug = options && options.debug || false;\n\t if (debug) {\n\t var el = document.querySelector('#input-textarea-caret-position-mirror-div');\n\t if ( el ) { el.parentNode.removeChild(el); }\n\t }\n\n\t // mirrored div\n\t var div = document.createElement('div');\n\t div.id = 'input-textarea-caret-position-mirror-div';\n\t document.body.appendChild(div);\n\n\t var style = div.style;\n\t var computed = window.getComputedStyle? getComputedStyle(element) : element.currentStyle; // currentStyle for IE < 9\n\n\t // default textarea styles\n\t style.whiteSpace = 'pre-wrap';\n\t if (element.nodeName !== 'INPUT')\n\t style.wordWrap = 'break-word'; // only for textarea-s\n\n\t // position off-screen\n\t style.position = 'absolute'; // required to return coordinates properly\n\t if (!debug)\n\t style.visibility = 'hidden'; // not 'display: none' because we want rendering\n\n\t // transfer the element's properties to the div\n\t properties.forEach(function (prop) {\n\t style[prop] = computed[prop];\n\t });\n\n\t if (isFirefox) {\n\t // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275\n\t if (element.scrollHeight > parseInt(computed.height))\n\t style.overflowY = 'scroll';\n\t } else {\n\t style.overflow = 'hidden'; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll'\n\t }\n\n\t div.textContent = element.value.substring(0, position);\n\t // the second special handling for input type=\"text\" vs textarea: spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037\n\t if (element.nodeName === 'INPUT')\n\t div.textContent = div.textContent.replace(/\\s/g, \"\\u00a0\");\n\n\t var span = document.createElement('span');\n\t // Wrapping must be replicated *exactly*, including when a long word gets\n\t // onto the next line, with whitespace at the end of the line before (#7).\n\t // The *only* reliable way to do that is to copy the *entire* rest of the\n\t // textarea's content into the created at the caret position.\n\t // for inputs, just '.' would be enough, but why bother?\n\t span.textContent = element.value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all\n\t div.appendChild(span);\n\n\t var coordinates = {\n\t top: span.offsetTop + parseInt(computed['borderTopWidth']),\n\t left: span.offsetLeft + parseInt(computed['borderLeftWidth'])\n\t };\n\n\t if (debug) {\n\t span.style.backgroundColor = '#aaa';\n\t } else {\n\t document.body.removeChild(div);\n\t }\n\n\t return coordinates;\n\t}\n\n\tif (typeof module != \"undefined\" && typeof module.exports != \"undefined\") {\n\t module.exports = getCaretCoordinates;\n\t} else {\n\t window.getCaretCoordinates = getCaretCoordinates;\n\t}\n\n\t}());\n\n/***/ })\n/******/ ])\n});\n;","/**\n * Cookie\n * from github.com/mirai-mamori/Sakurairo ./js/sakura-app.js ,commit 71f5a0c\n * @license GPL-v2\n * @date 2021.03\n */\nconst _version_ctrl = _iro.cookie_version_control || '';\nexport function setCookie(key, value, days) {\n const expires = days ? \"; expires=\" + new Date(Date.now() + (days * 24 * 60 * 60 * 1000)).toUTCString() : \"\";\n document.cookie = key + _version_ctrl + \"=\" + (value || \"\") + expires + \"; path=/\";\n}\nexport function getCookie(key) {\n const nameEQ = key + _version_ctrl + \"=\", ca = document.cookie.split(';');\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) == ' ')\n c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) == 0)\n return c.substring(nameEQ.length, c.length);\n }\n return null;\n}\nexport function removeCookie(key) {\n document.cookie = key + _version_ctrl + '=; Max-Age=-99999999;';\n}\n","/**\n * 关于AppleWebkit与Safari版本的对应,参考:\n * @seealso https://gist.github.com/jakub-g/48a16195280a7023f570ffa5c8a4eae5\n * @seealso https://en.wikipedia.org/wiki/Safari_version_history\n *\n * Opera浏览器自15以来更换了User Agent\n * OPR/*\n */\nconst uaMatches = Array.from(navigator.userAgent.matchAll(/(Firefox|Chrome|Version|OPR|Edg)\\/(\\d+)/ig));\nimport { setCookie } from '../common/cookie';\nfunction getSupportedImageMimeList() {\n const acceptList = ['image/*,*/*;q=0.8'];\n if (isSupported({ Chrome: 59, OPR: 46, Firefox: 3, Edg: 79, Version: 8 /**Safari 8 */ })) {\n acceptList.push('image/apng');\n if (isSupported({ Chrome: 32, OPR: 19, Firefox: 65, Edg: 18, Version: 14 /**Safari 14 */ })) {\n setCookie('su_webp', '1', 114514);\n acceptList.push('image/webp');\n if (isSupported({ Chrome: 85, OPR: 71, Firefox: 93 })) {\n acceptList.push('image/avif');\n }\n }\n }\n return acceptList.reverse().join(',');\n}\nexport function isSupported(checkList) {\n for (const [_, name, version] of uaMatches) {\n if (parseFloat(version) >= checkList[name]) {\n return true;\n }\n }\n return false;\n}\nexport const Accept_Image = getSupportedImageMimeList();\n","import { createButterbar } from \"../common/butterbar\";\nimport { __ } from \"../common/sakurairo_global\";\nconst txt = [\n \"# 商业转载请联系作者获得授权,非商业转载请注明出处。\",\n \"# For commercial use, please contact the author for authorization. For non-commercial use, please indicate the source.\",\n \"# 协议(License):署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)\",\n \"# 作者(Author):\" + _iro.author_name,\n \"# 链接(URL):\" + window.location.href,\n \"# 来源(Source):\" + _iro.site_name,\n];\nfunction setClipboardText(event, selectionTxt) {\n event.preventDefault();\n const htmlData = txt.join('
') + \"
\" + selectionTxt.replace(/\\r\\n/g, \"
\"), textData = txt.join('\\n') + \"\\n\\n\" + selectionTxt.toString().replace(/\\r\\n/g, \"\\n\");\n if (event.clipboardData) {\n event.clipboardData.setData(\"text/html\", htmlData);\n event.clipboardData.setData(\"text/plain\", textData);\n }\n else if (window.clipboardData) {\n //deprecate?\n return window.clipboardData.setData(\"text\", textData);\n }\n}\nfunction copytext(e) {\n const selection = window.getSelection();\n if (selection) {\n const selectionText = selection.toString();\n if (selectionText.length > 30) {\n setClipboardText(e, selectionText);\n createButterbar(__(\"复制成功!\"), 1000);\n }\n }\n}\n/**\n * 添加复制时的版权提示\n */\nexport default function add_copyright() {\n if (_iro.clipboardCopyright) {\n document.body.removeEventListener(\"copy\", copytext);\n document.body.addEventListener(\"copy\", copytext);\n }\n}\n","function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n const dbp = promisifyRequest(request);\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","import { createStore, promisifyRequest } from 'idb-keyval';\nconst store = createStore('sakurairo', 'cache');\nconst get = (key) => store('readonly', (store) => promisifyRequest(store.get(key)));\nconst set = (key, value) => store('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n});\nconst del = (key) => store('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n});\nexport { get, set, del };\n","import { get, set, del } from './cache';\nimport { Accept_Image } from './compatibility';\nimport { __ } from '../common/sakurairo_global';\nimport { isMobile } from './mobile';\nimport { createButterbar } from '../common/butterbar';\nimport { noop } from '../common/util';\nlet bgn = 1;\nlet blob_url = '';\nexport async function nextBG() {\n changeCoverBG(await getCoverPath(true));\n bgn++;\n}\nexport async function preBG() {\n bgn--;\n changeCoverBG(await getCoverPath(true));\n}\nconst centerbg = document.querySelector(\".centerbg\");\n/**\n * 更改封面背景\n */\nexport const changeCoverBG = _iro.site_bg_as_cover ? (url) => {\n document.body.style.backgroundImage = `url(${url})`;\n document.dispatchEvent(new CustomEvent('coverBG_change', { detail: url }));\n} :\n centerbg ? (url) => {\n centerbg.style.backgroundImage = `url(${url})`;\n document.dispatchEvent(new CustomEvent('coverBG_change', { detail: url }));\n } : noop;\nfunction parseCSSUrl(cssText) {\n const result = cssText?.match(/^url\\(\"(.+)\"\\)$/);\n if (result) {\n return result[1];\n }\n}\n/**\n * 返回当前封面背景的URL\n */\nexport const getCurrentBG = _iro.site_bg_as_cover ? () => parseCSSUrl(document.body.style.backgroundImage) :\n (centerbg ? () => parseCSSUrl(centerbg.style.backgroundImage) : noop);\nfunction getAPIPath(useBGN = false) {\n const cover_api_url = new URL(_iro.cover_api);\n if (isMobile() && _iro.random_graphs_mts == true) {\n cover_api_url.searchParams.set('type', 'mobile');\n return cover_api_url.toString() + (useBGN ? \"&\" + bgn : '');\n }\n else {\n return cover_api_url.toString() + (useBGN ? (cover_api_url.search === '' ? \"?\" : '&') + bgn : '');\n }\n}\nexport const getCoverPath = _iro.cache_cover ? (useBGN = false) => get('cover').then(coverBG => {\n if (coverBG && coverBG instanceof ArrayBuffer) {\n cleanBlobUrl();\n blob_url = URL.createObjectURL(new Blob([coverBG]));\n return blob_url;\n }\n else {\n //fallback\n return getAPIPath(useBGN);\n }\n}).finally(() => {\n fetchThenCache(useBGN);\n})\n : getAPIPath;\nasync function fetchThenCache(useBGN = false) {\n try {\n const resp = await fetch(getAPIPath(useBGN), { headers: { Accept: Accept_Image } });\n if (resp.status == 500) {\n const result = await resp.json();\n createButterbar(result.message);\n console.warn(result.message);\n }\n else if (resp.ok) {\n const buf = await resp.arrayBuffer();\n try {\n set('cover', buf);\n /**\n * @problem Safari暂时不支持indexdb存储blob\n * DataCloneError: Failed to store record in an IDBObjectStore: BlobURLs are not yet supported.\n * @seealso https://developers.google.com/web/fundamentals/instant-and-offline/web-storage/indexeddb-best-practices#keeping_your_app_predictable\n */\n }\n catch (e) {\n //catch: FireFox无痕模式下数据库不允许修改\n /**\n * @problem FireFox无痕模式下数据库不允许修改\n * DOMException: A mutation operation was attempted on a database that did not allow mutations\n * Chrome不会报错\n * 像是火狐的设计 https://wiki.mozilla.org/Private_Browsing#Persistent_Storage\n * 变通方法 https://bugzilla.mozilla.org/show_bug.cgi?id=1639542#c9\n */\n console.warn(e);\n }\n }\n }\n catch (e) {\n if (e instanceof TypeError) {\n console.warn(__('你的封面API好像不支持跨域调用,这种情况下缓存是不会生效的哦'));\n del('cover');\n }\n }\n}\nfunction cleanBlobUrl() {\n URL.revokeObjectURL(blob_url);\n blob_url = '';\n}\n/* export function initCoverBG() {\n if (_iro.site_bg_as_cover) {\n if (centerbg) centerbg.style.background = '#0000'\n }\n} */ \n","const mediaQuery = window.matchMedia('(prefers-color-scheme:dark)');\nlet inDarkMode = false;\nexport const isInDarkMode = () => inDarkMode;\nfunction informDarkModeChange(nextValue) {\n if (nextValue !== inDarkMode) {\n document.dispatchEvent(new CustomEvent(\"darkmode\", { detail: nextValue }));\n inDarkMode = nextValue;\n }\n}\nfunction mediaQueryCallback() {\n const dark = localStorage.getItem(\"dark\");\n //仅在深色模式不是用户主动设置时触发\n if (!dark) {\n if (mediaQuery.matches && _iro.darkmode) {\n turnOnDarkMode();\n }\n else {\n turnOffDarkMode();\n }\n }\n}\nif (_iro.dm_strategy === 'client') {\n mediaQuery.removeEventListener ? mediaQuery.removeEventListener('change', mediaQueryCallback) : mediaQuery.removeListener(mediaQueryCallback);\n mediaQuery.addEventListener ? mediaQuery.addEventListener('change', mediaQueryCallback) : mediaQuery.addListener(mediaQueryCallback);\n}\nfunction saveUserSetting(value) {\n if (value == ifDarkmodeShouldOn()) {\n //用户设置与自动切换深色模式判断一致时,恢复自动切换\n localStorage.removeItem('dark');\n }\n else {\n if (value == true) {\n localStorage.setItem(\"dark\", \"1\");\n }\n else {\n localStorage.setItem(\"dark\", \"0\");\n }\n }\n //localStorage.setItem(\"bgImgSetting\", \"white-bg\");\n}\nexport function turnOnDarkMode(userTriggered) {\n document.documentElement.style.backgroundColor = \"#333\";\n document.getElementsByClassName(\"site-content\")[0].style.backgroundColor = \"#333\";\n document.body.classList.add(\"dark\");\n if (userTriggered)\n saveUserSetting(true);\n informDarkModeChange(true);\n}\nexport function turnOffDarkMode(userTriggered) {\n document.documentElement.style.backgroundColor = \"\";\n document.getElementsByClassName(\"site-content\")[0].style.backgroundColor = \"rgba(255, 255, 255, .8)\";\n document.body.classList.remove(\"dark\");\n document.body.classList.remove(\"dynamic\");\n informDarkModeChange(false);\n if (userTriggered) {\n saveUserSetting(false);\n //document.body.style.backgroundImage = `url(${_iro.skin_bg0})`;\n }\n}\n/**\n * 检查是否在深色模式时间\n * @returns {boolean}\n */\nfunction checkTime() {\n const today = new Date();\n return (today.getHours() > 21 || today.getHours() < 7);\n}\nexport function ifDarkmodeShouldOn() {\n switch (_iro.dm_strategy) {\n case 'client':\n return mediaQuery.matches;\n case 'eien':\n return true;\n default: /**case time */\n return checkTime();\n }\n}\nexport function checkDarkModeSetting() {\n const dark = localStorage.getItem(\"dark\");\n if (!dark) {\n //无用户设置时,自动切换深色模式\n if (ifDarkmodeShouldOn() && _iro.darkmode) {\n turnOnDarkMode();\n }\n else {\n turnOffDarkMode();\n }\n }\n else {\n if (dark == '1') {\n turnOnDarkMode();\n }\n else {\n turnOffDarkMode();\n }\n }\n}\n/* function mobile_dark_light() {\n if (document.body.classList.contains(\"dark\")) {\n document.documentElement.style.background = \"unset\";\n document.body.classList.remove(\"dark\");\n document.getElementById(\"moblieDarkLight\").innerHTML = '';\n setCookie(\"dark\", \"0\", 0.33);\n } else {\n document.documentElement.style.background = \"#333333\";\n document.getElementById(\"moblieDarkLight\").innerHTML = '';\n document.body.classList.add(\"dark\");\n setCookie(\"dark\", \"1\", 0.33);\n }\n} */ \n","import { createButterbar } from \"../common/butterbar\";\nimport { __ } from \"../common/sakurairo_global\";\nimport { isMobile } from \"./mobile\";\nlet btnSerif, btnSansSerif;\nfunction Serif() {\n if (isMobile()) {\n createButterbar(__(\"将从网络加载字体,流量请注意\"));\n }\n document.body.classList.add(\"serif\");\n localStorage.setItem(\"font_family\", \"serif\");\n setButtonState('serif');\n}\nfunction SansSerif() {\n document.body.classList.remove(\"serif\");\n localStorage.setItem(\"font_family\", \"sans-serif\");\n setButtonState('sans-serif');\n}\nfunction change_font_listener(btn) {\n return () => {\n const { name } = btn.dataset;\n const nowFont = localStorage.getItem(\"font_family\");\n if (name == nowFont) {\n return;\n }\n else {\n (name == 'serif') ? Serif() : SansSerif();\n }\n };\n}\nexport function loadFontSetting() {\n const nowFont = localStorage.getItem(\"font_family\");\n if (!nowFont || nowFont == \"serif\") {\n document.body.classList.add(\"serif\");\n }\n}\nfunction setButtonState(font_name) {\n if (font_name === 'sans-serif' || localStorage.getItem(\"font_family\") == 'sans-serif') {\n btnSerif.classList.remove(\"selected\");\n btnSansSerif.classList.add(\"selected\");\n }\n else {\n btnSansSerif.classList.remove(\"selected\");\n btnSerif.classList.add(\"selected\");\n }\n}\nfunction initDOMCache() {\n btnSerif = document.getElementsByClassName(\"control-btn-serif\")[0];\n btnSansSerif = document.getElementsByClassName(\"control-btn-sans-serif\")[0];\n return btnSansSerif && btnSerif;\n}\nfunction initListener() {\n btnSerif.addEventListener('click', change_font_listener(btnSerif));\n btnSansSerif.addEventListener('click', change_font_listener(btnSansSerif));\n}\nexport function initFontControl() {\n const result = initDOMCache();\n if (!result)\n localStorage.removeItem('font_family'); //样式菜单“简单”时,使用默认字体 “A”\n loadFontSetting();\n if (result) {\n setButtonState();\n initListener();\n }\n}\n","export default async function hitokoto() {\n const yiyan = document.getElementById(\"footer_yiyan\");\n if (yiyan) {\n const api_group = _iro.yiyan_api || [\"https://api.maho.cc/yiyan/\"];\n if (api_group.length == 0) {\n console.warn('一言API: 路径为空');\n }\n for (const api_path of api_group) {\n try {\n const txt = await request(api_path);\n yiyan.innerText = txt;\n break;\n }\n catch (e) {\n console.warn(`一言API: 尝试联系\"${api_path}\"时出错。 `, e);\n continue;\n }\n }\n }\n}\nconst request = async (api) => {\n const res = await fetch(api, { headers: { Accept: \"application/json\" } });\n if (res.ok) {\n const data = await res.json();\n const from_who = (data.from_who == 'null' ? null : data.from_who) || '';\n const from = data.from != data.from_who ? `「${data['from']}」` : '';\n const hitokoto = data.hitokoto;\n return hitokoto + '——' + from_who + from;\n }\n else {\n throw res.status;\n }\n};\n","let cache_is_mobile = false;\nexport function initIsMobileCache() {\n const mediaQuery = window.matchMedia('(max-width:860px)');\n cache_is_mobile = mediaQuery.matches;\n mediaQuery.addEventListener ? mediaQuery.addEventListener('change', refreshIsMobileCache) : mediaQuery.addListener(refreshIsMobileCache);\n}\nfunction refreshIsMobileCache(ev) {\n cache_is_mobile = ev.matches;\n}\n/**\n *\n * @returns 返回document.body.clientWidth <= 860的结果。这个结果是缓存的\n */\nexport const isMobile = () => cache_is_mobile;\n","import { onlyOnceATime } from \"../common/util\";\nimport lazyload from \"../common/lazyload\";\nimport { __ } from '../common/sakurairo_global';\n// @ts-ignore\nimport { code_highlight_style } from '../common/code-highlight';\nimport { getForeground, getHighlight, getThemeColorFromImageElement } from \"./theme-color\";\nconst hslaCSSText = ([h, s, l, a]) => {\n const hsl = `${h}deg,${s}%,${l}%`;\n return a && a !== 1 ? `hsla(${hsl},${a})` : `hsl(${hsl})`;\n};\nlet load_post_timer;\nconst load_post = onlyOnceATime(async function load_post() {\n const now_href = document.location.href;\n const pagination_a = document.querySelector('#pagination a');\n if (pagination_a.classList.contains(\"loading\"))\n return;\n pagination_a.classList.add(\"loading\");\n pagination_a.innerText = \"\";\n // $('#pagination a').addClass(\"loading\").text(\"\");\n const resp = await fetch(pagination_a.getAttribute(\"href\") + \"#main\");\n const text = await resp.text();\n //在进行DOM操作前检查页面是否已经变化,防止错误加载到其他页面上\n if (now_href != document.location.href)\n return; /**如果页面状态发生了变化,那么也应该不用理加载提示符 */\n const parser = new DOMParser(), DOM = parser.parseFromString(text, \"text/html\"), result = DOM.querySelectorAll(\"#main .post, #shuoshuo_post\"), paga = DOM.querySelector(\"#pagination a\"), paga_innerText = paga && paga.innerText, nextHref = paga && paga.getAttribute(\"href\"), main = document.getElementById(\"main\");\n for (let i = 0; i < result.length; i++) {\n main.append(result[i]);\n }\n //if (resp.ok) {\n // result = $(data).find(\"#main .post\");\n // nextHref = $(data).find(\"#pagination a\").attr(\"href\");\n // $(\"#main\").append(result.fadeIn(500));\n const dpga = document.querySelector(\"#pagination a\"), addps = document.querySelector(\"#add_post span\");\n if (dpga) {\n dpga.classList.remove(\"loading\");\n dpga.innerText = paga_innerText;\n }\n if (addps) {\n addps.classList.remove(\"loading\");\n addps.innerText = \"\";\n }\n // $(\"#pagination a\").removeClass(\"loading\").text(\"Previous\");\n // $('#add_post span').removeClass(\"loading\").text(\"\");\n lazyload();\n code_highlight_style();\n post_list_show_animation();\n document.dispatchEvent(new CustomEvent('ajax_post_loaded'));\n if (nextHref != undefined) {\n pagination_a.setAttribute(\"href\", nextHref);\n // $(\"#pagination a\").attr(\"href\", nextHref);\n //加载完成上滑\n let tempScrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;\n // window.scrollTo(tempScrollTop);\n // $(window).scrollTop(tempScrollTop);\n window.scrollTo({\n top: tempScrollTop + 300,\n behavior: 'smooth'\n });\n // $body.animate({\n // scrollTop: tempScrollTop + 300\n //\n // }, 666)\n }\n else {\n document.getElementById(\"pagination\").innerHTML = \"\" + __(\"很高兴你翻到这里,但是真的没有了...\") + \"\";\n // $(\"#pagination\").html(\"很高兴你翻到这里,但是真的没有了...\");\n }\n //}\n /* $.ajax({\n type: \"POST\",\n url: $('#pagination a').attr(\"href\") + \"#main\",\n success: function (data) {\n result = $(data).find(\"#main .post\");\n nextHref = $(data).find(\"#pagination a\").attr(\"href\");\n $(\"#main\").append(result.fadeIn(500));\n $(\"#pagination a\").removeClass(\"loading\").text(\"Previous\");\n $('#add_post span').removeClass(\"loading\").text(\"\");\n lazyload();\n post_list_show_animation();\n if (nextHref != undefined) {\n $(\"#pagination a\").attr(\"href\", nextHref);\n //加载完成上滑\n var tempScrollTop = $(window).scrollTop();\n $(window).scrollTop(tempScrollTop);\n $body.animate({\n scrollTop: tempScrollTop + 300\n\n }, 666)\n } else {\n $(\"#pagination\").html(\"很高兴你翻到这里,但是真的没有了...\");\n }\n }\n }); */\n});\nexport function post_list_show_animation() {\n const articles = document.querySelectorAll('article.post-list-thumb');\n if (articles) {\n const io = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n entry.target.classList.add(\"post-list-show\");\n }\n else if (!entry.target.classList.contains(\"post-list-show\")) {\n return;\n }\n const target = entry.target;\n target.style.willChange = 'auto';\n io.unobserve(target);\n const thumbImage = target.querySelector('.post-thumb img');\n if (thumbImage) {\n let finalImageElement = thumbImage;\n if (thumbImage.classList.contains('lazyload')) {\n finalImageElement = document.createElement('img');\n finalImageElement.src = thumbImage.getAttribute('data-src');\n finalImageElement.crossOrigin = \"anonymous\";\n }\n getThemeColorFromImageElement(finalImageElement)\n .then(rgba => {\n if (!rgba)\n return;\n const style = target.style;\n style.setProperty('--article-theme', `rgba(${rgba[0]},${rgba[1]},${rgba[2]},${rgba[3] / 255})`);\n style.setProperty('--article-theme-highlight', hslaCSSText(getHighlight(rgba)));\n style.setProperty('--article-theme-foreground', hslaCSSText(getForeground(rgba)));\n });\n }\n }\n }, {\n root: null,\n threshold: [0.66]\n });\n for (const article of articles) {\n io.observe(article);\n }\n }\n}\nfunction XLS_Listener(e) {\n //要求是#pagination只有anchor一个直接子后代\n if (e.target.parentElement.id == 'pagination') {\n e.preventDefault();\n e.stopPropagation();\n clearTimeout(load_post_timer);\n load_post();\n }\n}\nexport function XLS() {\n const intersectionObserver = new IntersectionObserver((entries) => {\n if (entries[0].intersectionRatio <= 0)\n return;\n // var page_next = $('#pagination a').attr(\"href\");\n const _page_next = document.querySelector('#pagination a');\n if (_page_next) {\n const href_page_next = _page_next.getAttribute(\"href\"), load_key = document.getElementById(\"add_post_time\");\n if (href_page_next != undefined && load_key) {\n const load_time = load_key.title;\n if (load_time != \"233\") {\n console.log(\"%c 自动加载时倒计时 %c\", \"background:#9a9da2; color:#ffffff; border-radius:4px;\", \"\", \"\", load_time);\n load_post_timer = setTimeout(load_post, parseInt(load_time, 10) * 1000);\n }\n }\n }\n });\n intersectionObserver.observe(document.querySelector('.footer-device'));\n document.body.removeEventListener('click', XLS_Listener);\n document.body.addEventListener(\"click\", XLS_Listener);\n}\n","export default function showcard() {\n for (const showcard of document.querySelectorAll('.showcard')) {\n const img = showcard.querySelector('.img');\n const button = showcard.querySelector('.showcard-button');\n if (!img || !button) {\n throw new Error('invalid structure for .showcard');\n }\n img.addEventListener('mouseover', function () {\n button.classList.add('hover');\n });\n img.addEventListener('mouseout', function () {\n button.classList.remove('hover');\n });\n }\n}\n","let lastMsgId = 0;\nexport default class PromiseWorker {\n w;\n cb = {};\n [Symbol.dispose];\n constructor(worker) {\n this.w = worker;\n const callback = (e) => {\n const payload = e.data;\n const messageId = payload[0];\n const callback = this.cb[messageId];\n if (!callback)\n return;\n delete this.cb[messageId];\n callback(payload[1], payload[2]);\n };\n worker.addEventListener('message', callback);\n this.postMessage = (message, ...extraArgs) => {\n const messageId = lastMsgId++;\n const messageToSend = [messageId, message];\n return new Promise((resolve, reject) => {\n this.cb[messageId] = (error, result) => {\n if (error) {\n return reject(new Error(error.message));\n }\n resolve(result);\n };\n this.w.postMessage(messageToSend, ...extraArgs);\n });\n };\n this[Symbol.dispose] = () => {\n worker.removeEventListener('message', callback);\n };\n }\n postMessage;\n}\n","/**\n * RGB space.\n *\n * @module color-space/rgb\n */\n\nexport default {\n\tname: 'rgb',\n\tmin: [0,0,0],\n\tmax: [255,255,255],\n\tchannel: ['red', 'green', 'blue'],\n\talias: ['RGB']\n};\n","/**\n * @module color-space/hsl\n */\nimport rgb from './rgb.js';\n\nexport default {\n\tname: 'hsl',\n\tmin: [0,0,0],\n\tmax: [360,100,100],\n\tchannel: ['hue', 'saturation', 'lightness'],\n\talias: ['HSL'],\n\n\trgb: function(hsl) {\n\t\tvar h = hsl[0]/360, s = hsl[1]/100, l = hsl[2]/100, t1, t2, t3, rgb, val, i=0;\n\n\t\tif (s === 0) return val = l * 255, [val, val, val];\n\n\t\tt2 = l < 0.5 ? l * (1 + s) : l + s - l * s;\n\t\tt1 = 2 * l - t2;\n\n\t\trgb = [0, 0, 0];\n\t\tfor (;i<3;) {\n\t\t\tt3 = h + 1 / 3 * - (i - 1);\n\t\t\tt3 < 0 ? t3++ : t3 > 1 && t3--;\n\t\t\tval = 6 * t3 < 1 ? t1 + (t2 - t1) * 6 * t3 :\n\t\t\t2 * t3 < 1 ? t2 :\n\t\t\t3 * t3 < 2 ? t1 + (t2 - t1) * (2 / 3 - t3) * 6 :\n\t\t\tt1;\n\t\t\trgb[i++] = val * 255;\n\t\t}\n\n\t\treturn rgb;\n\t}\n};\n\n\n//extend rgb\nrgb.hsl = function(rgb) {\n\tvar r = rgb[0]/255,\n\t\t\tg = rgb[1]/255,\n\t\t\tb = rgb[2]/255,\n\t\t\tmin = Math.min(r, g, b),\n\t\t\tmax = Math.max(r, g, b),\n\t\t\tdelta = max - min,\n\t\t\th, s, l;\n\n\tif (max === min) {\n\t\th = 0;\n\t}\n\telse if (r === max) {\n\t\th = (g - b) / delta;\n\t}\n\telse if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t}\n\telse if (b === max) {\n\t\th = 4 + (r - g)/ delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tl = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t}\n\telse if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t}\n\telse {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n","/**\n * CIE XYZ\n *\n * @module color-space/xyz\n */\nimport rgb from './rgb.js';\n\nvar xyz = {\n\tname: 'xyz',\n\tmin: [0,0,0],\n\tchannel: ['X','Y','Z'],\n\talias: ['XYZ', 'ciexyz', 'cie1931']\n};\n\n\n/**\n * Whitepoint reference values with observer/illuminant\n *\n * http://en.wikipedia.org/wiki/Standard_illuminant\n */\nxyz.whitepoint = {\n\t//1931 2°\n\t2: {\n\t\t//incadescent\n\t\tA:[109.85, 100, 35.585],\n\t\t// B:[],\n\t\tC: [98.074, 100, 118.232],\n\t\tD50: [96.422, 100, 82.521],\n\t\tD55: [95.682, 100, 92.149],\n\t\t//daylight\n\t\tD65: [95.045592705167, 100, 108.9057750759878],\n\t\tD75: [94.972, 100, 122.638],\n\t\t//flourescent\n\t\t// F1: [],\n\t\tF2: [99.187, 100, 67.395],\n\t\t// F3: [],\n\t\t// F4: [],\n\t\t// F5: [],\n\t\t// F6:[],\n\t\tF7: [95.044, 100, 108.755],\n\t\t// F8: [],\n\t\t// F9: [],\n\t\t// F10: [],\n\t\tF11: [100.966, 100, 64.370],\n\t\t// F12: [],\n\t\tE: [100,100,100]\n\t},\n\n\t//1964 10°\n\t10: {\n\t\t//incadescent\n\t\tA:[111.144, 100, 35.200],\n\t\tC: [97.285, 100, 116.145],\n\t\tD50: [96.720, 100, 81.427],\n\t\tD55: [95.799, 100, 90.926],\n\t\t//daylight\n\t\tD65: [94.811, 100, 107.304],\n\t\tD75: [94.416, 100, 120.641],\n\t\t//flourescent\n\t\tF2: [103.280, 100, 69.026],\n\t\tF7: [95.792, 100, 107.687],\n\t\tF11: [103.866, 100, 65.627],\n\t\tE: [100,100,100]\n\t}\n};\n\n\n/**\n * Top values are the whitepoint’s top values, default are D65\n */\nxyz.max = xyz.whitepoint[2].D65;\n\n\n/**\n * Transform xyz to rgb\n *\n * @param {Array} xyz Array of xyz values\n *\n * @return {Array} RGB values\n */\nxyz.rgb = function (_xyz, white) {\n\t//FIXME: make sure we have to divide like this. Probably we have to replace matrix as well then\n\twhite = white || xyz.whitepoint[2].E;\n\n\tvar x = _xyz[0] / white[0],\n\t\ty = _xyz[1] / white[1],\n\t\tz = _xyz[2] / white[2],\n\t\tr, g, b;\n\n\t// assume sRGB\n\t// http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html\n\tr = (x * 3.240969941904521) + (y * -1.537383177570093) + (z * -0.498610760293);\n\tg = (x * -0.96924363628087) + (y * 1.87596750150772) + (z * 0.041555057407175);\n\tb = (x * 0.055630079696993) + (y * -0.20397695888897) + (z * 1.056971514242878);\n\n\tr = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n\t\t: r = (r * 12.92);\n\n\tg = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n\t\t: g = (g * 12.92);\n\n\tb = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n\t\t: b = (b * 12.92);\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n}\n\n\n\n/**\n * RGB to XYZ\n *\n * @param {Array} rgb RGB channels\n *\n * @return {Array} XYZ channels\n */\nrgb.xyz = function(rgb, white) {\n\tvar r = rgb[0] / 255,\n\t\t\tg = rgb[1] / 255,\n\t\t\tb = rgb[2] / 255;\n\n\t// assume sRGB\n\tr = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n\tvar x = (r * 0.41239079926595) + (g * 0.35758433938387) + (b * 0.18048078840183);\n\tvar y = (r * 0.21263900587151) + (g * 0.71516867876775) + (b * 0.072192315360733);\n\tvar z = (r * 0.019330818715591) + (g * 0.11919477979462) + (b * 0.95053215224966);\n\n\twhite = white || xyz.whitepoint[2].E;\n\n\treturn [x * white[0], y * white[1], z * white[2]];\n};\n\n\n\nexport default xyz;\n","/**\n * CIE LAB space model\n *\n * @module color-space/lab\n */\n\nimport xyz from './xyz.js';\n\nexport default {\n\tname: 'lab',\n\tmin: [0,-100,-100],\n\tmax: [100,100,100],\n\tchannel: ['lightness', 'a', 'b'],\n\talias: ['LAB', 'cielab'],\n\n\txyz: function(lab) {\n\t\tvar l = lab[0],\n\t\t\t\ta = lab[1],\n\t\t\t\tb = lab[2],\n\t\t\t\tx, y, z, y2;\n\n\t\tif (l <= 8) {\n\t\t\ty = (l * 100) / 903.3;\n\t\t\ty2 = (7.787 * (y / 100)) + (16 / 116);\n\t\t} else {\n\t\t\ty = 100 * Math.pow((l + 16) / 116, 3);\n\t\t\ty2 = Math.pow(y / 100, 1/3);\n\t\t}\n\n\t\tx = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3);\n\n\t\tz = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3);\n\n\t\treturn [x, y, z];\n\t}\n};\n\n\n//extend xyz\nxyz.lab = function(xyz){\n\tvar x = xyz[0],\n\t\t\ty = xyz[1],\n\t\t\tz = xyz[2],\n\t\t\tl, a, b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n","import rgb from 'color-space/rgb.js';\nimport xyz from 'color-space/xyz.js';\nimport lab from 'color-space/lab.js';\n\nfunction _filled_array(fillWith, count) {\n const array = [];\n for (let i = 0; i < count; i++) {\n array.push(fillWith);\n }\n return array;\n}\nfunction euclidean_distance_squared_index(a, a_start, b) {\n const r = a[a_start++] - b[0];\n const g = a[a_start++] - b[1];\n const _b = a[a_start++] - b[2];\n return r ** 2 + g ** 2 + _b ** 2;\n}\nfunction kmeans(data, k, maxAttempt, thresold = 2, clipAlpha = false) {\n const cluster_sum = [];\n const thresold_squared = thresold ** 2;\n let pixelCount = data.length / 4;\n let cluster_centers = [];\n let new_cluster_centers = [];\n let iteration = 0;\n const isDataTypedArray = data instanceof Uint8ClampedArray;\n const PIXEL_LEN = clipAlpha ? 3 : 4;\n if (clipAlpha) {\n let j = 0;\n const dataNoAlpha = isDataTypedArray ? new Uint8ClampedArray(pixelCount * 3) : [];\n for (let i = 0; i < data.length; ) {\n if (data[i + 3] == 0) {\n i += 4;\n continue;\n }\n dataNoAlpha[j++] = data[i++];\n dataNoAlpha[j++] = data[i++];\n dataNoAlpha[j++] = data[i++];\n i++;\n }\n data = dataNoAlpha.slice(0, j);\n pixelCount = j / 3;\n }\n for (let i = 0; i < k; i++) {\n const start = Math.floor(1 * (pixelCount - 1)) * PIXEL_LEN;\n cluster_centers.push(\n /* Array.from */\n data.slice(start, start + 3)\n );\n new_cluster_centers.push(isDataTypedArray ? new Uint8ClampedArray(3) : _filled_array(0, 3));\n cluster_sum.push(_filled_array(0, 4));\n }\n while (iteration < maxAttempt) {\n for (let i = 0; i < data.length; ) {\n let cluster_index = 0;\n let _min_distance = euclidean_distance_squared_index(data, i, cluster_centers[0]);\n for (let j = 1; j < k; j++) {\n const distance = euclidean_distance_squared_index(data, i, cluster_centers[j]);\n if (distance < _min_distance) {\n _min_distance = distance;\n cluster_index = j;\n }\n }\n const sum = cluster_sum[cluster_index];\n sum[0] += data[i++];\n sum[1] += data[i++];\n sum[2] += data[i++];\n sum[3]++;\n if (PIXEL_LEN === 4) i++;\n }\n let allStabled = true;\n for (let i = 0; i < k; i++) {\n const rgbc = cluster_sum[i];\n const count = rgbc[3];\n if (count == 0) {\n const start = Math.floor(Math.random() * (pixelCount - 1)) * PIXEL_LEN;\n new_cluster_centers[i] = /* Array.from */\n data.slice(start, start + 3);\n allStabled = false;\n } else {\n let new_center = new_cluster_centers[i];\n let diffSquared = 0;\n for (let j = 0; j < 3; j++) {\n new_center[j] = rgbc[j] / count;\n diffSquared += (new_center[j] - cluster_centers[i][j]) ** 2;\n }\n if (diffSquared > thresold_squared) {\n allStabled = false;\n }\n }\n }\n if (allStabled) {\n return {\n centroid: new_cluster_centers,\n iteration,\n fit: true,\n label: cluster_sum.map((v) => v[3]),\n size: pixelCount\n };\n }\n const medium = cluster_centers;\n cluster_centers = new_cluster_centers;\n new_cluster_centers = medium;\n iteration++;\n for (let i = 0; i < k; i++) {\n cluster_sum[i].fill(0);\n }\n }\n return {\n centroid: cluster_centers,\n iteration,\n fit: false,\n label: cluster_sum.map((v) => v[3]),\n size: pixelCount\n };\n}\n\n/**\n * NeuQuant Neural-Network Quantization Algorithm\n *\n * Copyright (c) 1994 Anthony Dekker\n *\n * See \"Kohonen neural networks for optimal colour quantization\" in \"Network:\n * Computation in Neural Systems\" Vol. 5 (1994) pp 351-367. for a discussion of\n * the algorithm.\n *\n * See also http://members.ozemail.com.au/~dekker/NEUQUANT.HTML\n *\n * Any party obtaining a copy of these files from the author, directly or\n * indirectly, is granted, free of charge, a full and unrestricted irrevocable,\n * world-wide, paid up, royalty-free, nonexclusive right and license to deal in\n * this software and documentation files (the \"Software\"), including without\n * limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons who\n * receive copies from any such party to do so, with the only requirement being\n * that this copyright notice remain intact.\n *\n * Copyright (c) 2012 Johan Nordberg (JavaScript port)\n * Copyright (c) 2014 Devon Govett (JavaScript port)\n */\n\nconst prime1 = 499;\nconst prime2 = 491;\nconst prime3 = 487;\nconst prime4 = 503;\n\nconst maxprime = Math.max(prime1, prime2, prime3, prime4);\nconst minpicturebytes = (3 * maxprime);\n\nconst defaults = {\n ncycles: 100,\n netsize: 256,\n samplefac: 10\n};\n\nconst assign = function (target) {\n for (let i = 1, l = arguments.length; i < l; i++) {\n const nextSource = arguments[i];\n if (nextSource != null) {\n for (const nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n target[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return target\n};\n\nclass NeuQuant {\n constructor (pixels, options) {\n assign(this, defaults, {pixels}, options);\n\n if (this.netsize < 4 || this.netsize > 256) {\n throw new Error('Color count must be between 4 and 256')\n }\n\n if (this.samplefac < 1 || this.samplefac > 30) {\n throw new Error('Sampling factor must be between 1 and 30')\n }\n\n this.maxnetpos = this.netsize - 1;\n\n this.netbiasshift = 4;\n this.intbiasshift = 16;\n this.intbias = (1 << this.intbiasshift);\n this.gammashift = 10;\n this.gamma = (1 << this.gammashift);\n this.betashift = 10;\n this.beta = (this.intbias >> this.betashift);\n this.betagamma = (this.beta * this.gamma);\n\n this.initrad = (this.netsize >> 3);\n this.radiusbiasshift = 6;\n this.radiusbias = (1 << this.radiusbiasshift);\n this.initradius = (this.initrad * this.radiusbias);\n this.radiusdec = 30;\n\n this.alphabiasshift = 10;\n this.initalpha = (1 << this.alphabiasshift);\n\n this.radbiasshift = 8;\n this.radbias = (1 << this.radbiasshift);\n this.alpharadbshift = (this.alphabiasshift + this.radbiasshift);\n this.alpharadbias = (1 << this.alpharadbshift);\n\n this.network = [];\n this.netindex = new Uint32Array(256);\n this.bias = new Uint32Array(this.netsize);\n this.freq = new Uint32Array(this.netsize);\n this.radpower = new Uint32Array(this.netsize >> 3);\n\n for (let i = 0, l = this.netsize; i < l; i++) {\n let v = (i << (this.netbiasshift + 8)) / this.netsize;\n this.network[i] = new Float64Array([v, v, v, 0]);\n this.freq[i] = this.intbias / this.netsize;\n this.bias[i] = 0;\n }\n }\n\n unbiasnet () {\n for (let i = 0, l = this.netsize; i < l; i++) {\n this.network[i][0] >>= this.netbiasshift;\n this.network[i][1] >>= this.netbiasshift;\n this.network[i][2] >>= this.netbiasshift;\n this.network[i][3] = i;\n }\n }\n\n altersingle (alpha, i, b, g, r) {\n this.network[i][0] -= (alpha * (this.network[i][0] - b)) / this.initalpha;\n this.network[i][1] -= (alpha * (this.network[i][1] - g)) / this.initalpha;\n this.network[i][2] -= (alpha * (this.network[i][2] - r)) / this.initalpha;\n }\n\n alterneigh (radius, i, b, g, r) {\n const lo = Math.abs(i - radius);\n const hi = Math.min(i + radius, this.netsize);\n\n let j = i + 1;\n let k = i - 1;\n let m = 1;\n\n while ((j < hi) || (k > lo)) {\n const a = this.radpower[m++];\n\n if (j < hi) {\n const p = this.network[j++];\n p[0] -= (a * (p[0] - b)) / this.alpharadbias;\n p[1] -= (a * (p[1] - g)) / this.alpharadbias;\n p[2] -= (a * (p[2] - r)) / this.alpharadbias;\n }\n\n if (k > lo) {\n const p = this.network[k--];\n p[0] -= (a * (p[0] - b)) / this.alpharadbias;\n p[1] -= (a * (p[1] - g)) / this.alpharadbias;\n p[2] -= (a * (p[2] - r)) / this.alpharadbias;\n }\n }\n }\n\n contest (b, g, r) {\n let bestd = ~(1 << 31);\n let bestbiasd = bestd;\n let bestpos = -1;\n let bestbiaspos = bestpos;\n\n for (let i = 0, l = this.netsize; i < l; i++) {\n let n = this.network[i];\n\n let dist = Math.abs(n[0] - b) + Math.abs(n[1] - g) + Math.abs(n[2] - r);\n if (dist < bestd) {\n bestd = dist;\n bestpos = i;\n }\n\n let biasdist = dist - ((this.bias[i]) >> (this.intbiasshift - this.netbiasshift));\n if (biasdist < bestbiasd) {\n bestbiasd = biasdist;\n bestbiaspos = i;\n }\n\n let betafreq = (this.freq[i] >> this.betashift);\n this.freq[i] -= betafreq;\n this.bias[i] += (betafreq << this.gammashift);\n }\n\n this.freq[bestpos] += this.beta;\n this.bias[bestpos] -= this.betagamma;\n\n return bestbiaspos\n }\n\n inxbuild () {\n let previouscol = 0;\n let startpos = 0;\n\n for (let i = 0, l = this.netsize; i < l; i++) {\n let p = this.network[i];\n let q = null;\n let smallpos = i;\n let smallval = p[1];\n\n for (let j = i + 1; j < l; j++) {\n q = this.network[j];\n if (q[1] < smallval) {\n smallpos = j;\n smallval = q[1];\n }\n }\n q = this.network[smallpos];\n\n if (i !== smallpos) {\n [p[0], q[0]] = [q[0], p[0]];\n [p[1], q[1]] = [q[1], p[1]];\n [p[2], q[2]] = [q[2], p[2]];\n [p[3], q[3]] = [q[3], p[3]];\n }\n\n if (smallval !== previouscol) {\n this.netindex[previouscol] = (startpos + i) >> 1;\n for (let j = previouscol + 1; j < smallval; j++) {\n this.netindex[j] = i;\n }\n previouscol = smallval;\n startpos = i;\n }\n }\n\n this.netindex[previouscol] = (startpos + this.maxnetpos) >> 1;\n for (let i = previouscol + 1; i < 256; i++) {\n this.netindex[i] = this.maxnetpos;\n }\n }\n\n learn () {\n const lengthcount = this.pixels.length;\n const alphadec = 30 + ((this.samplefac - 1) / 3);\n const samplepixels = lengthcount / (3 * this.samplefac);\n\n let delta = samplepixels / this.ncycles | 0;\n let alpha = this.initalpha;\n let radius = this.initradius;\n\n let rad = radius >> this.radiusbiasshift;\n\n if (rad <= 1) {\n rad = 0;\n }\n\n for (let i = 0; i < rad; i++) {\n this.radpower[i] = alpha * (((rad * rad - i * i) * this.radbias) / (rad * rad));\n }\n\n let step;\n if (lengthcount < minpicturebytes) {\n this.samplefac = 1;\n step = 3;\n } else if ((lengthcount % prime1) !== 0) {\n step = 3 * prime1;\n } else if ((lengthcount % prime2) !== 0) {\n step = 3 * prime2;\n } else if ((lengthcount % prime3) !== 0) {\n step = 3 * prime3;\n } else {\n step = 3 * prime4;\n }\n\n let pix = 0;\n\n for (let i = 0; i < samplepixels;) {\n let b = (this.pixels[pix] & 0xff) << this.netbiasshift;\n let g = (this.pixels[pix + 1] & 0xff) << this.netbiasshift;\n let r = (this.pixels[pix + 2] & 0xff) << this.netbiasshift;\n\n let j = this.contest(b, g, r);\n this.altersingle(alpha, j, b, g, r);\n if (rad !== 0) {\n this.alterneigh(rad, j, b, g, r);\n }\n\n pix += step;\n if (pix >= lengthcount) {\n pix -= lengthcount;\n }\n\n if (delta === 0) {\n delta = 1;\n }\n\n if (++i % delta === 0) {\n alpha -= alpha / alphadec;\n radius -= radius / this.radiusdec;\n rad = radius >> this.radiusbiasshift;\n\n if (rad <= 1) {\n rad = 0;\n }\n\n for (let k = 0; k < rad; k++) {\n this.radpower[k] = alpha * (((rad * rad - k * k) * this.radbias) / (rad * rad));\n }\n }\n }\n }\n\n buildColorMap () {\n this.learn();\n this.unbiasnet();\n this.inxbuild();\n }\n\n getColorMap () {\n const map = new Uint8Array(this.netsize * 3);\n const index = new Uint8Array(this.netsize);\n\n for (let i = 0, l = this.netsize; i < l; i++) {\n index[this.network[i][3]] = i;\n }\n\n for (let i = 0, j = 0, k = 0, l = this.netsize; i < l; i++) {\n k = index[i];\n map[j++] = this.network[k][0] & 0xff;\n map[j++] = this.network[k][1] & 0xff;\n map[j++] = this.network[k][2] & 0xff;\n }\n\n return map\n }\n}\n\nfunction findClosest (palette, r, g, b) {\n let minpos = 0;\n let mind = 256 * 256 * 256;\n\n for (let i = 0, l = palette.length; i < l;) {\n const dr = r - palette[i++];\n const dg = g - palette[i++];\n const db = b - palette[i];\n const d = dr * dr + dg * dg + db * db;\n const pos = i / 3 | 0;\n\n if (d < mind) {\n mind = d;\n minpos = pos;\n }\n\n i++;\n }\n\n return minpos\n}\n\nfunction palette (pixels, options) {\n const nq = new NeuQuant(pixels, options);\n nq.buildColorMap();\n return nq.getColorMap()\n}\n\nfunction indexed (pixels, palette) {\n const indexed = new Uint8Array(pixels.length / 3);\n const memo = {};\n\n for (let i = 0, j = 0, l = pixels.length; i < l;) {\n const r = pixels[i++];\n const g = pixels[i++];\n const b = pixels[i++];\n const k = r << 16 | g << 8 | b;\n\n if (k in memo) {\n indexed[j++] = memo[k];\n } else {\n indexed[j++] = memo[k] = findClosest(palette, r, g, b);\n }\n }\n\n return indexed\n}\n\nfunction rgba2Rgb(data) {\n const rgb = new Uint8ClampedArray(data.length / 4 * 3);\n const len = data.length;\n let rgb_i = 0;\n for (let i = 0; i < len; ) {\n for (let j = 0; j < 3; j++) {\n rgb[rgb_i++] = data[i++];\n }\n i++;\n }\n return rgb;\n}\nfunction neuquant(img, k, samplefac = 1) {\n const img_rgb = rgba2Rgb(img);\n const palette$1 = palette(img_rgb, { netsize: k, samplefac });\n const indexed_pixel = indexed(img_rgb, palette$1);\n const pixel = [];\n const len = palette$1.length;\n for (let i = 0; i < len; ) {\n pixel.push([palette$1[i++], palette$1[i++], palette$1[i++], 255]);\n }\n return { centroid: pixel, label: count(k, indexed_pixel) };\n}\nfunction count(k, index) {\n const counts = new Array(k).fill(0);\n for (const i of index) {\n counts[i]++;\n }\n return counts;\n}\n\nfunction _prepare2DContext(width, height) {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n canvas.height = height;\n canvas.width = width;\n return ctx;\n}\nfunction _prepare2DContextAsync(width, height) {\n const canvas = new OffscreenCanvas(width, height);\n const ctx = canvas.getContext(\"2d\");\n return ctx;\n}\nfunction awaitImage(imgElement) {\n return new Promise((resolve, reject) => {\n if (imgElement.complete) {\n resolve();\n } else {\n imgElement.addEventListener(\"load\", (e) => {\n resolve(e);\n });\n imgElement.addEventListener(\"error\", (reason) => {\n reject(reason);\n });\n }\n });\n}\nfunction _readImage(prepareCtx, imgSource) {\n const { naturalWidth, naturalHeight } = imgSource;\n const ctx = prepareCtx(naturalWidth, naturalHeight);\n ctx.drawImage(imgSource, 0, 0, naturalWidth, naturalHeight);\n return ctx.getImageData(0, 0, naturalWidth, naturalHeight);\n}\nconst readImage = _readImage.bind(void 0, _prepare2DContext);\nconst readImageOffscreen = _readImage.bind(void 0, _prepare2DContextAsync);\nfunction _readImageDownsampling(prepareCtx, imgSource, maxSample) {\n let { naturalWidth: width, naturalHeight: height } = imgSource;\n const scale = width * height / maxSample;\n if (scale > 1) {\n const scaleSqrt = Math.sqrt(scale);\n width = width / scaleSqrt | 0;\n height = height / scaleSqrt | 0;\n }\n const ctx = prepareCtx(width, height);\n ctx.drawImage(imgSource, 0, 0, width, height);\n return ctx.getImageData(0, 0, width, height);\n}\nconst readImageDownsampling = _readImageDownsampling.bind(void 0, _prepare2DContext);\nconst readImageDownsamplingOffscreen = _readImageDownsampling.bind(void 0, _prepare2DContextAsync);\n\nfunction convertToLab(source) {\n const array = [];\n for (let i = 0; i < source.length; i += 4) {\n const pixel = source.slice(i, i + 4);\n const alpha = pixel[3];\n const pixel_rgb = pixel.slice(0, 3);\n const pixel_xyz = rgb.xyz(pixel_rgb);\n const pixel_lab = xyz.lab(pixel_xyz);\n array.push(...pixel_lab, alpha);\n }\n return array;\n}\nfunction labaToRGBA(laba) {\n const pixel_lab = laba.slice(0, 3);\n const alpha = laba[3];\n const pixel_xyz = lab.xyz(pixel_lab);\n const pixel_rgb = xyz.rgb(pixel_xyz);\n pixel_rgb.push(alpha);\n return pixel_rgb;\n}\n\nfunction max_min_of_three([a, b, c]) {\n if (a > b) {\n if (b > c) {\n return [a, c];\n } else {\n if (a > c) {\n return [a, b];\n } else {\n return [c, b];\n }\n }\n } else {\n if (b > c) {\n if (c > a) {\n return [b, a];\n } else {\n return [b, c];\n }\n } else {\n return [c, a];\n }\n }\n}\n\nfunction normalizeRGBA(rgba) {\n return rgba.map((v) => v / 255);\n}\nfunction rgbaToHSLA(rgba) {\n let h, s;\n const [max, min] = max_min_of_three(rgba);\n const diff = max - min;\n const light_2x = max + min;\n if (diff == 0) {\n h = 0;\n s = 0;\n } else {\n if (max == rgba[0]) {\n const temp_h = 60 * (rgba[1] - rgba[2]) / diff;\n if (temp_h < 0) {\n h = temp_h + 360;\n } else {\n h = temp_h;\n }\n } else if (max == rgba[1]) {\n h = 60 * (rgba[2] - rgba[0]) / diff + 120;\n } else {\n h = 60 * (rgba[0] - rgba[1]) / diff + 240;\n }\n if (light_2x == 0) {\n s = 0;\n } else if (light_2x <= 1) {\n s = diff / light_2x;\n } else {\n s = diff / (2 - light_2x);\n }\n }\n return [h, s, light_2x / 2, rgba[3]];\n}\nconst getVector4Comparer = (sort = [0, 1, 2, 3]) => (a, b) => {\n let result;\n for (const s of sort) {\n result = a[s] - b[s];\n if (result != 0) {\n return result;\n }\n }\n return result;\n};\nconst hslaCSSText = ([h, s, l, a]) => `hsla(${h}deg,${s * 100}%,${l * 100}%,${a})`;\nconst rgbaCSSText = (pixel) => `rgba(${pixel.map((v) => Math.floor(v)).join(\",\")})`;\n\nexport { awaitImage, convertToLab, getVector4Comparer, hslaCSSText, kmeans, labaToRGBA, neuquant, normalizeRGBA, readImage, readImageDownsampling, readImageDownsamplingOffscreen, readImageOffscreen, rgbaCSSText, rgbaToHSLA };\n","import PromiseWorker from '@kotorik/promise-worker';\nimport { isInDarkMode } from '../darkmode';\n//@ts-ignore\nimport 'color-space/hsl';\n//@ts-ignore\nimport rgb from 'color-space/rgb';\nimport { awaitImage, readImageDownsampling } from '@kotorik/palette';\nconst originalThemeSkinMatcing = getComputedStyle(document.documentElement).getPropertyValue('--theme-skin-matching');\nconst worker = new PromiseWorker(new Worker(new URL('./worker.ts', import.meta.url)));\nlet currentColor = [0, 0, 0, 0];\nfunction hslaCSSText([h, s, l, a]) {\n if (a) {\n return \"hsla(\" + h + \"deg,\" + s + \"%,\" + l + \"%,\" + a + \")\";\n }\n else {\n return \"hsl(\" + h + \"deg,\" + s + \"%,\" + l + \"%)\";\n }\n}\nexport async function getThemeColorFromImageElement(imgElement) {\n try {\n await awaitImage(imgElement);\n const imageData = readImageDownsampling(imgElement, 10000);\n const result = await worker.postMessage(imageData.data, { transfer: [imageData.data.buffer] });\n return result;\n }\n catch (e) {\n console.error(e);\n return null;\n }\n}\nfunction _updateThemeColorMeta(color_css) {\n const meta = document.querySelector('meta[name=theme-color]');\n meta && (meta.content = color_css);\n}\nexport async function updateThemeSkin(coverBGUrl) {\n const imgElement = document.createElement('img');\n imgElement.src = coverBGUrl;\n imgElement.crossOrigin = \"anonymous\";\n const rgba = await getThemeColorFromImageElement(imgElement);\n if (rgba) {\n currentColor = rgba;\n _setColor();\n }\n else {\n _updateThemeColorMeta(originalThemeSkinMatcing); //回滚\n }\n}\nfunction _setColor(darkmode) {\n let hsla = rgb.hsl(currentColor);\n const darkmodeColor = [...hsla];\n darkmodeColor[2] *= 0.5;\n if (typeof darkmode == 'undefined' ? isInDarkMode() : darkmode) {\n hsla = darkmodeColor;\n }\n _updateThemeColorMeta(hslaCSSText(hsla));\n if (_iro.extract_theme_skin) {\n document.documentElement.style.setProperty('--theme-skin-matching', hslaCSSText(hsla));\n document.documentElement.style.setProperty('--theme-skin-dark', hslaCSSText(darkmodeColor));\n }\n /* const textColor = [0, 0, 0] as [number, number, number]\n \n if (hsla[2] > 40) {\n textColor[2] = 0.314\n } else {\n textColor[2] = 1 - 0.314\n }\n \n const style = document.documentElement.style\n const [h, s, l] = hsla\n style.setProperty('--header-color-h', h + 'deg')\n style.setProperty('--header-color-s', s + '%')\n style.setProperty('--header-color-l', l + '%')\n \n const siteHeader = document.querySelector('.site-header')\n siteHeader.style.color = hslaCSSText(textColor)\n */\n}\nexport function initThemeColor() {\n document.addEventListener('coverBG_change', (({ detail: coverBGUrl }) => updateThemeSkin(coverBGUrl)));\n document.addEventListener('darkmode', (({ detail: next }) => _setColor(next)));\n}\nexport function getForeground(rgba) {\n const hsla = rgb.hsl(rgba);\n if (hsla[2] > 40) {\n return [0, 0, 0, 1];\n }\n return [0, 100, 100, 1];\n}\nexport function getHighlight(rgba) {\n const hsla = rgb.hsl(rgba);\n hsla[2] = Math.min(100, hsla[2] * 1.1);\n return hsla;\n}\n","import { importExternal } from '../common/npmLib';\nlet typedInstance;\nexport function disableTypedJsIfExist() {\n if (typedInstance) {\n typedInstance.destroy();\n typedInstance = null;\n }\n}\nexport default async function initTypedJs() {\n const json = document.getElementById('typed-js-initial');\n if (json) {\n disableTypedJsIfExist(); // Fix mirai-mamori/Sakurairo #810\n try {\n const options = JSON.parse(json.innerHTML);\n const element = document.querySelector('.element');\n element.innerText = '';\n if (_iro.ext_shared_lib) {\n if (!window.Typed)\n await importExternal('dist/typed.umd.js', 'typed.js');\n typedInstance = new window.Typed(element, options);\n }\n else {\n const { default: Typed } = await import('typed.js');\n typedInstance = new Typed(element, options);\n }\n }\n catch (e) {\n console.error(\"请检查typed.js设置\", e);\n }\n }\n}\n","import { getBaseName } from '../common/util';\nimport { __ } from '../common/sakurairo_global';\nimport { importExternal } from '../common/npmLib';\nconst bgvideo = document.getElementById(\"bgvideo\");\nconst videoList = _iro.movies.name?.split(\",\") || []; // 视频列表\nlet unplayedIndex = new Array(videoList.length).fill(0).map((_, index) => index);\nlet aplayersToResume = [];\n//#region 背景视频\nconst _getNextRandomVideo = () => {\n if (unplayedIndex.length == 0) {\n unplayedIndex = new Array(videoList.length).fill(0).map((_, index) => index);\n }\n const nextIndex = Math.floor(Math.random() * unplayedIndex.length);\n return videoList[unplayedIndex.splice(nextIndex, 1)[0]];\n};\nfunction getVideo() {\n const video_stu = document.getElementsByClassName(\"video-stu\")[0];\n const fileName = _getNextRandomVideo(); // 随机抽取视频\n video_stu.innerHTML = __(\"正在载入视频 ...\");\n video_stu.style.bottom = \"0px\";\n //这里不需要检验_iro.movies是不是字符串,因为应该在前边检查\n bgvideo.setAttribute(\"src\", new URL(fileName, _iro.movies.url || location.origin).toString());\n bgvideo.setAttribute(\"video-name\", getBaseName(fileName));\n}\n/**\n * 播放\n */\nfunction splay() {\n const video_btn = document.getElementById(\"video-btn\");\n if (video_btn) {\n video_btn.classList.add(\"video-pause\");\n video_btn.classList.remove(\"video-play\");\n video_btn.style.display = \"\";\n }\n try {\n document.querySelector(\".video-stu\").style.bottom = \"-100px\";\n document.querySelector(\".focusinfo\").style.top = \"-999px\";\n if (_iro.float_player_on) {\n import('./aplayer').then(({ pauseAllPlayer }) => {\n aplayersToResume = pauseAllPlayer();\n bgvideo.play();\n });\n return;\n }\n }\n catch (e) {\n console.warn(e);\n }\n bgvideo.play();\n}\n/**\n * 暂停\n */\nfunction spause() {\n const video_btn = document.getElementById(\"video-btn\");\n if (video_btn) {\n video_btn.classList.add(\"video-play\");\n video_btn.classList.remove(\"video-pause\");\n }\n try {\n document.querySelector(\".focusinfo\").style.top = \"49.3%\";\n }\n catch { }\n bgvideo.pause();\n for (const player of aplayersToResume) {\n player.play();\n }\n}\n/**\n * 自动续播 - 播放\n */\nexport function liveplay() {\n if (bgvideo && bgvideo.oncanplay != undefined && document.querySelector(\".haslive\")) { // 检查视频数据\n if (document.querySelector(\".videolive\")) { // 检查播放状态\n splay();\n }\n }\n}\nexport function livepause() {\n if (bgvideo && bgvideo.oncanplay != undefined && document.querySelector(\".haslive\")) { // 检查视频数据\n spause();\n const video_stu = document.getElementsByClassName(\"video-stu\")[0];\n video_stu.style.bottom = \"0px\";\n video_stu.innerHTML = __(\"已暂停...\");\n }\n}\nexport function coverVideo() {\n const video_btn = document.getElementById(\"video-btn\");\n if (video_btn)\n video_btn.addEventListener(\"click\", function () {\n if (this.classList.contains(\"loadvideo\")) {\n this.classList.add(\"video-pause\");\n this.classList.remove(\"loadvideo\");\n getVideo();\n bgvideo.oncanplay = () => {\n splay();\n document.getElementById(\"video-add\").style.display = \"block\";\n video_btn.classList.add(\"videolive\", \"haslive\"); // MDZZ\n };\n }\n else {\n if (this.classList.contains(\"video-pause\")) {\n spause();\n video_btn.classList.remove(\"videolive\");\n document.getElementsByClassName(\"video-stu\")[0].style.bottom = \"0px\";\n document.getElementsByClassName(\"video-stu\")[0].innerHTML = __(\"已暂停...\");\n }\n else {\n splay();\n video_btn.classList.add(\"videolive\"); // 用于判断切换页面时的状态\n }\n }\n bgvideo.onended = function () {\n bgvideo.setAttribute(\"src\", \"\");\n document.getElementById(\"video-add\").style.display = \"none\";\n document.querySelector(\".focusinfo\").style.top = \"49.3%\";\n if (video_btn) {\n video_btn.classList.add(\"loadvideo\");\n video_btn.classList.remove(\"video-pause\", \"videolive\", \"haslive\");\n if (_iro.movies.loop) {\n video_btn.click();\n }\n }\n };\n });\n const video_add = document.getElementById(\"video-add\");\n if (video_add)\n video_add.addEventListener(\"click\", getVideo);\n}\n//#endregion\nexport async function coverVideoIni() {\n initHLS();\n lazyloadPatch();\n}\nfunction canPlayHandler() {\n this.poster = '';\n}\n/**\n * 用户代理可能会禁止自动播放,此时需要撤掉poster\n */\nasync function lazyloadPatch() {\n document.querySelectorAll('video.lazyload')\n .forEach(video => video.addEventListener('canplay', canPlayHandler));\n}\nasync function initHLS() {\n const videos = document.querySelectorAll('video.hls');\n if (videos.length == 0)\n return;\n //检查浏览器是否原生支持\n if (videos[0].canPlayType('application/vnd.apple.mpegurl')) {\n for (const video of videos) {\n video.src = video.dataset.src || video.src;\n video.autoplay = true;\n }\n }\n else {\n if (!window.Hls) {\n try {\n if (_iro.ext_shared_lib) {\n await importExternal('dist/hls.light.min.js', 'hls.js');\n }\n else {\n //@ts-ignore\n const { default: Hls } = await import('hls.js/dist/hls.light.js');\n window.Hls = Hls;\n }\n }\n catch (reason) {\n console.warn('Hls load failed: ', reason);\n }\n }\n if (!Hls.isSupported())\n console.error('Hls: Media Source Extensions is unsupported.');\n for (const video of videos) {\n const hls = new Hls();\n hls.loadSource(video.dataset.src || video.src);\n hls.attachMedia(video);\n hls.on(Hls.Events.MANIFEST_PARSED, () => {\n video.play();\n });\n }\n }\n}\n","import { sakurairoGlobal } from \"../common/sakurairo_global\";\nexport function web_audio() {\n if (!_iro.audio)\n return;\n //@ts-ignore\n const AudioContext = window.AudioContext || window.webkitAudioContext;\n if (AudioContext) {\n let i = 0;\n const o = 1;\n const t = getSheet();\n const selects = document.querySelectorAll(\".site-title, #moblieGoTop, .site-branding, .searchbox, .changeSkin-gear, .menu-list li\");\n const notes = \"♪♩♫♬♭€§¶♯\";\n const gainValueMax = sakurairoGlobal.opt.web_audio?.main_gain || 1;\n const ctx = new AudioContext;\n const l = ctx.createGain();\n const c = ctx.createOscillator();\n l.connect(ctx.destination);\n c.connect(l);\n c.type = \"sine\";\n c.start(ctx.currentTime);\n let _t;\n function suspendContextWhenIdle() {\n clearTimeout(_t);\n _t = setTimeout(() => {\n ctx.suspend();\n _t = undefined;\n }, 1000);\n }\n let lastTarget = null;\n const listener = (e) => {\n if (e.currentTarget === lastTarget)\n return;\n ctx.resume();\n lastTarget = e.currentTarget;\n const d = Math.round(notes.length * Math.random());\n const h = e.pageX;\n const p = e.pageY - 5;\n const dom = document.createElement(\"b\");\n dom.textContent = notes[d];\n dom.style.zIndex = \"99999\";\n dom.style.top = p - 100 + \"px\";\n dom.style.left = h + \"px\";\n dom.style.position = \"absolute\";\n dom.style.color = \"#FF6EB4\";\n dom.style.pointerEvents = \"none\";\n document.body.appendChild(dom);\n dom.animate([\n { top: p + \"px\" },\n { opacity: 0 }\n ], {\n duration: 500\n });\n const r = t[i] || t[i = 0];\n i += o;\n l.gain.cancelScheduledValues(ctx.currentTime);\n c.frequency.setValueAtTime(r, ctx.currentTime);\n l.gain.exponentialRampToValueAtTime(gainValueMax, ctx.currentTime + .01);\n l.gain.exponentialRampToValueAtTime(.001, ctx.currentTime + 2);\n l.gain.setValueAtTime(0, ctx.currentTime + 2.1);\n setTimeout(() => {\n dom.remove();\n if (lastTarget === e.currentTarget)\n lastTarget = null;\n suspendContextWhenIdle();\n }, 500);\n };\n selects.forEach(s => s.addEventListener('pointerenter', listener));\n }\n}\nfunction getSheet() {\n const sheet = sakurairoGlobal.opt.web_audio?.sheet;\n if (typeof sheet == 'string') {\n return sheet.split(' ');\n }\n else if (sheet instanceof Array) {\n return sheet;\n }\n else {\n //欢乐颂\n /*t = \"329.628 329.628 349.228 391.995 391.995 349.228 329.628 293.665 261.626 261.626 293.665 329.628 329.628 293.665 293.665 329.628 329.628 349.228 391.995 391.995 349.228 329.628 293.665 261.626 261.626 293.665 329.628 293.665 261.626 261.626 293.665 293.665 329.628 261.626 293.665 329.628 349.228 329.628 261.626 293.665 329.628 349.228 329.628 293.665 261.626 293.665 195.998 329.628 329.628 349.228 391.995 391.995 349.228 329.628 293.665 261.626 261.626 293.665 329.628 293.665 261.626 261.626\".split(\" \")*/\n //天空之城\n return \"880 987 1046 987 1046 1318 987 659 659 880 784 880 1046 784 659 659 698 659 698 1046 659 1046 1046 1046 987 698 698 987 987 880 987 1046 987 1046 1318 987 659 659 880 784 880 1046 784 659 698 1046 987 1046 1174 1174 1174 1046 1046 880 987 784 880 1046 1174 1318 1174 1318 1567 1046 987 1046 1318 1318 1174 784 784 880 1046 987 1174 1046 784 784 1396 1318 1174 659 1318 1046 1318 1760 1567 1567 1318 1174 1046 1046 1174 1046 1174 1567 1318 1318 1760 1567 1318 1174 1046 1046 1174 1046 1174 987 880 880 987 880\".split(\" \");\n }\n}\n","export function clearButterbar() {\n const butterBar = document.getElementsByClassName(\"butterBar\");\n if (butterBar.length > 0) {\n for (let i = 0; i < butterBar.length; i++) {\n butterBar[i].remove();\n }\n }\n}\nexport function createButterbar(message, keep) {\n clearButterbar();\n /* document.body.insertAdjacentHTML('beforeend', ' ');\n */\n const div = document.createElement('div');\n const p = document.createElement('p');\n div.classList.add('butterBar', 'butterBar--center');\n p.classList.add('butterBar-message');\n p.innerHTML = message;\n div.appendChild(p);\n document.body.appendChild(div);\n if (keep !== true)\n setTimeout(() => { clearButterbar(); }, typeof keep == 'number' ? keep : 6000);\n return div;\n}\n","/**\n * default option\n */\nconst defaults = {\n src: \"data-src\",\n srcset: \"data-srcset\",\n selector: \".lazyload\",\n root: null,\n rootMargin: \"0px\",\n threshold: 0\n};\n/**\n * @class LazyLoad\n */\nexport default class LazyLoad {\n constructor(elms, options) {\n this.opts = { ...defaults, ...options };\n this.elms = elms || document.querySelectorAll(this.opts.selector);\n this.init();\n }\n elms;\n obs = null;\n opts;\n init() {\n /* Without observers load everything and bail out early. */\n if (!IntersectionObserver) {\n this.load();\n return;\n }\n this.obs = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n this.obs.unobserve(entry.target);\n this.doLoad(entry.target);\n }\n }\n }, {\n root: this.opts.root,\n rootMargin: this.opts.rootMargin,\n threshold: [this.opts.threshold]\n });\n this.elms.forEach((image) => {\n this.obs.observe(image);\n });\n }\n load() {\n if (!this.opts) {\n return;\n }\n this.elms.forEach(this.doLoad);\n }\n doLoad = (element) => {\n const src = element.getAttribute(this.opts.src);\n const srcset = element.getAttribute(this.opts.srcset);\n const tagName = element.tagName.toLowerCase();\n if (src) {\n if (element.src === src || element.style.backgroundImage.includes(src)) {\n return;\n }\n if (tagName === 'video' || tagName === 'img') {\n element.src = src;\n }\n else {\n element.style.backgroundImage = \"url('\" + src + \"')\";\n }\n }\n if (tagName === 'img' && srcset) {\n element.srcset = srcset;\n }\n };\n /**\n * Destroy Lazyload Instance\n * @returns\n */\n destroy() {\n if (!this.opts) {\n return;\n }\n this.obs.disconnect();\n this.opts = null;\n }\n}\nexport const lazyload = (images, options) => new LazyLoad(images, options);\n","import Lazyload from 'lazyload';\nlet instance;\nexport default function lazyload() {\n if (instance) {\n instance.destroy();\n }\n instance = new Lazyload();\n}\n","/**\n * 收集资源的下载情况,自动切换cdn\n * 策略:\n * 1.如果发现大量资源无法下载(cdn down),尝试切换cdn\n * 2.切换cdn时测试对同一个资源访问的表现(未实现)\n * 3.\n * 暂不根据加载速度动态调整cdn\n * TODO: 使用内置依赖的fallback\n */\nconst STORAGE_KEY = 'sakurairo_prefer_cdn';\nconst CDN_LIST = [\n /* [\"https://jscdn.host/release/ucode/\", \"/\", \"/\", \"\"],\n [\"https://cdnjs.cloudflare.com/ajax/libs/\", \"/\", \"/\", \"\"],\n */\n [\"https://jsd.nmxc.ltd/npm/\", \"@\", \"/\", \"\"],\n [\"https://cdn.jsdelivr.net/npm/\", \"@\", \"/\", \"\"],\n [\"https://unpkg.com/\", \"@\", \"/\", \"\"],\n //TODO:自定cdn\n];\nfunction getPreferCDNIndex() {\n const config = localStorage.getItem(STORAGE_KEY);\n if (config) {\n const num = parseInt(config);\n if (isNaN(num) || num >= CDN_LIST.length) {\n //回归初始值\n localStorage.removeItem(STORAGE_KEY);\n return 0;\n }\n return num;\n }\n else {\n return 0;\n }\n}\nconst currentCDNIndex = getPreferCDNIndex();\nconst currentCDN = { raw: CDN_LIST[currentCDNIndex] };\n/**\n * 从当前的CDN中获取指定npm包中的指定文件\n * @author KotoriK\n * @param relativePath 文件在npm包中的路径\n * @param packageName npm包名\n * @param version npm包版本,默认从package.json中获取依赖版本(注意package_info.js中有限定哪些包的信息会被带到运行时),若无相关信息则为latest\n * @returns 从当前cdn访问该文件的url\n */\nexport const resolvePath = (relativePath, packageName, version) => String.raw(currentCDN, packageName, version || PKG_INFO[packageName] || 'latest', relativePath);\nconst resolvePathByCDN = (cdn, relativePath, moduleName, version) => String.raw({ raw: cdn }, moduleName, version, relativePath);\nfunction isServedByCurrentCDN(path) {\n const cdnMatchKey = CDN_LIST[currentCDNIndex][0];\n if (path.match(cdnMatchKey)) {\n return true;\n }\n}\nfunction analyze(time = 30000) {\n let failedCounts = 0;\n let totalCounts = 0;\n const observer = new PerformanceObserver((list, observer) => {\n for (const entry of list.getEntries()) {\n if (isServedByCurrentCDN(entry.name)) {\n totalCounts++;\n const { transferSize } = entry;\n if (transferSize == 0) {\n //可能是资源未能成功下载\n failedCounts++;\n }\n }\n }\n });\n observer.observe({ entryTypes: ['resource'] });\n setTimeout(() => {\n observer.disconnect();\n if (failedCounts / totalCounts > 0.7) {\n //切换cdn\n const nextCDN = currentCDNIndex + 1;\n localStorage.setItem(STORAGE_KEY, (nextCDN >= CDN_LIST.length ? 0 : nextCDN).toString());\n }\n }, time);\n}\n/* ready(analyze)\n */\n//TODO\n//测试cdn对实例资源的访问表现\nasync function testCDN() {\n await Promise.allSettled(CDN_LIST.map((cdn) => \n //baguettebox.js@1.11.1/dist/baguetteBox.min.css\n fetch(resolvePathByCDN(cdn, 'dist/baguetteBox.min.css', 'baguettebox.js', '1.11.1'))));\n}\nexport const importExternal = (path, packageName, version) => {\n const id = `${packageName}${version ? '@' + version : ''}${path}`;\n if (document.getElementById(id)) { // 避免重复加载\n return Promise.resolve();\n }\n const script = document.createElement('script');\n script.id = id;\n script.src = resolvePath(path, packageName, version);\n script.async = true;\n //TODO: 超时处理\n return new Promise((resolve, reject) => {\n script.onload = () => resolve();\n script.onerror = () => {\n script.remove(); // 允许下次尝试\n reject(new Error(packageName + \"加载失败\"));\n };\n document.body.append(script);\n }).finally(() => {\n script.onload = script.onerror = null; //据说ie上会内存泄露\n });\n};\n","/**\n *\n * @param key 这段句子的中文表述(默认语言)\n */\n//@ts-ignore\nexport const __ = (defaultStr) => (window._sakurairoi18n && _sakurairoi18n[defaultStr]) || defaultStr;\n/**\n *\n * 占位符格式 {index} ex.{0}\n * @param defaultStr 这段句子的中文表述(默认语言)\n * @param replacements 句子中占位符的替代元素\n */\nexport const _$ = (defaultStr, ...replacements) => {\n let template = __(defaultStr);\n for (const index in replacements) {\n template = template.replace('{' + index + '}', replacements[index]);\n }\n return template;\n};\nexport const sakurairoGlobal = {\n opt: {},\n /* _sys_call:sys_call\n */\n build: BUILD_INFO\n};\n/**\n * 在sakurairoGlobal注册一个对象\n * @param key\n * @param value\n * @returns\n */\nexport const registerOnGlobal = (key, value) => Object.defineProperty(sakurairoGlobal, key, {\n value: value,\n writable: false,\n enumerable: true,\n});\nif ('_sakurairo' in window) {\n //@ts-ignore\n const _sakurairo = window._sakurairo;\n //@ts-ignore\n if ('opt' in _sakurairo) {\n sakurairoGlobal.opt = _sakurairo.opt;\n }\n}\n//@ts-ignore\nwindow._sakurairo = sakurairoGlobal;\n","let readyFunctionList = [];\n/**\n * 传入的函数同时间只能运行一个\n * @param func 要包装的函数\n * @returns 包装后的函数\n */\nexport const onlyOnceATime = (func) => {\n let isRunning = false;\n return (...args) => {\n if (!isRunning) {\n isRunning = true;\n try {\n const result = func(...args);\n if (result instanceof Promise) {\n result.finally(() => isRunning = false);\n }\n else {\n isRunning = false;\n }\n return result;\n }\n catch (e) {\n console.warn(e);\n isRunning = false;\n }\n }\n };\n};\nconst whileReady = () => {\n document.removeEventListener('DOMContentLoaded', whileReady);\n for (const fn of readyFunctionList) {\n fn();\n }\n readyFunctionList = [];\n};\n/**\n * 延迟函数到DOM树加载完成后执行\n * @seealso https://developer.mozilla.org/zh-CN/docs/Web/API/Document/readyState\n * @param fn 要延迟执行的函数\n */\nexport const ready = function (fn) {\n //interactive:等价于事件DOMContentLoaded\n //complete:等价于事件load\n if (document.readyState !== 'loading') {\n return fn();\n }\n if (readyFunctionList.length == 0) {\n document.addEventListener('DOMContentLoaded', whileReady, false);\n }\n readyFunctionList.push(fn);\n};\n/**\n * 获取文件名的主名部分(即去除扩展名)\n * @param fileName 文件名\n * @returns 主名\n */\nexport const getBaseName = (fileName) => fileName.replace(/\\.\\w+$/, '');\n// TODO: 使用现代CSS替代实现\nexport function slideToggle(el, duration = 1000, mode = '') {\n const dom = el;\n dom.status = dom.status || getComputedStyle(dom, null)['display'];\n const flag = dom.status != 'none';\n if ((flag == true && mode == \"show\") || (flag == false && mode == \"hide\"))\n return;\n dom.status = flag ? 'none' : 'block';\n dom.style.transition = 'height ' + duration / 1000 + 's';\n dom.style.overflow = 'hidden';\n clearTimeout(dom.tagTimer);\n dom.tagTimer = dom.tagTimer || null;\n dom.style.display = 'block';\n dom.tagHeight = dom.tagHeight || dom.clientHeight + 'px';\n dom.style.display = '';\n dom.style.height = flag ? dom.tagHeight : \"0px\";\n setTimeout(() => {\n dom.style.height = flag ? \"0px\" : dom.tagHeight;\n }, 0);\n dom.tagTimer = setTimeout(() => {\n dom.style.display = flag ? 'none' : 'block';\n dom.style.transition = '';\n dom.style.overflow = '';\n dom.style.height = '';\n dom.status = dom.tagHeight = null;\n }, duration);\n}\nexport function buildAPI(apiPath, params = {}, nonce = true) {\n const path = new URL(apiPath);\n const { searchParams } = path;\n for (const [key, value] of Object.entries(params)) {\n searchParams.set(key, value);\n }\n if (nonce)\n searchParams.set(\"_wpnonce\", _iro.nonce);\n return path.toString();\n}\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport function noop() { }\n","const mainContainer = document.getElementById(\"main-container\");\nfunction toggle() {\n document.body.classList.toggle(\"navOpen\");\n mainContainer.classList.toggle(\"open\");\n document.getElementById(\"mo-nav\").classList.toggle(\"open\");\n document.querySelector(\".openNav\").classList.toggle(\"open\");\n document.querySelector(\".site-header\").classList.toggle(\"open\");\n}\nexport function open() {\n toggle();\n document.documentElement.style.overflow = \"hidden\";\n mainContainer.addEventListener('click', close);\n}\nexport function close() {\n toggle();\n document.documentElement.style.overflow = \"unset\";\n mainContainer.removeEventListener('click', close);\n}\n","import { buildAPI } from '../common/util';\nimport { __ } from '../common/sakurairo_global';\nlet QueryStorage;\nfunction renderSearchResult(keyword, link, fa, title, iconfont, comments, text) {\n if (keyword) {\n const s = keyword.trim().split(\" \"), a = title.indexOf(s[s.length - 1]), b = text.indexOf(s[s.length - 1]);\n title = a < 60 ? title.slice(0, 80) : title.slice(a - 30, a + 30);\n title = title.replace(s[s.length - 1], ' ' + s[s.length - 1].toUpperCase() + ' ');\n text = b < 60 ? text.slice(0, 80) : text.slice(b - 30, b + 30);\n text = text.replace(s[s.length - 1], ' ' + s[s.length - 1].toUpperCase() + ' ');\n }\n return ``;\n}\nfunction Cx(array, query) {\n for (let s = 0; s < query.length; s++) {\n if (['.', '?', '*'].indexOf(query[s]) != -1) {\n query = query.slice(0, s) + \"\\\\\" + query.slice(s);\n s++;\n }\n }\n query = query.replace(query, \"^(?=.*?\" + query + \").+$\").replace(/\\s/g, \")(?=.*?\");\n return array.filter(v => Object.values(v)\n .some(v => new RegExp(query + '').test(v)));\n}\nfunction query(B, keyword) {\n let y = \"\", w = \"\", u = \"\", r = \"\", p = \"\", F = \"\";\n const G = '${title}${comments} ${text}
\", E = \"\", queries = Cx(B, keyword.trim());\n for (const query of queries) {\n switch (query.type) {\n case \"post\":\n w = w + renderSearchResult(keyword, query.link, \"fa-inbox\", query.title, \"fa-comments\", query.comments, query.text);\n break;\n case \"tag\":\n p = p + renderSearchResult(\"\", query.link, \"fa-tag\", query.title, \"none\", \"\", \"\");\n break;\n case \"category\":\n r = r + renderSearchResult(\"\", query.link, \"fa-folder\", query.title, \"none\", \"\", \"\");\n break;\n case \"page\":\n u = u + renderSearchResult(keyword, query.link, \"fa-file\", query.title, \"fa-comments\", query.comments, query.text);\n break;\n case \"comment\":\n F = F + renderSearchResult(keyword, query.link, \"fa-comment\", query.title, \"none\", \"\", query.text);\n break;\n }\n }\n w && (y = y + G + __(\"文章\") + E + w + D);\n u && (y = y + G + __(\"页面\") + E + u + D);\n r && (y = y + G + __(\"分类\") + E + r + D);\n p && (y = y + G + __(\"标签\") + E + p + D);\n F && (y = y + G + __(\"评论\") + E + F + D);\n document.getElementById(\"PostlistBox\").innerHTML = y;\n}\nfunction search_a(val) {\n const otxt = document.getElementById(\"search-input\");\n if (sessionStorage.getItem('search') != null) {\n QueryStorage = JSON.parse(sessionStorage.getItem('search'));\n query(QueryStorage, otxt.value);\n div_href();\n }\n else {\n fetch(val)\n .then(async (resp) => {\n if (resp.ok) {\n const json = await resp.text();\n if (json != \"\") {\n sessionStorage.setItem('search', json);\n QueryStorage = JSON.parse(json);\n query(QueryStorage, otxt.value);\n div_href();\n }\n }\n else {\n console.warn('HTTP ' + resp.status);\n }\n })\n .catch(reason => console.warn(reason));\n }\n}\n/* if (!Object.values) Object.values = function (obj) {\n if (obj !== Object(obj))\n throw new TypeError('Object.values called on a non-object');\n var val = [],\n key;\n for (key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n val.push(obj[key]);\n }\n }\n return val;\n } */\nfunction div_href() {\n const search_close = document.querySelector(\".search_close\");\n const Ty = document.getElementById('Ty');\n for (const ele of document.getElementsByClassName('ins-selectable')) {\n ele.addEventListener(\"click\", () => {\n Ty.href = ele.getAttribute('href');\n Ty.click();\n search_close.click();\n });\n }\n /* $(\".ins-selectable\").each(function () {\n $(this).click(function () {\n $(\"#Ty\").attr('href', $(this).attr('href'));\n $(\"#Ty\").click();\n $(\".search_close\").click();\n });\n }); */\n}\nexport function jsSearchCallback() {\n //$('.js-toggle-search').toggleClass('is-active');\n document.getElementsByClassName('js-toggle-search')[0].classList.toggle('is-active');\n //$('.js-search').toggleClass('is-visible');\n document.getElementsByClassName('js-search')[0].classList.toggle('is-visible');\n //$('html').css('overflow-y', 'hidden');\n document.documentElement.style.overflowY = 'hidden';\n if (_iro.live_search) {\n QueryStorage = [];\n search_a(buildAPI(_iro.api + \"sakura/v1/cache_search/json\"));\n let otxt = document.getElementById(\"search-input\"), \n //list = document.getElementById(\"PostlistBox\"),\n //Record = list.innerHTML,\n searchFlag = null;\n otxt.oninput = function () {\n if (searchFlag != null) {\n clearTimeout(searchFlag);\n }\n searchFlag = setTimeout(function () {\n query(QueryStorage, otxt.value);\n div_href();\n }, 250);\n };\n }\n}\n","import lazyload from \"../common/lazyload\"\nimport { slideToggle } from \"../common/util\";\nimport { changeCoverBG, getCoverPath, getCurrentBG, nextBG, preBG } from \"./coverBackground\";\nimport { isMobile } from \"./mobile\";\nimport { open, close } from './mobile_nav'\n\nvar _mashiro_global_skin_secter = true\n\nexport function checkSkinSecter() {\n if (_mashiro_global_skin_secter === false) {\n const pattern = document.querySelector(\".pattern-center\"),\n headertop = document.querySelector(\".headertop-bar\");\n if (pattern) {\n pattern.classList.remove(\"pattern-center\");\n pattern.classList.add(\"pattern-center-sakura\");\n }\n if (headertop) {\n headertop.classList.remove(\"headertop-bar\");\n headertop.classList.add(\"headertop-bar-sakura\");\n }\n } else {\n const pattern = document.querySelector(\".pattern-center-sakura\"),\n headertop = document.querySelector(\".headertop-bar-sakura\");\n if (pattern) {\n pattern.classList.remove(\"pattern-center-sakura\");\n pattern.classList.add(\"pattern-center\");\n }\n if (headertop) {\n headertop.classList.remove(\"headertop-bar-sakura\");\n headertop.classList.add(\"headertop-bar\");\n }\n }\n}\n/**\n * 设置前台背景\n * @param {string} tagId 前台背景ID\n * @returns \n */\nexport async function changeSkin(tagId) {\n //@sideeffect\n _mashiro_global_skin_secter = tagId == \"white-bg\" || tagId == \"dark-bg\";\n checkSkinSecter();\n let bg_url;\n switch (tagId) {\n case \"white-bg\":\n if (_iro.site_bg_as_cover) {\n changeCoverBG(await getCoverPath())//为触发封面背景相关事件 调用函数而不是走下方流程\n return\n } else {\n bg_url = _iro.skin_bg0;\n }\n break;\n case \"diy1-bg\":\n bg_url = _iro.skin_bg1;\n break;\n case \"diy2-bg\":\n bg_url = _iro.skin_bg2;\n break;\n case \"diy3-bg\":\n bg_url = _iro.skin_bg3;\n break;\n case \"diy4-bg\":\n bg_url = _iro.skin_bg4;\n break;\n }\n document.body.style.backgroundImage = bg_url ? `url(${bg_url})` : '';\n}\n\nexport function bgButtonAddListener() {\n const next = document.getElementById(\"bg-next\"),\n pre = document.getElementById(\"bg-pre\");\n if (next) { next.onclick = nextBG }\n if (pre) { pre.onclick = preBG }\n}\n\nexport function timeSeriesReload(flag) {\n const archives = document.getElementById('archives');\n if (!archives) return;\n const al_li = archives.getElementsByClassName('al_mon');\n\n if (flag) {\n archives.addEventListener(\"click\", (e) => {\n if (e.target.classList.contains(\"al_mon\")) {\n e.preventDefault();\n slideToggle(e.target.nextElementSibling, 500);\n }\n })\n lazyload();\n } else {\n let al_expand_collapse = document.getElementById('al_expand_collapse');\n al_expand_collapse.style.cursor = \"s-resize\";\n for (let i = 0; i < al_li.length; i++) {\n let a = al_li[i],\n num = a.nextElementSibling.getElementsByTagName('li').length;\n a.style.cursor = \"s-resize\";\n a.querySelector('#post-num').textContent = num;\n }\n const al_post_list = archives.getElementsByClassName(\"al_post_list\")\n const al_post_list_first = al_post_list[0];\n for (const child of al_post_list) {\n slideToggle(child, 500, 'hide')\n }\n slideToggle(al_post_list_first, 500, 'show');\n\n archives.addEventListener(\"click\", (e) => {\n if (e.target.classList.contains(\"al_mon\")) {\n slideToggle(e.target.nextElementSibling, 500);\n e.preventDefault();\n }\n })\n if (!isMobile()) {\n for (let i = 0; i < al_post_list.length; i++) {\n let el = al_post_list[i];\n el.parentNode.addEventListener('mouseover', () => {\n slideToggle(el, 500, 'show');\n return false;\n })\n }\n if (false) {\n for (let i = 0; i < al_post_list.length; i++) {\n let el = al_post_list[i];\n el.parentNode.addEventListener('mouseover', function () {\n slideToggle(el, 500, 'hide');\n return false;\n })\n }\n }\n }\n let expanded = false;\n al_expand_collapse.addEventListener('click', () => {\n for (const el of al_post_list) {\n slideToggle(el, 500, expanded ? 'hide' : 'show');\n }\n expanded = !expanded;\n });\n }\n}\n//#region Siren\nimport { liveplay, livepause, } from './video'\nexport function MN() {\n const iconflat = document.querySelector(\".iconflat\");\n iconflat && iconflat.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n if (document.body.classList.contains(\"navOpen\")) {\n close()\n } else {\n open()\n }\n });\n}\n\nexport function MNH() {\n if (document.body.classList.contains(\"navOpen\")) {\n close()\n }\n}\n/**\n * @has-dom-modify\n */\nexport function auto_height() {\n if (_iro.windowheight == 'auto') {\n if (document.querySelector(\"h1.main-title\")) {\n //let _height = document.documentElement.clientHeight + \"px\";\n const centerbg = document.getElementById(\"centerbg\")\n const bgvideo = document.getElementById(\"bgvideo\")\n if (centerbg) centerbg.style.height = \"100vh\";\n if (bgvideo) bgvideo.style.minHeight = \"100vh\";\n }\n } else {\n const headertop = document.querySelector(\".headertop\")\n headertop && headertop.classList.add(\"headertop-bar\");\n }\n}\n/**\n * @has-dom-modify\n */\nexport function PE() {\n const headertop = document.querySelector(\".headertop\")\n if (headertop) {\n let blank = document.querySelector(\".blank\");\n if (document.querySelector(\".main-title\")) {\n try {\n blank.style.paddingTop = \"0px\";\n } catch (e) { }\n headertop.style.height = \"auto\";\n headertop.style.display = \"\";\n if (_iro.movies.live) liveplay();\n } else {\n try {\n blank.style.paddingTop = \"75px\";\n } catch (e) { }\n headertop.style.height = \"0px\";\n headertop.style.display = \"none\";\n livepause();\n }\n }\n}\nimport { jsSearchCallback } from './search'\nimport { turnOnDarkMode, turnOffDarkMode } from './darkmode';\n/**\n * @has-dom-modify\n */\nexport function CE() {\n let comments_fold = document.querySelector(\".comments-fold\");\n let comments_main = document.querySelector(\".comments-main\");\n if (comments_fold != null) {\n comments_fold.style.display = \"block\";\n comments_main.style.display = \"none\";\n comments_fold.addEventListener(\"click\", () => {\n slideToggle(comments_main, 500, 'show');\n comments_fold.style.display = \"none\";\n });\n }\n let archives = document.getElementsByClassName(\"archives\");\n if (archives.length > 0) {\n for (let i = 1; i < archives.length; i++) {\n archives[i].style.display = \"none\";\n }\n archives[0].style.display = \"\";\n let h3 = document.getElementById(\"archives-temp\").getElementsByTagName(\"h3\");\n const handler = (e) => {\n e.preventDefault();\n e.stopPropagation();\n slideToggle(e.target.nextElementSibling, 300);\n }\n for (let i = 0; i < h3.length; i++) {\n h3[i].addEventListener(\"click\", handler)\n }\n }\n // $('.comments-hidden').show();\n // $('.comments-main').hide();\n // $('.comments-hidden').click(function () {\n // $('.comments-main').slideDown(500);\n // $('.comments-hidden').hide();\n // });\n // $('.archives').hide();\n // $('.archives:first').show();\n // $('#archives-temp h3').click(function () {\n // $(this).next().slideToggle('fast');\n // return false;\n // });\n /*if (_iro.baguetteBoxON) {\n baguetteBox.run('.entry-content', {\n captions: function (element) {\n return element.getElementsByTagName('img')[0].alt;\n },\n ignoreClass: 'fancybox',\n });\n }*/\n\n for (const ele of document.getElementsByClassName('js-toggle-search')) {\n ele.addEventListener('click', jsSearchCallback);\n }\n\n const sc = document.querySelector(\".search_close\");\n sc && sc.addEventListener(\"click\", () => {\n let js_search = document.getElementsByClassName(\"js-search\")[0];\n if (js_search.classList.contains(\"is-visible\")) {\n document.getElementsByClassName(\"js-toggle-search\")[0].classList.toggle(\"is-active\");\n js_search.classList.toggle(\"is-visible\");\n document.documentElement.style.overflowY = \"unset\";\n }\n });\n try {\n const loading = document.getElementById(\"loading\");\n loading.addEventListener(\"click\", () => {\n loading.classList.add(\"hide\");\n loading.classList.remove(\"show\");\n });\n } catch (e) { }\n}\nexport function collapseMenu() {\n const show_Nav = document.getElementById(\"show-nav\");\n show_Nav && show_Nav.addEventListener(\"click\", () => {\n const sln = document.querySelector(\".site-top .lower nav\");\n if (show_Nav.classList.contains(\"showNav\")) {\n show_Nav.classList.remove(\"showNav\");\n show_Nav.classList.add(\"hideNav\");\n sln && sln.classList.add(\"navbar\");\n } else {\n show_Nav.classList.remove(\"hideNav\");\n show_Nav.classList.add(\"showNav\");\n sln && sln.classList.remove(\"navbar\");\n }\n });\n}\n//#endregion Siren\nexport function addSkinMenuListener() {\n const cached = document.querySelectorAll(\".menu-list li\");\n const handler = (e) => {\n const tagid = e.target.id || e.target.parentElement.id;\n if (tagid == \"dark-bg\") {\n turnOnDarkMode(true)\n } else {\n turnOffDarkMode(true)\n changeSkin(tagid)\n localStorage.setItem(\"bgImgSetting\", tagid)\n }\n closeSkinMenu();\n }\n for (const e of cached) {\n e.addEventListener(\"click\", handler);\n }\n}\n/**\n * 根据设置初始化前台背景。启用前台背景与站点封面背景一体化以后封面背景在此设置\n * @returns 一个Promise。Promise resolved 时封面背景应当已经加载完毕\n */\nexport function checkBgImgSetting() {\n return changeSkin(localStorage.getItem(\"bgImgSetting\") || 'white-bg');\n}\nexport async function checkCoverBackground() {\n if (_iro.site_bg_as_cover) {\n return //交给checkBgImgSetting处理\n }\n if (!_iro.land_at_home) return//进入非主页 \n if (getCurrentBG()) {//进入主页且已经加载了封面背景\n return\n }\n changeCoverBG(await getCoverPath())\n}\nexport function closeSkinMenu() {\n document.querySelector(\".skin-menu\").classList.remove(\"show\");\n setTimeout(() => {\n const changeSkin = document.querySelector(\".changeSkin-gear\")\n if (changeSkin != null) {\n changeSkin.style.visibility = \"visible\";\n }\n }, 300);\n}","function imgError(ele, type) {\n switch (type) {\n case 1:\n ele.src = 'https://s.nmxc.ltd/sakurairo_vision/@2.6/basic/friendlink.jpg';\n break;\n case 2:\n ele.src = 'https://weavatar.com/avatar/?s=80&d=mm&r=g';\n break;\n default:\n ele.src = 'https://s.nmxc.ltd/sakurairo_vision/@2.6/basic/image-404.png';\n }\n}\nfunction cmt_showPopup(ele) {\n let popup = ele.querySelector(\"#thePopup\");\n popup.classList.add(\"show\");\n ele.querySelector(\"input\").onblur = () => {\n popup.classList.remove(\"show\");\n }\n}\n/*视频feature*/\nfunction coverVideo() {\n let video = document.getElementById(\"coverVideo\"),\n btn_playControl = document.getElementById(\"cv-pc\");\n\n if (video.paused) {\n video.play();\n try {\n btn_playControl.innerHTML = '';\n } catch { }\n //console.info('play:coverVideo()');\n } else {\n video.pause();\n try {\n btn_playControl.innerHTML = '';\n } catch { }\n //console.info('pause:coverVideo()');\n }\n}\nfunction coverVideoMute() {\n const video = document.getElementById(\"coverVideo\")\n const btn_volumeControl = document.getElementById(\"cv-vc\");\n if (video.muted) {\n video.muted = false\n btn_volumeControl.innerHTML = ''\n } else {\n video.muted = true\n btn_volumeControl.innerHTML = ''\n }\n}\nfunction killCoverVideo() {\n var video = document.getElementById(\"coverVideo\");\n var btn_playControl = document.getElementById(\"cv-pc\");\n\n if (video.paused) {\n //console.info('none:killCoverVideo()');\n } else {\n video.pause();\n try {\n btn_playControl.innerHTML = '';\n } catch (e) { }\n //console.info('pause:killCoverVideo()');\n }\n}\n\nfunction mail_me() {\n window.open(\"mailto:\" + _iro.email_name + \"@\" + _iro.email_domain);\n}\n/* 首页下拉箭头 */\nfunction headertop_down() {\n let coverOffset = document.getElementById(\"content\").getBoundingClientRect().top + window.pageYOffset;\n window.scrollTo({\n top: coverOffset,\n behavior: \"smooth\"\n });\n}\nwindow.imgError = imgError\nwindow.cmt_showPopup = cmt_showPopup\nwindow.coverVideo = coverVideo\nwindow.coverVideoMute = coverVideoMute\nwindow.killCoverVideo = killCoverVideo\nwindow.mail_me = mail_me\nwindow.headertop_down = headertop_down","async function initParticle() {\r\n const cfg = document.getElementById('particles-js-cfg')\r\n if (cfg) {\r\n try {\r\n //particles.js的npm包内没有预置minify版本,与unpkg不兼容\r\n //@ts-ignore\r\n await import('particles.js')\r\n //@ts-ignore\r\n particlesJS('particles-js', JSON.parse(cfg.innerHTML))\r\n } catch (error) {\r\n console.error(error)\r\n }\r\n }\r\n}\r\nexport default function initEffect() {\r\n const { effect } = _iro\r\n if (effect) {\r\n if (effect.type == 'yuki') {\r\n import('./falling_effect/yuki/start')\r\n } else import('./falling_effect/sakura/start')\r\n }\r\n initParticle()\r\n}","/**\n * app.js - Client script bundle for Sakurairo, a WordPress theme.\n * @author bymoye \n * @author KotoriK\n * @license GPL-v2\n * @date 2021.3.21\n * Github Repository:\n * @url https://github.com/Fuukei/Sakurairo_Scripts\n * @url https://github.com/mirai-mamori/Sakurairo/blob/f7db3c5c73d70a6a3f845844a44f279d540a7b6c/js/sakura-app.js\n * \n * *** ACKNOWLEDGEMENT *** \n * \n * *** modified on mashirozx/Sakura/js/sakura-app.js ***\n * Sakura theme application bundle\n * @author Mashiro\n * @url https://2heng.xin\n * @date 2019.8.3\n * *** ***\n * \n * *** inherited from louie-senpai/Siren/js/app.js ***\n * Siren application js\n * @author Louie\n * @url http://i94.me\n * @date 2016.11.19\n * *** ***\n * \n * *** inherited from Xoin-Yang/Akina/js/global.js ***\n * @author Xoin-Yang\n * @date 2017.04.25\n * @url http://www.akina.pw/\n * *** END OF ACKNOWLEDGEMENT *** \n * \n * Press 'F' to pay respects.\n * \n */\n\nimport { getCurrentBG, } from './coverBackground'\nimport add_copyright from './copyright'\nimport { loadCSS } from 'fg-loadcss'\nimport lazyload from \"../common/lazyload\"\nimport './global-func'\nimport { ready } from '../common/util'\nimport about_us from './about_us'\nimport preload_screen from './preload_screen'\nimport { isSupported } from './compatibility'\nimport hitokoto from './hitokoto'\nimport { web_audio } from './web_audio'\nimport { XLS, post_list_show_animation } from './post_list'\nimport { initThemeColor, updateThemeSkin } from './theme-color'\nimport initEffect from './effect'\nimport { initIsMobileCache, isMobile } from './mobile'\nimport { initFontControl } from './font_control'\nimport scrollHandler from './scroll_handler'\nimport { checkDarkModeSetting, } from './darkmode'\nimport { addSkinMenuListener, auto_height, bgButtonAddListener, CE, checkBgImgSetting, checkCoverBackground, checkSkinSecter, closeSkinMenu, MN, PE, timeSeriesReload, collapseMenu } from './func'\nimport initTypedJs from './typed'\nimport showcard from './showcard'\n\ninitIsMobileCache()\n/**\n * 检查是否应当开启_iro.pjax\n * @seealso https://github.com/PaperStrike/Pjax#compatibility\n */\n_iro.pjax = _iro.pjax && isSupported({ Firefox: 60, Edg: 79, Chrome: 66, OPR: 53, Version: 12/**Safari 12 */ });\n_iro.pjax && import('./pjax').then(({ default: initPjax }) => initPjax())\n\ntimeSeriesReload();\nadd_copyright()\nfunction activate_widget() {\n let secondary = document.getElementById(\"secondary\");\n if (!isMobile()) {\n let show_hide = document.querySelector(\".show-hide\");\n show_hide && show_hide.addEventListener(\"click\", () => {\n secondary && secondary.classList.toggle(\"active\");\n });\n } else {\n secondary && secondary.remove();\n }\n}\nsetTimeout(function () {\n activate_widget();\n}, 100);\n\n/* let isWebkit = navigator.userAgent.toLowerCase().indexOf('webkit') > -1,\n isOpera = navigator.userAgent.toLowerCase().indexOf('opera') > -1,\n isIe = navigator.userAgent.toLowerCase().indexOf('msie') > -1;\nif ((isWebkit || isOpera || isIe) && document.getElementById && window.addEventListener) { */\nwindow.addEventListener('hashchange', () => {\n const id = location.hash.substring(1)\n if (!(/^[A-z0-9_-]+$/.test(id))) {\n return;\n }\n const element = document.getElementById(id);\n if (element) {\n if (!(/^(?:a|select|input|button|textarea)$/i.test(element.tagName))) {\n element.tabIndex = -1;\n }\n element.focus();\n }\n}, false);\n/* } */\n\ncheckDarkModeSetting();\n\nimport POWERMODE from 'activate-power-mode'\nimport { coverVideoIni, coverVideo } from './video'\n\nfunction powermode() {\n POWERMODE.colorful = true;\n POWERMODE.shake = false;\n document.body.addEventListener('input', POWERMODE)\n}\n//afterDOMContentLoaded\n\nready(function () {\n if (_iro.float_player_on) {\n if (!isMobile()) {\n import('./aplayer').then(({ aplayerInit }) => aplayerInit())\n }\n }\n if (_iro.land_at_home) initTypedJs()\n Promise.all([checkCoverBackground(), checkBgImgSetting()])\n .then(() => {\n if (_iro.extract_theme_skin || isSupported({ Version: 15/**Safari 15 */ })) {\n initThemeColor()\n const bgUrl = getCurrentBG()\n if (bgUrl) updateThemeSkin(bgUrl)\n }\n })\n addSkinMenuListener();\n //let checkskin_bg = (a) => a == \"none\" ? \"\" : a;\n let changskin = document.querySelector(\"#changskin\"),\n close_SkinMenu = document.querySelector(\".skin-menu #close-skinMenu\");\n changskin && changskin.addEventListener(\"click\", function () {\n document.querySelector(\".skin-menu\").classList.toggle(\"show\");\n })\n close_SkinMenu && close_SkinMenu.addEventListener(\"click\", closeSkinMenu)\n scrollHandler();\n /*GT()*/\n const mb_to_top = document.querySelector(\"#moblieGoTop\")\n if (mb_to_top) {\n mb_to_top.onclick = () => {\n window.scrollTo({\n top: 0,\n behavior: \"smooth\"\n });\n }\n }\n /*GT end;*/\n XLS();\n MN();\n coverVideo();\n hitokoto()\n bgButtonAddListener()\n //#region has-dom-modify\n initFontControl()\n auto_height();\n PE();\n CE();\n collapseMenu()\n //#endregion\n web_audio()\n preload_screen()\n lazyload();\n showcard()\n powermode()\n //#region mashiro_global.ini.normalize();\n post_list_show_animation();\n coverVideoIni();\n checkSkinSecter();\n //#endregion\n initEffect()\n about_us()\n});\n","import { isMobile } from \"./mobile\";\nexport default function scrollHandler() {\n const header_thresold = 0;\n const siteHeader = document.querySelector(\".site-header\");\n const skinMenu = document.querySelector(\".skin-menu\");\n const changskin = document.querySelector(\"#changskin\");\n const mb_to_top = document.querySelector(\"#moblieGoTop\");\n const common = (scrollTop) => {\n //NH\n if (scrollTop > header_thresold) {\n siteHeader.classList.add(\"yya\");\n }\n else {\n siteHeader.classList.remove(\"yya\");\n }\n const cssText = scrollTop > 20 ? \"scale(1)\" : \"scale(0)\";\n mb_to_top.style.transform = cssText;\n changskin.style.transform = cssText;\n };\n if (isMobile()) {\n const smallScreenHandler = () => {\n const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;\n skinMenu && skinMenu.classList.remove(\"show\");\n common(scrollTop);\n };\n window.addEventListener(\"scroll\", smallScreenHandler);\n }\n else {\n const cached = document.getElementById('bar');\n const recalcuScrollbar = (scrollTop) => {\n const scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight;\n const result = Math.round(scrollTop / (scrollHeight - window.innerHeight) * 100);\n cached.style.width = result + '%';\n /* switch (true) {\n case (result <= 19): c = '#cccccc'; break;\n case (result <= 39): c = '#50bcb6'; break;\n case (result <= 59): c = '#85c440'; break;\n case (result <= 79): c = '#f2b63c'; break;\n case (result <= 99): c = '#FF0000'; break;\n case (result == 100): c = '#5aaadb'; break;\n default: c = \"orange\";\n }\n cached.style.background = c; */\n //炫彩scrollbar好像不是很好看,又被php那边的样式强制覆盖了,就先注释掉\n skinMenu && skinMenu.classList.remove(\"show\");\n };\n const largeScreenHandler = () => {\n const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;\n recalcuScrollbar(scrollTop);\n common(scrollTop);\n };\n window.addEventListener(\"scroll\", largeScreenHandler);\n }\n}\n//pjax.complete ready\n/* function NH() {\n const header_thresold = 0,\n siteHeader = document.querySelector(\".site-header\")\n window.addEventListener(\"scroll\", () => {\n const scrollTop = document.documentElement.scrollTop || window.pageYOffset;\n if (scrollTop > header_thresold) {\n siteHeader.classList.add(\"yya\");\n } else {\n siteHeader.classList.remove(\"yya\");\n }\n })\n // $(window).scroll(function () {\n // var s = $(document).scrollTop(),\n // cached = $('.site-header');\n // if (s == h1) {\n // cached.removeClass('yya');\n // }\n // if (s > h1) {\n // cached.addClass('yya');\n // }\n // });\n} */\n//ready\n/* function GT() {\n const mb_to_top = document.querySelector(\"#moblieGoTop\"),\n changskin = document.querySelector(\"#changskin\");\n window.addEventListener(\"scroll\", debounce(() => {\n const scroll = document.documentElement.scrollTop || document.body.scrollTop;\n const cssText = scroll > 20 ? \"scale(1)\" : \"scale(0)\"\n mb_to_top.style.transform = cssText;\n changskin.style.transform = cssText;\n }))\n mb_to_top.onclick = topFunction\n}\n\nfunction topFunction() {\n window.scrollTo({\n top: 0,\n behavior: \"smooth\"\n });\n} */\n","export default function () {\n const preload = document.getElementById(\"preload\");\n if (preload) {\n let removed = false;\n const removeScreen = () => {\n if (removed)\n return;\n document.documentElement.style.overflowY = 'unset';\n if (_iro.preload_blur != 0) {\n try {\n preload\n .animate([\n { filter: \"blur(0px)\", backdropFilter: \"blur(10px)\", opacity: 1 },\n { backdropFilter: \"blur(0px)grayscale(0)\", opacity: 0.1 },\n { opacity: 0, filter: \"blur(100px)\", }\n ], { duration: _iro.preload_blur, fill: \"forwards\", easing: \"ease\" })\n .onfinish = () => {\n preload.remove();\n };\n return;\n }\n catch (error) {\n console.warn(error);\n }\n }\n preload.classList.add('hide');\n preload.classList.remove('show');\n removed = true;\n setTimeout(() => preload.remove(), 233);\n };\n if (document.readyState === 'complete')\n return removeScreen();\n window.addEventListener('load', removeScreen, { once: true });\n setTimeout(removeScreen, 3000);\n }\n}\n","export default function about_us() {\n const b = \"background:linear-gradient(to bottom right,#212349,#2f459d,#6486c7,#a1aec9);\";\n const c = b + 'color:#fff;font-size:16px;font-family:sans-serif;font-size: 12px;border-radius: 8px; padding: 4px; box-shadow:aliceblue 0 20px;border:#6486c7 solid 1px;font-weight:bold';\n console.log('%cNon, le grand amour ne suffit pas.\\n' +\n 'Seul un adieu fleurira.\\n' +\n 'C\\'est notre histoire de vie, douce et amère.\\n' +\n '⌜La vaguelette⌟ ', b + 'color:#0000;background:linear-gradient(to bottom right,#6486c7,#a1aec9) text;font-size:14px;font-family:sans-serif');\n console.log('%c Sakurairo %c https://github.com/mirai-mamori/Sakurairo', c, '');\n}\n","import { isInDarkMode } from '../app/darkmode'\nimport { loadCSS } from 'fg-loadcss'\nimport { importExternal, resolvePath } from '../common/npmLib';\nimport { __ } from './sakurairo_global';\n\nconst PRISM_VERSION = PKG_INFO['prismjs']\nconst attributes = {\n 'autocomplete': 'off',\n 'autocorrect': 'off',\n 'autocapitalize': 'off',\n 'spellcheck': 'false',\n 'contenteditable': 'false',\n 'design': 'by Mashiro'\n}\nfunction gen_top_bar(pre, code_a) {\n if (!pre.children[0]) return\n let lang = 'text'\n const className = pre.children[0].className\n const matchResult = className.match(/language-(\\w+)/i)\n if (matchResult) {\n lang = matchResult[1]\n }\n pre.classList.add(\"highlight-wrap\");\n for (const t in attributes) {\n pre.setAttribute(t, attributes[t]);\n }\n code_a.setAttribute('data-rel', lang.toUpperCase());\n}\nasync function importHighlightjs() {\n try {\n if (!window.hljs) {\n window.hljs = (await import('highlight.js')).default\n await import('highlightjs-line-numbers.js')\n }\n } catch (e) {\n console.warn(e)\n }\n}\nconst hljs_click_callback = (e) => {\n const element = e.target\n if (!element.classList.contains(\"highlight-wrap\")) return;\n if (element.classList.contains('code-block-fullscreen')) {\n element.remove()\n } else {\n const cloneElement = element.cloneNode(true)\n cloneElement.classList.toggle(\"code-block-fullscreen\")\n document.body.append(cloneElement)\n }\n document.documentElement.classList.toggle('code-block-fullscreen-html-scroll');\n}\nexport function deattachHljsCallback() {\n document.body.removeEventListener(\"click\", hljs_click_callback)\n}\nexport async function hljs_process(pre, code) {\n try {\n await importHighlightjs()\n for (let i = 0; i < code.length; i++) {\n if (!code[i].classList.contains(\"hljs\")) {\n hljs.highlightElement(code[i]);\n }\n }\n for (let i = 0; i < pre.length; i++) {\n if (!pre[i].classList.contains(\"highlight-wrap\")) {\n gen_top_bar(pre[i], code[i]);\n }\n }\n hljs.initLineNumbersOnLoad();\n document.body.addEventListener(\"click\", hljs_click_callback)\n } catch (e) {\n console.warn(e)\n }\n}\n//Prism\nconst PrismBaseUrl = _iro.code_highlight_prism?.autoload_path || resolvePath('', 'prismjs', PRISM_VERSION)\nlet currentPrismThemeCSS = undefined\nconst themeCSS = (() => {\n const { light, dark } = _iro.code_highlight_prism?.theme || {}\n const theme = {\n light: light || 'themes/prism.min.css',\n dark: dark || 'themes/prism-tomorrow.min.css',\n }\n for (const theme_name in theme) {\n theme[theme_name] = new URL(theme[theme_name], PrismBaseUrl).toString()\n }\n return theme\n})()\n\nfunction loadPrismCSS(darkmodeOn) {\n const nextCSSHref = darkmodeOn ? themeCSS.dark : themeCSS.light\n if (currentPrismThemeCSS) {\n if (currentPrismThemeCSS.href !== nextCSSHref) {\n const nextCSSElement = loadCSS(nextCSSHref)\n nextCSSElement.addEventListener('load', () => {\n currentPrismThemeCSS.remove()\n currentPrismThemeCSS = nextCSSElement\n })\n }\n } else {\n currentPrismThemeCSS = loadCSS(nextCSSHref)\n }\n}\n\nconst prism_darkmode_callback = (e) => {\n loadPrismCSS(e.detail)\n}\nexport const deattachPrismCallback = () => document.removeEventListener('darkmode', prism_darkmode_callback)\nasync function importPrismJS() {\n try {\n if (!window.Prism) {\n loadPrismCSS(isInDarkMode())\n document.addEventListener('darkmode', prism_darkmode_callback)\n //必备插件全家桶\n loadCSS(new URL('plugins/toolbar/prism-toolbar.min.css', PrismBaseUrl).toString())\n loadCSS(new URL('plugins/previewers/prism-previewers.min.css', PrismBaseUrl).toString())\n if (_iro.ext_shared_lib) {\n await Promise.all([importExternal('components/prism-core.min.js', 'prismjs', PRISM_VERSION),\n importExternal('plugins/autoloader/prism-autoloader.min.js', 'prismjs', PRISM_VERSION),\n importExternal('plugins/toolbar/prism-toolbar.min.js', 'prismjs', PRISM_VERSION),\n importExternal('plugins/previewers/prism-previewers.min.js', 'prismjs', PRISM_VERSION),\n importExternal('plugins/show-language/prism-show-language.min.js', 'prismjs', PRISM_VERSION)])\n } else await import('./prism_pack')\n Prism.plugins.autoloader.languages_path = new URL('components/', PrismBaseUrl).toString()\n }\n } catch (reason) {\n console.warn(reason)\n }\n}\nfunction loadPrismPluginLineNumbers() {\n loadCSS(new URL('plugins/line-numbers/prism-line-numbers.min.css', PrismBaseUrl).toString())\n if (_iro.ext_shared_lib) {\n return importExternal('plugins/line-numbers/prism-line-numbers.min.js', 'prismjs', PRISM_VERSION)\n } else {\n return import('prismjs/plugins/line-numbers/prism-line-numbers')\n }\n}\nfunction loadPrismMatchBraces() {\n loadCSS(new URL('plugins/match-braces/prism-match-braces.min.css', PrismBaseUrl).toString())\n if (_iro.ext_shared_lib) {\n return importExternal('plugins/match-braces/prism-match-braces.min.js', 'prismjs', PRISM_VERSION)\n } else {\n return import('prismjs/plugins/match-braces/prism-match-braces')\n }\n}\nfunction loadPrismCommandLine() {\n loadCSS(new URL('plugins/command-line/prism-command-line.css', PrismBaseUrl).toString())\n if (_iro.ext_shared_lib) {\n return importExternal('plugins/command-line/prism-command-line.min.js', 'prismjs', PRISM_VERSION)\n } else {\n return import('prismjs/plugins/command-line/prism-command-line')\n }\n}\n/**\n * \n * @param {NodeListOf ', D = \" } code document.querySelectorAll(\"pre code\")\n */\nexport async function prism_process(code) {\n try {\n let loadLineNumber = false\n let loadMatchBraces = false\n let loadCommandLine = false\n if (_iro.code_highlight_prism.line_number_all) {\n document.querySelector('.entry-content').classList.add('line-numbers')\n loadLineNumber = true\n }\n for (const ele of code) {\n if (ele.parentElement.classList.contains('line-numbers')) {\n loadLineNumber = true\n }\n if (ele.classList.contains('match-braces')) {\n loadMatchBraces = true\n }\n if (ele.dataset.prompt || ele.dataset.host || ele.dataset.user) {\n //cli\n loadCommandLine = true\n }\n }\n await Promise.all([\n importPrismJS(),\n loadLineNumber && loadPrismPluginLineNumbers(),\n loadMatchBraces && loadPrismMatchBraces(),\n loadCommandLine && loadPrismCommandLine()\n ])\n for (const ele of code) {\n if (!ele.firstChild?.classList?.contains('token')) {\n Prism.highlightElement(ele);\n }\n }\n Prism.plugins.fileHighlight && Prism.plugins.fileHighlight.highlight()\n } catch (error) {\n console.warn(error)\n }\n}\n\nexport async function code_highlight_style() {\n const pre = document.getElementsByTagName(\"pre\"),\n code = document.querySelectorAll(\"pre code\");\n if (!pre.length) {\n switch (_iro.code_highlight) {\n case 'hljs':\n deattachHljsCallback()\n return\n case 'prism':\n deattachPrismCallback()\n return\n default:\n }\n }\n switch (_iro.code_highlight) {\n case 'hljs':\n await hljs_process(pre, code)\n break\n case 'prism':\n await prism_process(code)\n break\n case 'custom': return\n default:\n console.warn(`_iro.code_highlight这咋填的是个${_iro.code_highlight}啊🤔`)\n }\n //copy_code_block\n if (code.length > 0) {\n for (let j = 0; j < code.length; j++) {\n const pre_a = code[j].parentElement.querySelectorAll(\"a\");\n for (const ele of pre_a) {\n if (ele.classList.contains(\"copy-code\")) {\n ele.remove(); //如果已经存在复制按钮,需将其移除后再重新添加\n }\n }\n code[j].setAttribute('id', 'code-block-' + j);\n code[j].insertAdjacentHTML('afterend', '');\n }\n if (_iro.ext_shared_lib) {\n await importExternal('dist/clipboard.min.js', 'clipboard')\n new ClipboardJS('.copy-code')\n } else {\n const ClipboardJS = (await import('clipboard')).default\n new ClipboardJS('.copy-code');\n }\n }\n}","/*! loadCSS. [c]2020 Filament Group, Inc. MIT License */\n(function(w){\n\t\"use strict\";\n\t/* exported loadCSS */\n\tvar loadCSS = function( href, before, media, attributes ){\n\t\t// Arguments explained:\n\t\t// `href` [REQUIRED] is the URL for your CSS file.\n\t\t// `before` [OPTIONAL] is the element the script should use as a reference for injecting our stylesheet before\n\t\t// By default, loadCSS attempts to inject the link after the last stylesheet or script in the DOM. However, you might desire a more specific location in your document.\n\t\t// `media` [OPTIONAL] is the media type or query of the stylesheet. By default it will be 'all'\n\t\t// `attributes` [OPTIONAL] is the Object of attribute name/attribute value pairs to set on the stylesheet's DOM Element.\n\t\tvar doc = w.document;\n\t\tvar ss = doc.createElement( \"link\" );\n\t\tvar ref;\n\t\tif( before ){\n\t\t\tref = before;\n\t\t}\n\t\telse {\n\t\t\tvar refs = ( doc.body || doc.getElementsByTagName( \"head\" )[ 0 ] ).childNodes;\n\t\t\tref = refs[ refs.length - 1];\n\t\t}\n\n\t\tvar sheets = doc.styleSheets;\n\t\t// Set any of the provided attributes to the stylesheet DOM Element.\n\t\tif( attributes ){\n\t\t\tfor( var attributeName in attributes ){\n\t\t\t\tif( attributes.hasOwnProperty( attributeName ) ){\n\t\t\t\t\tss.setAttribute( attributeName, attributes[attributeName] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tss.rel = \"stylesheet\";\n\t\tss.href = href;\n\t\t// temporarily set media to something inapplicable to ensure it'll fetch without blocking render\n\t\tss.media = \"only x\";\n\n\t\t// wait until body is defined before injecting link. This ensures a non-blocking load in IE11.\n\t\tfunction ready( cb ){\n\t\t\tif( doc.body ){\n\t\t\t\treturn cb();\n\t\t\t}\n\t\t\tsetTimeout(function(){\n\t\t\t\tready( cb );\n\t\t\t});\n\t\t}\n\t\t// Inject link\n\t\t\t// Note: the ternary preserves the existing behavior of \"before\" argument, but we could choose to change the argument to \"after\" in a later release and standardize on ref.nextSibling for all refs\n\t\t\t// Note: `insertBefore` is used instead of `appendChild`, for safety re: http://www.paulirish.com/2011/surefire-dom-element-insertion/\n\t\tready( function(){\n\t\t\tref.parentNode.insertBefore( ss, ( before ? ref : ref.nextSibling ) );\n\t\t});\n\t\t// A method (exposed on return object for external use) that mimics onload by polling document.styleSheets until it includes the new sheet.\n\t\tvar onloadcssdefined = function( cb ){\n\t\t\tvar resolvedHref = ss.href;\n\t\t\tvar i = sheets.length;\n\t\t\twhile( i-- ){\n\t\t\t\tif( sheets[ i ].href === resolvedHref ){\n\t\t\t\t\treturn cb();\n\t\t\t\t}\n\t\t\t}\n\t\t\tsetTimeout(function() {\n\t\t\t\tonloadcssdefined( cb );\n\t\t\t});\n\t\t};\n\n\t\tfunction loadCB(){\n\t\t\tif( ss.addEventListener ){\n\t\t\t\tss.removeEventListener( \"load\", loadCB );\n\t\t\t}\n\t\t\tss.media = media || \"all\";\n\t\t}\n\n\t\t// once loaded, set link's media back to `all` so that the stylesheet applies once it loads\n\t\tif( ss.addEventListener ){\n\t\t\tss.addEventListener( \"load\", loadCB);\n\t\t}\n\t\tss.onloadcssdefined = onloadcssdefined;\n\t\tonloadcssdefined( loadCB );\n\t\treturn ss;\n\t};\n\t// commonjs\n\tif( typeof exports !== \"undefined\" ){\n\t\texports.loadCSS = loadCSS;\n\t}\n\telse {\n\t\tw.loadCSS = loadCSS;\n\t}\n}( typeof global !== \"undefined\" ? global : this ));\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"2065\":\"lg-2\",\"2236\":\"lg-12\",\"2661\":\"lg-6\",\"3042\":\"lg-9\",\"5459\":\"lg-0\",\"5470\":\"lg-5\",\"6458\":\"lg-1\",\"7435\":\"lg-8\",\"8268\":\"lg-7\",\"8279\":\"lg-4\",\"8599\":\"lg-11\",\"9256\":\"lg-3\",\"9438\":\"lg-10\"}[chunkId] || chunkId) + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","if (typeof document === \"undefined\") return;\nvar createStylesheet = (chunkId, fullhref, oldTag, resolve, reject) => {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tif (__webpack_require__.nc) {\n\t\tlinkTag.nonce = __webpack_require__.nc;\n\t}\n\tvar onLinkComplete = (event) => {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && event.type;\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + errorType + \": \" + realHref + \")\");\n\t\t\terr.name = \"ChunkLoadError\";\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tif (linkTag.parentNode) linkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = (href, fullhref) => {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = (chunkId) => {\n\treturn new Promise((resolve, reject) => {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t3524: 0\n};\n\n__webpack_require__.f.miniCss = (chunkId, promises) => {\n\tvar cssChunks = {\"2563\":1,\"9160\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(() => {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, (e) => {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr\n\n// no prefetching\n\n// no preloaded","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t3524: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(9160 != chunkId) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = globalThis[\"webpackChunksakurairo_scripts\"] = globalThis[\"webpackChunksakurairo_scripts\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [8538], () => (__webpack_require__(5679)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","factory","modules","installedModules","moduleId","exports","module","id","loaded","call","m","c","p","canvas","document","createElement","width","window","innerWidth","height","innerHeight","style","cssText","addEventListener","body","appendChild","context","getContext","particles","particlePointer","rendering","getRandom","min","max","Math","random","getColor","el","POWERMODE","colorful","u","getComputedStyle","color","createParticle","x","y","alpha","velocity","caret","bcr","activeElement","tagName","getAttribute","offset","selectionEnd","getBoundingClientRect","left","top","selection","getSelection","rangeCount","range","getRangeAt","startNode","startContainer","nodeType","TEXT_NODE","parentNode","getCaret","numParticles","round","shake","intensity","marginLeft","marginTop","setTimeout","requestAnimationFrame","loop","clearRect","rendered","rect","i","length","particle","globalAlpha","fillStyle","fillRect","properties","isFirefox","mozInnerScreenX","getCaretCoordinates","element","position","options","debug","querySelector","removeChild","div","computed","currentStyle","whiteSpace","nodeName","wordWrap","visibility","forEach","prop","scrollHeight","parseInt","overflowY","overflow","textContent","value","substring","replace","span","coordinates","offsetTop","offsetLeft","backgroundColor","_version_ctrl","_iro","cookie_version_control","uaMatches","Array","from","navigator","userAgent","matchAll","isSupported","checkList","_","name","version","parseFloat","Accept_Image","acceptList","Chrome","OPR","Firefox","Edg","Version","push","key","days","expires","Date","now","toUTCString","cookie","setCookie","reverse","join","getSupportedImageMimeList","txt","author_name","location","href","site_name","copytext","e","selectionText","toString","event","selectionTxt","preventDefault","htmlData","textData","clipboardData","setData","setClipboardText","createButterbar","__","add_copyright","clipboardCopyright","removeEventListener","promisifyRequest","request","Promise","resolve","reject","oncomplete","onsuccess","result","onabort","onerror","error","createStore","dbName","storeName","indexedDB","open","onupgradeneeded","createObjectStore","dbp","txMode","callback","then","db","transaction","objectStore","store","bgn","blob_url","async","nextBG","changeCoverBG","getCoverPath","preBG","centerbg","site_bg_as_cover","url","backgroundImage","dispatchEvent","CustomEvent","detail","noop","parseCSSUrl","match","getCurrentBG","getAPIPath","useBGN","cover_api_url","URL","cover_api","isMobile","random_graphs_mts","searchParams","set","search","cache_cover","get","coverBG","ArrayBuffer","revokeObjectURL","createObjectURL","Blob","finally","resp","fetch","headers","Accept","status","json","message","console","warn","ok","buf","arrayBuffer","put","TypeError","delete","del","fetchThenCache","mediaQuery","matchMedia","inDarkMode","isInDarkMode","informDarkModeChange","nextValue","mediaQueryCallback","localStorage","getItem","matches","darkmode","turnOnDarkMode","turnOffDarkMode","saveUserSetting","ifDarkmodeShouldOn","removeItem","setItem","userTriggered","documentElement","getElementsByClassName","classList","add","remove","dm_strategy","today","getHours","checkTime","checkDarkModeSetting","dark","removeListener","addListener","btnSerif","btnSansSerif","change_font_listener","btn","dataset","setButtonState","loadFontSetting","nowFont","font_name","initFontControl","hitokoto","yiyan","getElementById","api_group","yiyan_api","api_path","innerText","res","api","data","from_who","cache_is_mobile","initIsMobileCache","refreshIsMobileCache","ev","hslaCSSText","h","s","l","a","hsl","load_post_timer","load_post","onlyOnceATime","now_href","pagination_a","contains","text","DOM","DOMParser","parseFromString","querySelectorAll","paga","paga_innerText","nextHref","main","append","dpga","addps","lazyload","code_highlight_style","post_list_show_animation","undefined","setAttribute","tempScrollTop","scrollTop","pageYOffset","scrollTo","behavior","innerHTML","articles","io","IntersectionObserver","entries","entry","isIntersecting","target","willChange","unobserve","thumbImage","finalImageElement","src","crossOrigin","getThemeColorFromImageElement","rgba","setProperty","getHighlight","getForeground","root","threshold","article","observe","XLS_Listener","parentElement","stopPropagation","clearTimeout","XLS","intersectionRatio","_page_next","href_page_next","load_key","load_time","title","log","showcard","img","button","Error","lastMsgId","PromiseWorker","w","cb","Symbol","dispose","constructor","worker","this","payload","messageId","postMessage","extraArgs","messageToSend","channel","alias","rgb","r","g","b","delta","A","C","D50","D55","D65","D75","F2","F7","F11","E","whitepoint","_xyz","white","z","pow","xyz","lab","_prepare2DContext","ctx","_prepare2DContextAsync","OffscreenCanvas","_readImage","prepareCtx","imgSource","naturalWidth","naturalHeight","drawImage","getImageData","bind","_readImageDownsampling","maxSample","scale","scaleSqrt","sqrt","readImageDownsampling","originalThemeSkinMatcing","getPropertyValue","Worker","currentColor","imgElement","complete","reason","awaitImage","imageData","transfer","buffer","_updateThemeColorMeta","color_css","meta","content","updateThemeSkin","coverBGUrl","_setColor","hsla","darkmodeColor","extract_theme_skin","initThemeColor","next","typedInstance","disableTypedJsIfExist","destroy","initTypedJs","JSON","parse","ext_shared_lib","Typed","importExternal","default","bgvideo","videoList","movies","split","unplayedIndex","fill","map","index","aplayersToResume","_getNextRandomVideo","nextIndex","floor","splice","getVideo","video_stu","fileName","bottom","origin","getBaseName","splay","video_btn","display","float_player_on","pauseAllPlayer","play","spause","pause","player","liveplay","oncanplay","livepause","coverVideo","onended","click","video_add","coverVideoIni","videos","canPlayType","video","autoplay","Hls","hls","loadSource","attachMedia","on","Events","MANIFEST_PARSED","initHLS","canPlayHandler","lazyloadPatch","poster","web_audio","audio","AudioContext","webkitAudioContext","o","t","sheet","sakurairoGlobal","opt","getSheet","selects","notes","gainValueMax","main_gain","createGain","createOscillator","_t","connect","destination","type","start","currentTime","lastTarget","listener","currentTarget","resume","d","pageX","pageY","dom","zIndex","pointerEvents","animate","opacity","duration","gain","cancelScheduledValues","frequency","setValueAtTime","exponentialRampToValueAtTime","suspend","clearButterbar","butterBar","keep","defaults","srcset","selector","rootMargin","LazyLoad","elms","opts","init","obs","doLoad","image","load","toLowerCase","includes","disconnect","instance","Lazyload","STORAGE_KEY","CDN_LIST","currentCDNIndex","config","num","isNaN","getPreferCDNIndex","currentCDN","raw","resolvePath","relativePath","packageName","String","PKG_INFO","path","script","onload","defaultStr","_sakurairoi18n","_$","replacements","template","build","BUILD_INFO","registerOnGlobal","Object","defineProperty","writable","enumerable","_sakurairo","readyFunctionList","func","isRunning","args","whileReady","fn","ready","readyState","slideToggle","mode","flag","transition","tagTimer","tagHeight","clientHeight","buildAPI","apiPath","params","nonce","mainContainer","toggle","close","QueryStorage","renderSearchResult","keyword","link","fa","iconfont","comments","trim","indexOf","slice","toUpperCase","query","B","F","G","D","queries","array","filter","v","values","some","RegExp","test","Cx","div_href","search_close","Ty","ele","jsSearchCallback","live_search","val","otxt","sessionStorage","catch","search_a","searchFlag","oninput","_mashiro_global_skin_secter","checkSkinSecter","pattern","headertop","changeSkin","tagId","bg_url","skin_bg0","skin_bg1","skin_bg2","skin_bg3","skin_bg4","bgButtonAddListener","pre","onclick","timeSeriesReload","archives","al_li","nextElementSibling","al_expand_collapse","cursor","getElementsByTagName","al_post_list","al_post_list_first","child","expanded","MN","iconflat","MNH","auto_height","windowheight","minHeight","PE","blank","paddingTop","live","CE","comments_fold","comments_main","h3","handler","sc","js_search","loading","collapseMenu","show_Nav","sln","addSkinMenuListener","cached","tagid","closeSkinMenu","checkBgImgSetting","checkCoverBackground","land_at_home","imgError","cmt_showPopup","popup","onblur","btn_playControl","paused","coverVideoMute","btn_volumeControl","muted","killCoverVideo","mail_me","email_name","email_domain","headertop_down","coverOffset","initEffect","effect","cfg","particlesJS","initParticle","pjax","initPjax","secondary","show_hide","activate_widget","hash","tabIndex","focus","aplayerInit","all","bgUrl","changskin","close_SkinMenu","siteHeader","skinMenu","mb_to_top","common","transform","smallScreenHandler","recalcuScrollbar","largeScreenHandler","scrollHandler","preload","removed","removeScreen","preload_blur","backdropFilter","easing","onfinish","once","preload_screen","about_us","PRISM_VERSION","attributes","gen_top_bar","code_a","children","lang","matchResult","className","hljs_click_callback","cloneElement","cloneNode","hljs_process","code","hljs","importHighlightjs","highlightElement","initLineNumbersOnLoad","PrismBaseUrl","code_highlight_prism","autoload_path","currentPrismThemeCSS","themeCSS","light","theme","theme_name","loadPrismCSS","darkmodeOn","nextCSSHref","nextCSSElement","loadCSS","prism_darkmode_callback","deattachPrismCallback","importPrismJS","Prism","plugins","autoloader","languages_path","code_highlight","loadLineNumber","loadMatchBraces","loadCommandLine","line_number_all","prompt","host","user","firstChild","fileHighlight","highlight","prism_process","j","pre_a","insertAdjacentHTML","ClipboardJS","before","media","ref","doc","ss","refs","childNodes","sheets","styleSheets","attributeName","hasOwnProperty","rel","insertBefore","nextSibling","onloadcssdefined","resolvedHref","loadCB","__webpack_module_cache__","__webpack_require__","cachedModule","__webpack_modules__","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","keys","every","n","getter","__esModule","getPrototypeOf","obj","ns","create","def","current","getOwnPropertyNames","definition","f","chunkId","reduce","promises","miniCssF","globalThis","Function","prototype","done","needAttach","scripts","charset","timeout","nc","onScriptComplete","prev","doneFns","head","toStringTag","scriptUrl","importScripts","currentScript","loadStylesheet","fullhref","existingLinkTags","dataHref","tag","existingStyleTags","findStylesheet","oldTag","linkTag","errorType","realHref","err","createStylesheet","installedCssChunks","miniCss","baseURI","self","installedChunks","installedChunkData","promise","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"app.js","mappings":"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","sources":["webpack://sakurairo-scripts/webpack/runtime/chunk loaded","webpack://sakurairo-scripts/webpack/runtime/create fake namespace object","webpack://sakurairo-scripts/webpack/runtime/load script","webpack://sakurairo-scripts/./node_modules/.pnpm/activate-power-mode@git+ssh+++git@github.com+Fuukei+activate-power-mode.git\u0000#af3f686f10267f8ec_xa76km7eox4vi7payqxroumraa/node_modules/activate-power-mode/dist/activate-power-mode.js","webpack://sakurairo-scripts/./src/common/cookie.ts","webpack://sakurairo-scripts/./src/app/compatibility.ts","webpack://sakurairo-scripts/./src/app/copyright.ts","webpack://sakurairo-scripts/./node_modules/.pnpm/idb-keyval@6.2.1/node_modules/idb-keyval/dist/index.js","webpack://sakurairo-scripts/./src/app/cache.ts","webpack://sakurairo-scripts/./src/app/coverBackground.ts","webpack://sakurairo-scripts/./src/app/darkmode.ts","webpack://sakurairo-scripts/./src/app/font_control.ts","webpack://sakurairo-scripts/./src/app/hitokoto.ts","webpack://sakurairo-scripts/./src/app/mobile.ts","webpack://sakurairo-scripts/./src/app/post_list.ts","webpack://sakurairo-scripts/./src/app/showcard.ts","webpack://sakurairo-scripts/./node_modules/.pnpm/@kotorik+promise-worker@0.1.0/node_modules/@kotorik/promise-worker/dist/index.mjs","webpack://sakurairo-scripts/./node_modules/.pnpm/color-space@2.0.1/node_modules/color-space/rgb.js","webpack://sakurairo-scripts/./node_modules/.pnpm/color-space@2.0.1/node_modules/color-space/hsl.js","webpack://sakurairo-scripts/./node_modules/.pnpm/color-space@2.0.1/node_modules/color-space/xyz.js","webpack://sakurairo-scripts/./node_modules/.pnpm/color-space@2.0.1/node_modules/color-space/lab.js","webpack://sakurairo-scripts/./node_modules/.pnpm/@kotorik+palette@3.0.4/node_modules/@kotorik/palette/dist/index.js","webpack://sakurairo-scripts/./src/app/theme-color/index.ts","webpack://sakurairo-scripts/./src/app/typed.ts","webpack://sakurairo-scripts/./src/app/video.ts","webpack://sakurairo-scripts/./src/app/web_audio.ts","webpack://sakurairo-scripts/./src/common/butterbar.ts","webpack://sakurairo-scripts/./node_modules/.pnpm/lazyload@https+++codeload.github.com+KotoriK+lazyload+tar.gz+82d55720d3076d66f0efa3ee44505a00_zlmltryyoiytzoax633icq5k7m/node_modules/lazyload/src/lazyload.ts","webpack://sakurairo-scripts/./src/common/lazyload.ts","webpack://sakurairo-scripts/./src/common/npmLib.ts","webpack://sakurairo-scripts/./src/common/sakurairo_global.ts","webpack://sakurairo-scripts/./src/common/util.ts","webpack://sakurairo-scripts/./src/app/mobile_nav.ts","webpack://sakurairo-scripts/./src/app/search.ts","webpack://sakurairo-scripts/./src/app/func.js","webpack://sakurairo-scripts/./src/app/global-func.js","webpack://sakurairo-scripts/./src/app/effect.js","webpack://sakurairo-scripts/./src/app/index.js","webpack://sakurairo-scripts/./src/app/scroll_handler.ts","webpack://sakurairo-scripts/./src/app/preload_screen.ts","webpack://sakurairo-scripts/./src/app/about_us.ts","webpack://sakurairo-scripts/./src/common/code-highlight.js","webpack://sakurairo-scripts/./node_modules/.pnpm/fg-loadcss@3.1.0/node_modules/fg-loadcss/src/loadCSS.js","webpack://sakurairo-scripts/webpack/bootstrap","webpack://sakurairo-scripts/webpack/runtime/compat get default export","webpack://sakurairo-scripts/webpack/runtime/define property getters","webpack://sakurairo-scripts/webpack/runtime/ensure chunk","webpack://sakurairo-scripts/webpack/runtime/get javascript chunk filename","webpack://sakurairo-scripts/webpack/runtime/get mini-css chunk filename","webpack://sakurairo-scripts/webpack/runtime/global","webpack://sakurairo-scripts/webpack/runtime/hasOwnProperty shorthand","webpack://sakurairo-scripts/webpack/runtime/make namespace object","webpack://sakurairo-scripts/webpack/runtime/publicPath","webpack://sakurairo-scripts/webpack/runtime/css loading","webpack://sakurairo-scripts/webpack/runtime/jsonp chunk loading","webpack://sakurairo-scripts/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"sakurairo-scripts:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"POWERMODE\"] = factory();\n\telse\n\t\troot[\"POWERMODE\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar canvas = document.createElement('canvas');\n\tcanvas.width = window.innerWidth;\n\tcanvas.height = window.innerHeight;\n\tcanvas.style.cssText = 'position:fixed;top:0;left:0;pointer-events:none;z-index:999999';\n\twindow.addEventListener('resize', function () {\n\t canvas.width = window.innerWidth;\n\t canvas.height = window.innerHeight;\n\t});\n\tdocument.body.appendChild(canvas);\n\tvar context = canvas.getContext('2d');\n\tvar particles = [];\n\tvar particlePointer = 0;\n\tvar rendering = false;\n\n\tPOWERMODE.shake = true;\n\n\tfunction getRandom(min, max) {\n\t return Math.random() * (max - min) + min;\n\t}\n\n\tfunction getColor(el) {\n\t if (POWERMODE.colorful) {\n\t var u = getRandom(0, 360);\n\t return 'hsla(' + getRandom(u - 10, u + 10) + ', 100%, ' + getRandom(50, 80) + '%, ' + 1 + ')';\n\t } else {\n\t return window.getComputedStyle(el).color;\n\t }\n\t}\n\n\tfunction getCaret() {\n\t var el = document.activeElement;\n\t var bcr;\n\t if (el.tagName === 'TEXTAREA' ||\n\t (el.tagName === 'INPUT' && el.getAttribute('type') === 'text')) {\n\t var offset = __webpack_require__(1)(el, el.selectionEnd);\n\t bcr = el.getBoundingClientRect();\n\t return {\n\t x: offset.left + bcr.left,\n\t y: offset.top + bcr.top,\n\t color: getColor(el)\n\t };\n\t }\n\t var selection = window.getSelection();\n\t if (selection.rangeCount) {\n\t var range = selection.getRangeAt(0);\n\t var startNode = range.startContainer;\n\t if (startNode.nodeType === document.TEXT_NODE) {\n\t startNode = startNode.parentNode;\n\t }\n\t bcr = range.getBoundingClientRect();\n\t return {\n\t x: bcr.left,\n\t y: bcr.top,\n\t color: getColor(startNode)\n\t };\n\t }\n\t return { x: 0, y: 0, color: 'transparent' };\n\t}\n\n\tfunction createParticle(x, y, color) {\n\t return {\n\t x: x,\n\t y: y,\n\t alpha: 1,\n\t color: color,\n\t velocity: {\n\t x: -1 + Math.random() * 2,\n\t y: -3.5 + Math.random() * 2\n\t }\n\t };\n\t}\n\n\tfunction POWERMODE() {\n\t { // spawn particles\n\t var caret = getCaret();\n\t var numParticles = 5 + Math.round(Math.random() * 10);\n\t while (numParticles--) {\n\t particles[particlePointer] = createParticle(caret.x, caret.y, caret.color);\n\t particlePointer = (particlePointer + 1) % 500;\n\t }\n\t }\n\t { // shake screen\n\t if (POWERMODE.shake) {\n\t var intensity = 1 + 2 * Math.random();\n\t var x = intensity * (Math.random() > 0.5 ? -1 : 1);\n\t var y = intensity * (Math.random() > 0.5 ? -1 : 1);\n\t document.body.style.marginLeft = x + 'px';\n\t document.body.style.marginTop = y + 'px';\n\t setTimeout(function() {\n\t document.body.style.marginLeft = '';\n\t document.body.style.marginTop = '';\n\t }, 75);\n\t }\n\t }\n\t if(!rendering){\n\t requestAnimationFrame(loop);\n\t }\n\t};\n\tPOWERMODE.colorful = false;\n\n\tfunction loop() {\n\t rendering = true;\n\t context.clearRect(0, 0, canvas.width, canvas.height);\n\t var rendered = false;\n\t var rect = canvas.getBoundingClientRect();\n\t for (var i = 0; i < particles.length; ++i) {\n\t var particle = particles[i];\n\t if (particle.alpha <= 0.1) continue;\n\t particle.velocity.y += 0.075;\n\t particle.x += particle.velocity.x;\n\t particle.y += particle.velocity.y;\n\t particle.alpha *= 0.96;\n\t context.globalAlpha = particle.alpha;\n\t context.fillStyle = particle.color;\n\t context.fillRect(\n\t Math.round(particle.x - 1.5) - rect.left,\n\t Math.round(particle.y - 1.5) - rect.top,\n\t 3, 3\n\t );\n\t rendered = true;\n\t }\n\t if(rendered){\n\t requestAnimationFrame(loop);\n\t }else{\n\t rendering = false;\n\t }\n\t}\n\n\tmodule.exports = POWERMODE;\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports) {\n\n\t/* jshint browser: true */\n\n\t(function () {\n\n\t// The properties that we copy into a mirrored div.\n\t// Note that some browsers, such as Firefox,\n\t// do not concatenate properties, i.e. padding-top, bottom etc. -> padding,\n\t// so we have to do every single property specifically.\n\tvar properties = [\n\t 'direction', // RTL support\n\t 'boxSizing',\n\t 'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does\n\t 'height',\n\t 'overflowX',\n\t 'overflowY', // copy the scrollbar for IE\n\n\t 'borderTopWidth',\n\t 'borderRightWidth',\n\t 'borderBottomWidth',\n\t 'borderLeftWidth',\n\t 'borderStyle',\n\n\t 'paddingTop',\n\t 'paddingRight',\n\t 'paddingBottom',\n\t 'paddingLeft',\n\n\t // https://developer.mozilla.org/en-US/docs/Web/CSS/font\n\t 'fontStyle',\n\t 'fontVariant',\n\t 'fontWeight',\n\t 'fontStretch',\n\t 'fontSize',\n\t 'fontSizeAdjust',\n\t 'lineHeight',\n\t 'fontFamily',\n\n\t 'textAlign',\n\t 'textTransform',\n\t 'textIndent',\n\t 'textDecoration', // might not make a difference, but better be safe\n\n\t 'letterSpacing',\n\t 'wordSpacing',\n\n\t 'tabSize',\n\t 'MozTabSize'\n\n\t];\n\n\tvar isFirefox = window.mozInnerScreenX != null;\n\n\tfunction getCaretCoordinates(element, position, options) {\n\n\t var debug = options && options.debug || false;\n\t if (debug) {\n\t var el = document.querySelector('#input-textarea-caret-position-mirror-div');\n\t if ( el ) { el.parentNode.removeChild(el); }\n\t }\n\n\t // mirrored div\n\t var div = document.createElement('div');\n\t div.id = 'input-textarea-caret-position-mirror-div';\n\t document.body.appendChild(div);\n\n\t var style = div.style;\n\t var computed = window.getComputedStyle? getComputedStyle(element) : element.currentStyle; // currentStyle for IE < 9\n\n\t // default textarea styles\n\t style.whiteSpace = 'pre-wrap';\n\t if (element.nodeName !== 'INPUT')\n\t style.wordWrap = 'break-word'; // only for textarea-s\n\n\t // position off-screen\n\t style.position = 'absolute'; // required to return coordinates properly\n\t if (!debug)\n\t style.visibility = 'hidden'; // not 'display: none' because we want rendering\n\n\t // transfer the element's properties to the div\n\t properties.forEach(function (prop) {\n\t style[prop] = computed[prop];\n\t });\n\n\t if (isFirefox) {\n\t // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275\n\t if (element.scrollHeight > parseInt(computed.height))\n\t style.overflowY = 'scroll';\n\t } else {\n\t style.overflow = 'hidden'; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll'\n\t }\n\n\t div.textContent = element.value.substring(0, position);\n\t // the second special handling for input type=\"text\" vs textarea: spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037\n\t if (element.nodeName === 'INPUT')\n\t div.textContent = div.textContent.replace(/\\s/g, \"\\u00a0\");\n\n\t var span = document.createElement('span');\n\t // Wrapping must be replicated *exactly*, including when a long word gets\n\t // onto the next line, with whitespace at the end of the line before (#7).\n\t // The *only* reliable way to do that is to copy the *entire* rest of the\n\t // textarea's content into the created at the caret position.\n\t // for inputs, just '.' would be enough, but why bother?\n\t span.textContent = element.value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all\n\t div.appendChild(span);\n\n\t var coordinates = {\n\t top: span.offsetTop + parseInt(computed['borderTopWidth']),\n\t left: span.offsetLeft + parseInt(computed['borderLeftWidth'])\n\t };\n\n\t if (debug) {\n\t span.style.backgroundColor = '#aaa';\n\t } else {\n\t document.body.removeChild(div);\n\t }\n\n\t return coordinates;\n\t}\n\n\tif (typeof module != \"undefined\" && typeof module.exports != \"undefined\") {\n\t module.exports = getCaretCoordinates;\n\t} else {\n\t window.getCaretCoordinates = getCaretCoordinates;\n\t}\n\n\t}());\n\n/***/ })\n/******/ ])\n});\n;","/**\n * Cookie\n * from github.com/mirai-mamori/Sakurairo ./js/sakura-app.js ,commit 71f5a0c\n * @license GPL-v2\n * @date 2021.03\n */\nconst _version_ctrl = _iro.cookie_version_control || '';\nexport function setCookie(key, value, days) {\n const expires = days ? \"; expires=\" + new Date(Date.now() + (days * 24 * 60 * 60 * 1000)).toUTCString() : \"\";\n document.cookie = key + _version_ctrl + \"=\" + (value || \"\") + expires + \"; path=/\";\n}\nexport function getCookie(key) {\n const nameEQ = key + _version_ctrl + \"=\", ca = document.cookie.split(';');\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) == ' ')\n c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) == 0)\n return c.substring(nameEQ.length, c.length);\n }\n return null;\n}\nexport function removeCookie(key) {\n document.cookie = key + _version_ctrl + '=; Max-Age=-99999999;';\n}\n","/**\n * 关于AppleWebkit与Safari版本的对应,参考:\n * @seealso https://gist.github.com/jakub-g/48a16195280a7023f570ffa5c8a4eae5\n * @seealso https://en.wikipedia.org/wiki/Safari_version_history\n *\n * Opera浏览器自15以来更换了User Agent\n * OPR/*\n */\nconst uaMatches = Array.from(navigator.userAgent.matchAll(/(Firefox|Chrome|Version|OPR|Edg)\\/(\\d+)/ig));\nimport { setCookie } from '../common/cookie';\nfunction getSupportedImageMimeList() {\n const acceptList = ['image/*,*/*;q=0.8'];\n if (isSupported({ Chrome: 59, OPR: 46, Firefox: 3, Edg: 79, Version: 8 /**Safari 8 */ })) {\n acceptList.push('image/apng');\n if (isSupported({ Chrome: 32, OPR: 19, Firefox: 65, Edg: 18, Version: 14 /**Safari 14 */ })) {\n setCookie('su_webp', '1', 114514);\n acceptList.push('image/webp');\n if (isSupported({ Chrome: 85, OPR: 71, Firefox: 93 })) {\n acceptList.push('image/avif');\n }\n }\n }\n return acceptList.reverse().join(',');\n}\nexport function isSupported(checkList) {\n for (const [_, name, version] of uaMatches) {\n if (parseFloat(version) >= checkList[name]) {\n return true;\n }\n }\n return false;\n}\nexport const Accept_Image = getSupportedImageMimeList();\n","import { createButterbar } from \"../common/butterbar\";\nimport { __ } from \"../common/sakurairo_global\";\nconst txt = [\n \"# 商业转载请联系作者获得授权,非商业转载请注明出处。\",\n \"# For commercial use, please contact the author for authorization. For non-commercial use, please indicate the source.\",\n \"# 协议(License):署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)\",\n \"# 作者(Author):\" + _iro.author_name,\n \"# 链接(URL):\" + window.location.href,\n \"# 来源(Source):\" + _iro.site_name,\n];\nfunction setClipboardText(event, selectionTxt) {\n event.preventDefault();\n const htmlData = txt.join('
') + \"
\" + selectionTxt.replace(/\\r\\n/g, \"
\"), textData = txt.join('\\n') + \"\\n\\n\" + selectionTxt.toString().replace(/\\r\\n/g, \"\\n\");\n if (event.clipboardData) {\n event.clipboardData.setData(\"text/html\", htmlData);\n event.clipboardData.setData(\"text/plain\", textData);\n }\n else if (window.clipboardData) {\n //deprecate?\n return window.clipboardData.setData(\"text\", textData);\n }\n}\nfunction copytext(e) {\n const selection = window.getSelection();\n if (selection) {\n const selectionText = selection.toString();\n if (selectionText.length > 30) {\n setClipboardText(e, selectionText);\n createButterbar(__(\"复制成功!\"), 1000);\n }\n }\n}\n/**\n * 添加复制时的版权提示\n */\nexport default function add_copyright() {\n if (_iro.clipboardCopyright) {\n document.body.removeEventListener(\"copy\", copytext);\n document.body.addEventListener(\"copy\", copytext);\n }\n}\n","function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n const dbp = promisifyRequest(request);\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","import { createStore, promisifyRequest } from 'idb-keyval';\nconst store = createStore('sakurairo', 'cache');\nconst get = (key) => store('readonly', (store) => promisifyRequest(store.get(key)));\nconst set = (key, value) => store('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n});\nconst del = (key) => store('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n});\nexport { get, set, del };\n","import { get, set, del } from './cache';\nimport { Accept_Image } from './compatibility';\nimport { __ } from '../common/sakurairo_global';\nimport { isMobile } from './mobile';\nimport { createButterbar } from '../common/butterbar';\nimport { noop } from '../common/util';\nlet bgn = 1;\nlet blob_url = '';\nexport async function nextBG() {\n changeCoverBG(await getCoverPath(true));\n bgn++;\n}\nexport async function preBG() {\n bgn--;\n changeCoverBG(await getCoverPath(true));\n}\nconst centerbg = document.querySelector(\".centerbg\");\n/**\n * 更改封面背景\n */\nexport const changeCoverBG = _iro.site_bg_as_cover ? (url) => {\n document.body.style.backgroundImage = `url(${url})`;\n document.dispatchEvent(new CustomEvent('coverBG_change', { detail: url }));\n} :\n centerbg ? (url) => {\n centerbg.style.backgroundImage = `url(${url})`;\n document.dispatchEvent(new CustomEvent('coverBG_change', { detail: url }));\n } : noop;\nfunction parseCSSUrl(cssText) {\n const result = cssText?.match(/^url\\(\"(.+)\"\\)$/);\n if (result) {\n return result[1];\n }\n}\n/**\n * 返回当前封面背景的URL\n */\nexport const getCurrentBG = _iro.site_bg_as_cover ? () => parseCSSUrl(document.body.style.backgroundImage) :\n (centerbg ? () => parseCSSUrl(centerbg.style.backgroundImage) : noop);\nfunction getAPIPath(useBGN = false) {\n const cover_api_url = new URL(_iro.cover_api);\n if (isMobile() && _iro.random_graphs_mts == true) {\n cover_api_url.searchParams.set('type', 'mobile');\n return cover_api_url.toString() + (useBGN ? \"&\" + bgn : '');\n }\n else {\n return cover_api_url.toString() + (useBGN ? (cover_api_url.search === '' ? \"?\" : '&') + bgn : '');\n }\n}\nexport const getCoverPath = _iro.cache_cover ? (useBGN = false) => get('cover').then(coverBG => {\n if (coverBG && coverBG instanceof ArrayBuffer) {\n cleanBlobUrl();\n blob_url = URL.createObjectURL(new Blob([coverBG]));\n return blob_url;\n }\n else {\n //fallback\n return getAPIPath(useBGN);\n }\n}).finally(() => {\n fetchThenCache(useBGN);\n})\n : getAPIPath;\nasync function fetchThenCache(useBGN = false) {\n try {\n const resp = await fetch(getAPIPath(useBGN), { headers: { Accept: Accept_Image } });\n if (resp.status == 500) {\n const result = await resp.json();\n createButterbar(result.message);\n console.warn(result.message);\n }\n else if (resp.ok) {\n const buf = await resp.arrayBuffer();\n try {\n set('cover', buf);\n /**\n * @problem Safari暂时不支持indexdb存储blob\n * DataCloneError: Failed to store record in an IDBObjectStore: BlobURLs are not yet supported.\n * @seealso https://developers.google.com/web/fundamentals/instant-and-offline/web-storage/indexeddb-best-practices#keeping_your_app_predictable\n */\n }\n catch (e) {\n //catch: FireFox无痕模式下数据库不允许修改\n /**\n * @problem FireFox无痕模式下数据库不允许修改\n * DOMException: A mutation operation was attempted on a database that did not allow mutations\n * Chrome不会报错\n * 像是火狐的设计 https://wiki.mozilla.org/Private_Browsing#Persistent_Storage\n * 变通方法 https://bugzilla.mozilla.org/show_bug.cgi?id=1639542#c9\n */\n console.warn(e);\n }\n }\n }\n catch (e) {\n if (e instanceof TypeError) {\n console.warn(__('你的封面API好像不支持跨域调用,这种情况下缓存是不会生效的哦'));\n del('cover');\n }\n }\n}\nfunction cleanBlobUrl() {\n URL.revokeObjectURL(blob_url);\n blob_url = '';\n}\n/* export function initCoverBG() {\n if (_iro.site_bg_as_cover) {\n if (centerbg) centerbg.style.background = '#0000'\n }\n} */ \n","const mediaQuery = window.matchMedia('(prefers-color-scheme:dark)');\nlet inDarkMode = false;\nexport const isInDarkMode = () => inDarkMode;\nfunction informDarkModeChange(nextValue) {\n if (nextValue !== inDarkMode) {\n document.dispatchEvent(new CustomEvent(\"darkmode\", { detail: nextValue }));\n inDarkMode = nextValue;\n }\n}\nfunction mediaQueryCallback() {\n const dark = localStorage.getItem(\"dark\");\n //仅在深色模式不是用户主动设置时触发\n if (!dark) {\n if (mediaQuery.matches && _iro.darkmode) {\n turnOnDarkMode();\n }\n else {\n turnOffDarkMode();\n }\n }\n}\nif (_iro.dm_strategy === 'client') {\n mediaQuery.removeEventListener ? mediaQuery.removeEventListener('change', mediaQueryCallback) : mediaQuery.removeListener(mediaQueryCallback);\n mediaQuery.addEventListener ? mediaQuery.addEventListener('change', mediaQueryCallback) : mediaQuery.addListener(mediaQueryCallback);\n}\nfunction saveUserSetting(value) {\n if (value == ifDarkmodeShouldOn()) {\n //用户设置与自动切换深色模式判断一致时,恢复自动切换\n localStorage.removeItem('dark');\n }\n else {\n if (value == true) {\n localStorage.setItem(\"dark\", \"1\");\n }\n else {\n localStorage.setItem(\"dark\", \"0\");\n }\n }\n //localStorage.setItem(\"bgImgSetting\", \"white-bg\");\n}\nexport function turnOnDarkMode(userTriggered) {\n document.documentElement.style.backgroundColor = \"#333\";\n document.getElementsByClassName(\"site-content\")[0].style.backgroundColor = \"#333\";\n document.body.classList.add(\"dark\");\n if (userTriggered)\n saveUserSetting(true);\n informDarkModeChange(true);\n}\nexport function turnOffDarkMode(userTriggered) {\n document.documentElement.style.backgroundColor = \"\";\n document.getElementsByClassName(\"site-content\")[0].style.backgroundColor = \"rgba(255, 255, 255, .8)\";\n document.body.classList.remove(\"dark\");\n document.body.classList.remove(\"dynamic\");\n informDarkModeChange(false);\n if (userTriggered) {\n saveUserSetting(false);\n //document.body.style.backgroundImage = `url(${_iro.skin_bg0})`;\n }\n}\n/**\n * 检查是否在深色模式时间\n * @returns {boolean}\n */\nfunction checkTime() {\n const today = new Date();\n return (today.getHours() > 21 || today.getHours() < 7);\n}\nexport function ifDarkmodeShouldOn() {\n switch (_iro.dm_strategy) {\n case 'client':\n return mediaQuery.matches;\n case 'eien':\n return true;\n default: /**case time */\n return checkTime();\n }\n}\nexport function checkDarkModeSetting() {\n const dark = localStorage.getItem(\"dark\");\n if (!dark) {\n //无用户设置时,自动切换深色模式\n if (ifDarkmodeShouldOn() && _iro.darkmode) {\n turnOnDarkMode();\n }\n else {\n turnOffDarkMode();\n }\n }\n else {\n if (dark == '1') {\n turnOnDarkMode();\n }\n else {\n turnOffDarkMode();\n }\n }\n}\n/* function mobile_dark_light() {\n if (document.body.classList.contains(\"dark\")) {\n document.documentElement.style.background = \"unset\";\n document.body.classList.remove(\"dark\");\n document.getElementById(\"moblieDarkLight\").innerHTML = '';\n setCookie(\"dark\", \"0\", 0.33);\n } else {\n document.documentElement.style.background = \"#333333\";\n document.getElementById(\"moblieDarkLight\").innerHTML = '';\n document.body.classList.add(\"dark\");\n setCookie(\"dark\", \"1\", 0.33);\n }\n} */ \n","import { createButterbar } from \"../common/butterbar\";\nimport { __ } from \"../common/sakurairo_global\";\nimport { isMobile } from \"./mobile\";\nlet btnSerif, btnSansSerif;\nfunction Serif() {\n if (isMobile()) {\n createButterbar(__(\"将从网络加载字体,流量请注意\"));\n }\n document.body.classList.add(\"serif\");\n localStorage.setItem(\"font_family\", \"serif\");\n setButtonState('serif');\n}\nfunction SansSerif() {\n document.body.classList.remove(\"serif\");\n localStorage.setItem(\"font_family\", \"sans-serif\");\n setButtonState('sans-serif');\n}\nfunction change_font_listener(btn) {\n return () => {\n const { name } = btn.dataset;\n const nowFont = localStorage.getItem(\"font_family\");\n if (name == nowFont) {\n return;\n }\n else {\n (name == 'serif') ? Serif() : SansSerif();\n }\n };\n}\nexport function loadFontSetting() {\n const nowFont = localStorage.getItem(\"font_family\");\n if (!nowFont || nowFont == \"serif\") {\n document.body.classList.add(\"serif\");\n }\n}\nfunction setButtonState(font_name) {\n if (font_name === 'sans-serif' || localStorage.getItem(\"font_family\") == 'sans-serif') {\n btnSerif.classList.remove(\"selected\");\n btnSansSerif.classList.add(\"selected\");\n }\n else {\n btnSansSerif.classList.remove(\"selected\");\n btnSerif.classList.add(\"selected\");\n }\n}\nfunction initDOMCache() {\n btnSerif = document.getElementsByClassName(\"control-btn-serif\")[0];\n btnSansSerif = document.getElementsByClassName(\"control-btn-sans-serif\")[0];\n return btnSansSerif && btnSerif;\n}\nfunction initListener() {\n btnSerif.addEventListener('click', change_font_listener(btnSerif));\n btnSansSerif.addEventListener('click', change_font_listener(btnSansSerif));\n}\nexport function initFontControl() {\n const result = initDOMCache();\n if (!result)\n localStorage.removeItem('font_family'); //样式菜单“简单”时,使用默认字体 “A”\n loadFontSetting();\n if (result) {\n setButtonState();\n initListener();\n }\n}\n","export default async function hitokoto() {\n const yiyan = document.getElementById(\"footer_yiyan\");\n if (yiyan) {\n const api_group = _iro.yiyan_api || [\"https://api.maho.cc/yiyan/\"];\n if (api_group.length == 0) {\n console.warn('一言API: 路径为空');\n }\n for (const api_path of api_group) {\n try {\n const txt = await request(api_path);\n yiyan.innerText = txt;\n break;\n }\n catch (e) {\n console.warn(`一言API: 尝试联系\"${api_path}\"时出错。 `, e);\n continue;\n }\n }\n }\n}\nconst request = async (api) => {\n const res = await fetch(api, { headers: { Accept: \"application/json\" } });\n if (res.ok) {\n const data = await res.json();\n const from_who = (data.from_who == 'null' ? null : data.from_who) || '';\n const from = data.from != data.from_who ? `「${data['from']}」` : '';\n const hitokoto = data.hitokoto;\n return hitokoto + '——' + from_who + from;\n }\n else {\n throw res.status;\n }\n};\n","let cache_is_mobile = false;\nexport function initIsMobileCache() {\n const mediaQuery = window.matchMedia('(max-width:860px)');\n cache_is_mobile = mediaQuery.matches;\n mediaQuery.addEventListener ? mediaQuery.addEventListener('change', refreshIsMobileCache) : mediaQuery.addListener(refreshIsMobileCache);\n}\nfunction refreshIsMobileCache(ev) {\n cache_is_mobile = ev.matches;\n}\n/**\n *\n * @returns 返回document.body.clientWidth <= 860的结果。这个结果是缓存的\n */\nexport const isMobile = () => cache_is_mobile;\n","import { onlyOnceATime } from \"../common/util\";\nimport lazyload from \"../common/lazyload\";\nimport { __ } from '../common/sakurairo_global';\n// @ts-ignore\nimport { code_highlight_style } from '../common/code-highlight';\nimport { getForeground, getHighlight, getThemeColorFromImageElement } from \"./theme-color\";\nconst hslaCSSText = ([h, s, l, a]) => {\n const hsl = `${h}deg,${s}%,${l}%`;\n return a && a !== 1 ? `hsla(${hsl},${a})` : `hsl(${hsl})`;\n};\nlet load_post_timer;\nconst load_post = onlyOnceATime(async function load_post() {\n const now_href = document.location.href;\n const pagination_a = document.querySelector('#pagination a');\n if (pagination_a.classList.contains(\"loading\"))\n return;\n pagination_a.classList.add(\"loading\");\n pagination_a.innerText = \"\";\n // $('#pagination a').addClass(\"loading\").text(\"\");\n const resp = await fetch(pagination_a.getAttribute(\"href\") + \"#main\");\n const text = await resp.text();\n //在进行DOM操作前检查页面是否已经变化,防止错误加载到其他页面上\n if (now_href != document.location.href)\n return; /**如果页面状态发生了变化,那么也应该不用理加载提示符 */\n const parser = new DOMParser(), DOM = parser.parseFromString(text, \"text/html\"), result = DOM.querySelectorAll(\"#main .post, #shuoshuo_post\"), paga = DOM.querySelector(\"#pagination a\"), paga_innerText = paga && paga.innerText, nextHref = paga && paga.getAttribute(\"href\"), main = document.getElementById(\"main\");\n for (let i = 0; i < result.length; i++) {\n main.append(result[i]);\n }\n //if (resp.ok) {\n // result = $(data).find(\"#main .post\");\n // nextHref = $(data).find(\"#pagination a\").attr(\"href\");\n // $(\"#main\").append(result.fadeIn(500));\n const dpga = document.querySelector(\"#pagination a\"), addps = document.querySelector(\"#add_post span\");\n if (dpga) {\n dpga.classList.remove(\"loading\");\n dpga.innerText = paga_innerText;\n }\n if (addps) {\n addps.classList.remove(\"loading\");\n addps.innerText = \"\";\n }\n // $(\"#pagination a\").removeClass(\"loading\").text(\"Previous\");\n // $('#add_post span').removeClass(\"loading\").text(\"\");\n lazyload();\n code_highlight_style();\n post_list_show_animation();\n document.dispatchEvent(new CustomEvent('ajax_post_loaded'));\n if (nextHref != undefined) {\n pagination_a.setAttribute(\"href\", nextHref);\n // $(\"#pagination a\").attr(\"href\", nextHref);\n //加载完成上滑\n let tempScrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;\n // window.scrollTo(tempScrollTop);\n // $(window).scrollTop(tempScrollTop);\n window.scrollTo({\n top: tempScrollTop + 300,\n behavior: 'smooth'\n });\n // $body.animate({\n // scrollTop: tempScrollTop + 300\n //\n // }, 666)\n }\n else {\n document.getElementById(\"pagination\").innerHTML = \"\" + __(\"很高兴你翻到这里,但是真的没有了...\") + \"\";\n // $(\"#pagination\").html(\"很高兴你翻到这里,但是真的没有了...\");\n }\n //}\n /* $.ajax({\n type: \"POST\",\n url: $('#pagination a').attr(\"href\") + \"#main\",\n success: function (data) {\n result = $(data).find(\"#main .post\");\n nextHref = $(data).find(\"#pagination a\").attr(\"href\");\n $(\"#main\").append(result.fadeIn(500));\n $(\"#pagination a\").removeClass(\"loading\").text(\"Previous\");\n $('#add_post span').removeClass(\"loading\").text(\"\");\n lazyload();\n post_list_show_animation();\n if (nextHref != undefined) {\n $(\"#pagination a\").attr(\"href\", nextHref);\n //加载完成上滑\n var tempScrollTop = $(window).scrollTop();\n $(window).scrollTop(tempScrollTop);\n $body.animate({\n scrollTop: tempScrollTop + 300\n\n }, 666)\n } else {\n $(\"#pagination\").html(\"很高兴你翻到这里,但是真的没有了...\");\n }\n }\n }); */\n});\nexport function post_list_show_animation() {\n const articles = document.querySelectorAll('article.post-list-thumb,article.shuoshuo-item');\n if (articles) {\n const io = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n entry.target.classList.add(\"post-list-show\");\n }\n else {\n continue;\n }\n const target = entry.target;\n const thumbImage = target.querySelector('.post-thumb img');\n io.unobserve(target);\n if (thumbImage) {\n let finalImageElement = thumbImage;\n if (thumbImage.classList.contains('lazyload')) {\n finalImageElement = document.createElement('img');\n finalImageElement.src = thumbImage.getAttribute('data-src');\n finalImageElement.crossOrigin = \"anonymous\";\n }\n getThemeColorFromImageElement(finalImageElement)\n .then(rgba => {\n if (!rgba)\n return;\n const style = target.style;\n style.setProperty('--article-theme', `rgba(${rgba[0]},${rgba[1]},${rgba[2]},${rgba[3] / 255})`);\n style.setProperty('--article-theme-highlight', hslaCSSText(getHighlight(rgba)));\n style.setProperty('--article-theme-foreground', hslaCSSText(getForeground(rgba)));\n });\n }\n }\n }, {\n threshold: [0.42]\n });\n for (const article of articles) {\n io.observe(article);\n }\n }\n}\nfunction XLS_Listener(e) {\n //要求是#pagination只有anchor一个直接子后代\n if (e.target.parentElement.id == 'pagination') {\n e.preventDefault();\n e.stopPropagation();\n clearTimeout(load_post_timer);\n load_post();\n }\n}\nexport function XLS() {\n const intersectionObserver = new IntersectionObserver((entries) => {\n if (entries[0].intersectionRatio <= 0)\n return;\n // var page_next = $('#pagination a').attr(\"href\");\n const _page_next = document.querySelector('#pagination a');\n if (_page_next) {\n const href_page_next = _page_next.getAttribute(\"href\"), load_key = document.getElementById(\"add_post_time\");\n if (href_page_next != undefined && load_key) {\n const load_time = load_key.title;\n if (load_time != \"233\") {\n console.log(\"%c 自动加载时倒计时 %c\", \"background:#9a9da2; color:#ffffff; border-radius:4px;\", \"\", \"\", load_time);\n load_post_timer = setTimeout(load_post, parseInt(load_time, 10) * 1000);\n }\n }\n }\n });\n intersectionObserver.observe(document.querySelector('.footer-device'));\n document.body.removeEventListener('click', XLS_Listener);\n document.body.addEventListener(\"click\", XLS_Listener);\n}\n","export default function showcard() {\n for (const showcard of document.querySelectorAll('.showcard')) {\n const img = showcard.querySelector('.img');\n const button = showcard.querySelector('.showcard-button');\n if (!img || !button) {\n throw new Error('invalid structure for .showcard');\n }\n img.addEventListener('mouseover', function () {\n button.classList.add('hover');\n });\n img.addEventListener('mouseout', function () {\n button.classList.remove('hover');\n });\n }\n}\n","let lastMsgId = 0;\nexport default class PromiseWorker {\n w;\n cb = {};\n [Symbol.dispose];\n constructor(worker) {\n this.w = worker;\n const callback = (e) => {\n const payload = e.data;\n const messageId = payload[0];\n const callback = this.cb[messageId];\n if (!callback)\n return;\n delete this.cb[messageId];\n callback(payload[1], payload[2]);\n };\n worker.addEventListener('message', callback);\n this.postMessage = (message, ...extraArgs) => {\n const messageId = lastMsgId++;\n const messageToSend = [messageId, message];\n return new Promise((resolve, reject) => {\n this.cb[messageId] = (error, result) => {\n if (error) {\n return reject(new Error(error.message));\n }\n resolve(result);\n };\n this.w.postMessage(messageToSend, ...extraArgs);\n });\n };\n this[Symbol.dispose] = () => {\n worker.removeEventListener('message', callback);\n };\n }\n postMessage;\n}\n","/**\n * RGB space.\n *\n * @module color-space/rgb\n */\n\nexport default {\n\tname: 'rgb',\n\tmin: [0,0,0],\n\tmax: [255,255,255],\n\tchannel: ['red', 'green', 'blue'],\n\talias: ['RGB']\n};\n","/**\n * @module color-space/hsl\n */\nimport rgb from './rgb.js';\n\nexport default {\n\tname: 'hsl',\n\tmin: [0,0,0],\n\tmax: [360,100,100],\n\tchannel: ['hue', 'saturation', 'lightness'],\n\talias: ['HSL'],\n\n\trgb: function(hsl) {\n\t\tvar h = hsl[0]/360, s = hsl[1]/100, l = hsl[2]/100, t1, t2, t3, rgb, val, i=0;\n\n\t\tif (s === 0) return val = l * 255, [val, val, val];\n\n\t\tt2 = l < 0.5 ? l * (1 + s) : l + s - l * s;\n\t\tt1 = 2 * l - t2;\n\n\t\trgb = [0, 0, 0];\n\t\tfor (;i<3;) {\n\t\t\tt3 = h + 1 / 3 * - (i - 1);\n\t\t\tt3 < 0 ? t3++ : t3 > 1 && t3--;\n\t\t\tval = 6 * t3 < 1 ? t1 + (t2 - t1) * 6 * t3 :\n\t\t\t2 * t3 < 1 ? t2 :\n\t\t\t3 * t3 < 2 ? t1 + (t2 - t1) * (2 / 3 - t3) * 6 :\n\t\t\tt1;\n\t\t\trgb[i++] = val * 255;\n\t\t}\n\n\t\treturn rgb;\n\t}\n};\n\n\n//extend rgb\nrgb.hsl = function(rgb) {\n\tvar r = rgb[0]/255,\n\t\t\tg = rgb[1]/255,\n\t\t\tb = rgb[2]/255,\n\t\t\tmin = Math.min(r, g, b),\n\t\t\tmax = Math.max(r, g, b),\n\t\t\tdelta = max - min,\n\t\t\th, s, l;\n\n\tif (max === min) {\n\t\th = 0;\n\t}\n\telse if (r === max) {\n\t\th = (g - b) / delta;\n\t}\n\telse if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t}\n\telse if (b === max) {\n\t\th = 4 + (r - g)/ delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tl = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t}\n\telse if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t}\n\telse {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n","/**\n * CIE XYZ\n *\n * @module color-space/xyz\n */\nimport rgb from './rgb.js';\n\nvar xyz = {\n\tname: 'xyz',\n\tmin: [0,0,0],\n\tchannel: ['X','Y','Z'],\n\talias: ['XYZ', 'ciexyz', 'cie1931']\n};\n\n\n/**\n * Whitepoint reference values with observer/illuminant\n *\n * http://en.wikipedia.org/wiki/Standard_illuminant\n */\nxyz.whitepoint = {\n\t//1931 2°\n\t2: {\n\t\t//incadescent\n\t\tA:[109.85, 100, 35.585],\n\t\t// B:[],\n\t\tC: [98.074, 100, 118.232],\n\t\tD50: [96.422, 100, 82.521],\n\t\tD55: [95.682, 100, 92.149],\n\t\t//daylight\n\t\tD65: [95.045592705167, 100, 108.9057750759878],\n\t\tD75: [94.972, 100, 122.638],\n\t\t//flourescent\n\t\t// F1: [],\n\t\tF2: [99.187, 100, 67.395],\n\t\t// F3: [],\n\t\t// F4: [],\n\t\t// F5: [],\n\t\t// F6:[],\n\t\tF7: [95.044, 100, 108.755],\n\t\t// F8: [],\n\t\t// F9: [],\n\t\t// F10: [],\n\t\tF11: [100.966, 100, 64.370],\n\t\t// F12: [],\n\t\tE: [100,100,100]\n\t},\n\n\t//1964 10°\n\t10: {\n\t\t//incadescent\n\t\tA:[111.144, 100, 35.200],\n\t\tC: [97.285, 100, 116.145],\n\t\tD50: [96.720, 100, 81.427],\n\t\tD55: [95.799, 100, 90.926],\n\t\t//daylight\n\t\tD65: [94.811, 100, 107.304],\n\t\tD75: [94.416, 100, 120.641],\n\t\t//flourescent\n\t\tF2: [103.280, 100, 69.026],\n\t\tF7: [95.792, 100, 107.687],\n\t\tF11: [103.866, 100, 65.627],\n\t\tE: [100,100,100]\n\t}\n};\n\n\n/**\n * Top values are the whitepoint’s top values, default are D65\n */\nxyz.max = xyz.whitepoint[2].D65;\n\n\n/**\n * Transform xyz to rgb\n *\n * @param {Array} xyz Array of xyz values\n *\n * @return {Array} RGB values\n */\nxyz.rgb = function (_xyz, white) {\n\t//FIXME: make sure we have to divide like this. Probably we have to replace matrix as well then\n\twhite = white || xyz.whitepoint[2].E;\n\n\tvar x = _xyz[0] / white[0],\n\t\ty = _xyz[1] / white[1],\n\t\tz = _xyz[2] / white[2],\n\t\tr, g, b;\n\n\t// assume sRGB\n\t// http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html\n\tr = (x * 3.240969941904521) + (y * -1.537383177570093) + (z * -0.498610760293);\n\tg = (x * -0.96924363628087) + (y * 1.87596750150772) + (z * 0.041555057407175);\n\tb = (x * 0.055630079696993) + (y * -0.20397695888897) + (z * 1.056971514242878);\n\n\tr = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n\t\t: r = (r * 12.92);\n\n\tg = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n\t\t: g = (g * 12.92);\n\n\tb = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n\t\t: b = (b * 12.92);\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n}\n\n\n\n/**\n * RGB to XYZ\n *\n * @param {Array} rgb RGB channels\n *\n * @return {Array} XYZ channels\n */\nrgb.xyz = function(rgb, white) {\n\tvar r = rgb[0] / 255,\n\t\t\tg = rgb[1] / 255,\n\t\t\tb = rgb[2] / 255;\n\n\t// assume sRGB\n\tr = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n\tvar x = (r * 0.41239079926595) + (g * 0.35758433938387) + (b * 0.18048078840183);\n\tvar y = (r * 0.21263900587151) + (g * 0.71516867876775) + (b * 0.072192315360733);\n\tvar z = (r * 0.019330818715591) + (g * 0.11919477979462) + (b * 0.95053215224966);\n\n\twhite = white || xyz.whitepoint[2].E;\n\n\treturn [x * white[0], y * white[1], z * white[2]];\n};\n\n\n\nexport default xyz;\n","/**\n * CIE LAB space model\n *\n * @module color-space/lab\n */\n\nimport xyz from './xyz.js';\n\nexport default {\n\tname: 'lab',\n\tmin: [0,-100,-100],\n\tmax: [100,100,100],\n\tchannel: ['lightness', 'a', 'b'],\n\talias: ['LAB', 'cielab'],\n\n\txyz: function(lab) {\n\t\tvar l = lab[0],\n\t\t\t\ta = lab[1],\n\t\t\t\tb = lab[2],\n\t\t\t\tx, y, z, y2;\n\n\t\tif (l <= 8) {\n\t\t\ty = (l * 100) / 903.3;\n\t\t\ty2 = (7.787 * (y / 100)) + (16 / 116);\n\t\t} else {\n\t\t\ty = 100 * Math.pow((l + 16) / 116, 3);\n\t\t\ty2 = Math.pow(y / 100, 1/3);\n\t\t}\n\n\t\tx = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3);\n\n\t\tz = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3);\n\n\t\treturn [x, y, z];\n\t}\n};\n\n\n//extend xyz\nxyz.lab = function(xyz){\n\tvar x = xyz[0],\n\t\t\ty = xyz[1],\n\t\t\tz = xyz[2],\n\t\t\tl, a, b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n","import rgb from 'color-space/rgb.js';\nimport xyz from 'color-space/xyz.js';\nimport lab from 'color-space/lab.js';\n\nfunction _filled_array(fillWith, count) {\n const array = [];\n for (let i = 0; i < count; i++) {\n array.push(fillWith);\n }\n return array;\n}\nfunction euclidean_distance_squared_index(a, a_start, b) {\n const r = a[a_start++] - b[0];\n const g = a[a_start++] - b[1];\n const _b = a[a_start++] - b[2];\n return r ** 2 + g ** 2 + _b ** 2;\n}\nfunction kmeans(data, k, maxAttempt, thresold = 2, clipAlpha = false) {\n const cluster_sum = [];\n const thresold_squared = thresold ** 2;\n let pixelCount = data.length / 4;\n let cluster_centers = [];\n let new_cluster_centers = [];\n let iteration = 0;\n const isDataTypedArray = data instanceof Uint8ClampedArray;\n const PIXEL_LEN = clipAlpha ? 3 : 4;\n if (clipAlpha) {\n let j = 0;\n const dataNoAlpha = isDataTypedArray ? new Uint8ClampedArray(pixelCount * 3) : [];\n for (let i = 0; i < data.length; ) {\n if (data[i + 3] == 0) {\n i += 4;\n continue;\n }\n dataNoAlpha[j++] = data[i++];\n dataNoAlpha[j++] = data[i++];\n dataNoAlpha[j++] = data[i++];\n i++;\n }\n data = dataNoAlpha.slice(0, j);\n pixelCount = j / 3;\n }\n for (let i = 0; i < k; i++) {\n const start = Math.floor(1 * (pixelCount - 1)) * PIXEL_LEN;\n cluster_centers.push(\n /* Array.from */\n data.slice(start, start + 3)\n );\n new_cluster_centers.push(isDataTypedArray ? new Uint8ClampedArray(3) : _filled_array(0, 3));\n cluster_sum.push(_filled_array(0, 4));\n }\n while (iteration < maxAttempt) {\n for (let i = 0; i < data.length; ) {\n let cluster_index = 0;\n let _min_distance = euclidean_distance_squared_index(data, i, cluster_centers[0]);\n for (let j = 1; j < k; j++) {\n const distance = euclidean_distance_squared_index(data, i, cluster_centers[j]);\n if (distance < _min_distance) {\n _min_distance = distance;\n cluster_index = j;\n }\n }\n const sum = cluster_sum[cluster_index];\n sum[0] += data[i++];\n sum[1] += data[i++];\n sum[2] += data[i++];\n sum[3]++;\n if (PIXEL_LEN === 4) i++;\n }\n let allStabled = true;\n for (let i = 0; i < k; i++) {\n const rgbc = cluster_sum[i];\n const count = rgbc[3];\n if (count == 0) {\n const start = Math.floor(Math.random() * (pixelCount - 1)) * PIXEL_LEN;\n new_cluster_centers[i] = /* Array.from */\n data.slice(start, start + 3);\n allStabled = false;\n } else {\n let new_center = new_cluster_centers[i];\n let diffSquared = 0;\n for (let j = 0; j < 3; j++) {\n new_center[j] = rgbc[j] / count;\n diffSquared += (new_center[j] - cluster_centers[i][j]) ** 2;\n }\n if (diffSquared > thresold_squared) {\n allStabled = false;\n }\n }\n }\n if (allStabled) {\n return {\n centroid: new_cluster_centers,\n iteration,\n fit: true,\n label: cluster_sum.map((v) => v[3]),\n size: pixelCount\n };\n }\n const medium = cluster_centers;\n cluster_centers = new_cluster_centers;\n new_cluster_centers = medium;\n iteration++;\n for (let i = 0; i < k; i++) {\n cluster_sum[i].fill(0);\n }\n }\n return {\n centroid: cluster_centers,\n iteration,\n fit: false,\n label: cluster_sum.map((v) => v[3]),\n size: pixelCount\n };\n}\n\n/**\n * NeuQuant Neural-Network Quantization Algorithm\n *\n * Copyright (c) 1994 Anthony Dekker\n *\n * See \"Kohonen neural networks for optimal colour quantization\" in \"Network:\n * Computation in Neural Systems\" Vol. 5 (1994) pp 351-367. for a discussion of\n * the algorithm.\n *\n * See also http://members.ozemail.com.au/~dekker/NEUQUANT.HTML\n *\n * Any party obtaining a copy of these files from the author, directly or\n * indirectly, is granted, free of charge, a full and unrestricted irrevocable,\n * world-wide, paid up, royalty-free, nonexclusive right and license to deal in\n * this software and documentation files (the \"Software\"), including without\n * limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons who\n * receive copies from any such party to do so, with the only requirement being\n * that this copyright notice remain intact.\n *\n * Copyright (c) 2012 Johan Nordberg (JavaScript port)\n * Copyright (c) 2014 Devon Govett (JavaScript port)\n */\n\nconst prime1 = 499;\nconst prime2 = 491;\nconst prime3 = 487;\nconst prime4 = 503;\n\nconst maxprime = Math.max(prime1, prime2, prime3, prime4);\nconst minpicturebytes = (3 * maxprime);\n\nconst defaults = {\n ncycles: 100,\n netsize: 256,\n samplefac: 10\n};\n\nconst assign = function (target) {\n for (let i = 1, l = arguments.length; i < l; i++) {\n const nextSource = arguments[i];\n if (nextSource != null) {\n for (const nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n target[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return target\n};\n\nclass NeuQuant {\n constructor (pixels, options) {\n assign(this, defaults, {pixels}, options);\n\n if (this.netsize < 4 || this.netsize > 256) {\n throw new Error('Color count must be between 4 and 256')\n }\n\n if (this.samplefac < 1 || this.samplefac > 30) {\n throw new Error('Sampling factor must be between 1 and 30')\n }\n\n this.maxnetpos = this.netsize - 1;\n\n this.netbiasshift = 4;\n this.intbiasshift = 16;\n this.intbias = (1 << this.intbiasshift);\n this.gammashift = 10;\n this.gamma = (1 << this.gammashift);\n this.betashift = 10;\n this.beta = (this.intbias >> this.betashift);\n this.betagamma = (this.beta * this.gamma);\n\n this.initrad = (this.netsize >> 3);\n this.radiusbiasshift = 6;\n this.radiusbias = (1 << this.radiusbiasshift);\n this.initradius = (this.initrad * this.radiusbias);\n this.radiusdec = 30;\n\n this.alphabiasshift = 10;\n this.initalpha = (1 << this.alphabiasshift);\n\n this.radbiasshift = 8;\n this.radbias = (1 << this.radbiasshift);\n this.alpharadbshift = (this.alphabiasshift + this.radbiasshift);\n this.alpharadbias = (1 << this.alpharadbshift);\n\n this.network = [];\n this.netindex = new Uint32Array(256);\n this.bias = new Uint32Array(this.netsize);\n this.freq = new Uint32Array(this.netsize);\n this.radpower = new Uint32Array(this.netsize >> 3);\n\n for (let i = 0, l = this.netsize; i < l; i++) {\n let v = (i << (this.netbiasshift + 8)) / this.netsize;\n this.network[i] = new Float64Array([v, v, v, 0]);\n this.freq[i] = this.intbias / this.netsize;\n this.bias[i] = 0;\n }\n }\n\n unbiasnet () {\n for (let i = 0, l = this.netsize; i < l; i++) {\n this.network[i][0] >>= this.netbiasshift;\n this.network[i][1] >>= this.netbiasshift;\n this.network[i][2] >>= this.netbiasshift;\n this.network[i][3] = i;\n }\n }\n\n altersingle (alpha, i, b, g, r) {\n this.network[i][0] -= (alpha * (this.network[i][0] - b)) / this.initalpha;\n this.network[i][1] -= (alpha * (this.network[i][1] - g)) / this.initalpha;\n this.network[i][2] -= (alpha * (this.network[i][2] - r)) / this.initalpha;\n }\n\n alterneigh (radius, i, b, g, r) {\n const lo = Math.abs(i - radius);\n const hi = Math.min(i + radius, this.netsize);\n\n let j = i + 1;\n let k = i - 1;\n let m = 1;\n\n while ((j < hi) || (k > lo)) {\n const a = this.radpower[m++];\n\n if (j < hi) {\n const p = this.network[j++];\n p[0] -= (a * (p[0] - b)) / this.alpharadbias;\n p[1] -= (a * (p[1] - g)) / this.alpharadbias;\n p[2] -= (a * (p[2] - r)) / this.alpharadbias;\n }\n\n if (k > lo) {\n const p = this.network[k--];\n p[0] -= (a * (p[0] - b)) / this.alpharadbias;\n p[1] -= (a * (p[1] - g)) / this.alpharadbias;\n p[2] -= (a * (p[2] - r)) / this.alpharadbias;\n }\n }\n }\n\n contest (b, g, r) {\n let bestd = ~(1 << 31);\n let bestbiasd = bestd;\n let bestpos = -1;\n let bestbiaspos = bestpos;\n\n for (let i = 0, l = this.netsize; i < l; i++) {\n let n = this.network[i];\n\n let dist = Math.abs(n[0] - b) + Math.abs(n[1] - g) + Math.abs(n[2] - r);\n if (dist < bestd) {\n bestd = dist;\n bestpos = i;\n }\n\n let biasdist = dist - ((this.bias[i]) >> (this.intbiasshift - this.netbiasshift));\n if (biasdist < bestbiasd) {\n bestbiasd = biasdist;\n bestbiaspos = i;\n }\n\n let betafreq = (this.freq[i] >> this.betashift);\n this.freq[i] -= betafreq;\n this.bias[i] += (betafreq << this.gammashift);\n }\n\n this.freq[bestpos] += this.beta;\n this.bias[bestpos] -= this.betagamma;\n\n return bestbiaspos\n }\n\n inxbuild () {\n let previouscol = 0;\n let startpos = 0;\n\n for (let i = 0, l = this.netsize; i < l; i++) {\n let p = this.network[i];\n let q = null;\n let smallpos = i;\n let smallval = p[1];\n\n for (let j = i + 1; j < l; j++) {\n q = this.network[j];\n if (q[1] < smallval) {\n smallpos = j;\n smallval = q[1];\n }\n }\n q = this.network[smallpos];\n\n if (i !== smallpos) {\n [p[0], q[0]] = [q[0], p[0]];\n [p[1], q[1]] = [q[1], p[1]];\n [p[2], q[2]] = [q[2], p[2]];\n [p[3], q[3]] = [q[3], p[3]];\n }\n\n if (smallval !== previouscol) {\n this.netindex[previouscol] = (startpos + i) >> 1;\n for (let j = previouscol + 1; j < smallval; j++) {\n this.netindex[j] = i;\n }\n previouscol = smallval;\n startpos = i;\n }\n }\n\n this.netindex[previouscol] = (startpos + this.maxnetpos) >> 1;\n for (let i = previouscol + 1; i < 256; i++) {\n this.netindex[i] = this.maxnetpos;\n }\n }\n\n learn () {\n const lengthcount = this.pixels.length;\n const alphadec = 30 + ((this.samplefac - 1) / 3);\n const samplepixels = lengthcount / (3 * this.samplefac);\n\n let delta = samplepixels / this.ncycles | 0;\n let alpha = this.initalpha;\n let radius = this.initradius;\n\n let rad = radius >> this.radiusbiasshift;\n\n if (rad <= 1) {\n rad = 0;\n }\n\n for (let i = 0; i < rad; i++) {\n this.radpower[i] = alpha * (((rad * rad - i * i) * this.radbias) / (rad * rad));\n }\n\n let step;\n if (lengthcount < minpicturebytes) {\n this.samplefac = 1;\n step = 3;\n } else if ((lengthcount % prime1) !== 0) {\n step = 3 * prime1;\n } else if ((lengthcount % prime2) !== 0) {\n step = 3 * prime2;\n } else if ((lengthcount % prime3) !== 0) {\n step = 3 * prime3;\n } else {\n step = 3 * prime4;\n }\n\n let pix = 0;\n\n for (let i = 0; i < samplepixels;) {\n let b = (this.pixels[pix] & 0xff) << this.netbiasshift;\n let g = (this.pixels[pix + 1] & 0xff) << this.netbiasshift;\n let r = (this.pixels[pix + 2] & 0xff) << this.netbiasshift;\n\n let j = this.contest(b, g, r);\n this.altersingle(alpha, j, b, g, r);\n if (rad !== 0) {\n this.alterneigh(rad, j, b, g, r);\n }\n\n pix += step;\n if (pix >= lengthcount) {\n pix -= lengthcount;\n }\n\n if (delta === 0) {\n delta = 1;\n }\n\n if (++i % delta === 0) {\n alpha -= alpha / alphadec;\n radius -= radius / this.radiusdec;\n rad = radius >> this.radiusbiasshift;\n\n if (rad <= 1) {\n rad = 0;\n }\n\n for (let k = 0; k < rad; k++) {\n this.radpower[k] = alpha * (((rad * rad - k * k) * this.radbias) / (rad * rad));\n }\n }\n }\n }\n\n buildColorMap () {\n this.learn();\n this.unbiasnet();\n this.inxbuild();\n }\n\n getColorMap () {\n const map = new Uint8Array(this.netsize * 3);\n const index = new Uint8Array(this.netsize);\n\n for (let i = 0, l = this.netsize; i < l; i++) {\n index[this.network[i][3]] = i;\n }\n\n for (let i = 0, j = 0, k = 0, l = this.netsize; i < l; i++) {\n k = index[i];\n map[j++] = this.network[k][0] & 0xff;\n map[j++] = this.network[k][1] & 0xff;\n map[j++] = this.network[k][2] & 0xff;\n }\n\n return map\n }\n}\n\nfunction findClosest (palette, r, g, b) {\n let minpos = 0;\n let mind = 256 * 256 * 256;\n\n for (let i = 0, l = palette.length; i < l;) {\n const dr = r - palette[i++];\n const dg = g - palette[i++];\n const db = b - palette[i];\n const d = dr * dr + dg * dg + db * db;\n const pos = i / 3 | 0;\n\n if (d < mind) {\n mind = d;\n minpos = pos;\n }\n\n i++;\n }\n\n return minpos\n}\n\nfunction palette (pixels, options) {\n const nq = new NeuQuant(pixels, options);\n nq.buildColorMap();\n return nq.getColorMap()\n}\n\nfunction indexed (pixels, palette) {\n const indexed = new Uint8Array(pixels.length / 3);\n const memo = {};\n\n for (let i = 0, j = 0, l = pixels.length; i < l;) {\n const r = pixels[i++];\n const g = pixels[i++];\n const b = pixels[i++];\n const k = r << 16 | g << 8 | b;\n\n if (k in memo) {\n indexed[j++] = memo[k];\n } else {\n indexed[j++] = memo[k] = findClosest(palette, r, g, b);\n }\n }\n\n return indexed\n}\n\nfunction rgba2Rgb(data) {\n const rgb = new Uint8ClampedArray(data.length / 4 * 3);\n const len = data.length;\n let rgb_i = 0;\n for (let i = 0; i < len; ) {\n for (let j = 0; j < 3; j++) {\n rgb[rgb_i++] = data[i++];\n }\n i++;\n }\n return rgb;\n}\nfunction neuquant(img, k, samplefac = 1) {\n const img_rgb = rgba2Rgb(img);\n const palette$1 = palette(img_rgb, { netsize: k, samplefac });\n const indexed_pixel = indexed(img_rgb, palette$1);\n const pixel = [];\n const len = palette$1.length;\n for (let i = 0; i < len; ) {\n pixel.push([palette$1[i++], palette$1[i++], palette$1[i++], 255]);\n }\n return { centroid: pixel, label: count(k, indexed_pixel) };\n}\nfunction count(k, index) {\n const counts = new Array(k).fill(0);\n for (const i of index) {\n counts[i]++;\n }\n return counts;\n}\n\nfunction _prepare2DContext(width, height) {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n canvas.height = height;\n canvas.width = width;\n return ctx;\n}\nfunction _prepare2DContextAsync(width, height) {\n const canvas = new OffscreenCanvas(width, height);\n const ctx = canvas.getContext(\"2d\");\n return ctx;\n}\nfunction awaitImage(imgElement) {\n return new Promise((resolve, reject) => {\n if (imgElement.complete) {\n resolve();\n } else {\n imgElement.addEventListener(\"load\", (e) => {\n resolve(e);\n });\n imgElement.addEventListener(\"error\", (reason) => {\n reject(reason);\n });\n }\n });\n}\nfunction _readImage(prepareCtx, imgSource) {\n const { naturalWidth, naturalHeight } = imgSource;\n const ctx = prepareCtx(naturalWidth, naturalHeight);\n ctx.drawImage(imgSource, 0, 0, naturalWidth, naturalHeight);\n return ctx.getImageData(0, 0, naturalWidth, naturalHeight);\n}\nconst readImage = _readImage.bind(void 0, _prepare2DContext);\nconst readImageOffscreen = _readImage.bind(void 0, _prepare2DContextAsync);\nfunction _readImageDownsampling(prepareCtx, imgSource, maxSample) {\n let { naturalWidth: width, naturalHeight: height } = imgSource;\n const scale = width * height / maxSample;\n if (scale > 1) {\n const scaleSqrt = Math.sqrt(scale);\n width = width / scaleSqrt | 0;\n height = height / scaleSqrt | 0;\n }\n const ctx = prepareCtx(width, height);\n ctx.drawImage(imgSource, 0, 0, width, height);\n return ctx.getImageData(0, 0, width, height);\n}\nconst readImageDownsampling = _readImageDownsampling.bind(void 0, _prepare2DContext);\nconst readImageDownsamplingOffscreen = _readImageDownsampling.bind(void 0, _prepare2DContextAsync);\n\nfunction convertToLab(source) {\n const array = [];\n for (let i = 0; i < source.length; i += 4) {\n const pixel = source.slice(i, i + 4);\n const alpha = pixel[3];\n const pixel_rgb = pixel.slice(0, 3);\n const pixel_xyz = rgb.xyz(pixel_rgb);\n const pixel_lab = xyz.lab(pixel_xyz);\n array.push(...pixel_lab, alpha);\n }\n return array;\n}\nfunction labaToRGBA(laba) {\n const pixel_lab = laba.slice(0, 3);\n const alpha = laba[3];\n const pixel_xyz = lab.xyz(pixel_lab);\n const pixel_rgb = xyz.rgb(pixel_xyz);\n pixel_rgb.push(alpha);\n return pixel_rgb;\n}\n\nfunction max_min_of_three([a, b, c]) {\n if (a > b) {\n if (b > c) {\n return [a, c];\n } else {\n if (a > c) {\n return [a, b];\n } else {\n return [c, b];\n }\n }\n } else {\n if (b > c) {\n if (c > a) {\n return [b, a];\n } else {\n return [b, c];\n }\n } else {\n return [c, a];\n }\n }\n}\n\nfunction normalizeRGBA(rgba) {\n return rgba.map((v) => v / 255);\n}\nfunction rgbaToHSLA(rgba) {\n let h, s;\n const [max, min] = max_min_of_three(rgba);\n const diff = max - min;\n const light_2x = max + min;\n if (diff == 0) {\n h = 0;\n s = 0;\n } else {\n if (max == rgba[0]) {\n const temp_h = 60 * (rgba[1] - rgba[2]) / diff;\n if (temp_h < 0) {\n h = temp_h + 360;\n } else {\n h = temp_h;\n }\n } else if (max == rgba[1]) {\n h = 60 * (rgba[2] - rgba[0]) / diff + 120;\n } else {\n h = 60 * (rgba[0] - rgba[1]) / diff + 240;\n }\n if (light_2x == 0) {\n s = 0;\n } else if (light_2x <= 1) {\n s = diff / light_2x;\n } else {\n s = diff / (2 - light_2x);\n }\n }\n return [h, s, light_2x / 2, rgba[3]];\n}\nconst getVector4Comparer = (sort = [0, 1, 2, 3]) => (a, b) => {\n let result;\n for (const s of sort) {\n result = a[s] - b[s];\n if (result != 0) {\n return result;\n }\n }\n return result;\n};\nconst hslaCSSText = ([h, s, l, a]) => `hsla(${h}deg,${s * 100}%,${l * 100}%,${a})`;\nconst rgbaCSSText = (pixel) => `rgba(${pixel.map((v) => Math.floor(v)).join(\",\")})`;\n\nexport { awaitImage, convertToLab, getVector4Comparer, hslaCSSText, kmeans, labaToRGBA, neuquant, normalizeRGBA, readImage, readImageDownsampling, readImageDownsamplingOffscreen, readImageOffscreen, rgbaCSSText, rgbaToHSLA };\n","import PromiseWorker from '@kotorik/promise-worker';\nimport { isInDarkMode } from '../darkmode';\n//@ts-ignore\nimport 'color-space/hsl';\n//@ts-ignore\nimport rgb from 'color-space/rgb';\nimport { awaitImage, readImageDownsampling } from '@kotorik/palette';\nconst originalThemeSkinMatcing = getComputedStyle(document.documentElement).getPropertyValue('--theme-skin-matching');\nconst worker = new PromiseWorker(new Worker(new URL('./worker.ts', import.meta.url)));\nlet currentColor = [0, 0, 0, 0];\nfunction hslaCSSText([h, s, l, a]) {\n if (a) {\n return \"hsla(\" + h + \"deg,\" + s + \"%,\" + l + \"%,\" + a + \")\";\n }\n else {\n return \"hsl(\" + h + \"deg,\" + s + \"%,\" + l + \"%)\";\n }\n}\nexport async function getThemeColorFromImageElement(imgElement) {\n try {\n await awaitImage(imgElement);\n const imageData = readImageDownsampling(imgElement, 10000);\n const result = await worker.postMessage(imageData.data, { transfer: [imageData.data.buffer] });\n return result;\n }\n catch (e) {\n console.error(e);\n return null;\n }\n}\nfunction _updateThemeColorMeta(color_css) {\n const meta = document.querySelector('meta[name=theme-color]');\n meta && (meta.content = color_css);\n}\nexport async function updateThemeSkin(coverBGUrl) {\n const imgElement = document.createElement('img');\n imgElement.src = coverBGUrl;\n imgElement.crossOrigin = \"anonymous\";\n const rgba = await getThemeColorFromImageElement(imgElement);\n if (rgba) {\n currentColor = rgba;\n _setColor();\n }\n else {\n _updateThemeColorMeta(originalThemeSkinMatcing); //回滚\n }\n}\nfunction _setColor(darkmode) {\n let hsla = rgb.hsl(currentColor);\n const darkmodeColor = [...hsla];\n darkmodeColor[2] *= 0.5;\n if (typeof darkmode == 'undefined' ? isInDarkMode() : darkmode) {\n hsla = darkmodeColor;\n }\n _updateThemeColorMeta(hslaCSSText(hsla));\n if (_iro.extract_theme_skin) {\n document.documentElement.style.setProperty('--theme-skin-matching', hslaCSSText(hsla));\n document.documentElement.style.setProperty('--theme-skin-dark', hslaCSSText(darkmodeColor));\n }\n /* const textColor = [0, 0, 0] as [number, number, number]\n \n if (hsla[2] > 40) {\n textColor[2] = 0.314\n } else {\n textColor[2] = 1 - 0.314\n }\n \n const style = document.documentElement.style\n const [h, s, l] = hsla\n style.setProperty('--header-color-h', h + 'deg')\n style.setProperty('--header-color-s', s + '%')\n style.setProperty('--header-color-l', l + '%')\n \n const siteHeader = document.querySelector('.site-header')\n siteHeader.style.color = hslaCSSText(textColor)\n */\n}\nexport function initThemeColor() {\n document.addEventListener('coverBG_change', (({ detail: coverBGUrl }) => updateThemeSkin(coverBGUrl)));\n document.addEventListener('darkmode', (({ detail: next }) => _setColor(next)));\n}\nexport function getForeground(rgba) {\n const hsla = rgb.hsl(rgba);\n if (hsla[2] > 40) {\n return [0, 0, 0, 1];\n }\n return [0, 100, 100, 1];\n}\nexport function getHighlight(rgba) {\n const hsla = rgb.hsl(rgba);\n hsla[2] = Math.min(100, hsla[2] * 1.1);\n return hsla;\n}\n","import { importExternal } from '../common/npmLib';\nlet typedInstance;\nexport function disableTypedJsIfExist() {\n if (typedInstance) {\n typedInstance.destroy();\n typedInstance = null;\n }\n}\nexport default async function initTypedJs() {\n const json = document.getElementById('typed-js-initial');\n if (json) {\n disableTypedJsIfExist(); // Fix mirai-mamori/Sakurairo #810\n try {\n const options = JSON.parse(json.innerHTML);\n const element = document.querySelector('.element');\n element.innerText = '';\n if (_iro.ext_shared_lib) {\n if (!window.Typed)\n await importExternal('dist/typed.umd.js', 'typed.js');\n typedInstance = new window.Typed(element, options);\n }\n else {\n const { default: Typed } = await import('typed.js');\n typedInstance = new Typed(element, options);\n }\n }\n catch (e) {\n console.error(\"请检查typed.js设置\", e);\n }\n }\n}\n","import { getBaseName } from '../common/util';\nimport { __ } from '../common/sakurairo_global';\nimport { importExternal } from '../common/npmLib';\nconst bgvideo = document.getElementById(\"bgvideo\");\nconst videoList = _iro.movies.name?.split(\",\") || []; // 视频列表\nlet unplayedIndex = new Array(videoList.length).fill(0).map((_, index) => index);\nlet aplayersToResume = [];\n//#region 背景视频\nconst _getNextRandomVideo = () => {\n if (unplayedIndex.length == 0) {\n unplayedIndex = new Array(videoList.length).fill(0).map((_, index) => index);\n }\n const nextIndex = Math.floor(Math.random() * unplayedIndex.length);\n return videoList[unplayedIndex.splice(nextIndex, 1)[0]];\n};\nfunction getVideo() {\n const video_stu = document.getElementsByClassName(\"video-stu\")[0];\n const fileName = _getNextRandomVideo(); // 随机抽取视频\n video_stu.innerHTML = __(\"正在载入视频 ...\");\n video_stu.style.bottom = \"0px\";\n //这里不需要检验_iro.movies是不是字符串,因为应该在前边检查\n bgvideo.setAttribute(\"src\", new URL(fileName, _iro.movies.url || location.origin).toString());\n bgvideo.setAttribute(\"video-name\", getBaseName(fileName));\n}\n/**\n * 播放\n */\nfunction splay() {\n const video_btn = document.getElementById(\"video-btn\");\n if (video_btn) {\n video_btn.classList.add(\"video-pause\");\n video_btn.classList.remove(\"video-play\");\n video_btn.style.display = \"\";\n }\n try {\n document.querySelector(\".video-stu\").style.bottom = \"-100px\";\n document.querySelector(\".focusinfo\").style.top = \"-999px\";\n if (_iro.float_player_on) {\n import('./aplayer').then(({ pauseAllPlayer }) => {\n aplayersToResume = pauseAllPlayer();\n bgvideo.play();\n });\n return;\n }\n }\n catch (e) {\n console.warn(e);\n }\n bgvideo.play();\n}\n/**\n * 暂停\n */\nfunction spause() {\n const video_btn = document.getElementById(\"video-btn\");\n if (video_btn) {\n video_btn.classList.add(\"video-play\");\n video_btn.classList.remove(\"video-pause\");\n }\n try {\n document.querySelector(\".focusinfo\").style.top = \"49.3%\";\n }\n catch { }\n bgvideo.pause();\n for (const player of aplayersToResume) {\n player.play();\n }\n}\n/**\n * 自动续播 - 播放\n */\nexport function liveplay() {\n if (bgvideo && bgvideo.oncanplay != undefined && document.querySelector(\".haslive\")) { // 检查视频数据\n if (document.querySelector(\".videolive\")) { // 检查播放状态\n splay();\n }\n }\n}\nexport function livepause() {\n if (bgvideo && bgvideo.oncanplay != undefined && document.querySelector(\".haslive\")) { // 检查视频数据\n spause();\n const video_stu = document.getElementsByClassName(\"video-stu\")[0];\n video_stu.style.bottom = \"0px\";\n video_stu.innerHTML = __(\"已暂停...\");\n }\n}\nexport function coverVideo() {\n const video_btn = document.getElementById(\"video-btn\");\n if (video_btn)\n video_btn.addEventListener(\"click\", function () {\n if (this.classList.contains(\"loadvideo\")) {\n this.classList.add(\"video-pause\");\n this.classList.remove(\"loadvideo\");\n getVideo();\n bgvideo.oncanplay = () => {\n splay();\n document.getElementById(\"video-add\").style.display = \"block\";\n video_btn.classList.add(\"videolive\", \"haslive\"); // MDZZ\n };\n }\n else {\n if (this.classList.contains(\"video-pause\")) {\n spause();\n video_btn.classList.remove(\"videolive\");\n document.getElementsByClassName(\"video-stu\")[0].style.bottom = \"0px\";\n document.getElementsByClassName(\"video-stu\")[0].innerHTML = __(\"已暂停...\");\n }\n else {\n splay();\n video_btn.classList.add(\"videolive\"); // 用于判断切换页面时的状态\n }\n }\n bgvideo.onended = function () {\n bgvideo.setAttribute(\"src\", \"\");\n document.getElementById(\"video-add\").style.display = \"none\";\n document.querySelector(\".focusinfo\").style.top = \"49.3%\";\n if (video_btn) {\n video_btn.classList.add(\"loadvideo\");\n video_btn.classList.remove(\"video-pause\", \"videolive\", \"haslive\");\n if (_iro.movies.loop) {\n video_btn.click();\n }\n }\n };\n });\n const video_add = document.getElementById(\"video-add\");\n if (video_add)\n video_add.addEventListener(\"click\", getVideo);\n}\n//#endregion\nexport async function coverVideoIni() {\n initHLS();\n lazyloadPatch();\n}\nfunction canPlayHandler() {\n this.poster = '';\n}\n/**\n * 用户代理可能会禁止自动播放,此时需要撤掉poster\n */\nasync function lazyloadPatch() {\n document.querySelectorAll('video.lazyload')\n .forEach(video => video.addEventListener('canplay', canPlayHandler));\n}\nasync function initHLS() {\n const videos = document.querySelectorAll('video.hls');\n if (videos.length == 0)\n return;\n //检查浏览器是否原生支持\n if (videos[0].canPlayType('application/vnd.apple.mpegurl')) {\n for (const video of videos) {\n video.src = video.dataset.src || video.src;\n video.autoplay = true;\n }\n }\n else {\n if (!window.Hls) {\n try {\n if (_iro.ext_shared_lib) {\n await importExternal('dist/hls.light.min.js', 'hls.js');\n }\n else {\n //@ts-ignore\n const { default: Hls } = await import('hls.js/dist/hls.light.js');\n window.Hls = Hls;\n }\n }\n catch (reason) {\n console.warn('Hls load failed: ', reason);\n }\n }\n if (!Hls.isSupported())\n console.error('Hls: Media Source Extensions is unsupported.');\n for (const video of videos) {\n const hls = new Hls();\n hls.loadSource(video.dataset.src || video.src);\n hls.attachMedia(video);\n hls.on(Hls.Events.MANIFEST_PARSED, () => {\n video.play();\n });\n }\n }\n}\n","import { sakurairoGlobal } from \"../common/sakurairo_global\";\nexport function web_audio() {\n if (!_iro.audio)\n return;\n //@ts-ignore\n const AudioContext = window.AudioContext || window.webkitAudioContext;\n if (AudioContext) {\n let i = 0;\n const o = 1;\n const t = getSheet();\n const selects = document.querySelectorAll(\".site-title, #moblieGoTop, .site-branding, .searchbox, .changeSkin-gear, .menu-list li\");\n const notes = \"♪♩♫♬♭€§¶♯\";\n const gainValueMax = sakurairoGlobal.opt.web_audio?.main_gain || 1;\n const ctx = new AudioContext;\n const l = ctx.createGain();\n const c = ctx.createOscillator();\n l.connect(ctx.destination);\n c.connect(l);\n c.type = \"sine\";\n c.start(ctx.currentTime);\n let _t;\n function suspendContextWhenIdle() {\n clearTimeout(_t);\n _t = setTimeout(() => {\n ctx.suspend();\n _t = undefined;\n }, 1000);\n }\n let lastTarget = null;\n const listener = (e) => {\n if (e.currentTarget === lastTarget)\n return;\n ctx.resume();\n lastTarget = e.currentTarget;\n const d = Math.round(notes.length * Math.random());\n const h = e.pageX;\n const p = e.pageY - 5;\n const dom = document.createElement(\"b\");\n dom.textContent = notes[d];\n dom.style.zIndex = \"99999\";\n dom.style.top = p - 100 + \"px\";\n dom.style.left = h + \"px\";\n dom.style.position = \"absolute\";\n dom.style.color = \"#FF6EB4\";\n dom.style.pointerEvents = \"none\";\n document.body.appendChild(dom);\n dom.animate([\n { top: p + \"px\" },\n { opacity: 0 }\n ], {\n duration: 500\n });\n const r = t[i] || t[i = 0];\n i += o;\n l.gain.cancelScheduledValues(ctx.currentTime);\n c.frequency.setValueAtTime(r, ctx.currentTime);\n l.gain.exponentialRampToValueAtTime(gainValueMax, ctx.currentTime + .01);\n l.gain.exponentialRampToValueAtTime(.001, ctx.currentTime + 2);\n l.gain.setValueAtTime(0, ctx.currentTime + 2.1);\n setTimeout(() => {\n dom.remove();\n if (lastTarget === e.currentTarget)\n lastTarget = null;\n suspendContextWhenIdle();\n }, 500);\n };\n selects.forEach(s => s.addEventListener('pointerenter', listener));\n }\n}\nfunction getSheet() {\n const sheet = sakurairoGlobal.opt.web_audio?.sheet;\n if (typeof sheet == 'string') {\n return sheet.split(' ');\n }\n else if (sheet instanceof Array) {\n return sheet;\n }\n else {\n //欢乐颂\n /*t = \"329.628 329.628 349.228 391.995 391.995 349.228 329.628 293.665 261.626 261.626 293.665 329.628 329.628 293.665 293.665 329.628 329.628 349.228 391.995 391.995 349.228 329.628 293.665 261.626 261.626 293.665 329.628 293.665 261.626 261.626 293.665 293.665 329.628 261.626 293.665 329.628 349.228 329.628 261.626 293.665 329.628 349.228 329.628 293.665 261.626 293.665 195.998 329.628 329.628 349.228 391.995 391.995 349.228 329.628 293.665 261.626 261.626 293.665 329.628 293.665 261.626 261.626\".split(\" \")*/\n //天空之城\n return \"880 987 1046 987 1046 1318 987 659 659 880 784 880 1046 784 659 659 698 659 698 1046 659 1046 1046 1046 987 698 698 987 987 880 987 1046 987 1046 1318 987 659 659 880 784 880 1046 784 659 698 1046 987 1046 1174 1174 1174 1046 1046 880 987 784 880 1046 1174 1318 1174 1318 1567 1046 987 1046 1318 1318 1174 784 784 880 1046 987 1174 1046 784 784 1396 1318 1174 659 1318 1046 1318 1760 1567 1567 1318 1174 1046 1046 1174 1046 1174 1567 1318 1318 1760 1567 1318 1174 1046 1046 1174 1046 1174 987 880 880 987 880\".split(\" \");\n }\n}\n","export function clearButterbar() {\n const butterBar = document.getElementsByClassName(\"butterBar\");\n if (butterBar.length > 0) {\n for (let i = 0; i < butterBar.length; i++) {\n butterBar[i].remove();\n }\n }\n}\nexport function createButterbar(message, keep) {\n clearButterbar();\n /* document.body.insertAdjacentHTML('beforeend', ' -');\n */\n const div = document.createElement('div');\n const p = document.createElement('p');\n div.classList.add('butterBar', 'butterBar--center');\n p.classList.add('butterBar-message');\n p.innerHTML = message;\n div.appendChild(p);\n document.body.appendChild(div);\n if (keep !== true)\n setTimeout(() => { clearButterbar(); }, typeof keep == 'number' ? keep : 6000);\n return div;\n}\n","/**\n * default option\n */\nconst defaults = {\n src: \"data-src\",\n srcset: \"data-srcset\",\n selector: \".lazyload\",\n root: null,\n rootMargin: \"0px\",\n threshold: 0\n};\n/**\n * @class LazyLoad\n */\nexport default class LazyLoad {\n constructor(elms, options) {\n this.opts = { ...defaults, ...options };\n this.elms = elms || document.querySelectorAll(this.opts.selector);\n this.init();\n }\n elms;\n obs = null;\n opts;\n init() {\n /* Without observers load everything and bail out early. */\n if (!IntersectionObserver) {\n this.load();\n return;\n }\n this.obs = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n this.obs.unobserve(entry.target);\n this.doLoad(entry.target);\n }\n }\n }, {\n root: this.opts.root,\n rootMargin: this.opts.rootMargin,\n threshold: [this.opts.threshold]\n });\n this.elms.forEach((image) => {\n this.obs.observe(image);\n });\n }\n load() {\n if (!this.opts) {\n return;\n }\n this.elms.forEach(this.doLoad);\n }\n doLoad = (element) => {\n const src = element.getAttribute(this.opts.src);\n const srcset = element.getAttribute(this.opts.srcset);\n const tagName = element.tagName.toLowerCase();\n if (src) {\n if (element.src === src || element.style.backgroundImage.includes(src)) {\n return;\n }\n if (tagName === 'video' || tagName === 'img') {\n element.src = src;\n }\n else {\n element.style.backgroundImage = \"url('\" + src + \"')\";\n }\n }\n if (tagName === 'img' && srcset) {\n element.srcset = srcset;\n }\n };\n /**\n * Destroy Lazyload Instance\n * @returns\n */\n destroy() {\n if (!this.opts) {\n return;\n }\n this.obs.disconnect();\n this.opts = null;\n }\n}\nexport const lazyload = (images, options) => new LazyLoad(images, options);\n","import Lazyload from 'lazyload';\nlet instance;\nexport default function lazyload() {\n if (instance) {\n instance.destroy();\n }\n instance = new Lazyload();\n}\n","/**\n * 收集资源的下载情况,自动切换cdn\n * 策略:\n * 1.如果发现大量资源无法下载(cdn down),尝试切换cdn\n * 2.切换cdn时测试对同一个资源访问的表现(未实现)\n * 3.\n * 暂不根据加载速度动态调整cdn\n * TODO: 使用内置依赖的fallback\n */\nconst STORAGE_KEY = 'sakurairo_prefer_cdn';\nconst CDN_LIST = [\n /* [\"https://jscdn.host/release/ucode/\", \"/\", \"/\", \"\"],\n [\"https://cdnjs.cloudflare.com/ajax/libs/\", \"/\", \"/\", \"\"],\n */\n [\"https://jsd.nmxc.ltd/npm/\", \"@\", \"/\", \"\"],\n [\"https://cdn.jsdelivr.net/npm/\", \"@\", \"/\", \"\"],\n [\"https://unpkg.com/\", \"@\", \"/\", \"\"],\n //TODO:自定cdn\n];\nfunction getPreferCDNIndex() {\n const config = localStorage.getItem(STORAGE_KEY);\n if (config) {\n const num = parseInt(config);\n if (isNaN(num) || num >= CDN_LIST.length) {\n //回归初始值\n localStorage.removeItem(STORAGE_KEY);\n return 0;\n }\n return num;\n }\n else {\n return 0;\n }\n}\nconst currentCDNIndex = getPreferCDNIndex();\nconst currentCDN = { raw: CDN_LIST[currentCDNIndex] };\n/**\n * 从当前的CDN中获取指定npm包中的指定文件\n * @author KotoriK\n * @param relativePath 文件在npm包中的路径\n * @param packageName npm包名\n * @param version npm包版本,默认从package.json中获取依赖版本(注意package_info.js中有限定哪些包的信息会被带到运行时),若无相关信息则为latest\n * @returns 从当前cdn访问该文件的url\n */\nexport const resolvePath = (relativePath, packageName, version) => String.raw(currentCDN, packageName, version || PKG_INFO[packageName] || 'latest', relativePath);\nconst resolvePathByCDN = (cdn, relativePath, moduleName, version) => String.raw({ raw: cdn }, moduleName, version, relativePath);\nfunction isServedByCurrentCDN(path) {\n const cdnMatchKey = CDN_LIST[currentCDNIndex][0];\n if (path.match(cdnMatchKey)) {\n return true;\n }\n}\nfunction analyze(time = 30000) {\n let failedCounts = 0;\n let totalCounts = 0;\n const observer = new PerformanceObserver((list, observer) => {\n for (const entry of list.getEntries()) {\n if (isServedByCurrentCDN(entry.name)) {\n totalCounts++;\n const { transferSize } = entry;\n if (transferSize == 0) {\n //可能是资源未能成功下载\n failedCounts++;\n }\n }\n }\n });\n observer.observe({ entryTypes: ['resource'] });\n setTimeout(() => {\n observer.disconnect();\n if (failedCounts / totalCounts > 0.7) {\n //切换cdn\n const nextCDN = currentCDNIndex + 1;\n localStorage.setItem(STORAGE_KEY, (nextCDN >= CDN_LIST.length ? 0 : nextCDN).toString());\n }\n }, time);\n}\n/* ready(analyze)\n */\n//TODO\n//测试cdn对实例资源的访问表现\nasync function testCDN() {\n await Promise.allSettled(CDN_LIST.map((cdn) => \n //baguettebox.js@1.11.1/dist/baguetteBox.min.css\n fetch(resolvePathByCDN(cdn, 'dist/baguetteBox.min.css', 'baguettebox.js', '1.11.1'))));\n}\nexport const importExternal = (path, packageName, version) => {\n const id = `${packageName}${version ? '@' + version : ''}${path}`;\n if (document.getElementById(id)) { // 避免重复加载\n return Promise.resolve();\n }\n const script = document.createElement('script');\n script.id = id;\n script.src = resolvePath(path, packageName, version);\n script.async = true;\n //TODO: 超时处理\n return new Promise((resolve, reject) => {\n script.onload = () => resolve();\n script.onerror = () => {\n script.remove(); // 允许下次尝试\n reject(new Error(packageName + \"加载失败\"));\n };\n document.body.append(script);\n }).finally(() => {\n script.onload = script.onerror = null; //据说ie上会内存泄露\n });\n};\n","/**\n *\n * @param key 这段句子的中文表述(默认语言)\n */\n//@ts-ignore\nexport const __ = (defaultStr) => (window._sakurairoi18n && _sakurairoi18n[defaultStr]) || defaultStr;\n/**\n *\n * 占位符格式 {index} ex.{0}\n * @param defaultStr 这段句子的中文表述(默认语言)\n * @param replacements 句子中占位符的替代元素\n */\nexport const _$ = (defaultStr, ...replacements) => {\n let template = __(defaultStr);\n for (const index in replacements) {\n template = template.replace('{' + index + '}', replacements[index]);\n }\n return template;\n};\nexport const sakurairoGlobal = {\n opt: {},\n /* _sys_call:sys_call\n */\n build: BUILD_INFO\n};\n/**\n * 在sakurairoGlobal注册一个对象\n * @param key\n * @param value\n * @returns\n */\nexport const registerOnGlobal = (key, value) => Object.defineProperty(sakurairoGlobal, key, {\n value: value,\n writable: false,\n enumerable: true,\n});\nif ('_sakurairo' in window) {\n //@ts-ignore\n const _sakurairo = window._sakurairo;\n //@ts-ignore\n if ('opt' in _sakurairo) {\n sakurairoGlobal.opt = _sakurairo.opt;\n }\n}\n//@ts-ignore\nwindow._sakurairo = sakurairoGlobal;\n","let readyFunctionList = [];\n/**\n * 传入的函数同时间只能运行一个\n * @param func 要包装的函数\n * @returns 包装后的函数\n */\nexport const onlyOnceATime = (func) => {\n let isRunning = false;\n return (...args) => {\n if (!isRunning) {\n isRunning = true;\n try {\n const result = func(...args);\n if (result instanceof Promise) {\n result.finally(() => isRunning = false);\n }\n else {\n isRunning = false;\n }\n return result;\n }\n catch (e) {\n console.warn(e);\n isRunning = false;\n }\n }\n };\n};\nconst whileReady = () => {\n document.removeEventListener('DOMContentLoaded', whileReady);\n for (const fn of readyFunctionList) {\n fn();\n }\n readyFunctionList = [];\n};\n/**\n * 延迟函数到DOM树加载完成后执行\n * @seealso https://developer.mozilla.org/zh-CN/docs/Web/API/Document/readyState\n * @param fn 要延迟执行的函数\n */\nexport const ready = function (fn) {\n //interactive:等价于事件DOMContentLoaded\n //complete:等价于事件load\n if (document.readyState !== 'loading') {\n return fn();\n }\n if (readyFunctionList.length == 0) {\n document.addEventListener('DOMContentLoaded', whileReady, false);\n }\n readyFunctionList.push(fn);\n};\n/**\n * 获取文件名的主名部分(即去除扩展名)\n * @param fileName 文件名\n * @returns 主名\n */\nexport const getBaseName = (fileName) => fileName.replace(/\\.\\w+$/, '');\n// TODO: 使用现代CSS替代实现\nexport function slideToggle(el, duration = 1000, mode = '') {\n const dom = el;\n dom.status = dom.status || getComputedStyle(dom, null)['display'];\n const flag = dom.status != 'none';\n if ((flag == true && mode == \"show\") || (flag == false && mode == \"hide\"))\n return;\n dom.status = flag ? 'none' : 'block';\n dom.style.transition = 'height ' + duration / 1000 + 's';\n dom.style.overflow = 'hidden';\n clearTimeout(dom.tagTimer);\n dom.tagTimer = dom.tagTimer || null;\n dom.style.display = 'block';\n dom.tagHeight = dom.tagHeight || dom.clientHeight + 'px';\n dom.style.display = '';\n dom.style.height = flag ? dom.tagHeight : \"0px\";\n setTimeout(() => {\n dom.style.height = flag ? \"0px\" : dom.tagHeight;\n }, 0);\n dom.tagTimer = setTimeout(() => {\n dom.style.display = flag ? 'none' : 'block';\n dom.style.transition = '';\n dom.style.overflow = '';\n dom.style.height = '';\n dom.status = dom.tagHeight = null;\n }, duration);\n}\nexport function buildAPI(apiPath, params = {}, nonce = true) {\n const path = new URL(apiPath);\n const { searchParams } = path;\n for (const [key, value] of Object.entries(params)) {\n searchParams.set(key, value);\n }\n if (nonce)\n searchParams.set(\"_wpnonce\", _iro.nonce);\n return path.toString();\n}\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport function noop() { }\n","const mainContainer = document.getElementById(\"main-container\");\nfunction toggle() {\n document.body.classList.toggle(\"navOpen\");\n mainContainer.classList.toggle(\"open\");\n document.getElementById(\"mo-nav\").classList.toggle(\"open\");\n document.querySelector(\".openNav\").classList.toggle(\"open\");\n document.querySelector(\".site-header\").classList.toggle(\"open\");\n}\nexport function open() {\n toggle();\n document.documentElement.style.overflow = \"hidden\";\n mainContainer.addEventListener('click', close);\n}\nexport function close() {\n toggle();\n document.documentElement.style.overflow = \"unset\";\n mainContainer.removeEventListener('click', close);\n}\n","import { buildAPI } from '../common/util';\nimport { __ } from '../common/sakurairo_global';\nlet QueryStorage;\nfunction renderSearchResult(keyword, link, fa, title, iconfont, comments, text) {\n if (keyword) {\n const s = keyword.trim().split(\" \"), a = title.indexOf(s[s.length - 1]), b = text.indexOf(s[s.length - 1]);\n title = a < 60 ? title.slice(0, 80) : title.slice(a - 30, a + 30);\n title = title.replace(s[s.length - 1], ' ' + s[s.length - 1].toUpperCase() + ' ');\n text = b < 60 ? text.slice(0, 80) : text.slice(b - 30, b + 30);\n text = text.replace(s[s.length - 1], ' ' + s[s.length - 1].toUpperCase() + ' ');\n }\n return ``;\n}\nfunction Cx(array, query) {\n for (let s = 0; s < query.length; s++) {\n if (['.', '?', '*'].indexOf(query[s]) != -1) {\n query = query.slice(0, s) + \"\\\\\" + query.slice(s);\n s++;\n }\n }\n query = query.replace(query, \"^(?=.*?\" + query + \").+$\").replace(/\\s/g, \")(?=.*?\");\n return array.filter(v => Object.values(v)\n .some(v => new RegExp(query + '').test(v)));\n}\nfunction query(B, keyword) {\n let y = \"\", w = \"\", u = \"\", r = \"\", p = \"\", F = \"\";\n const G = '${title}${comments} ${text}
\", E = \"\", queries = Cx(B, keyword.trim());\n for (const query of queries) {\n switch (query.type) {\n case \"post\":\n w = w + renderSearchResult(keyword, query.link, \"fa-inbox\", query.title, \"fa-comments\", query.comments, query.text);\n break;\n case \"tag\":\n p = p + renderSearchResult(\"\", query.link, \"fa-tag\", query.title, \"none\", \"\", \"\");\n break;\n case \"category\":\n r = r + renderSearchResult(\"\", query.link, \"fa-folder\", query.title, \"none\", \"\", \"\");\n break;\n case \"page\":\n u = u + renderSearchResult(keyword, query.link, \"fa-file\", query.title, \"fa-comments\", query.comments, query.text);\n break;\n case \"comment\":\n F = F + renderSearchResult(keyword, query.link, \"fa-comment\", query.title, \"none\", \"\", query.text);\n break;\n }\n }\n w && (y = y + G + __(\"文章\") + E + w + D);\n u && (y = y + G + __(\"页面\") + E + u + D);\n r && (y = y + G + __(\"分类\") + E + r + D);\n p && (y = y + G + __(\"标签\") + E + p + D);\n F && (y = y + G + __(\"评论\") + E + F + D);\n document.getElementById(\"PostlistBox\").innerHTML = y;\n}\nfunction search_a(val) {\n const otxt = document.getElementById(\"search-input\");\n if (sessionStorage.getItem('search') != null) {\n QueryStorage = JSON.parse(sessionStorage.getItem('search'));\n query(QueryStorage, otxt.value);\n div_href();\n }\n else {\n fetch(val)\n .then(async (resp) => {\n if (resp.ok) {\n const json = await resp.text();\n if (json != \"\") {\n sessionStorage.setItem('search', json);\n QueryStorage = JSON.parse(json);\n query(QueryStorage, otxt.value);\n div_href();\n }\n }\n else {\n console.warn('HTTP ' + resp.status);\n }\n })\n .catch(reason => console.warn(reason));\n }\n}\n/* if (!Object.values) Object.values = function (obj) {\n if (obj !== Object(obj))\n throw new TypeError('Object.values called on a non-object');\n var val = [],\n key;\n for (key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n val.push(obj[key]);\n }\n }\n return val;\n } */\nfunction div_href() {\n const search_close = document.querySelector(\".search_close\");\n const Ty = document.getElementById('Ty');\n for (const ele of document.getElementsByClassName('ins-selectable')) {\n ele.addEventListener(\"click\", () => {\n Ty.href = ele.getAttribute('href');\n Ty.click();\n search_close.click();\n });\n }\n /* $(\".ins-selectable\").each(function () {\n $(this).click(function () {\n $(\"#Ty\").attr('href', $(this).attr('href'));\n $(\"#Ty\").click();\n $(\".search_close\").click();\n });\n }); */\n}\nexport function jsSearchCallback() {\n //$('.js-toggle-search').toggleClass('is-active');\n document.getElementsByClassName('js-toggle-search')[0].classList.toggle('is-active');\n //$('.js-search').toggleClass('is-visible');\n document.getElementsByClassName('js-search')[0].classList.toggle('is-visible');\n //$('html').css('overflow-y', 'hidden');\n document.documentElement.style.overflowY = 'hidden';\n if (_iro.live_search) {\n QueryStorage = [];\n search_a(buildAPI(_iro.api + \"sakura/v1/cache_search/json\"));\n let otxt = document.getElementById(\"search-input\"), \n //list = document.getElementById(\"PostlistBox\"),\n //Record = list.innerHTML,\n searchFlag = null;\n otxt.oninput = function () {\n if (searchFlag != null) {\n clearTimeout(searchFlag);\n }\n searchFlag = setTimeout(function () {\n query(QueryStorage, otxt.value);\n div_href();\n }, 250);\n };\n }\n}\n","import lazyload from \"../common/lazyload\"\nimport { slideToggle } from \"../common/util\";\nimport { changeCoverBG, getCoverPath, getCurrentBG, nextBG, preBG } from \"./coverBackground\";\nimport { isMobile } from \"./mobile\";\nimport { open, close } from './mobile_nav'\n\nvar _mashiro_global_skin_secter = true\n\nexport function checkSkinSecter() {\n if (_mashiro_global_skin_secter === false) {\n const pattern = document.querySelector(\".pattern-center\"),\n headertop = document.querySelector(\".headertop-bar\");\n if (pattern) {\n pattern.classList.remove(\"pattern-center\");\n pattern.classList.add(\"pattern-center-sakura\");\n }\n if (headertop) {\n headertop.classList.remove(\"headertop-bar\");\n headertop.classList.add(\"headertop-bar-sakura\");\n }\n } else {\n const pattern = document.querySelector(\".pattern-center-sakura\"),\n headertop = document.querySelector(\".headertop-bar-sakura\");\n if (pattern) {\n pattern.classList.remove(\"pattern-center-sakura\");\n pattern.classList.add(\"pattern-center\");\n }\n if (headertop) {\n headertop.classList.remove(\"headertop-bar-sakura\");\n headertop.classList.add(\"headertop-bar\");\n }\n }\n}\n/**\n * 设置前台背景\n * @param {string} tagId 前台背景ID\n * @returns \n */\nexport async function changeSkin(tagId) {\n //@sideeffect\n _mashiro_global_skin_secter = tagId == \"white-bg\" || tagId == \"dark-bg\";\n checkSkinSecter();\n let bg_url;\n switch (tagId) {\n case \"white-bg\":\n if (_iro.site_bg_as_cover) {\n changeCoverBG(await getCoverPath())//为触发封面背景相关事件 调用函数而不是走下方流程\n return\n } else {\n bg_url = _iro.skin_bg0;\n }\n break;\n case \"diy1-bg\":\n bg_url = _iro.skin_bg1;\n break;\n case \"diy2-bg\":\n bg_url = _iro.skin_bg2;\n break;\n case \"diy3-bg\":\n bg_url = _iro.skin_bg3;\n break;\n case \"diy4-bg\":\n bg_url = _iro.skin_bg4;\n break;\n }\n document.body.style.backgroundImage = bg_url ? `url(${bg_url})` : '';\n}\n\nexport function bgButtonAddListener() {\n const next = document.getElementById(\"bg-next\"),\n pre = document.getElementById(\"bg-pre\");\n if (next) { next.onclick = nextBG }\n if (pre) { pre.onclick = preBG }\n}\n\nexport function timeSeriesReload(flag) {\n const archives = document.getElementById('archives');\n if (!archives) return;\n const al_li = archives.getElementsByClassName('al_mon');\n\n if (flag) {\n archives.addEventListener(\"click\", (e) => {\n if (e.target.classList.contains(\"al_mon\")) {\n e.preventDefault();\n slideToggle(e.target.nextElementSibling, 500);\n }\n })\n lazyload();\n } else {\n let al_expand_collapse = document.getElementById('al_expand_collapse');\n al_expand_collapse.style.cursor = \"s-resize\";\n for (let i = 0; i < al_li.length; i++) {\n let a = al_li[i],\n num = a.nextElementSibling.getElementsByTagName('li').length;\n a.style.cursor = \"s-resize\";\n a.querySelector('#post-num').textContent = num;\n }\n const al_post_list = archives.getElementsByClassName(\"al_post_list\")\n const al_post_list_first = al_post_list[0];\n for (const child of al_post_list) {\n slideToggle(child, 500, 'hide')\n }\n slideToggle(al_post_list_first, 500, 'show');\n\n archives.addEventListener(\"click\", (e) => {\n if (e.target.classList.contains(\"al_mon\")) {\n slideToggle(e.target.nextElementSibling, 500);\n e.preventDefault();\n }\n })\n if (!isMobile()) {\n for (let i = 0; i < al_post_list.length; i++) {\n let el = al_post_list[i];\n el.parentNode.addEventListener('mouseover', () => {\n slideToggle(el, 500, 'show');\n return false;\n })\n }\n if (false) {\n for (let i = 0; i < al_post_list.length; i++) {\n let el = al_post_list[i];\n el.parentNode.addEventListener('mouseover', function () {\n slideToggle(el, 500, 'hide');\n return false;\n })\n }\n }\n }\n let expanded = false;\n al_expand_collapse.addEventListener('click', () => {\n for (const el of al_post_list) {\n slideToggle(el, 500, expanded ? 'hide' : 'show');\n }\n expanded = !expanded;\n });\n }\n}\n//#region Siren\nimport { liveplay, livepause, } from './video'\nexport function MN() {\n const iconflat = document.querySelector(\".iconflat\");\n iconflat && iconflat.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n if (document.body.classList.contains(\"navOpen\")) {\n close()\n } else {\n open()\n }\n });\n}\n\nexport function MNH() {\n if (document.body.classList.contains(\"navOpen\")) {\n close()\n }\n}\n/**\n * @has-dom-modify\n */\nexport function auto_height() {\n if (_iro.windowheight == 'auto') {\n if (document.querySelector(\"h1.main-title\")) {\n //let _height = document.documentElement.clientHeight + \"px\";\n const centerbg = document.getElementById(\"centerbg\")\n const bgvideo = document.getElementById(\"bgvideo\")\n if (centerbg) centerbg.style.height = \"100vh\";\n if (bgvideo) bgvideo.style.minHeight = \"100vh\";\n }\n } else {\n const headertop = document.querySelector(\".headertop\")\n headertop && headertop.classList.add(\"headertop-bar\");\n }\n}\n/**\n * @has-dom-modify\n */\nexport function PE() {\n const headertop = document.querySelector(\".headertop\")\n if (headertop) {\n let blank = document.querySelector(\".blank\");\n if (document.querySelector(\".main-title\")) {\n try {\n blank.style.paddingTop = \"0px\";\n } catch (e) { }\n headertop.style.height = \"auto\";\n headertop.style.display = \"\";\n if (_iro.movies.live) liveplay();\n } else {\n try {\n blank.style.paddingTop = \"75px\";\n } catch (e) { }\n headertop.style.height = \"0px\";\n headertop.style.display = \"none\";\n livepause();\n }\n }\n}\nimport { jsSearchCallback } from './search'\nimport { turnOnDarkMode, turnOffDarkMode } from './darkmode';\n/**\n * @has-dom-modify\n */\nexport function CE() {\n let comments_fold = document.querySelector(\".comments-fold\");\n let comments_main = document.querySelector(\".comments-main\");\n if (comments_fold != null) {\n comments_fold.style.display = \"block\";\n comments_main.style.display = \"none\";\n comments_fold.addEventListener(\"click\", () => {\n slideToggle(comments_main, 500, 'show');\n comments_fold.style.display = \"none\";\n });\n }\n let archives = document.getElementsByClassName(\"archives\");\n if (archives.length > 0) {\n for (let i = 1; i < archives.length; i++) {\n archives[i].style.display = \"none\";\n }\n archives[0].style.display = \"\";\n let h3 = document.getElementById(\"archives-temp\").getElementsByTagName(\"h3\");\n const handler = (e) => {\n e.preventDefault();\n e.stopPropagation();\n slideToggle(e.target.nextElementSibling, 300);\n }\n for (let i = 0; i < h3.length; i++) {\n h3[i].addEventListener(\"click\", handler)\n }\n }\n // $('.comments-hidden').show();\n // $('.comments-main').hide();\n // $('.comments-hidden').click(function () {\n // $('.comments-main').slideDown(500);\n // $('.comments-hidden').hide();\n // });\n // $('.archives').hide();\n // $('.archives:first').show();\n // $('#archives-temp h3').click(function () {\n // $(this).next().slideToggle('fast');\n // return false;\n // });\n /*if (_iro.baguetteBoxON) {\n baguetteBox.run('.entry-content', {\n captions: function (element) {\n return element.getElementsByTagName('img')[0].alt;\n },\n ignoreClass: 'fancybox',\n });\n }*/\n\n for (const ele of document.getElementsByClassName('js-toggle-search')) {\n ele.addEventListener('click', jsSearchCallback);\n }\n\n const sc = document.querySelector(\".search_close\");\n sc && sc.addEventListener(\"click\", () => {\n let js_search = document.getElementsByClassName(\"js-search\")[0];\n if (js_search.classList.contains(\"is-visible\")) {\n document.getElementsByClassName(\"js-toggle-search\")[0].classList.toggle(\"is-active\");\n js_search.classList.toggle(\"is-visible\");\n document.documentElement.style.overflowY = \"unset\";\n }\n });\n try {\n const loading = document.getElementById(\"loading\");\n loading.addEventListener(\"click\", () => {\n loading.classList.add(\"hide\");\n loading.classList.remove(\"show\");\n });\n } catch (e) { }\n}\nexport function collapseMenu() {\n const show_Nav = document.getElementById(\"show-nav\");\n show_Nav && show_Nav.addEventListener(\"click\", () => {\n const sln = document.querySelector(\".site-top .lower nav\");\n if (show_Nav.classList.contains(\"showNav\")) {\n show_Nav.classList.remove(\"showNav\");\n show_Nav.classList.add(\"hideNav\");\n sln && sln.classList.add(\"navbar\");\n } else {\n show_Nav.classList.remove(\"hideNav\");\n show_Nav.classList.add(\"showNav\");\n sln && sln.classList.remove(\"navbar\");\n }\n });\n}\n//#endregion Siren\nexport function addSkinMenuListener() {\n const cached = document.querySelectorAll(\".menu-list li\");\n const handler = (e) => {\n const tagid = e.target.id || e.target.parentElement.id;\n if (tagid == \"dark-bg\") {\n turnOnDarkMode(true)\n } else {\n turnOffDarkMode(true)\n changeSkin(tagid)\n localStorage.setItem(\"bgImgSetting\", tagid)\n }\n closeSkinMenu();\n }\n for (const e of cached) {\n e.addEventListener(\"click\", handler);\n }\n}\n/**\n * 根据设置初始化前台背景。启用前台背景与站点封面背景一体化以后封面背景在此设置\n * @returns 一个Promise。Promise resolved 时封面背景应当已经加载完毕\n */\nexport function checkBgImgSetting() {\n return changeSkin(localStorage.getItem(\"bgImgSetting\") || 'white-bg');\n}\nexport async function checkCoverBackground() {\n if (_iro.site_bg_as_cover) {\n return //交给checkBgImgSetting处理\n }\n if (!_iro.land_at_home) return//进入非主页 \n if (getCurrentBG()) {//进入主页且已经加载了封面背景\n return\n }\n changeCoverBG(await getCoverPath())\n}\nexport function closeSkinMenu() {\n document.querySelector(\".skin-menu\").classList.remove(\"show\");\n setTimeout(() => {\n const changeSkin = document.querySelector(\".changeSkin-gear\")\n if (changeSkin != null) {\n changeSkin.style.visibility = \"visible\";\n }\n }, 300);\n}","function imgError(ele, type) {\n switch (type) {\n case 1:\n ele.src = 'https://s.nmxc.ltd/sakurairo_vision/@2.6/basic/friendlink.jpg';\n break;\n case 2:\n ele.src = 'https://weavatar.com/avatar/?s=80&d=mm&r=g';\n break;\n default:\n ele.src = 'https://s.nmxc.ltd/sakurairo_vision/@2.6/basic/image-404.png';\n }\n}\nfunction cmt_showPopup(ele) {\n let popup = ele.querySelector(\"#thePopup\");\n popup.classList.add(\"show\");\n ele.querySelector(\"input\").onblur = () => {\n popup.classList.remove(\"show\");\n }\n}\n/*视频feature*/\nfunction coverVideo() {\n let video = document.getElementById(\"coverVideo\"),\n btn_playControl = document.getElementById(\"cv-pc\");\n\n if (video.paused) {\n video.play();\n try {\n btn_playControl.innerHTML = '';\n } catch { }\n //console.info('play:coverVideo()');\n } else {\n video.pause();\n try {\n btn_playControl.innerHTML = '';\n } catch { }\n //console.info('pause:coverVideo()');\n }\n}\nfunction coverVideoMute() {\n const video = document.getElementById(\"coverVideo\")\n const btn_volumeControl = document.getElementById(\"cv-vc\");\n if (video.muted) {\n video.muted = false\n btn_volumeControl.innerHTML = ''\n } else {\n video.muted = true\n btn_volumeControl.innerHTML = ''\n }\n}\nfunction killCoverVideo() {\n var video = document.getElementById(\"coverVideo\");\n var btn_playControl = document.getElementById(\"cv-pc\");\n\n if (video.paused) {\n //console.info('none:killCoverVideo()');\n } else {\n video.pause();\n try {\n btn_playControl.innerHTML = '';\n } catch (e) { }\n //console.info('pause:killCoverVideo()');\n }\n}\n\nfunction mail_me() {\n window.open(\"mailto:\" + _iro.email_name + \"@\" + _iro.email_domain);\n}\n/* 首页下拉箭头 */\nfunction headertop_down() {\n let coverOffset = document.getElementById(\"content\").getBoundingClientRect().top + window.pageYOffset;\n window.scrollTo({\n top: coverOffset,\n behavior: \"smooth\"\n });\n}\nwindow.imgError = imgError\nwindow.cmt_showPopup = cmt_showPopup\nwindow.coverVideo = coverVideo\nwindow.coverVideoMute = coverVideoMute\nwindow.killCoverVideo = killCoverVideo\nwindow.mail_me = mail_me\nwindow.headertop_down = headertop_down","async function initParticle() {\r\n const cfg = document.getElementById('particles-js-cfg')\r\n if (cfg) {\r\n try {\r\n //particles.js的npm包内没有预置minify版本,与unpkg不兼容\r\n //@ts-ignore\r\n await import('particles.js')\r\n //@ts-ignore\r\n particlesJS('particles-js', JSON.parse(cfg.innerHTML))\r\n } catch (error) {\r\n console.error(error)\r\n }\r\n }\r\n}\r\nexport default function initEffect() {\r\n const { effect } = _iro\r\n if (effect) {\r\n if (effect.type == 'yuki') {\r\n import('./falling_effect/yuki/start')\r\n } else import('./falling_effect/sakura/start')\r\n }\r\n initParticle()\r\n}","/**\n * app.js - Client script bundle for Sakurairo, a WordPress theme.\n * @author bymoye \n * @author KotoriK\n * @license GPL-v2\n * @date 2021.3.21\n * Github Repository:\n * @url https://github.com/Fuukei/Sakurairo_Scripts\n * @url https://github.com/mirai-mamori/Sakurairo/blob/f7db3c5c73d70a6a3f845844a44f279d540a7b6c/js/sakura-app.js\n * \n * *** ACKNOWLEDGEMENT *** \n * \n * *** modified on mashirozx/Sakura/js/sakura-app.js ***\n * Sakura theme application bundle\n * @author Mashiro\n * @url https://2heng.xin\n * @date 2019.8.3\n * *** ***\n * \n * *** inherited from louie-senpai/Siren/js/app.js ***\n * Siren application js\n * @author Louie\n * @url http://i94.me\n * @date 2016.11.19\n * *** ***\n * \n * *** inherited from Xoin-Yang/Akina/js/global.js ***\n * @author Xoin-Yang\n * @date 2017.04.25\n * @url http://www.akina.pw/\n * *** END OF ACKNOWLEDGEMENT *** \n * \n * Press 'F' to pay respects.\n * \n */\n\nimport { getCurrentBG, } from './coverBackground'\nimport add_copyright from './copyright'\nimport { loadCSS } from 'fg-loadcss'\nimport lazyload from \"../common/lazyload\"\nimport './global-func'\nimport { ready } from '../common/util'\nimport about_us from './about_us'\nimport preload_screen from './preload_screen'\nimport { isSupported } from './compatibility'\nimport hitokoto from './hitokoto'\nimport { web_audio } from './web_audio'\nimport { XLS, post_list_show_animation } from './post_list'\nimport { initThemeColor, updateThemeSkin } from './theme-color'\nimport initEffect from './effect'\nimport { initIsMobileCache, isMobile } from './mobile'\nimport { initFontControl } from './font_control'\nimport scrollHandler from './scroll_handler'\nimport { checkDarkModeSetting, } from './darkmode'\nimport { addSkinMenuListener, auto_height, bgButtonAddListener, CE, checkBgImgSetting, checkCoverBackground, checkSkinSecter, closeSkinMenu, MN, PE, timeSeriesReload, collapseMenu } from './func'\nimport initTypedJs from './typed'\nimport showcard from './showcard'\n\ninitIsMobileCache()\n/**\n * 检查是否应当开启_iro.pjax\n * @seealso https://github.com/PaperStrike/Pjax#compatibility\n */\n_iro.pjax = _iro.pjax && isSupported({ Firefox: 60, Edg: 79, Chrome: 66, OPR: 53, Version: 12/**Safari 12 */ });\n_iro.pjax && import('./pjax').then(({ default: initPjax }) => initPjax())\n\ntimeSeriesReload();\nadd_copyright()\nfunction activate_widget() {\n let secondary = document.getElementById(\"secondary\");\n if (!isMobile()) {\n let show_hide = document.querySelector(\".show-hide\");\n show_hide && show_hide.addEventListener(\"click\", () => {\n secondary && secondary.classList.toggle(\"active\");\n });\n } else {\n secondary && secondary.remove();\n }\n}\nsetTimeout(function () {\n activate_widget();\n}, 100);\n\n/* let isWebkit = navigator.userAgent.toLowerCase().indexOf('webkit') > -1,\n isOpera = navigator.userAgent.toLowerCase().indexOf('opera') > -1,\n isIe = navigator.userAgent.toLowerCase().indexOf('msie') > -1;\nif ((isWebkit || isOpera || isIe) && document.getElementById && window.addEventListener) { */\nwindow.addEventListener('hashchange', () => {\n const id = location.hash.substring(1)\n if (!(/^[A-z0-9_-]+$/.test(id))) {\n return;\n }\n const element = document.getElementById(id);\n if (element) {\n if (!(/^(?:a|select|input|button|textarea)$/i.test(element.tagName))) {\n element.tabIndex = -1;\n }\n element.focus();\n }\n}, false);\n/* } */\n\ncheckDarkModeSetting();\n\nimport POWERMODE from 'activate-power-mode'\nimport { coverVideoIni, coverVideo } from './video'\n\nfunction powermode() {\n POWERMODE.colorful = true;\n POWERMODE.shake = false;\n document.body.addEventListener('input', POWERMODE)\n}\n//afterDOMContentLoaded\n\nready(function () {\n if (_iro.float_player_on) {\n if (!isMobile()) {\n import('./aplayer').then(({ aplayerInit }) => aplayerInit())\n }\n }\n if (_iro.land_at_home) initTypedJs()\n Promise.all([checkCoverBackground(), checkBgImgSetting()])\n .then(() => {\n if (_iro.extract_theme_skin || isSupported({ Version: 15/**Safari 15 */ })) {\n initThemeColor()\n const bgUrl = getCurrentBG()\n if (bgUrl) updateThemeSkin(bgUrl)\n }\n })\n addSkinMenuListener();\n //let checkskin_bg = (a) => a == \"none\" ? \"\" : a;\n let changskin = document.querySelector(\"#changskin\"),\n close_SkinMenu = document.querySelector(\".skin-menu #close-skinMenu\");\n changskin && changskin.addEventListener(\"click\", function () {\n document.querySelector(\".skin-menu\").classList.toggle(\"show\");\n })\n close_SkinMenu && close_SkinMenu.addEventListener(\"click\", closeSkinMenu)\n scrollHandler();\n /*GT()*/\n const mb_to_top = document.querySelector(\"#moblieGoTop\")\n if (mb_to_top) {\n mb_to_top.onclick = () => {\n window.scrollTo({\n top: 0,\n behavior: \"smooth\"\n });\n }\n }\n /*GT end;*/\n XLS();\n MN();\n coverVideo();\n hitokoto()\n bgButtonAddListener()\n //#region has-dom-modify\n initFontControl()\n auto_height();\n PE();\n CE();\n collapseMenu()\n //#endregion\n web_audio()\n preload_screen()\n lazyload();\n showcard()\n powermode()\n //#region mashiro_global.ini.normalize();\n post_list_show_animation();\n coverVideoIni();\n checkSkinSecter();\n //#endregion\n initEffect()\n about_us()\n});\n","import { isMobile } from \"./mobile\";\nexport default function scrollHandler() {\n const header_thresold = 0;\n const siteHeader = document.querySelector(\".site-header\");\n const skinMenu = document.querySelector(\".skin-menu\");\n const changskin = document.querySelector(\"#changskin\");\n const mb_to_top = document.querySelector(\"#moblieGoTop\");\n const common = (scrollTop) => {\n //NH\n if (scrollTop > header_thresold) {\n siteHeader.classList.add(\"yya\");\n }\n else {\n siteHeader.classList.remove(\"yya\");\n }\n const cssText = scrollTop > 20 ? \"scale(1)\" : \"scale(0)\";\n mb_to_top.style.transform = cssText;\n changskin.style.transform = cssText;\n };\n if (isMobile()) {\n const smallScreenHandler = () => {\n const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;\n skinMenu && skinMenu.classList.remove(\"show\");\n common(scrollTop);\n };\n window.addEventListener(\"scroll\", smallScreenHandler);\n }\n else {\n const cached = document.getElementById('bar');\n const recalcuScrollbar = (scrollTop) => {\n const scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight;\n const result = Math.round(scrollTop / (scrollHeight - window.innerHeight) * 100);\n cached.style.width = result + '%';\n /* switch (true) {\n case (result <= 19): c = '#cccccc'; break;\n case (result <= 39): c = '#50bcb6'; break;\n case (result <= 59): c = '#85c440'; break;\n case (result <= 79): c = '#f2b63c'; break;\n case (result <= 99): c = '#FF0000'; break;\n case (result == 100): c = '#5aaadb'; break;\n default: c = \"orange\";\n }\n cached.style.background = c; */\n //炫彩scrollbar好像不是很好看,又被php那边的样式强制覆盖了,就先注释掉\n skinMenu && skinMenu.classList.remove(\"show\");\n };\n const largeScreenHandler = () => {\n const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;\n recalcuScrollbar(scrollTop);\n common(scrollTop);\n };\n window.addEventListener(\"scroll\", largeScreenHandler);\n }\n}\n//pjax.complete ready\n/* function NH() {\n const header_thresold = 0,\n siteHeader = document.querySelector(\".site-header\")\n window.addEventListener(\"scroll\", () => {\n const scrollTop = document.documentElement.scrollTop || window.pageYOffset;\n if (scrollTop > header_thresold) {\n siteHeader.classList.add(\"yya\");\n } else {\n siteHeader.classList.remove(\"yya\");\n }\n })\n // $(window).scroll(function () {\n // var s = $(document).scrollTop(),\n // cached = $('.site-header');\n // if (s == h1) {\n // cached.removeClass('yya');\n // }\n // if (s > h1) {\n // cached.addClass('yya');\n // }\n // });\n} */\n//ready\n/* function GT() {\n const mb_to_top = document.querySelector(\"#moblieGoTop\"),\n changskin = document.querySelector(\"#changskin\");\n window.addEventListener(\"scroll\", debounce(() => {\n const scroll = document.documentElement.scrollTop || document.body.scrollTop;\n const cssText = scroll > 20 ? \"scale(1)\" : \"scale(0)\"\n mb_to_top.style.transform = cssText;\n changskin.style.transform = cssText;\n }))\n mb_to_top.onclick = topFunction\n}\n\nfunction topFunction() {\n window.scrollTo({\n top: 0,\n behavior: \"smooth\"\n });\n} */\n","export default function () {\n const preload = document.getElementById(\"preload\");\n if (preload) {\n let removed = false;\n const removeScreen = () => {\n if (removed)\n return;\n document.documentElement.style.overflowY = 'unset';\n if (_iro.preload_blur != 0) {\n try {\n preload\n .animate([\n { filter: \"blur(0px)\", backdropFilter: \"blur(10px)\", opacity: 1 },\n { backdropFilter: \"blur(0px)grayscale(0)\", opacity: 0.1 },\n { opacity: 0, filter: \"blur(100px)\", }\n ], { duration: _iro.preload_blur, fill: \"forwards\", easing: \"ease\" })\n .onfinish = () => {\n preload.remove();\n };\n return;\n }\n catch (error) {\n console.warn(error);\n }\n }\n preload.classList.add('hide');\n preload.classList.remove('show');\n removed = true;\n setTimeout(() => preload.remove(), 233);\n };\n if (document.readyState === 'complete')\n return removeScreen();\n window.addEventListener('load', removeScreen, { once: true });\n setTimeout(removeScreen, 3000);\n }\n}\n","export default function about_us() {\n const b = \"background:linear-gradient(to bottom right,#212349,#2f459d,#6486c7,#a1aec9);\";\n const c = b + 'color:#fff;font-size:16px;font-family:sans-serif;font-size: 12px;border-radius: 8px; padding: 4px; box-shadow:aliceblue 0 20px;border:#6486c7 solid 1px;font-weight:bold';\n console.log('%cNon, le grand amour ne suffit pas.\\n' +\n 'Seul un adieu fleurira.\\n' +\n 'C\\'est notre histoire de vie, douce et amère.\\n' +\n '⌜La vaguelette⌟ ', b + 'color:#0000;background:linear-gradient(to bottom right,#6486c7,#a1aec9) text;font-size:14px;font-family:sans-serif');\n console.log('%c Sakurairo %c https://github.com/mirai-mamori/Sakurairo', c, '');\n}\n","import { isInDarkMode } from '../app/darkmode'\nimport { loadCSS } from 'fg-loadcss'\nimport { importExternal, resolvePath } from '../common/npmLib';\nimport { __ } from './sakurairo_global';\n\nconst PRISM_VERSION = PKG_INFO['prismjs']\nconst attributes = {\n 'autocomplete': 'off',\n 'autocorrect': 'off',\n 'autocapitalize': 'off',\n 'spellcheck': 'false',\n 'contenteditable': 'false',\n 'design': 'by Mashiro'\n}\nfunction gen_top_bar(pre, code_a) {\n if (!pre.children[0]) return\n let lang = 'text'\n const className = pre.children[0].className\n const matchResult = className.match(/language-(\\w+)/i)\n if (matchResult) {\n lang = matchResult[1]\n }\n pre.classList.add(\"highlight-wrap\");\n for (const t in attributes) {\n pre.setAttribute(t, attributes[t]);\n }\n code_a.setAttribute('data-rel', lang.toUpperCase());\n}\nasync function importHighlightjs() {\n try {\n if (!window.hljs) {\n window.hljs = (await import('highlight.js')).default\n await import('highlightjs-line-numbers.js')\n }\n } catch (e) {\n console.warn(e)\n }\n}\nconst hljs_click_callback = (e) => {\n const element = e.target\n if (!element.classList.contains(\"highlight-wrap\")) return;\n if (element.classList.contains('code-block-fullscreen')) {\n element.remove()\n } else {\n const cloneElement = element.cloneNode(true)\n cloneElement.classList.toggle(\"code-block-fullscreen\")\n document.body.append(cloneElement)\n }\n document.documentElement.classList.toggle('code-block-fullscreen-html-scroll');\n}\nexport function deattachHljsCallback() {\n document.body.removeEventListener(\"click\", hljs_click_callback)\n}\nexport async function hljs_process(pre, code) {\n try {\n await importHighlightjs()\n for (let i = 0; i < code.length; i++) {\n if (!code[i].classList.contains(\"hljs\")) {\n hljs.highlightElement(code[i]);\n }\n }\n for (let i = 0; i < pre.length; i++) {\n if (!pre[i].classList.contains(\"highlight-wrap\")) {\n gen_top_bar(pre[i], code[i]);\n }\n }\n hljs.initLineNumbersOnLoad();\n document.body.addEventListener(\"click\", hljs_click_callback)\n } catch (e) {\n console.warn(e)\n }\n}\n//Prism\nconst PrismBaseUrl = _iro.code_highlight_prism?.autoload_path || resolvePath('', 'prismjs', PRISM_VERSION)\nlet currentPrismThemeCSS = undefined\nconst themeCSS = (() => {\n const { light, dark } = _iro.code_highlight_prism?.theme || {}\n const theme = {\n light: light || 'themes/prism.min.css',\n dark: dark || 'themes/prism-tomorrow.min.css',\n }\n for (const theme_name in theme) {\n theme[theme_name] = new URL(theme[theme_name], PrismBaseUrl).toString()\n }\n return theme\n})()\n\nfunction loadPrismCSS(darkmodeOn) {\n const nextCSSHref = darkmodeOn ? themeCSS.dark : themeCSS.light\n if (currentPrismThemeCSS) {\n if (currentPrismThemeCSS.href !== nextCSSHref) {\n const nextCSSElement = loadCSS(nextCSSHref)\n nextCSSElement.addEventListener('load', () => {\n currentPrismThemeCSS.remove()\n currentPrismThemeCSS = nextCSSElement\n })\n }\n } else {\n currentPrismThemeCSS = loadCSS(nextCSSHref)\n }\n}\n\nconst prism_darkmode_callback = (e) => {\n loadPrismCSS(e.detail)\n}\nexport const deattachPrismCallback = () => document.removeEventListener('darkmode', prism_darkmode_callback)\nasync function importPrismJS() {\n try {\n if (!window.Prism) {\n loadPrismCSS(isInDarkMode())\n document.addEventListener('darkmode', prism_darkmode_callback)\n //必备插件全家桶\n loadCSS(new URL('plugins/toolbar/prism-toolbar.min.css', PrismBaseUrl).toString())\n loadCSS(new URL('plugins/previewers/prism-previewers.min.css', PrismBaseUrl).toString())\n if (_iro.ext_shared_lib) {\n await Promise.all([importExternal('components/prism-core.min.js', 'prismjs', PRISM_VERSION),\n importExternal('plugins/autoloader/prism-autoloader.min.js', 'prismjs', PRISM_VERSION),\n importExternal('plugins/toolbar/prism-toolbar.min.js', 'prismjs', PRISM_VERSION),\n importExternal('plugins/previewers/prism-previewers.min.js', 'prismjs', PRISM_VERSION),\n importExternal('plugins/show-language/prism-show-language.min.js', 'prismjs', PRISM_VERSION)])\n } else await import('./prism_pack')\n Prism.plugins.autoloader.languages_path = new URL('components/', PrismBaseUrl).toString()\n }\n } catch (reason) {\n console.warn(reason)\n }\n}\nfunction loadPrismPluginLineNumbers() {\n loadCSS(new URL('plugins/line-numbers/prism-line-numbers.min.css', PrismBaseUrl).toString())\n if (_iro.ext_shared_lib) {\n return importExternal('plugins/line-numbers/prism-line-numbers.min.js', 'prismjs', PRISM_VERSION)\n } else {\n return import('prismjs/plugins/line-numbers/prism-line-numbers')\n }\n}\nfunction loadPrismMatchBraces() {\n loadCSS(new URL('plugins/match-braces/prism-match-braces.min.css', PrismBaseUrl).toString())\n if (_iro.ext_shared_lib) {\n return importExternal('plugins/match-braces/prism-match-braces.min.js', 'prismjs', PRISM_VERSION)\n } else {\n return import('prismjs/plugins/match-braces/prism-match-braces')\n }\n}\nfunction loadPrismCommandLine() {\n loadCSS(new URL('plugins/command-line/prism-command-line.css', PrismBaseUrl).toString())\n if (_iro.ext_shared_lib) {\n return importExternal('plugins/command-line/prism-command-line.min.js', 'prismjs', PRISM_VERSION)\n } else {\n return import('prismjs/plugins/command-line/prism-command-line')\n }\n}\n/**\n * \n * @param {NodeListOf ', D = \" } code document.querySelectorAll(\"pre code\")\n */\nexport async function prism_process(code) {\n try {\n let loadLineNumber = false\n let loadMatchBraces = false\n let loadCommandLine = false\n if (_iro.code_highlight_prism.line_number_all) {\n document.querySelector('.entry-content').classList.add('line-numbers')\n loadLineNumber = true\n }\n for (const ele of code) {\n if (ele.parentElement.classList.contains('line-numbers')) {\n loadLineNumber = true\n }\n if (ele.classList.contains('match-braces')) {\n loadMatchBraces = true\n }\n if (ele.dataset.prompt || ele.dataset.host || ele.dataset.user) {\n //cli\n loadCommandLine = true\n }\n }\n await Promise.all([\n importPrismJS(),\n loadLineNumber && loadPrismPluginLineNumbers(),\n loadMatchBraces && loadPrismMatchBraces(),\n loadCommandLine && loadPrismCommandLine()\n ])\n for (const ele of code) {\n if (!ele.firstChild?.classList?.contains('token')) {\n Prism.highlightElement(ele);\n }\n }\n Prism.plugins.fileHighlight && Prism.plugins.fileHighlight.highlight()\n } catch (error) {\n console.warn(error)\n }\n}\n\nexport async function code_highlight_style() {\n const pre = document.getElementsByTagName(\"pre\"),\n code = document.querySelectorAll(\"pre code\");\n if (!pre.length) {\n switch (_iro.code_highlight) {\n case 'hljs':\n deattachHljsCallback()\n return\n case 'prism':\n deattachPrismCallback()\n return\n default:\n }\n }\n switch (_iro.code_highlight) {\n case 'hljs':\n await hljs_process(pre, code)\n break\n case 'prism':\n await prism_process(code)\n break\n case 'custom': return\n default:\n console.warn(`_iro.code_highlight这咋填的是个${_iro.code_highlight}啊🤔`)\n }\n //copy_code_block\n if (code.length > 0) {\n for (let j = 0; j < code.length; j++) {\n const pre_a = code[j].parentElement.querySelectorAll(\"a\");\n for (const ele of pre_a) {\n if (ele.classList.contains(\"copy-code\")) {\n ele.remove(); //如果已经存在复制按钮,需将其移除后再重新添加\n }\n }\n code[j].setAttribute('id', 'code-block-' + j);\n code[j].insertAdjacentHTML('afterend', '');\n }\n if (_iro.ext_shared_lib) {\n await importExternal('dist/clipboard.min.js', 'clipboard')\n new ClipboardJS('.copy-code')\n } else {\n const ClipboardJS = (await import('clipboard')).default\n new ClipboardJS('.copy-code');\n }\n }\n}","/*! loadCSS. [c]2020 Filament Group, Inc. MIT License */\n(function(w){\n\t\"use strict\";\n\t/* exported loadCSS */\n\tvar loadCSS = function( href, before, media, attributes ){\n\t\t// Arguments explained:\n\t\t// `href` [REQUIRED] is the URL for your CSS file.\n\t\t// `before` [OPTIONAL] is the element the script should use as a reference for injecting our stylesheet before\n\t\t// By default, loadCSS attempts to inject the link after the last stylesheet or script in the DOM. However, you might desire a more specific location in your document.\n\t\t// `media` [OPTIONAL] is the media type or query of the stylesheet. By default it will be 'all'\n\t\t// `attributes` [OPTIONAL] is the Object of attribute name/attribute value pairs to set on the stylesheet's DOM Element.\n\t\tvar doc = w.document;\n\t\tvar ss = doc.createElement( \"link\" );\n\t\tvar ref;\n\t\tif( before ){\n\t\t\tref = before;\n\t\t}\n\t\telse {\n\t\t\tvar refs = ( doc.body || doc.getElementsByTagName( \"head\" )[ 0 ] ).childNodes;\n\t\t\tref = refs[ refs.length - 1];\n\t\t}\n\n\t\tvar sheets = doc.styleSheets;\n\t\t// Set any of the provided attributes to the stylesheet DOM Element.\n\t\tif( attributes ){\n\t\t\tfor( var attributeName in attributes ){\n\t\t\t\tif( attributes.hasOwnProperty( attributeName ) ){\n\t\t\t\t\tss.setAttribute( attributeName, attributes[attributeName] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tss.rel = \"stylesheet\";\n\t\tss.href = href;\n\t\t// temporarily set media to something inapplicable to ensure it'll fetch without blocking render\n\t\tss.media = \"only x\";\n\n\t\t// wait until body is defined before injecting link. This ensures a non-blocking load in IE11.\n\t\tfunction ready( cb ){\n\t\t\tif( doc.body ){\n\t\t\t\treturn cb();\n\t\t\t}\n\t\t\tsetTimeout(function(){\n\t\t\t\tready( cb );\n\t\t\t});\n\t\t}\n\t\t// Inject link\n\t\t\t// Note: the ternary preserves the existing behavior of \"before\" argument, but we could choose to change the argument to \"after\" in a later release and standardize on ref.nextSibling for all refs\n\t\t\t// Note: `insertBefore` is used instead of `appendChild`, for safety re: http://www.paulirish.com/2011/surefire-dom-element-insertion/\n\t\tready( function(){\n\t\t\tref.parentNode.insertBefore( ss, ( before ? ref : ref.nextSibling ) );\n\t\t});\n\t\t// A method (exposed on return object for external use) that mimics onload by polling document.styleSheets until it includes the new sheet.\n\t\tvar onloadcssdefined = function( cb ){\n\t\t\tvar resolvedHref = ss.href;\n\t\t\tvar i = sheets.length;\n\t\t\twhile( i-- ){\n\t\t\t\tif( sheets[ i ].href === resolvedHref ){\n\t\t\t\t\treturn cb();\n\t\t\t\t}\n\t\t\t}\n\t\t\tsetTimeout(function() {\n\t\t\t\tonloadcssdefined( cb );\n\t\t\t});\n\t\t};\n\n\t\tfunction loadCB(){\n\t\t\tif( ss.addEventListener ){\n\t\t\t\tss.removeEventListener( \"load\", loadCB );\n\t\t\t}\n\t\t\tss.media = media || \"all\";\n\t\t}\n\n\t\t// once loaded, set link's media back to `all` so that the stylesheet applies once it loads\n\t\tif( ss.addEventListener ){\n\t\t\tss.addEventListener( \"load\", loadCB);\n\t\t}\n\t\tss.onloadcssdefined = onloadcssdefined;\n\t\tonloadcssdefined( loadCB );\n\t\treturn ss;\n\t};\n\t// commonjs\n\tif( typeof exports !== \"undefined\" ){\n\t\texports.loadCSS = loadCSS;\n\t}\n\telse {\n\t\tw.loadCSS = loadCSS;\n\t}\n}( typeof global !== \"undefined\" ? global : this ));\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"2065\":\"lg-2\",\"2236\":\"lg-12\",\"2661\":\"lg-6\",\"3042\":\"lg-9\",\"5459\":\"lg-0\",\"5470\":\"lg-5\",\"6458\":\"lg-1\",\"7435\":\"lg-8\",\"8268\":\"lg-7\",\"8279\":\"lg-4\",\"8599\":\"lg-11\",\"9256\":\"lg-3\",\"9438\":\"lg-10\"}[chunkId] || chunkId) + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","if (typeof document === \"undefined\") return;\nvar createStylesheet = (chunkId, fullhref, oldTag, resolve, reject) => {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tif (__webpack_require__.nc) {\n\t\tlinkTag.nonce = __webpack_require__.nc;\n\t}\n\tvar onLinkComplete = (event) => {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && event.type;\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + errorType + \": \" + realHref + \")\");\n\t\t\terr.name = \"ChunkLoadError\";\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tif (linkTag.parentNode) linkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = (href, fullhref) => {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = (chunkId) => {\n\treturn new Promise((resolve, reject) => {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t3524: 0\n};\n\n__webpack_require__.f.miniCss = (chunkId, promises) => {\n\tvar cssChunks = {\"2563\":1,\"9160\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(() => {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, (e) => {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr\n\n// no prefetching\n\n// no preloaded","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t3524: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(9160 != chunkId) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = globalThis[\"webpackChunksakurairo_scripts\"] = globalThis[\"webpackChunksakurairo_scripts\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [8538], () => (__webpack_require__(5679)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","factory","modules","installedModules","moduleId","exports","module","id","loaded","call","m","c","p","canvas","document","createElement","width","window","innerWidth","height","innerHeight","style","cssText","addEventListener","body","appendChild","context","getContext","particles","particlePointer","rendering","getRandom","min","max","Math","random","getColor","el","POWERMODE","colorful","u","getComputedStyle","color","createParticle","x","y","alpha","velocity","caret","bcr","activeElement","tagName","getAttribute","offset","selectionEnd","getBoundingClientRect","left","top","selection","getSelection","rangeCount","range","getRangeAt","startNode","startContainer","nodeType","TEXT_NODE","parentNode","getCaret","numParticles","round","shake","intensity","marginLeft","marginTop","setTimeout","requestAnimationFrame","loop","clearRect","rendered","rect","i","length","particle","globalAlpha","fillStyle","fillRect","properties","isFirefox","mozInnerScreenX","getCaretCoordinates","element","position","options","debug","querySelector","removeChild","div","computed","currentStyle","whiteSpace","nodeName","wordWrap","visibility","forEach","prop","scrollHeight","parseInt","overflowY","overflow","textContent","value","substring","replace","span","coordinates","offsetTop","offsetLeft","backgroundColor","_version_ctrl","_iro","cookie_version_control","uaMatches","Array","from","navigator","userAgent","matchAll","isSupported","checkList","_","name","version","parseFloat","Accept_Image","acceptList","Chrome","OPR","Firefox","Edg","Version","push","key","days","expires","Date","now","toUTCString","cookie","setCookie","reverse","join","getSupportedImageMimeList","txt","author_name","location","href","site_name","copytext","e","selectionText","toString","event","selectionTxt","preventDefault","htmlData","textData","clipboardData","setData","setClipboardText","createButterbar","__","add_copyright","clipboardCopyright","removeEventListener","promisifyRequest","request","Promise","resolve","reject","oncomplete","onsuccess","result","onabort","onerror","error","createStore","dbName","storeName","indexedDB","open","onupgradeneeded","createObjectStore","dbp","txMode","callback","then","db","transaction","objectStore","store","bgn","blob_url","async","nextBG","changeCoverBG","getCoverPath","preBG","centerbg","site_bg_as_cover","url","backgroundImage","dispatchEvent","CustomEvent","detail","noop","parseCSSUrl","match","getCurrentBG","getAPIPath","useBGN","cover_api_url","URL","cover_api","isMobile","random_graphs_mts","searchParams","set","search","cache_cover","get","coverBG","ArrayBuffer","revokeObjectURL","createObjectURL","Blob","finally","resp","fetch","headers","Accept","status","json","message","console","warn","ok","buf","arrayBuffer","put","TypeError","delete","del","fetchThenCache","mediaQuery","matchMedia","inDarkMode","isInDarkMode","informDarkModeChange","nextValue","mediaQueryCallback","localStorage","getItem","matches","darkmode","turnOnDarkMode","turnOffDarkMode","saveUserSetting","ifDarkmodeShouldOn","removeItem","setItem","userTriggered","documentElement","getElementsByClassName","classList","add","remove","dm_strategy","today","getHours","checkTime","checkDarkModeSetting","dark","removeListener","addListener","btnSerif","btnSansSerif","change_font_listener","btn","dataset","setButtonState","loadFontSetting","nowFont","font_name","initFontControl","hitokoto","yiyan","getElementById","api_group","yiyan_api","api_path","innerText","res","api","data","from_who","cache_is_mobile","initIsMobileCache","refreshIsMobileCache","ev","hslaCSSText","h","s","l","a","hsl","load_post_timer","load_post","onlyOnceATime","now_href","pagination_a","contains","text","DOM","DOMParser","parseFromString","querySelectorAll","paga","paga_innerText","nextHref","main","append","dpga","addps","lazyload","code_highlight_style","post_list_show_animation","undefined","setAttribute","tempScrollTop","scrollTop","pageYOffset","scrollTo","behavior","innerHTML","articles","io","IntersectionObserver","entries","entry","isIntersecting","target","thumbImage","unobserve","finalImageElement","src","crossOrigin","getThemeColorFromImageElement","rgba","setProperty","getHighlight","getForeground","threshold","article","observe","XLS_Listener","parentElement","stopPropagation","clearTimeout","XLS","intersectionRatio","_page_next","href_page_next","load_key","load_time","title","log","showcard","img","button","Error","lastMsgId","PromiseWorker","w","cb","Symbol","dispose","constructor","worker","this","payload","messageId","postMessage","extraArgs","messageToSend","channel","alias","rgb","r","g","b","delta","A","C","D50","D55","D65","D75","F2","F7","F11","E","whitepoint","_xyz","white","z","pow","xyz","lab","_prepare2DContext","ctx","_prepare2DContextAsync","OffscreenCanvas","_readImage","prepareCtx","imgSource","naturalWidth","naturalHeight","drawImage","getImageData","bind","_readImageDownsampling","maxSample","scale","scaleSqrt","sqrt","readImageDownsampling","originalThemeSkinMatcing","getPropertyValue","Worker","currentColor","imgElement","complete","reason","awaitImage","imageData","transfer","buffer","_updateThemeColorMeta","color_css","meta","content","updateThemeSkin","coverBGUrl","_setColor","hsla","darkmodeColor","extract_theme_skin","initThemeColor","next","typedInstance","disableTypedJsIfExist","destroy","initTypedJs","JSON","parse","ext_shared_lib","Typed","importExternal","default","bgvideo","videoList","movies","split","unplayedIndex","fill","map","index","aplayersToResume","_getNextRandomVideo","nextIndex","floor","splice","getVideo","video_stu","fileName","bottom","origin","getBaseName","splay","video_btn","display","float_player_on","pauseAllPlayer","play","spause","pause","player","liveplay","oncanplay","livepause","coverVideo","onended","click","video_add","coverVideoIni","videos","canPlayType","video","autoplay","Hls","hls","loadSource","attachMedia","on","Events","MANIFEST_PARSED","initHLS","canPlayHandler","lazyloadPatch","poster","web_audio","audio","AudioContext","webkitAudioContext","o","t","sheet","sakurairoGlobal","opt","getSheet","selects","notes","gainValueMax","main_gain","createGain","createOscillator","_t","connect","destination","type","start","currentTime","lastTarget","listener","currentTarget","resume","d","pageX","pageY","dom","zIndex","pointerEvents","animate","opacity","duration","gain","cancelScheduledValues","frequency","setValueAtTime","exponentialRampToValueAtTime","suspend","clearButterbar","butterBar","keep","defaults","srcset","selector","root","rootMargin","LazyLoad","elms","opts","init","obs","doLoad","image","load","toLowerCase","includes","disconnect","instance","Lazyload","STORAGE_KEY","CDN_LIST","currentCDNIndex","config","num","isNaN","getPreferCDNIndex","currentCDN","raw","resolvePath","relativePath","packageName","String","PKG_INFO","path","script","onload","defaultStr","_sakurairoi18n","_$","replacements","template","build","BUILD_INFO","registerOnGlobal","Object","defineProperty","writable","enumerable","_sakurairo","readyFunctionList","func","isRunning","args","whileReady","fn","ready","readyState","slideToggle","mode","flag","transition","tagTimer","tagHeight","clientHeight","buildAPI","apiPath","params","nonce","mainContainer","toggle","close","QueryStorage","renderSearchResult","keyword","link","fa","iconfont","comments","trim","indexOf","slice","toUpperCase","query","B","F","G","D","queries","array","filter","v","values","some","RegExp","test","Cx","div_href","search_close","Ty","ele","jsSearchCallback","live_search","val","otxt","sessionStorage","catch","search_a","searchFlag","oninput","_mashiro_global_skin_secter","checkSkinSecter","pattern","headertop","changeSkin","tagId","bg_url","skin_bg0","skin_bg1","skin_bg2","skin_bg3","skin_bg4","bgButtonAddListener","pre","onclick","timeSeriesReload","archives","al_li","nextElementSibling","al_expand_collapse","cursor","getElementsByTagName","al_post_list","al_post_list_first","child","expanded","MN","iconflat","MNH","auto_height","windowheight","minHeight","PE","blank","paddingTop","live","CE","comments_fold","comments_main","h3","handler","sc","js_search","loading","collapseMenu","show_Nav","sln","addSkinMenuListener","cached","tagid","closeSkinMenu","checkBgImgSetting","checkCoverBackground","land_at_home","imgError","cmt_showPopup","popup","onblur","btn_playControl","paused","coverVideoMute","btn_volumeControl","muted","killCoverVideo","mail_me","email_name","email_domain","headertop_down","coverOffset","initEffect","effect","cfg","particlesJS","initParticle","pjax","initPjax","secondary","show_hide","activate_widget","hash","tabIndex","focus","aplayerInit","all","bgUrl","changskin","close_SkinMenu","siteHeader","skinMenu","mb_to_top","common","transform","smallScreenHandler","recalcuScrollbar","largeScreenHandler","scrollHandler","preload","removed","removeScreen","preload_blur","backdropFilter","easing","onfinish","once","preload_screen","about_us","PRISM_VERSION","attributes","gen_top_bar","code_a","children","lang","matchResult","className","hljs_click_callback","cloneElement","cloneNode","hljs_process","code","hljs","importHighlightjs","highlightElement","initLineNumbersOnLoad","PrismBaseUrl","code_highlight_prism","autoload_path","currentPrismThemeCSS","themeCSS","light","theme","theme_name","loadPrismCSS","darkmodeOn","nextCSSHref","nextCSSElement","loadCSS","prism_darkmode_callback","deattachPrismCallback","importPrismJS","Prism","plugins","autoloader","languages_path","code_highlight","loadLineNumber","loadMatchBraces","loadCommandLine","line_number_all","prompt","host","user","firstChild","fileHighlight","highlight","prism_process","j","pre_a","insertAdjacentHTML","ClipboardJS","before","media","ref","doc","ss","refs","childNodes","sheets","styleSheets","attributeName","hasOwnProperty","rel","insertBefore","nextSibling","onloadcssdefined","resolvedHref","loadCB","__webpack_module_cache__","__webpack_require__","cachedModule","__webpack_modules__","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","keys","every","n","getter","__esModule","getPrototypeOf","obj","ns","create","def","current","getOwnPropertyNames","definition","f","chunkId","reduce","promises","miniCssF","globalThis","Function","prototype","done","needAttach","scripts","charset","timeout","nc","onScriptComplete","prev","doneFns","head","toStringTag","scriptUrl","importScripts","currentScript","loadStylesheet","fullhref","existingLinkTags","dataHref","tag","existingStyleTags","findStylesheet","oldTag","linkTag","errorType","realHref","err","createStylesheet","installedCssChunks","miniCss","baseURI","self","installedChunks","installedChunkData","promise","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file From 851153171b46135685e84b2257d8f1bf81e1f41f Mon Sep 17 00:00:00 2001 From: KotoriK <52659125+KotoriK@users.noreply.github.com> Date: Wed, 9 Oct 2024 16:22:56 +0800 Subject: [PATCH 018/122] =?UTF-8?q?perf(chatgpt):=20=E4=BC=A0=E8=BE=93?= =?UTF-8?q?=E6=AD=A3=E6=96=87=E6=97=B6=EF=BC=8C=E5=88=A0=E9=99=A4=E8=BF=9E?= =?UTF-8?q?=E7=BB=AD=E7=9A=84\n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/chatgpt/hooks.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/chatgpt/hooks.php b/inc/chatgpt/hooks.php index 9184074f..efcde573 100644 --- a/inc/chatgpt/hooks.php +++ b/inc/chatgpt/hooks.php @@ -66,7 +66,7 @@ function summon_article_excerpt(WP_Post $post) ], [ "role" => "user", - "content" => "Context: " . mb_substr(wp_strip_all_tags(apply_filters('the_content', $post->post_content)), 0, 4050) + "content" => "Context: " . mb_substr(preg_replace("/(\\s)\\s{2,}/", "$1",wp_strip_all_tags(apply_filters('the_content', $post->post_content))), 0, 4050) ], ] ]); From 3940e15fb3e4529ddad151014edd056f8be29a25 Mon Sep 17 00:00:00 2001 From: KotoriK <52659125+KotoriK@users.noreply.github.com> Date: Wed, 9 Oct 2024 16:28:39 +0800 Subject: [PATCH 019/122] doc --- opt/options/theme-options.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opt/options/theme-options.php b/opt/options/theme-options.php index d6ad625d..a3e472ce 100644 --- a/opt/options/theme-options.php +++ b/opt/options/theme-options.php @@ -4048,7 +4048,7 @@ function iro_validate_optional_url( $value ) { 'type' => 'content', 'content' => __(' Options Framework Relies on the Codestar Open Source Codestar Framework Project
Update Function Relies on YahnisElsts Open Source Plugin Update Checker Project
-ChatGPT-related Capabilities Relies on HaoZi-Team Open Source ChatGPT PHP Project
','sakurairo_csf'), +ChatGPT-related Capabilities Relies on orhanerday Open Source open-ai Project
','sakurairo_csf'), ), array( From 3081625c17628df464c4ed50e010cafded7c62d2 Mon Sep 17 00:00:00 2001 From: KotoriK <52659125+KotoriK@users.noreply.github.com> Date: Wed, 9 Oct 2024 16:30:27 +0800 Subject: [PATCH 020/122] =?UTF-8?q?chore(chatgpt):=20=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- opt/options/theme-options.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/opt/options/theme-options.php b/opt/options/theme-options.php index a3e472ce..8c820099 100644 --- a/opt/options/theme-options.php +++ b/opt/options/theme-options.php @@ -3495,11 +3495,12 @@ function iro_validate_optional_url( $value ) { 'id' => 'chatgpt_model', 'type' => 'text', 'title' => __('ChatGPT Model','sakurairo_csf'), - 'descr' => __('Only models support Chat Completion API can be used. The default is "gpt-3.5-turbo". View https://platform.openai.com/docs/models/overview for more info.','sakurairo_csf'), + 'descr' => __('Only models support Chat Completion API can be used. The default is "gpt-4o-mini. View https://platform.openai.com/docs/models/overview for more info.','sakurairo_csf'), 'dependency' => array( array( 'composer_load', '==', 'true'), array( 'chatgpt_article_summarize', '==', 'true', '', 'true' ), - ) + ), + "default" => "gpt-4o-mini" ), array( From eeaa6721c56e7d6abd376daf3f3fefe0c8d339ad Mon Sep 17 00:00:00 2001 From: KotoriK <52659125+KotoriK@users.noreply.github.com> Date: Wed, 9 Oct 2024 17:12:00 +0800 Subject: [PATCH 021/122] =?UTF-8?q?feat(chatgpt):=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E5=80=BC=E8=87=AA=E5=8A=A8=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- opt/options/theme-options.php | 57 +++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/opt/options/theme-options.php b/opt/options/theme-options.php index 8c820099..bc5ba17a 100644 --- a/opt/options/theme-options.php +++ b/opt/options/theme-options.php @@ -3550,6 +3550,63 @@ function iro_validate_optional_url( $value ) { }, ), + array( + 'type' => 'callback', + 'function' => function (){ + ?> +++ Date: Wed, 9 Oct 2024 18:47:51 +0900 Subject: [PATCH 022/122] Daily Update --- opt/options/theme-options.php | 119 +++++++++++++++++----------------- 1 file changed, 60 insertions(+), 59 deletions(-) diff --git a/opt/options/theme-options.php b/opt/options/theme-options.php index bc5ba17a..6f3b960f 100644 --- a/opt/options/theme-options.php +++ b/opt/options/theme-options.php @@ -3432,13 +3432,71 @@ function iro_validate_optional_url( $value ) { 'default' => false ), + array( + 'type' => 'callback', + 'function' => function (){ + ?> +=__("Reset to API providers' default options","sakurairo_csf")?>
++ + ++ +++ 'chatgpt_base_url', 'type' => 'text', 'title' => __('ChatGPT Base URL','sakurairo_csf'), - 'desc' => __('Fill in the ChatGPT Base URL, The default is https://openai.fuukei.org/','sakurairo_csf'), + 'desc' => __('Fill in the ChatGPT Base URL, The default is https://api.openai.org','sakurairo_csf'), 'dependency' => array( 'composer_load', '==', 'true', '', 'true' ), - 'default' => 'https://openai.fuukei.org/' + 'default' => 'https://api.openai.org' ), array( @@ -3550,63 +3608,6 @@ function iro_validate_optional_url( $value ) { }, ), - array( - 'type' => 'callback', - 'function' => function (){ - ?> -=__("Reset to API providers' default options","sakurairo_csf")?>
++ + ++ +-- Date: Wed, 9 Oct 2024 19:26:44 +0900 Subject: [PATCH 023/122] Daily Update --- layouts/imgbox.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/layouts/imgbox.php b/layouts/imgbox.php index 508de4ce..f5d41324 100644 --- a/layouts/imgbox.php +++ b/layouts/imgbox.php @@ -9,7 +9,7 @@ endif; // 微信 if (iro_opt('wechat')):?> -=__("Reset to API providers' default options","sakurairo_csf")?>
-- - -- -+ @@ -20,7 +20,7 @@ foreach ($all_opt as $key => $value): if (!empty($value['link'])): // 显然 这里的逻辑可以看看all_opt的结构( - $img_url = $value['img'] ?? ($social_display_icon . ($value['icon'] ?? $key) . '.png'); + $img_url = $value['img'] ?? ($social_display_icon . ($value['icon'] ?? $key) . '.webp'); $title = $value['title'] ?? $key; ?>@@ -31,7 +31,7 @@ if (iro_opt('email_name') && iro_opt('email_domain')):?> + src="=iro_opt('vision_resource_basepath')?>=iro_opt('social_display_icon')?>/mail.webp" /> Date: Wed, 9 Oct 2024 22:48:12 +0900 Subject: [PATCH 024/122] Daily Update --- layouts/all_opt.php | 47 +++++++++++++++++++---------------- layouts/imgbox.php | 32 ++++++++++++++---------- opt/options/theme-options.php | 38 ++++++++++++++-------------- style.css | 2 +- 4 files changed, 64 insertions(+), 55 deletions(-) diff --git a/layouts/all_opt.php b/layouts/all_opt.php index 1d10686a..539d93bc 100644 --- a/layouts/all_opt.php +++ b/layouts/all_opt.php @@ -1,14 +1,14 @@ [ + 'link' => iro_opt('qq', '') + ], 'bili' => [ 'link' => iro_opt('bili', ''), 'icon' => 'bilibili', 'title' => 'bilibili', ], - 'qq' => [ - 'link' => iro_opt('qq', '') - ], 'wangyiyun' => [ 'link' => iro_opt('wangyiyun', ''), 'title' => 'cloudmusic', @@ -31,20 +31,33 @@ 'link' => iro_opt('steam', ''), 'class' => 'wangyiyun', 'icon' => 'st' + ], + 'youtube' => [ + 'link' => iro_opt('youtube', ''), + 'icon' => 'youtube', + 'class' => 'wangyiyun' ], - 'zhihu' => [ - 'link' => iro_opt('zhihu', ''), + 'instagram' => [ + 'link' => iro_opt('instagram', ''), + 'icon' => 'ig', + 'class' => 'wangyiyun' + ], + 'douyin' => [ + 'link' => iro_opt('douyin', ''), + 'icon' => 'dy', 'class' => 'wangyiyun' ], - 'qzone' => [ - 'link' => iro_opt('qzone', ''), - 'icon' => 'qz' + 'xiaohongshu' => [ + 'link' => iro_opt('xiaohongshu', ''), + 'class' => 'wangyiyun' ], - 'lofter' => [ - 'link' => iro_opt('lofter', '') + 'discord' => [ + 'link' => iro_opt('discord', ''), + 'class' => 'wangyiyun' ], - 'youku' => [ - 'link' => iro_opt('youku', '') + 'zhihu' => [ + 'link' => iro_opt('zhihu', ''), + 'class' => 'wangyiyun' ], 'linkedin' => [ 'link' => iro_opt('linkedin', ''), @@ -61,16 +74,6 @@ 'icon' => 'fb', 'class' => 'wangyiyun' ], - 'csdn' => [ - 'link' => iro_opt('csdn', ''), - 'icon' => 'csdn', - 'class' => 'wangyiyun' - ], - 'jianshu' => [ - 'link' => iro_opt('jianshu', ''), - 'icon' => 'book', - 'class' => 'wangyiyun' - ], 'socialdiy1' => [ 'link' => iro_opt('socialdiy1', ''), 'title' => iro_opt('socialdiy1_title', 'DIY1'), diff --git a/layouts/imgbox.php b/layouts/imgbox.php index f5d41324..de696c18 100644 --- a/layouts/imgbox.php +++ b/layouts/imgbox.php @@ -1,42 +1,48 @@ - + if (iro_opt('cover_random_graphs_switch', 'true')): ?> + - + if (iro_opt('wechat')): ?> + $value): if (!empty($value['link'])): - // 显然 这里的逻辑可以看看all_opt的结构( - $img_url = $value['img'] ?? ($social_display_icon . ($value['icon'] ?? $key) . '.webp'); + $img_url = $value['img'] ?? ($social_display_icon . ($value['icon'] ?? $key) . ($use_svg ? '.svg' : '.webp')); $title = $value['title'] ?? $key; ?> - - ++ + if (iro_opt('email_name') && iro_opt('email_domain')): ?> + src="= iro_opt('vision_resource_basepath') . ($use_svg ? 'mail.svg' : 'mail.webp') ?>" style="= $use_svg ? 'fill: ' . $svg_color . ';' : '' ?>" /> + if (iro_opt('cover_random_graphs_switch', 'true')): ?> + diff --git a/opt/options/theme-options.php b/opt/options/theme-options.php index 6f3b960f..68fc3746 100644 --- a/opt/options/theme-options.php +++ b/opt/options/theme-options.php @@ -1831,7 +1831,7 @@ function iro_validate_optional_url( $value ) { 'display_icon/fluent_design' => 'https://s.nmxc.ltd/sakurairo_vision/@2.7/options/display_icon_fd.gif', 'display_icon/muh2' => 'https://s.nmxc.ltd/sakurairo_vision/@2.7/options/display_icon_h2.gif', 'display_icon/flat_colorful' => 'https://s.nmxc.ltd/sakurairo_vision/@2.7/options/display_icon_fc.gif', - 'display_icon/sakura' => 'https://s.nmxc.ltd/sakurairo_vision/@2.7/options/display_icon_sa.gif', + 'display_icon/svg' => 'https://s.nmxc.ltd/sakurairo_vision/@2.7/options/display_icon_svg.webp', ), 'default' => 'display_icon/fluent_design' ), @@ -1927,73 +1927,73 @@ function iro_validate_optional_url( $value ) { ), array( - 'id' => 'zhihu', + 'id' => 'youtube', 'type' => 'text', - 'title' => __('ZhiHu','sakurairo_csf'), + 'title' => __('Youtube','sakurairo_csf'), 'dependency' => array( 'social_area', '==', 'true', '', 'true' ), 'desc' => __('add URL','sakurairo_csf'), ), array( - 'id' => 'qzone', + 'id' => 'instagram', 'type' => 'text', - 'title' => __('QZone','sakurairo_csf'), + 'title' => __('Instagram','sakurairo_csf'), 'dependency' => array( 'social_area', '==', 'true', '', 'true' ), 'desc' => __('add URL','sakurairo_csf'), ), array( - 'id' => 'lofter', + 'id' => 'douyin', 'type' => 'text', - 'title' => __('Lofter','sakurairo_csf'), + 'title' => __('Tiktok','sakurairo_csf'), 'dependency' => array( 'social_area', '==', 'true', '', 'true' ), 'desc' => __('add URL','sakurairo_csf'), ), array( - 'id' => 'youku', + 'id' => 'xiaohongshu', 'type' => 'text', - 'title' => __('Youku','sakurairo_csf'), + 'title' => __('YELLOWnote','sakurairo_csf'), 'dependency' => array( 'social_area', '==', 'true', '', 'true' ), 'desc' => __('add URL','sakurairo_csf'), ), array( - 'id' => 'linkedin', + 'id' => 'discord', 'type' => 'text', - 'title' => __('Linkedin','sakurairo_csf'), + 'title' => __('Discord','sakurairo_csf'), 'dependency' => array( 'social_area', '==', 'true', '', 'true' ), 'desc' => __('add URL','sakurairo_csf'), ), array( - 'id' => 'twitter', + 'id' => 'zhihu', 'type' => 'text', - 'title' => __('Twitter','sakurairo_csf'), + 'title' => __('ZhiHu','sakurairo_csf'), 'dependency' => array( 'social_area', '==', 'true', '', 'true' ), 'desc' => __('add URL','sakurairo_csf'), ), array( - 'id' => 'facebook', + 'id' => 'linkedin', 'type' => 'text', - 'title' => __('Facebook','sakurairo_csf'), + 'title' => __('Linkedin','sakurairo_csf'), 'dependency' => array( 'social_area', '==', 'true', '', 'true' ), 'desc' => __('add URL','sakurairo_csf'), ), array( - 'id' => 'csdn', + 'id' => 'twitter', 'type' => 'text', - 'title' => __('CSDN','sakurairo_csf'), + 'title' => __('Twitter','sakurairo_csf'), 'dependency' => array( 'social_area', '==', 'true', '', 'true' ), 'desc' => __('add URL','sakurairo_csf'), ), array( - 'id' => 'jianshu', + 'id' => 'facebook', 'type' => 'text', - 'title' => __('JianShu','sakurairo_csf'), + 'title' => __('Facebook','sakurairo_csf'), 'dependency' => array( 'social_area', '==', 'true', '', 'true' ), 'desc' => __('add URL','sakurairo_csf'), ), diff --git a/style.css b/style.css index 22106c13..170726d8 100644 --- a/style.css +++ b/style.css @@ -6,7 +6,7 @@ Theme URI: https://github.com/mirai-mamori/Sakurairo Author: Created by Fuukei Author URI: https://fuukei.org/ Description: A colorful, Easy-to-use, Perfect Experience, and Powerful Customizable WordPress Theme (Based on Theme Sakura) -Version: 2.6.13 +Version: 2.6.14 Tested up to: 6.6 Requires at least: 5.8 Requires PHP: 7.3 From 2f3f06301989240227c54ad58fcd310fce6fa0c6 Mon Sep 17 00:00:00 2001 From: KotoriK <52659125+KotoriK@users.noreply.github.com> Date: Thu, 10 Oct 2024 10:36:30 +0800 Subject: [PATCH 025/122] chore: gpt options --- opt/options/theme-options.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/opt/options/theme-options.php b/opt/options/theme-options.php index 68fc3746..96557875 100644 --- a/opt/options/theme-options.php +++ b/opt/options/theme-options.php @@ -3452,7 +3452,7 @@ function iro_validate_optional_url( $value ) { const defaults = { leaflow:{ - chatgpt_base_url:"https://amber-api.leaflow.cn/api/openai-compatible/v1", + chatgpt_base_url:"https://amber-api.leaflow.cn/api/openai-compatible", chatgpt_model:"auto" }, postchat:{ @@ -3460,7 +3460,7 @@ function iro_validate_optional_url( $value ) { chatgpt_model:"tianli" }, openai:{ - chatgpt_base_url:"https://api.openai.org", + chatgpt_base_url:"https://api.openai.com", chatgpt_model:"gpt-4o-mini", } } @@ -3494,16 +3494,16 @@ function iro_validate_optional_url( $value ) { 'id' => 'chatgpt_base_url', 'type' => 'text', 'title' => __('ChatGPT Base URL','sakurairo_csf'), - 'desc' => __('Fill in the ChatGPT Base URL, The default is https://api.openai.org','sakurairo_csf'), + 'desc' => __('Fill in the ChatGPT Base URL','sakurairo_csf'), 'dependency' => array( 'composer_load', '==', 'true', '', 'true' ), - 'default' => 'https://api.openai.org' + 'default' => 'https://api.openai.com' ), array( 'id' => 'chatgpt_access_token', 'type' => 'text', 'title' => __('ChatGPT API keys','sakurairo_csf'), - 'desc' => __('Fill in Your ChatGPT API keys, You can go to OpenAI Website to get your API Keys','sakurairo_csf'), + 'desc' => __('Fill in Your ChatGPT API keys, please refer to OpenAI Website for further information.','sakurairo_csf'), 'dependency' => array( 'composer_load', '==', 'true', '', 'true' ), ), @@ -3511,7 +3511,7 @@ function iro_validate_optional_url( $value ) { 'id' => 'chatgpt_article_summarize', 'type' => 'switcher', 'title' => __('ChatGPT Article Summarize','sakurairo_csf'), - 'label' => __('After turning on ChatGPT will automatically generate article abstracts','sakurairo_csf'), + 'label' => __('After turning on, title and context of your articles will be automatically sent to ChatGPT to generate excerpts.','sakurairo_csf'), 'dependency' => array( 'composer_load', '==', 'true', '', 'true' ), 'default' => false ), @@ -3529,7 +3529,7 @@ function iro_validate_optional_url( $value ) { 'id' => 'chatgpt_exclude_ids', 'type' => 'text', 'title' => __('Article IDs that do not Require ChatGPT Summarize','sakurairo_csf'), - 'desc' => __('Enter the article IDs that do not need to generate ChatGPT Summarize, and split multiple article IDs with ","','sakurairo_csf'), + 'desc' => __('Those articles will never be sent to ChatGPT for excerpt generation. Split each id with a ",".','sakurairo_csf'), 'dependency' => array( array( 'composer_load', '==', 'true'), array( 'chatgpt_article_summarize', '==', 'true', '', 'true' ), @@ -3553,7 +3553,7 @@ function iro_validate_optional_url( $value ) { 'id' => 'chatgpt_model', 'type' => 'text', 'title' => __('ChatGPT Model','sakurairo_csf'), - 'descr' => __('Only models support Chat Completion API can be used. The default is "gpt-4o-mini. View https://platform.openai.com/docs/models/overview for more info.','sakurairo_csf'), + 'descr' => __('Only models support Chat Completion API can be used. The default is "gpt-4o-mini. View https://platform.openai.com/docs/models/overview for further info.','sakurairo_csf'), 'dependency' => array( array( 'composer_load', '==', 'true'), array( 'chatgpt_article_summarize', '==', 'true', '', 'true' ), From 7993ffa9d3e867bacb3375b743b5e35692c83db9 Mon Sep 17 00:00:00 2001 From: KotoriK <52659125+KotoriK@users.noreply.github.com> Date: Thu, 10 Oct 2024 14:18:10 +0800 Subject: [PATCH 026/122] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=E5=89=8D?= =?UTF-8?q?=E5=90=8E=E6=96=87=E7=AB=A0=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layouts/post-nextprev.php | 50 +++++++++++++++++---------------------- style.css | 38 ++++++++++++++--------------- 2 files changed, 40 insertions(+), 48 deletions(-) diff --git a/layouts/post-nextprev.php b/layouts/post-nextprev.php index b2c8f804..db1e3e6e 100644 --- a/layouts/post-nextprev.php +++ b/layouts/post-nextprev.php @@ -6,34 +6,28 @@ if (iro_opt('article_nextpre') == '1') { ?> - - + ' . - ''; - + $load_svg_url = iro_opt('vision_resource_basepath', 'https://s.nmxc.ltd/sakurairo_vision/@2.7/') . 'load_svg/outload.svg'; + $prev_link_html = '' . + '' . + __("Previous Post", 'sakurairo') . + '' . + '%title
' . - '' . + ''; - $next_link_html = '' . - '' . - __("Next Post",'sakurairo') . - '' . - '%title
' . + '' . - ''; - ?> -%title
' . - '- --- -- + + $next_link_html = '' . + '' . + __("Next Post", 'sakurairo') . + '' . + '' . + ''; + + previous_post_link('%link', $prev_link_html, false, $classify_display_id); + next_post_link('%link', $next_link_html, false, $classify_display_id) ?> + \ No newline at end of file diff --git a/style.css b/style.css index 170726d8..393f5096 100644 --- a/style.css +++ b/style.css @@ -1522,7 +1522,7 @@ h1.page-title { font-weight: var(--global-font-weight); } -.post-squares.nextprev a { +.nextprev a { height: 150px; padding: 55px 40px; text-align: left; @@ -5917,68 +5917,66 @@ h1.page-title.mb- { color: #7d7d7d; } -.post-squares .half { - width: 50%; - float: left; -} - -.post-squares .third { +/* .post-squares .third { width: 33.333%; +} */ + +.nextprev>:not(:only-child) { + width: 50%; } -.post-squares.nextprev article { +.nextprev article { height: 150px; padding: 55px 40px; text-align: left; } -.post-squares.nextprev .label { +.nextprev .label { position: absolute; z-index: 100; top: 0; } -.post-squares.nextprev .info { +.nextprev .info { position: absolute; width: 70%; } -.post-squares.nextprev .next h3, -.post-squares.nextprev .previous h3 { +.nextprev a h3 { font-size: 14px; } -.post-squares.nextprev .previous { +.nextprev a[rel=prev] { text-align: left; } -.post-squares.nextprev .previous .info { +.nextprev a[rel=prev] .info { bottom: 40px; left: 40px; } -.post-squares.nextprev .previous .label { +.nextprev a[rel=prev] .label { top: 40px; left: 40px; } -.post-squares.nextprev .previous hr { +.nextprev a[rel=prev] hr { float: left; margin: 0; } -.post-squares.nextprev .next .info { +.nextprev a[rel=next] .info { text-align: right; right: 40px; bottom: 40px; } -.post-squares.nextprev .next .label { +.nextprev a[rel=next] .label { top: 40px; right: 40px; } -.post-squares.nextprev .next hr { +.nextprev a[rel=next] hr { float: right; margin: 0; } @@ -7913,7 +7911,7 @@ body:not(.heimu_toggle_on) .new:hover .heimu.off { } @media (max-width:760px) { - .post-squares.nextprev article { + .nextprev article { height: 150px; width: 100%; } From a481384ad8880c572d8106031fa5ce348cffb363 Mon Sep 17 00:00:00 2001 From: KotoriK <52659125+KotoriK@users.noreply.github.com> Date: Thu, 10 Oct 2024 16:04:12 +0800 Subject: [PATCH 027/122] refactor: lint css --- style.css | 102 ++++-------------------------------------------------- 1 file changed, 7 insertions(+), 95 deletions(-) diff --git a/style.css b/style.css index 393f5096..64bf5ef3 100644 --- a/style.css +++ b/style.css @@ -10132,110 +10132,22 @@ body.dark .toc { body.dark .toc:hover { box-shadow: 0 1px 30px -2px var(--theme-skin-dark) !important; - background: rgba(26, 26, 26, 0.8); + background: #1a1a1acc; transition: all 0.6s ease-in-out; -webkit-transition: all 0.6s ease-in-out; } -body.dark .post-license { - box-shadow: 0 1px 20px 2px rgba(26, 26, 26, 0.8); - background: rgba(26, 26, 26, 0.6); +body.dark .post-footer>:not(section),body.dark .post-footer >section > * { + box-shadow: 0 1px 20px 2px #1a1a1acc; + background: #1a1a1a99; border: 1px solid #7d7d7d30; -} - -body.dark .post-license:hover { - box-shadow: 0 1px 30px -2px var(--theme-skin-dark) !important; - background: rgba(26, 26, 26, 0.8); -} - -body.dark .post-tags { - box-shadow: 0 1px 20px 2px rgba(26, 26, 26, 0.8); - background: rgba(26, 26, 26, 0.6); - transition: all 0.6s ease-in-out; - -webkit-transition: all 0.6s ease-in-out; - border: 1px solid #7d7d7d30; -} - -body.dark .post-tags:hover { - box-shadow: 0 1px 30px -2px var(--theme-skin-dark) !important; - background: rgba(26, 26, 26, 0.8); transition: all 0.6s ease-in-out; -webkit-transition: all 0.6s ease-in-out; } -body.dark .post-modified-time { - box-shadow: 0 1px 20px 2px rgba(26, 26, 26, 0.8); - background: rgba(26, 26, 26, 0.6); - transition: all 0.6s ease-in-out; - -webkit-transition: all 0.6s ease-in-out; - border: 1px solid #7d7d7d30; -} - -body.dark .post-modified-time:hover { - box-shadow: 0 1px 30px -2px var(--theme-skin-dark) !important; - background: rgba(26, 26, 26, 0.8); - transition: all 0.6s ease-in-out; - -webkit-transition: all 0.6s ease-in-out; -} - -body.dark .reward-open { - box-shadow: 0 1px 20px 2px rgba(26, 26, 26, 0.8); - background: rgba(26, 26, 26, 0.6); - transition: all 0.6s ease-in-out; - -webkit-transition: all 0.6s ease-in-out; - border: 1px solid #7d7d7d30; -} - -body.dark .reward-open:hover { - box-shadow: 0 1px 30px -2px var(--theme-skin-dark) !important; - background: rgba(26, 26, 26, 0.8); - transition: all 0.6s ease-in-out; - -webkit-transition: all 0.6s ease-in-out; -} - -body.dark .author-profile .info { - box-shadow: 0 1px 20px 2px rgba(26, 26, 26, 0.8); - background: rgba(26, 26, 26, 0.6); - transition: all 0.6s ease-in-out; - -webkit-transition: all 0.6s ease-in-out; - border: 1px solid #7d7d7d30; -} - -body.dark .author-profile .info:hover { - box-shadow: 0 1px 30px -2px var(--theme-skin-dark) !important; - background: rgba(26, 26, 26, 0.8); - transition: all 0.6s ease-in-out; - -webkit-transition: all 0.6s ease-in-out; -} - -body.dark .author-profile .meta { - box-shadow: 0 1px 20px 2px rgba(26, 26, 26, 0.8); - background: rgba(26, 26, 26, 0.6); - transition: all 0.6s ease-in-out; - -webkit-transition: all 0.6s ease-in-out; - border: 1px solid #7d7d7d30; -} - -body.dark .author-profile .meta:hover { - box-shadow: 0 1px 30px -2px var(--theme-skin-dark) !important; - background: rgba(26, 26, 26, 0.8); - transition: all 0.6s ease-in-out; - -webkit-transition: all 0.6s ease-in-out; -} - -body.dark .author-profile .desc { - box-shadow: 0 1px 20px 2px rgba(26, 26, 26, 0.8); - background: rgba(26, 26, 26, 0.6); - transition: all 0.6s ease-in-out; - -webkit-transition: all 0.6s ease-in-out; - border: 1px solid #7d7d7d30; -} - -body.dark .author-profile .desc:hover { - box-shadow: 0 1px 30px -2px var(--theme-skin-dark) !important; - background: rgba(26, 26, 26, 0.8); - transition: all 0.6s ease-in-out; - -webkit-transition: all 0.6s ease-in-out; +body.dark .post-footer>:not(section):hover,body.dark .post-footer >section > :hover { + box-shadow: 0 1px 30px -2px var(--theme-skin-dark); + background: #1a1a1acc; } body.dark .ai-excerpt { From 314a09aed603827a76c1a70a40a73c9379488f24 Mon Sep 17 00:00:00 2001 From: KotoriK <52659125+KotoriK@users.noreply.github.com> Date: Thu, 10 Oct 2024 16:52:19 +0800 Subject: [PATCH 028/122] =?UTF-8?q?perf(=E6=96=87=E7=AB=A0=E8=AF=84?= =?UTF-8?q?=E8=AE=BA):=20=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit deprecate cmt_showPopup --- comments.php | 6 ++--- inc/decorate.php | 3 +++ style.css | 70 ++++++++++++++++++------------------------------ 3 files changed, 32 insertions(+), 47 deletions(-) diff --git a/comments.php b/comments.php index c5450ed3..b14ffdbb 100644 --- a/comments.php +++ b/comments.php @@ -141,11 +141,11 @@ 'fields' => apply_filters( 'comment_form_default_fields', array( 'avatar' => '%title
' . + '' . $robot_comments . $private_ms . $mail_notify , + '', 'author' => - ' ', + ' ', 'email' => - '' . __("You will receive notification by email", "sakurairo")/*你将收到回复通知*/ . '', + '' . __("You will receive notification by email", "sakurairo")/*你将收到回复通知*/ . '', 'url' => - '' . __("Advertisement is forbidden 😀", "sakurairo")/*禁止小广告😀*/ . '' . __("Advertisement is forbidden 😀", "sakurairo")/*禁止小广告😀*/ . '' . $robot_comments . $private_ms . $mail_notify , 'qq' => '' ) diff --git a/inc/decorate.php b/inc/decorate.php index 97ffb80b..b2590070 100644 --- a/inc/decorate.php +++ b/inc/decorate.php @@ -495,6 +495,9 @@ function customizer_css() { ?> /*背景类*/ .comment-respond textarea { background-image: url(=iro_opt('comment_area_image'); ?>); +background-size: contain; +background-repeat: no-repeat; +background-position: right; } .search-form.is-visible{ diff --git a/style.css b/style.css index 64bf5ef3..ed8c82f2 100644 --- a/style.css +++ b/style.css @@ -2359,43 +2359,30 @@ nav#comments-navi { -webkit-transition: all 0.6s ease-in-out; } -.comment-respond input { +.comment-respond input, +.comment-respond textarea { font-size: 14px; - width: 100% - /*!covered31.3%*/ - ; + width: 100%; margin: 0; - padding: 15px; color: #535a63; - border: 1px solid #ddd - /*!covered0*/ - ; - background: #FFF; - background-color: rgba(255, 255, 255, 0); + background: #FFF0; font-weight: var(--global-font-weight); + transition:border-color .2s ease-in-out; + -webkit-transition:border-color .2s ease-in-out; +} +.comment-respond input { + padding: 15px; } .comment-respond textarea { - font-size: 14px; - width: 100% - /*!covered31.3%*/ - ; - margin: 0; - padding: 21px 21px 20px; - color: #535a63; - border: 1px solid var(--article-theme-highlight,var(--theme-skin-matching)); - background: #FFF; + padding: 20px; display: block; float: none; height: 180px; margin-bottom: 10px; background-color: transparent; - background-size: contain; - background-repeat: no-repeat; - background-position: right; resize: vertical; - font-weight: var(--global-font-weight); } .graybar a{ @@ -6249,15 +6236,18 @@ span.time { width: 180%; } -form#commentform, +form#commentform,.comment-respond textarea:active, +.comment-respond textarea:focus, .comment-respond input:active, -.comment-respond input:focus, -.comment-respond textarea:active, -.comment-respond textarea:focus { +.comment-respond input:focus{ outline: 0; width: 100%; } +body.dark .comment-respond :where(textarea,input):where(:focus,:active){ + border: 1px solid var(--article-theme-highlight,var(--theme-skin-matching)); +} + span.page-numbers.current { color: var(--theme-skin, #505050); padding: 0 5px; @@ -6401,8 +6391,7 @@ a.page-numbers { } .commentbody:focus { - border-color: var(--theme-skin, #505050) !important; - transition: border-color .25s; + border-color: var(--theme-skin, #505050); } .comment-respond input[type=submit]:hover { @@ -7164,10 +7153,10 @@ a.toc-link { margin-left: 70px; } -.popup .show { +.popup input:focus+.popuptext { visibility: visible; - -webkit-animation: blur .8s; - animation: blur .8s; + -webkit-animation: blur .4s; + animation: blur .4s; } .insert-image-tips:hover, @@ -7797,17 +7786,10 @@ body:not(.heimu_toggle_on) .new:hover .heimu.off { @keyframes blur { 0% { - -webkit-filter: blur(10px); - -moz-filter: blur(10px); - -ms-filter: blur(10px); - filter: blur(10px); - } - - 50% { - -webkit-filter: blur(5px); - -moz-filter: blur(5px); - -ms-filter: blur(5px); - filter: blur(5px); + -webkit-filter: blur(8px); + -moz-filter: blur(8px); + -ms-filter: blur(8px); + filter: blur(8px); } 100% { @@ -10567,7 +10549,7 @@ body.dark .shuoshuo-title h3 { -webkit-transition: all 0.6s ease-in-out; } -body.dark .shuoshuo-comments,body.dark .shuoshuo-date { +body.dark .shuoshuo-comments,body.dark .shuoshuo-date { color: #abababab; transition: all 0.6s ease-in-out; -webkit-transition: all 0.6s ease-in-out; From c4b0e64fbad02ba60cdd26c14ac52a1025d33383 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9F=93=E5=B7=9D=20=E7=9E=B3?=Date: Thu, 10 Oct 2024 18:04:29 +0900 Subject: [PATCH 029/122] Daily Update --- inc/decorate.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/inc/decorate.php b/inc/decorate.php index b2590070..8494292d 100644 --- a/inc/decorate.php +++ b/inc/decorate.php @@ -344,10 +344,12 @@ function customizer_css() { ?> /*深色模式控件透明度*/ body.dark .header-info, -body.dark .header-shuo, -body.dark .top-social img +body.dark .header-shuo {color:#fff;background:rgba(51,51,51,=iro_opt('theme_darkmode_widget_transparency'); ?>);transition: all 0.6s ease-in-out;} +body.dark .top-social img +{background:rgba(51,51,51,=iro_opt('theme_darkmode_widget_transparency'); ?>);transition: all 0.6s ease-in-out;} + body.dark .top-social_v2 i {color:#ababab;transition: all 0.6s ease-in-out;} From b9599ffbc4d2809be4126f050a7ecfa95a1cb10e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9F=93=E5=B7=9D=20=E7=9E=B3?= Date: Thu, 10 Oct 2024 20:22:03 +0900 Subject: [PATCH 030/122] Daily Update --- functions.php | 39 +++++++-------------------------------- 1 file changed, 7 insertions(+), 32 deletions(-) diff --git a/functions.php b/functions.php index 9af438e4..49f81831 100644 --- a/functions.php +++ b/functions.php @@ -602,7 +602,7 @@ function visual_resource_updates($specified_version, $option_name, $new_value) $current_version = $theme->get('Version'); // Check if the function has already been triggered - $function_triggered = get_transient('visual_resource_updates_triggered18'); + $function_triggered = get_transient('visual_resource_updates_triggered19'); if ($function_triggered) { return; // Function has already been triggered, do nothing } @@ -617,11 +617,11 @@ function visual_resource_updates($specified_version, $option_name, $new_value) iro_opt_update($option_name, $option_value); // Set transient to indicate that the function has been triggered - set_transient('visual_resource_updates_triggered18', true); + set_transient('visual_resource_updates_triggered19', true); } } -visual_resource_updates('2.5.6', 'vision_resource_basepath', '2.6/'); +visual_resource_updates('2.5.6', 'vision_resource_basepath', '2.7/'); function gfonts_updates($specified_version, $option_name) { @@ -629,7 +629,7 @@ function gfonts_updates($specified_version, $option_name) $current_version = $theme->get('Version'); // Check if the function has already been triggered - $function_triggered = get_transient('gfonts_updates_triggered18'); + $function_triggered = get_transient('gfonts_updates_triggered19'); if ($function_triggered) { return; // Function has already been triggered, do nothing } @@ -642,7 +642,7 @@ function gfonts_updates($specified_version, $option_name) } // Set transient to indicate that the function has been triggered - set_transient('gfonts_updates_triggered18', true); + set_transient('gfonts_updates_triggered19', true); } } @@ -654,7 +654,7 @@ function gravater_updates($specified_version, $option_name) $current_version = $theme->get('Version'); // Check if the function has already been triggered - $function_triggered = get_transient('gravater_updates_triggered181'); + $function_triggered = get_transient('gravater_updates_triggered19'); if ($function_triggered) { return; // Function has already been triggered, do nothing } @@ -667,37 +667,12 @@ function gravater_updates($specified_version, $option_name) } // Set transient to indicate that the function has been triggered - set_transient('gravater_updates_triggered181', true); + set_transient('gravater_updates_triggered19', true); } } gravater_updates('2.5.6', 'gravatar_proxy'); -function chatgpt_updates($specified_version, $option_name) -{ - $theme = wp_get_theme(); - $current_version = $theme->get('Version'); - - // Check if the function has already been triggered - $function_triggered = get_transient('chatgpt_updates_triggered18'); - if ($function_triggered) { - return; // Function has already been triggered, do nothing - } - - if (version_compare($current_version, $specified_version, '>')) { - $option_value = iro_opt($option_name); - if (empty($option_value) || $option_value !== 'https://openai.fuukei.org/') { - $option_value = 'https://openai.fuukei.org/'; - iro_opt_update($option_name, $option_value); - } - - // Set transient to indicate that the function has been triggered - set_transient('chatgpt_updates_triggered18', true); - } -} - -chatgpt_updates('2.6.3.1', 'chatgpt_base_url'); - /* * 阻止站内文章互相Pingback */ From c88bcbe5e815514543233b22611b90c5d154105d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9F=93=E5=B7=9D=20=E7=9E=B3?= Date: Thu, 10 Oct 2024 20:40:26 +0900 Subject: [PATCH 031/122] Daily Update --- layouts/imgbox.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layouts/imgbox.php b/layouts/imgbox.php index de696c18..0111c354 100644 --- a/layouts/imgbox.php +++ b/layouts/imgbox.php @@ -36,7 +36,7 @@ if (iro_opt('email_name') && iro_opt('email_domain')): ?> + src="" style="" />