<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://xiarenwiki.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=%E8%99%BE%E4%BB%81</id>
	<title>虾仁维基 - 用户贡献 [zh-cn]</title>
	<link rel="self" type="application/atom+xml" href="https://xiarenwiki.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=%E8%99%BE%E4%BB%81"/>
	<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E7%89%B9%E6%AE%8A:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/%E8%99%BE%E4%BB%81"/>
	<updated>2026-09-28T01:47:19Z</updated>
	<subtitle>用户贡献</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=MediaWiki:Common.css&amp;diff=224</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=MediaWiki:Common.css&amp;diff=224"/>
		<updated>2026-07-31T08:39:16Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​v3.1 抽屉滚动兜底&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:root {&lt;br /&gt;
  --xr-red: #C41E3A;&lt;br /&gt;
  --xr-red-dark: #9B182D;&lt;br /&gt;
  --xr-paper: #F5F0E8;&lt;br /&gt;
  --xr-paper-dark: #E8E1D5;&lt;br /&gt;
  --xr-ink: #333333;&lt;br /&gt;
  --xr-bamboo: #2E5A3B;&lt;br /&gt;
  --xr-link: #1A5276;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body.skin-vector-legacy {&lt;br /&gt;
  background-color: var(--xr-paper);&lt;br /&gt;
  background-image: linear-gradient(180deg, #F5F0E8 0%, #EDE6D8 100%);&lt;br /&gt;
  color: var(--xr-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-head-base {&lt;br /&gt;
  background: var(--xr-red);&lt;br /&gt;
  height: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-page-base {&lt;br /&gt;
  background: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body {&lt;br /&gt;
  background: #FFFFFF;&lt;br /&gt;
  border: 1px solid var(--xr-paper-dark);&lt;br /&gt;
  box-shadow: 0 2px 12px rgba(0,0,0,0.06);&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1, h2, h3, h4, h5, h6 {&lt;br /&gt;
  font-family: &amp;quot;KaiTi&amp;quot;, &amp;quot;STKaiti&amp;quot;, &amp;quot;BiauKai&amp;quot;, &amp;quot;SimSun&amp;quot;, serif;&lt;br /&gt;
  color: var(--xr-red-dark);&lt;br /&gt;
  border-bottom: 2px solid var(--xr-paper-dark);&lt;br /&gt;
  padding-bottom: 0.3em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a, .mw-parser-output a.external {&lt;br /&gt;
  color: var(--xr-link);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a:hover, a:focus {&lt;br /&gt;
  color: var(--xr-red);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-tabs .mw-list-item a {&lt;br /&gt;
  border-radius: 4px 4px 0 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-tabs .mw-list-item.selected a {&lt;br /&gt;
  background: #FFFFFF;&lt;br /&gt;
  color: var(--xr-red);&lt;br /&gt;
  border-top: 2px solid var(--xr-red);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-panel .vector-menu-heading {&lt;br /&gt;
  color: var(--xr-red-dark);&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  font-family: &amp;quot;KaiTi&amp;quot;, &amp;quot;STKaiti&amp;quot;, serif;&lt;br /&gt;
  border-bottom: 1px solid var(--xr-paper-dark);&lt;br /&gt;
  padding-bottom: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .toc,&lt;br /&gt;
#toc,&lt;br /&gt;
.toc {&lt;br /&gt;
  background: var(--xr-paper);&lt;br /&gt;
  border: 1px solid var(--xr-paper-dark);&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .toc .toctitle h2,&lt;br /&gt;
.toc .toctitle h2 {&lt;br /&gt;
  color: var(--xr-red-dark);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-logo a {&lt;br /&gt;
  background-size: contain;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-head {&lt;br /&gt;
  background: rgba(255,255,255,0.92);&lt;br /&gt;
  backdrop-filter: blur(4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-editsection a {&lt;br /&gt;
  color: var(--xr-bamboo);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#footer {&lt;br /&gt;
  border-top: 1px solid var(--xr-paper-dark);&lt;br /&gt;
  padding-top: 1em;&lt;br /&gt;
}&lt;br /&gt;
/* ===== 竖排导航栏美化 + 古风字体（audit 2026-07-30）===== */&lt;br /&gt;
/* 古卷新墨：侧栏与正文统一用典雅宋体，呼应以卷为载体的调性 */&lt;br /&gt;
#mw-panel,&lt;br /&gt;
.mw-body-content {&lt;br /&gt;
    font-family: &amp;quot;Noto Serif SC&amp;quot;, &amp;quot;Source Han Serif SC&amp;quot;, &amp;quot;Songti SC&amp;quot;, &amp;quot;STSong&amp;quot;, &amp;quot;SimSun&amp;quot;, serif;&lt;br /&gt;
}&lt;br /&gt;
/* 侧栏条目：朱砂微光悬浮，提升可读与质感 */&lt;br /&gt;
#mw-panel .mw-list-item a {&lt;br /&gt;
    padding: 4px 8px;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    transition: background-color .2s ease, color .2s ease;&lt;br /&gt;
}&lt;br /&gt;
#mw-panel .mw-list-item a:hover {&lt;br /&gt;
    color: #C41E3A;&lt;br /&gt;
    background: rgba(196, 30, 58, 0.06);&lt;br /&gt;
}&lt;br /&gt;
/* 侧栏分组标题（如「创作与治理」）加一抹朱砂，强化层级 */&lt;br /&gt;
#mw-panel .vector-menu-heading,&lt;br /&gt;
#mw-panel .mw-portlet h3,&lt;br /&gt;
#p-navigation h3 {&lt;br /&gt;
    color: #9B182D;&lt;br /&gt;
    letter-spacing: .08em;&lt;br /&gt;
}&lt;br /&gt;
/* ===== 左侧栏目录修复（2026-07-30）===== */&lt;br /&gt;
/* 避免文章目录被某些浏览器/扩展渲染到 #mw-panel，导致侧栏过长 */&lt;br /&gt;
#mw-panel .toc,&lt;br /&gt;
#mw-panel #toc,&lt;br /&gt;
.vector-legacy-sidebar .toc {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== 自定义侧栏导航 xn-* 古风样式（2026-07-30）===== */&lt;br /&gt;
#mw-panel {&lt;br /&gt;
    font-family: &amp;quot;Noto Serif SC&amp;quot;, &amp;quot;Source Han Serif SC&amp;quot;, &amp;quot;Songti SC&amp;quot;, &amp;quot;STSong&amp;quot;, &amp;quot;SimSun&amp;quot;, serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* 搜索框 */&lt;br /&gt;
.xn-search { padding: 0 12px 10px; }&lt;br /&gt;
.xn-search-input {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    box-sizing: border-box;&lt;br /&gt;
    padding: 6px 10px;&lt;br /&gt;
    background: #FBF7F0;&lt;br /&gt;
    border: 1px solid #E0D5C5;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-family: &amp;quot;Noto Serif SC&amp;quot;, &amp;quot;Songti SC&amp;quot;, &amp;quot;SimSun&amp;quot;, serif;&lt;br /&gt;
    font-size: 0.85em;&lt;br /&gt;
    color: #5a4a3a;&lt;br /&gt;
    transition: border-color .2s ease, box-shadow .2s ease;&lt;br /&gt;
}&lt;br /&gt;
.xn-search-input:focus {&lt;br /&gt;
    outline: none;&lt;br /&gt;
    border-color: #C41E3A;&lt;br /&gt;
    box-shadow: 0 0 0 2px rgba(196,30,58,0.12);&lt;br /&gt;
}&lt;br /&gt;
.xn-search-input::placeholder { color: #B0A090; }&lt;br /&gt;
&lt;br /&gt;
/* 分组容器 */&lt;br /&gt;
.xn-section { margin-bottom: 2px; }&lt;br /&gt;
&lt;br /&gt;
/* 分组标题 */&lt;br /&gt;
.xn-header {&lt;br /&gt;
    padding: 8px 12px 6px;&lt;br /&gt;
    font-size: 0.82em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    letter-spacing: .08em;&lt;br /&gt;
    color: #9B182D;&lt;br /&gt;
    border-bottom: 1px solid rgba(196,30,58,0.15);&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    user-select: none;&lt;br /&gt;
    transition: background-color .2s ease;&lt;br /&gt;
    position: relative;&lt;br /&gt;
}&lt;br /&gt;
.xn-header:hover { background: rgba(196,30,58,0.05); }&lt;br /&gt;
.xn-header::before {&lt;br /&gt;
    content: &#039;&#039;;&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    width: 3px;&lt;br /&gt;
    height: 0.9em;&lt;br /&gt;
    background: #C41E3A;&lt;br /&gt;
    margin-right: 7px;&lt;br /&gt;
    vertical-align: middle;&lt;br /&gt;
    border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
.xn-header::after {&lt;br /&gt;
    content: &#039;▾&#039;;&lt;br /&gt;
    float: right;&lt;br /&gt;
    color: #B0A090;&lt;br /&gt;
    font-size: 0.9em;&lt;br /&gt;
    transition: transform .2s ease;&lt;br /&gt;
}&lt;br /&gt;
.xn-header.xn-collapsed::after {&lt;br /&gt;
    transform: rotate(-90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* 子分组标题 */&lt;br /&gt;
.xn-subheader, .xn-subsubheader {&lt;br /&gt;
    padding: 5px 12px 4px 22px;&lt;br /&gt;
    font-size: 0.8em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #7a2a3a;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    user-select: none;&lt;br /&gt;
}&lt;br /&gt;
.xn-subheader::after, .xn-subsubheader::after {&lt;br /&gt;
    content: &#039;▾&#039;;&lt;br /&gt;
    float: right;&lt;br /&gt;
    color: #C0B0A0;&lt;br /&gt;
    font-size: 0.85em;&lt;br /&gt;
    transition: transform .2s ease;&lt;br /&gt;
}&lt;br /&gt;
.xn-subheader.xn-collapsed::after, .xn-subsubheader.xn-collapsed::after {&lt;br /&gt;
    transform: rotate(-90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* 链接条目 */&lt;br /&gt;
.xn-body, .xn-subbody, .xn-subsubbody { overflow: hidden; }&lt;br /&gt;
.xn-link { padding: 0; }&lt;br /&gt;
.xn-link a {&lt;br /&gt;
    display: block;&lt;br /&gt;
    padding: 4px 12px 4px 22px;&lt;br /&gt;
    color: #4a3a2a;&lt;br /&gt;
    font-size: 0.82em;&lt;br /&gt;
    line-height: 1.5;&lt;br /&gt;
    transition: background-color .15s ease, color .15s ease, padding-left .15s ease;&lt;br /&gt;
}&lt;br /&gt;
.xn-link a:hover {&lt;br /&gt;
    color: #C41E3A;&lt;br /&gt;
    background: rgba(196,30,58,0.06);&lt;br /&gt;
    padding-left: 26px;&lt;br /&gt;
}&lt;br /&gt;
.xn-subbody .xn-link a { padding-left: 34px; }&lt;br /&gt;
.xn-subbody .xn-link a:hover { padding-left: 38px; }&lt;br /&gt;
.xn-subsubbody .xn-link a { padding-left: 46px; }&lt;br /&gt;
.xn-subsubbody .xn-link a:hover { padding-left: 50px; }&lt;br /&gt;
&lt;br /&gt;
/* 缺失页面 */&lt;br /&gt;
.xn-missing a { color: #b07070; font-style: italic; }&lt;br /&gt;
.xn-missing a:hover { color: #C41E3A; }&lt;br /&gt;
&lt;br /&gt;
/* ＋ 新增按钮 */&lt;br /&gt;
.xn-plus {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    margin-left: 4px;&lt;br /&gt;
    color: #2E5A3B !important;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    font-size: 0.85em;&lt;br /&gt;
    opacity: 0.5;&lt;br /&gt;
    transition: opacity .2s ease;&lt;br /&gt;
}&lt;br /&gt;
.xn-plus:hover { opacity: 1; }&lt;br /&gt;
&lt;br /&gt;
/* 单独链接（共创入口）*/&lt;br /&gt;
.xn-single {&lt;br /&gt;
    margin: 6px 12px;&lt;br /&gt;
    padding: 8px 10px;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    background: rgba(196,30,58,0.06);&lt;br /&gt;
    border: 1px solid rgba(196,30,58,0.2);&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    transition: background-color .2s ease;&lt;br /&gt;
}&lt;br /&gt;
.xn-single a {&lt;br /&gt;
    color: #C41E3A;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    letter-spacing: .05em;&lt;br /&gt;
}&lt;br /&gt;
.xn-single:hover { background: rgba(196,30,58,0.12); }&lt;br /&gt;
&lt;br /&gt;
/* 当前页高亮 */&lt;br /&gt;
.xn-active {&lt;br /&gt;
    color: #C41E3A !important;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    background: rgba(196,30,58,0.1) !important;&lt;br /&gt;
    border-left: 3px solid #C41E3A;&lt;br /&gt;
    padding-left: 19px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* 加载状态 */&lt;br /&gt;
.xn-loading {&lt;br /&gt;
    padding: 8px 12px 8px 22px;&lt;br /&gt;
    color: #B0A090;&lt;br /&gt;
    font-size: 0.8em;&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* 发现更多作品 */&lt;br /&gt;
.xn-add-work a {&lt;br /&gt;
    color: #2E5A3B;&lt;br /&gt;
    font-size: 0.8em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
    padding: 6px 12px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== 作品层级样式（xn-work-title，2026-07-30）===== */&lt;br /&gt;
/* 作品标题：缩进一级，字号略小，颜色稍淡 */&lt;br /&gt;
.xn-work-title {&lt;br /&gt;
    padding: 5px 12px 4px 22px;&lt;br /&gt;
    font-size: 0.8em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #7a2a3a;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    user-select: none;&lt;br /&gt;
    transition: background-color .2s ease;&lt;br /&gt;
}&lt;br /&gt;
.xn-work-title:hover { background: rgba(196,30,58,0.04); }&lt;br /&gt;
.xn-work-title::after {&lt;br /&gt;
    content: &#039;\25BE&#039;;&lt;br /&gt;
    float: right;&lt;br /&gt;
    color: #C0B0A0;&lt;br /&gt;
    font-size: 0.85em;&lt;br /&gt;
    transition: transform .2s ease;&lt;br /&gt;
}&lt;br /&gt;
.xn-work-title.xn-collapsed::after {&lt;br /&gt;
    transform: rotate(-90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* 作品子项整体缩进：比作品标题再深一级 */&lt;br /&gt;
.xn-work .xn-body &amp;gt; .xn-link a { padding-left: 34px; }&lt;br /&gt;
.xn-work .xn-body &amp;gt; .xn-link a:hover { padding-left: 38px; }&lt;br /&gt;
&lt;br /&gt;
/* 剧情层标题跟作品子项对齐 */&lt;br /&gt;
.xn-work .xn-body &amp;gt; .xn-subsection &amp;gt; .xn-subheader { padding-left: 34px; }&lt;br /&gt;
&lt;br /&gt;
/* 剧情层下段落标题再深一级 */&lt;br /&gt;
.xn-work .xn-body &amp;gt; .xn-subsection &amp;gt; .xn-subbody &amp;gt; .xn-subsubsection &amp;gt; .xn-subsubheader { padding-left: 46px; }&lt;br /&gt;
&lt;br /&gt;
/* 段落详情条目最深 */&lt;br /&gt;
.xn-work .xn-body &amp;gt; .xn-subsection &amp;gt; .xn-subbody &amp;gt; .xn-subsubsection &amp;gt; .xn-subsubbody .xn-link a { padding-left: 58px; }&lt;br /&gt;
.xn-work .xn-body &amp;gt; .xn-subsection &amp;gt; .xn-subbody &amp;gt; .xn-subsubsection &amp;gt; .xn-subsubbody .xn-link a:hover { padding-left: 62px; }&lt;br /&gt;
/* ===== 移动端（Minerva 皮肤）自定义导航适配（2026-07-30 v3）===== */&lt;br /&gt;
.xn-mobile {&lt;br /&gt;
    padding: 10px 0;&lt;br /&gt;
    border-bottom: 1px solid rgba(196,30,58,0.15);&lt;br /&gt;
    margin-bottom: 10px;&lt;br /&gt;
    font-family: &amp;quot;Noto Serif SC&amp;quot;, &amp;quot;Source Han Serif SC&amp;quot;, &amp;quot;Songti SC&amp;quot;, &amp;quot;STSong&amp;quot;, &amp;quot;SimSun&amp;quot;, serif;&lt;br /&gt;
}&lt;br /&gt;
.xn-mobile .xn-search { padding: 4px 16px 12px; }&lt;br /&gt;
.xn-mobile .xn-search-input { font-size: 16px; padding: 11px 12px; }&lt;br /&gt;
.xn-mobile .xn-header { font-size: 1rem; padding: 14px 16px 12px; }&lt;br /&gt;
.xn-mobile .xn-header::before { width: 4px; height: 1em; margin-right: 8px; }&lt;br /&gt;
.xn-mobile .xn-link a { padding: 13px 16px 13px 28px; font-size: 1rem; line-height: 1.4; }&lt;br /&gt;
.xn-mobile .xn-link a:hover { padding-left: 32px; }&lt;br /&gt;
.xn-mobile .xn-subbody .xn-link a { padding-left: 40px; }&lt;br /&gt;
.xn-mobile .xn-subbody .xn-link a:hover { padding-left: 44px; }&lt;br /&gt;
.xn-mobile .xn-subsubbody .xn-link a { padding-left: 52px; }&lt;br /&gt;
.xn-mobile .xn-subsubbody .xn-link a:hover { padding-left: 56px; }&lt;br /&gt;
.xn-mobile .xn-work-title { font-size: 0.95rem; padding: 13px 16px 11px 28px; }&lt;br /&gt;
.xn-mobile .xn-subheader, .xn-mobile .xn-subsubheader { padding: 12px 16px 10px 32px; font-size: 0.92rem; }&lt;br /&gt;
.xn-mobile .xn-single { margin: 12px 16px; padding: 13px 10px; }&lt;br /&gt;
.xn-mobile .xn-active { padding-left: 25px !important; }&lt;br /&gt;
.xn-mobile .xn-loading { padding: 12px 16px 12px 28px; font-size: 0.9em; }&lt;br /&gt;
.xn-mobile .xn-add-work a { padding: 10px 16px; }&lt;br /&gt;
/* 抽屉滚动兜底：自定义导航插入后内容变长，保证抽屉可滚动、底部条目不被截断 */&lt;br /&gt;
#mw-mf-page-left.menu { overflow-y: auto; -webkit-overflow-scrolling: touch; }&lt;br /&gt;
/* 展开/折叠动画走 GPU 合成层，保持 60fps */&lt;br /&gt;
.xn-mobile .xn-body, .xn-mobile .xn-subbody, .xn-mobile .xn-subsubbody { will-change: height; }&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=MediaWiki:Common.js&amp;diff=223</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=MediaWiki:Common.js&amp;diff=223"/>
		<updated>2026-07-31T08:39:15Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​v3.1 修正 Minerva 抽屉挂载点&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* 虾仁维基 - 自定义侧边栏导航 v3.0 */&lt;br /&gt;
/* 优化：古风主题统一、健壮初始化、精致样式、移动端(Minerva)适配 */&lt;br /&gt;
/* 最后更新: 2026-07-30 */&lt;br /&gt;
&lt;br /&gt;
(function ($, mw) {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
    var COLLAPSE_KEY = &#039;xiarenwiki-nav-v2&#039;;&lt;br /&gt;
    var WORKS = [&#039;我在大明那些年&#039;, &#039;彼岸轮回&#039;, &#039;一品布衣&#039;];&lt;br /&gt;
    var WORK_DIRECT = [&#039;宇宙层&#039;, &#039;人物&#039;, &#039;世界观&#039;, &#039;设定&#039;];&lt;br /&gt;
&lt;br /&gt;
    function init() {&lt;br /&gt;
        var wgIsArticle = mw.config.get(&#039;wgIsArticle&#039;);&lt;br /&gt;
        var wgCanonicalSpecialPageName = mw.config.get(&#039;wgCanonicalSpecialPageName&#039;);&lt;br /&gt;
        if (!wgIsArticle &amp;amp;&amp;amp; wgCanonicalSpecialPageName) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        var skin = mw.config.get(&#039;skin&#039;);&lt;br /&gt;
        var isMobile = (skin === &#039;minerva&#039; || skin === &#039;minerva-vec&#039;);&lt;br /&gt;
        mw.loader.using(&#039;mediawiki.api&#039;).then(function () {&lt;br /&gt;
            if (isMobile) {&lt;br /&gt;
                waitForMobileDrawer(function ($host) {&lt;br /&gt;
                    buildNav($host, true);&lt;br /&gt;
                });&lt;br /&gt;
            } else {&lt;br /&gt;
                waitForPanel(function ($panel) {&lt;br /&gt;
                    buildNav($panel, false);&lt;br /&gt;
                });&lt;br /&gt;
            }&lt;br /&gt;
        }).catch(function (e) {&lt;br /&gt;
            console.error(&#039;[虾仁导航] 依赖加载失败，降级构建&#039;, e);&lt;br /&gt;
            if (isMobile) {&lt;br /&gt;
                waitForMobileDrawer(function ($host) {&lt;br /&gt;
                    buildNav($host, true);&lt;br /&gt;
                });&lt;br /&gt;
            } else {&lt;br /&gt;
                waitForPanel(function ($panel) {&lt;br /&gt;
                    buildNav($panel, false);&lt;br /&gt;
                });&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function waitForPanel(cb) {&lt;br /&gt;
        var $panel = $(&#039;#mw-panel&#039;);&lt;br /&gt;
        if ($panel.length) return cb($panel);&lt;br /&gt;
        var tries = 0;&lt;br /&gt;
        var timer = setInterval(function () {&lt;br /&gt;
            $panel = $(&#039;#mw-panel&#039;);&lt;br /&gt;
            if ($panel.length || ++tries &amp;gt; 50) {&lt;br /&gt;
                clearInterval(timer);&lt;br /&gt;
                if ($panel.length) cb($panel);&lt;br /&gt;
            }&lt;br /&gt;
        }, 100);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Minerva 抽屉真实结构:&lt;br /&gt;
     *   &amp;lt;nav class=&amp;quot;navigation-drawer toggle-list&amp;quot;&amp;gt;&lt;br /&gt;
     *     &amp;lt;input id=&amp;quot;main-menu-input&amp;quot; class=&amp;quot;toggle-list__checkbox&amp;quot;&amp;gt;   &amp;lt;- checkbox hack 开关&lt;br /&gt;
     *     &amp;lt;label for=&amp;quot;main-menu-input&amp;quot;&amp;gt;                                &amp;lt;- 汉堡按钮&lt;br /&gt;
     *     &amp;lt;div id=&amp;quot;mw-mf-page-left&amp;quot; class=&amp;quot;menu&amp;quot;&amp;gt;  &amp;lt;- 抽屉内容, 由 #main-menu-input:checked ~ 控制显隐&lt;br /&gt;
     * 必须挂到 #mw-mf-page-left 内部; 若挂到外层 &amp;lt;nav&amp;gt;, 内容会插在 checkbox 之前,&lt;br /&gt;
     * 脱离 checkbox hack 的兄弟选择器控制, 变成常驻页头, 破坏 header 布局。&lt;br /&gt;
     */&lt;br /&gt;
    function waitForMobileDrawer(cb) {&lt;br /&gt;
        var tries = 0;&lt;br /&gt;
        function tryFind() {&lt;br /&gt;
            var $host = $(&#039;#mw-mf-page-left&#039;);&lt;br /&gt;
            if (!$host.length) $host = $(&#039;.navigation-drawer .menu&#039;);&lt;br /&gt;
            if (!$host.length) $host = $(&#039;.navigation-drawer #p-navigation&#039;).parent();&lt;br /&gt;
            if ($host.length) return cb($host.first());&lt;br /&gt;
            if (++tries &amp;gt; 60) return;&lt;br /&gt;
            setTimeout(tryFind, 100);&lt;br /&gt;
        }&lt;br /&gt;
        tryFind();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function buildNav($panel, isMobile) {&lt;br /&gt;
        var html = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-search&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;form action=&amp;quot;&#039; + mw.util.getUrl(&#039;Special:Search&#039;) + &#039;&amp;quot; method=&amp;quot;get&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;search&amp;quot; class=&amp;quot;xn-search-input&amp;quot; placeholder=&amp;quot;检索典籍…&amp;quot; /&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;/form&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += section(&#039;Wiki&#039;, [&lt;br /&gt;
            [&#039;首页&#039;, &#039;首页&#039;],&lt;br /&gt;
            [&#039;Wiki简介&#039;, &#039;Wiki简介&#039;],&lt;br /&gt;
            [&#039;管理员告示&#039;, &#039;管理员告示&#039;],&lt;br /&gt;
            [&#039;随机页面&#039;, &#039;Special:Random&#039;],&lt;br /&gt;
            [&#039;快速搜索&#039;, &#039;Special:Search&#039;],&lt;br /&gt;
            [&#039;相关平台&#039;, &#039;相关平台&#039;],&lt;br /&gt;
            [&#039;Wiki源站点&#039;, &#039;Wiki源站点&#039;]&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
        html += section(&#039;虾仁简介&#039;, [&lt;br /&gt;
            [&#039;虾仁？&#039;, &#039;虾仁？&#039;],&lt;br /&gt;
            [&#039;虾仁共创收录规则&#039;, &#039;虾仁共创收录规则&#039;],&lt;br /&gt;
            [&#039;虾仁宇宙结构介绍&#039;, &#039;虾仁宇宙结构介绍&#039;]&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-section&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;universe&amp;quot;&amp;gt;虾仁宇宙&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-universe&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;xn-loading&amp;quot;&amp;gt;卷帙加载中…&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-section&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;literature&amp;quot;&amp;gt;虾仁文学&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-literature&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += link(&#039;创始宣言&#039;, &#039;创始宣言&#039;);&lt;br /&gt;
        html += link(&#039;虾仁六章&#039;, &#039;虾仁六章&#039;);&lt;br /&gt;
        html += link(&#039;虾仁异志&#039;, &#039;虾仁异志&#039;);&lt;br /&gt;
        html += link(&#039;虾仁诗作&#039;, &#039;虾仁诗作&#039;);&lt;br /&gt;
        html += link(&#039;虾仁音乐&#039;, &#039;虾仁音乐&#039;);&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-subsection&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-subheader xn-expandable&amp;quot; data-sid=&amp;quot;papers&amp;quot;&amp;gt;虾仁论文 &#039; + plus(&#039;虾仁论文&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-subbody&amp;quot; id=&amp;quot;xn-papers&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += link(&#039;去中心化创作模式的研究&#039;, &#039;去中心化创作模式的研究&#039;);&lt;br /&gt;
        html += link(&#039;数字时代的孙悟空&#039;, &#039;数字时代的孙悟空&#039;);&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += section(&#039;虾仁历史&#039;, [&lt;br /&gt;
            [&#039;起源&#039;, &#039;虾仁历史/起源&#039;],&lt;br /&gt;
            [&#039;传播&#039;, &#039;虾仁历史/传播&#039;],&lt;br /&gt;
            [&#039;转折&#039;, &#039;虾仁历史/转折&#039;],&lt;br /&gt;
            [&#039;爆发&#039;, &#039;虾仁历史/爆发&#039;],&lt;br /&gt;
            [&#039;危机&#039;, &#039;虾仁历史/危机&#039;],&lt;br /&gt;
            [&#039;转型&#039;, &#039;虾仁历史/转型&#039;]&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-single&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&#039; + url(&#039;共创入口&#039;) + &#039;&amp;quot;&amp;gt;共创入口&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        if (isMobile) {&lt;br /&gt;
            var $box = $(&#039;&amp;lt;section class=&amp;quot;xn-mobile&amp;quot;&amp;gt;&amp;lt;/section&amp;gt;&#039;);&lt;br /&gt;
            $box.html(html);&lt;br /&gt;
            $panel.prepend($box);&lt;br /&gt;
        } else {&lt;br /&gt;
            $panel.html(html);&lt;br /&gt;
        }&lt;br /&gt;
        restoreCollapse();&lt;br /&gt;
        bindEvents();&lt;br /&gt;
        highlightCurrent();&lt;br /&gt;
        loadUniverse();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function section(title, items) {&lt;br /&gt;
        var sid = title.replace(/[^a-z0-9\u4e00-\u9fff]/gi, &#039;&#039;).toLowerCase();&lt;br /&gt;
        var h = &#039;&amp;lt;div class=&amp;quot;xn-section&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        h += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + sid + &#039;&amp;quot;&amp;gt;&#039; + title + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        h += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-&#039; + sid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        for (var i = 0; i &amp;lt; items.length; i++) {&lt;br /&gt;
            h += link(items[i][0], items[i][1]);&lt;br /&gt;
        }&lt;br /&gt;
        h += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return h;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function link(label, page, cls) {&lt;br /&gt;
        return &#039;&amp;lt;div class=&amp;quot;xn-link&#039; + (cls ? &#039; &#039; + cls : &#039;&#039;) + &#039;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&#039; + url(page) + &#039;&amp;quot;&amp;gt;&#039; + label + &#039;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function url(page) { return mw.util.getUrl(page); }&lt;br /&gt;
&lt;br /&gt;
    function plus(page) {&lt;br /&gt;
        return &#039;&amp;lt;a class=&amp;quot;xn-plus&amp;quot; href=&amp;quot;&#039; + url(page) + &#039;?action=edit&amp;quot; title=&amp;quot;编辑/新增&amp;quot;&amp;gt;＋&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    async function loadUniverse() {&lt;br /&gt;
        var $body = $(&#039;#xn-universe&#039;);&lt;br /&gt;
        if (!$body.length) return;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            var api = new mw.Api();&lt;br /&gt;
            var html = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; WORKS.length; i++) {&lt;br /&gt;
                var work = WORKS[i];&lt;br /&gt;
                var workSid = &#039;work&#039; + i;&lt;br /&gt;
&lt;br /&gt;
                var subpages = [];&lt;br /&gt;
                try {&lt;br /&gt;
                    var result = await api.get({&lt;br /&gt;
                        action: &#039;query&#039;,&lt;br /&gt;
                        list: &#039;allpages&#039;,&lt;br /&gt;
                        apprefix: work + &#039;/&#039;,&lt;br /&gt;
                        aplimit: 100&lt;br /&gt;
                    });&lt;br /&gt;
                    subpages = result.query.allpages || [];&lt;br /&gt;
                } catch (e) {&lt;br /&gt;
                    console.error(&#039;[虾仁导航] API error for &#039; + work, e);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-work&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-work-title xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + workSid + &#039;&amp;quot;&amp;gt;&#039; + work + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-&#039; + workSid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
                var directSet = {};&lt;br /&gt;
                for (var j = 0; j &amp;lt; subpages.length; j++) {&lt;br /&gt;
                    var rel = subpages[j].title.substring(work.length + 1);&lt;br /&gt;
                    if (rel.indexOf(&#039;/&#039;) === -1) directSet[rel] = true;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                for (var k = 0; k &amp;lt; WORK_DIRECT.length; k++) {&lt;br /&gt;
                    var item = WORK_DIRECT[k];&lt;br /&gt;
                    var exists = directSet[item];&lt;br /&gt;
                    html += link(item, work + &#039;/&#039; + item, exists ? &#039;&#039; : &#039;xn-missing&#039;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                var plotSegs = [];&lt;br /&gt;
                for (j = 0; j &amp;lt; subpages.length; j++) {&lt;br /&gt;
                    rel = subpages[j].title.substring(work.length + 1);&lt;br /&gt;
                    var parts = rel.split(&#039;/&#039;);&lt;br /&gt;
                    if (parts.length === 2 &amp;amp;&amp;amp; parts[0] === &#039;剧情层&#039;) {&lt;br /&gt;
                        plotSegs.push(parts[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                var plotSid = workSid + &#039;plot&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-subsection&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-subheader xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + plotSid + &#039;&amp;quot;&amp;gt;剧情层 &#039; + plus(work + &#039;/剧情层&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-subbody&amp;quot; id=&amp;quot;xn-&#039; + plotSid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
                for (k = 0; k &amp;lt; plotSegs.length; k++) {&lt;br /&gt;
                    var seg = plotSegs[k];&lt;br /&gt;
                    var segSid = workSid + &#039;seg&#039; + k;&lt;br /&gt;
                    var segPage = work + &#039;/剧情层/&#039; + seg;&lt;br /&gt;
&lt;br /&gt;
                    var jinji = [];&lt;br /&gt;
                    try {&lt;br /&gt;
                        var segResult = await api.get({&lt;br /&gt;
                            action: &#039;query&#039;,&lt;br /&gt;
                            list: &#039;allpages&#039;,&lt;br /&gt;
                            apprefix: segPage + &#039;/&#039;,&lt;br /&gt;
                            aplimit: 50&lt;br /&gt;
                        });&lt;br /&gt;
                        var segPages = segResult.query.allpages || [];&lt;br /&gt;
                        for (var m = 0; m &amp;lt; segPages.length; m++) {&lt;br /&gt;
                            jinji.push(segPages[m].title.substring(segPage.length + 1));&lt;br /&gt;
                        }&lt;br /&gt;
                    } catch (e2) {}&lt;br /&gt;
&lt;br /&gt;
                    html += &#039;&amp;lt;div class=&amp;quot;xn-subsubsection&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
                    html += &#039;&amp;lt;div class=&amp;quot;xn-subsubheader xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + segSid + &#039;&amp;quot;&amp;gt;&#039; + seg + &#039; &#039; + plus(segPage) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                    html += &#039;&amp;lt;div class=&amp;quot;xn-subsubbody&amp;quot; id=&amp;quot;xn-&#039; + segSid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
                    for (m = 0; m &amp;lt; jinji.length; m++) {&lt;br /&gt;
                        html += link(jinji[m], segPage + &#039;/&#039; + jinji[m]);&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;xn-link xn-add-work&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&#039; + url(&#039;Special:Search&#039;) + &#039;&amp;quot; title=&amp;quot;搜索已有作品&amp;quot;&amp;gt;＋ 发现更多作品&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
            $body.html(html);&lt;br /&gt;
            restoreCollapse();&lt;br /&gt;
            bindEvents();&lt;br /&gt;
            highlightCurrent();&lt;br /&gt;
&lt;br /&gt;
        } catch (e) {&lt;br /&gt;
            console.error(&#039;[虾仁导航] 虾仁宇宙加载失败&#039;, e);&lt;br /&gt;
            $body.html(&#039;&amp;lt;div class=&amp;quot;xn-link&amp;quot;&amp;gt;(加载失败，请刷新)&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function highlightCurrent() {&lt;br /&gt;
        var currentTitle = mw.config.get(&#039;wgPageName&#039;);&lt;br /&gt;
        $(&#039;.xn-link a&#039;).each(function () {&lt;br /&gt;
            var href = $(this).attr(&#039;href&#039;);&lt;br /&gt;
            if (!href) return;&lt;br /&gt;
            var match = false;&lt;br /&gt;
            if (href.indexOf(&#039;title=&#039;) &amp;gt; 0) {&lt;br /&gt;
                var m = href.match(/title=([^&amp;amp;]+)/);&lt;br /&gt;
                if (m) match = decodeURIComponent(m[1]) === currentTitle;&lt;br /&gt;
            } else {&lt;br /&gt;
                var parts = href.split(&#039;/&#039;);&lt;br /&gt;
                var last = parts[parts.length - 1];&lt;br /&gt;
                match = decodeURIComponent(last) === currentTitle;&lt;br /&gt;
            }&lt;br /&gt;
            if (match) {&lt;br /&gt;
                $(this).addClass(&#039;xn-active&#039;);&lt;br /&gt;
                $(this).closest(&#039;.xn-link&#039;).addClass(&#039;xn-active-link&#039;);&lt;br /&gt;
                $(this).parents(&#039;.xn-body, .xn-subbody, .xn-subsubbody&#039;).each(function () {&lt;br /&gt;
                    $(this).show();&lt;br /&gt;
                    var sid = $(this).attr(&#039;id&#039;);&lt;br /&gt;
                    if (sid &amp;amp;&amp;amp; sid.indexOf(&#039;xn-&#039;) === 0) {&lt;br /&gt;
                        sid = sid.substring(3);&lt;br /&gt;
                        $(&#039;[data-sid=&amp;quot;&#039; + sid + &#039;&amp;quot;]&#039;).removeClass(&#039;xn-collapsed&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function bindEvents() {&lt;br /&gt;
        $(document).off(&#039;click.xn&#039;).on(&#039;click.xn&#039;, &#039;.xn-expandable&#039;, function (e) {&lt;br /&gt;
            if ($(e.target).closest(&#039;.xn-plus&#039;).length) return;&lt;br /&gt;
            var sid = $(this).data(&#039;sid&#039;);&lt;br /&gt;
            var $body = $(&#039;#xn-&#039; + sid);&lt;br /&gt;
            if (!$body.length) $body = $(this).next(&#039;.xn-body,.xn-subbody,.xn-subsubbody&#039;);&lt;br /&gt;
            if (!$body.length) return;&lt;br /&gt;
&lt;br /&gt;
            $body.slideToggle(150);&lt;br /&gt;
            $(this).toggleClass(&#039;xn-collapsed&#039;, !$body.is(&#039;:visible&#039;));&lt;br /&gt;
&lt;br /&gt;
            var state = loadState();&lt;br /&gt;
            state[sid] = $body.is(&#039;:visible&#039;);&lt;br /&gt;
            saveState(state);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function restoreCollapse() {&lt;br /&gt;
        var state = loadState();&lt;br /&gt;
        var defaults = { &#039;universe&#039;: true };&lt;br /&gt;
        for (var key in defaults) {&lt;br /&gt;
            if (!(key in state)) state[key] = defaults[key];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        Object.keys(state).forEach(function (sid) {&lt;br /&gt;
            var $header = $(&#039;[data-sid=&amp;quot;&#039; + sid + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            var $body = $(&#039;#xn-&#039; + sid);&lt;br /&gt;
            if (!$body.length) $body = $header.next(&#039;.xn-body,.xn-subbody,.xn-subsubbody&#039;);&lt;br /&gt;
            if (!$body.length) return;&lt;br /&gt;
&lt;br /&gt;
            if (state[sid]) {&lt;br /&gt;
                $body.show();&lt;br /&gt;
                $header.removeClass(&#039;xn-collapsed&#039;);&lt;br /&gt;
            } else {&lt;br /&gt;
                $body.hide();&lt;br /&gt;
                $header.addClass(&#039;xn-collapsed&#039;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function loadState() {&lt;br /&gt;
        try { return JSON.parse(localStorage.getItem(COLLAPSE_KEY) || &#039;{}&#039;); }&lt;br /&gt;
        catch (e) { return {}; }&lt;br /&gt;
    }&lt;br /&gt;
    function saveState(s) {&lt;br /&gt;
        try { localStorage.setItem(COLLAPSE_KEY, JSON.stringify(s)); }&lt;br /&gt;
        catch (e) {}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    $(init);&lt;br /&gt;
&lt;br /&gt;
})(jQuery, mediaWiki);&lt;br /&gt;
&lt;br /&gt;
/* ===== 虾仁AI 浮窗助手（2026-07-30 v2） ===== */&lt;br /&gt;
(function () {&lt;br /&gt;
  if (window.__xrAiInited) return;&lt;br /&gt;
  window.__xrAiInited = true;&lt;br /&gt;
&lt;br /&gt;
  function xrAvatar(size) {&lt;br /&gt;
    return &#039;&amp;lt;svg viewBox=&amp;quot;0 0 48 48&amp;quot; width=&amp;quot;&#039; + size + &#039;&amp;quot; height=&amp;quot;&#039; + size + &#039;&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;ellipse cx=&amp;quot;24&amp;quot; cy=&amp;quot;14.5&amp;quot; rx=&amp;quot;18&amp;quot; ry=&amp;quot;5.5&amp;quot; fill=&amp;quot;#caa53d&amp;quot;/&amp;gt;&amp;lt;ellipse cx=&amp;quot;24&amp;quot; cy=&amp;quot;14.5&amp;quot; rx=&amp;quot;18&amp;quot; ry=&amp;quot;5.5&amp;quot; fill=&amp;quot;none&amp;quot; stroke=&amp;quot;#a8842a&amp;quot; stroke-width=&amp;quot;0.8&amp;quot;/&amp;gt;&amp;lt;path d=&amp;quot;M13 14.5 Q24 2.5 35 14.5 Z&amp;quot; fill=&amp;quot;#d9b84a&amp;quot;/&amp;gt;&amp;lt;path d=&amp;quot;M13 14.5 Q24 2.5 35 14.5 Z&amp;quot; fill=&amp;quot;none&amp;quot; stroke=&amp;quot;#a8842a&amp;quot; stroke-width=&amp;quot;0.8&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;12.5&amp;quot; cy=&amp;quot;25&amp;quot; r=&amp;quot;6.5&amp;quot; fill=&amp;quot;#2c2c2c&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;35.5&amp;quot; cy=&amp;quot;25&amp;quot; r=&amp;quot;6.5&amp;quot; fill=&amp;quot;#2c2c2c&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;24&amp;quot; cy=&amp;quot;29&amp;quot; r=&amp;quot;15&amp;quot; fill=&amp;quot;#fdfdfd&amp;quot; stroke=&amp;quot;#e9e2d2&amp;quot; stroke-width=&amp;quot;0.8&amp;quot;/&amp;gt;&amp;lt;ellipse cx=&amp;quot;18&amp;quot; cy=&amp;quot;28&amp;quot; rx=&amp;quot;4.5&amp;quot; ry=&amp;quot;5.6&amp;quot; fill=&amp;quot;#2c2c2c&amp;quot;/&amp;gt;&amp;lt;ellipse cx=&amp;quot;30&amp;quot; cy=&amp;quot;28&amp;quot; rx=&amp;quot;4.5&amp;quot; ry=&amp;quot;5.6&amp;quot; fill=&amp;quot;#2c2c2c&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;18&amp;quot; cy=&amp;quot;28&amp;quot; r=&amp;quot;1.9&amp;quot; fill=&amp;quot;#fff&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;30&amp;quot; cy=&amp;quot;28&amp;quot; r=&amp;quot;1.9&amp;quot; fill=&amp;quot;#fff&amp;quot;/&amp;gt;&amp;lt;ellipse cx=&amp;quot;24&amp;quot; cy=&amp;quot;33&amp;quot; rx=&amp;quot;2.1&amp;quot; ry=&amp;quot;1.5&amp;quot; fill=&amp;quot;#2c2c2c&amp;quot;/&amp;gt;&amp;lt;path d=&amp;quot;M20.5 36 Q24 38.5 27.5 36&amp;quot; stroke=&amp;quot;#2c2c2c&amp;quot; stroke-width=&amp;quot;1.3&amp;quot; fill=&amp;quot;none&amp;quot; stroke-linecap=&amp;quot;round&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;15&amp;quot; cy=&amp;quot;33&amp;quot; r=&amp;quot;2&amp;quot; fill=&amp;quot;#c41e3a&amp;quot; opacity=&amp;quot;0.18&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;33&amp;quot; cy=&amp;quot;33&amp;quot; r=&amp;quot;2&amp;quot; fill=&amp;quot;#c41e3a&amp;quot; opacity=&amp;quot;0.18&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function init() {&lt;br /&gt;
    var API = &#039;/ai_proxy.php&#039;;&lt;br /&gt;
    var TITLE = &#039;虾仁AI&#039;;&lt;br /&gt;
    var AUDIT_TEMPLATE = &#039;作品名：\n1. 视觉识别（主角是否为草帽熊猫头或明显变体）：\n2. 听觉识别（是否使用虾仁系列标志性AI配音）：\n3. 主角身份（是否虾仁人格内核的投射，名字可不同）：\n4. 完整性（有无完整结局）：\n5. 深度（有无情感内核/名场面）：\n6. 原创性（虾仁原生或深度改编）：\n7. 自述与作品链接：\n&#039;;&lt;br /&gt;
&lt;br /&gt;
    var css = document.createElement(&#039;style&#039;);&lt;br /&gt;
    css.textContent = [&lt;br /&gt;
      &#039;#xr-ai-fab{position:fixed;right:22px;bottom:22px;z-index:99999;width:56px;height:56px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;background:linear-gradient(135deg,#c41e3a,#9b182d);color:#fff;font-size:26px;box-shadow:0 6px 20px rgba(155,24,45,.4);transition:transform .2s ease,box-shadow .2s ease;font-family:&amp;quot;Noto Serif SC&amp;quot;,&amp;quot;Songti SC&amp;quot;,serif}&#039;,&lt;br /&gt;
      &#039;#xr-ai-fab:hover{transform:scale(1.08);box-shadow:0 8px 26px rgba(155,24,45,.55)}&#039;,&lt;br /&gt;
      &#039;#xr-ai-panel{position:fixed;right:22px;bottom:90px;z-index:99999;width:360px;max-width:calc(100vw - 32px);height:520px;max-height:calc(100vh - 120px);display:none;flex-direction:column;overflow:hidden;background:#fbf6ec;border:1px solid #e7d8bf;border-radius:14px;box-shadow:0 12px 40px rgba(80,40,30,.25);font-family:&amp;quot;Noto Serif SC&amp;quot;,&amp;quot;Source Han Serif SC&amp;quot;,&amp;quot;Songti SC&amp;quot;,&amp;quot;STSong&amp;quot;,&amp;quot;SimSun&amp;quot;,serif;color:#3a2418}&#039;,&lt;br /&gt;
      &#039;#xr-ai-panel.xr-show{display:flex}&#039;,&lt;br /&gt;
      &#039;.xr-ai-head{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;background:linear-gradient(135deg,#c41e3a,#9b182d);color:#fff}&#039;,&lt;br /&gt;
      &#039;.xr-ai-title{font-weight:700;font-size:16px;letter-spacing:.05em;display:flex;align-items:center;gap:6px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-close{background:none;border:none;color:#fff;font-size:20px;cursor:pointer;line-height:1}&#039;,&lt;br /&gt;
      &#039;.xr-ai-tabs{display:flex;border-bottom:1px solid #ecdfc8;background:#f3e9d6}&#039;,&lt;br /&gt;
      &#039;.xr-ai-tab{flex:1;padding:9px 0;text-align:center;cursor:pointer;font-size:13px;color:#7a5a3a;border:none;background:none;transition:color .2s}&#039;,&lt;br /&gt;
      &#039;.xr-ai-tab.xr-active{color:#c41e3a;font-weight:700;box-shadow:inset 0 -2px 0 #c41e3a}&#039;,&lt;br /&gt;
      &#039;.xr-ai-hint{text-align:center;font-size:11px;color:#a98c6b;padding:0 0 6px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-msgs{flex:1;overflow-y:auto;padding:14px;display:flex;flex-direction:column;gap:10px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-msg{max-width:84%;padding:9px 12px;border-radius:12px;line-height:1.6;font-size:14px;white-space:pre-wrap;word-break:break-word}&#039;,&lt;br /&gt;
      &#039;.xr-ai-msg.xr-user{align-self:flex-end;background:#c41e3a;color:#fff;border-bottom-right-radius:3px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-msg.xr-ai{align-self:flex-start;background:#fff;color:#3a2418;border:1px solid #ecdfc8;border-left:3px solid #c41e3a;border-bottom-left-radius:3px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-inputbar{display:flex;gap:8px;padding:10px;border-top:1px solid #ecdfc8;background:#f6eddb}&#039;,&lt;br /&gt;
      &#039;.xr-ai-input{flex:1;resize:none;border:1px solid #e0cda8;border-radius:9px;padding:8px 10px;font-family:inherit;font-size:14px;background:#fff;outline:none;max-height:80px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-input:focus{border-color:#c41e3a}&#039;,&lt;br /&gt;
      &#039;.xr-ai-send{border:none;border-radius:9px;padding:0 16px;background:#9b182d;color:#fff;cursor:pointer;font-family:inherit;font-size:14px;transition:background .2s}&#039;,&lt;br /&gt;
      &#039;.xr-ai-send:hover{background:#c41e3a}&#039;,&lt;br /&gt;
      &#039;.xr-ai-send:disabled{opacity:.5;cursor:default}&#039;&lt;br /&gt;
    ].join(&#039;\n&#039;);&lt;br /&gt;
    document.head.appendChild(css);&lt;br /&gt;
&lt;br /&gt;
    var fab = document.createElement(&#039;button&#039;);&lt;br /&gt;
    fab.id = &#039;xr-ai-fab&#039;; fab.innerHTML = xrAvatar(38); fab.title = TITLE; fab.setAttribute(&#039;aria-label&#039;, TITLE);&lt;br /&gt;
&lt;br /&gt;
    var panel = document.createElement(&#039;div&#039;);&lt;br /&gt;
    panel.id = &#039;xr-ai-panel&#039;;&lt;br /&gt;
    panel.innerHTML =&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-head&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;xr-ai-title&amp;quot;&amp;gt;&#039; + xrAvatar(22) + &#039; &#039; + TITLE + &#039;&amp;lt;/span&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-close&amp;quot; title=&amp;quot;收起&amp;quot;&amp;gt;×&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-tabs&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-tab xr-active&amp;quot; data-mode=&amp;quot;general&amp;quot;&amp;gt;闲聊&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-tab&amp;quot; data-mode=&amp;quot;wiki&amp;quot;&amp;gt;问虾仁宇宙&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-tab&amp;quot; data-mode=&amp;quot;audit&amp;quot;&amp;gt;作品审核&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-hint&amp;quot;&amp;gt;内容由 AI 生成，仅供参考&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-msgs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-inputbar&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;textarea class=&amp;quot;xr-ai-input&amp;quot; rows=&amp;quot;1&amp;quot; placeholder=&amp;quot;和虾仁AI说点什么…&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-send&amp;quot;&amp;gt;发送&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;company&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; &#039; +&lt;br /&gt;
      &#039;style=&amp;quot;position:absolute;left:-9999px;width:1px;height:1px;opacity:0;&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
    document.body.appendChild(fab);&lt;br /&gt;
    document.body.appendChild(panel);&lt;br /&gt;
&lt;br /&gt;
    var msgsEl = panel.querySelector(&#039;.xr-ai-msgs&#039;);&lt;br /&gt;
    var inputEl = panel.querySelector(&#039;.xr-ai-input&#039;);&lt;br /&gt;
    var sendEl = panel.querySelector(&#039;.xr-ai-send&#039;);&lt;br /&gt;
    var closeEl = panel.querySelector(&#039;.xr-ai-close&#039;);&lt;br /&gt;
    var tabs = panel.querySelectorAll(&#039;.xr-ai-tab&#039;);&lt;br /&gt;
    var honey = panel.querySelector(&#039;input[name=company]&#039;);&lt;br /&gt;
&lt;br /&gt;
    var mode = &#039;general&#039;;&lt;br /&gt;
    var history = [];&lt;br /&gt;
    var busy = false;&lt;br /&gt;
&lt;br /&gt;
    fab.addEventListener(&#039;click&#039;, function () { panel.classList.toggle(&#039;xr-show&#039;); });&lt;br /&gt;
    closeEl.addEventListener(&#039;click&#039;, function () { panel.classList.remove(&#039;xr-show&#039;); });&lt;br /&gt;
    tabs.forEach(function (t) {&lt;br /&gt;
      t.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
        tabs.forEach(function (x) { x.classList.remove(&#039;xr-active&#039;); });&lt;br /&gt;
        t.classList.add(&#039;xr-active&#039;);&lt;br /&gt;
        mode = t.getAttribute(&#039;data-mode&#039;);&lt;br /&gt;
        if (mode === &#039;audit&#039; &amp;amp;&amp;amp; !inputEl.value.trim()) { inputEl.value = AUDIT_TEMPLATE; inputEl.focus(); }&lt;br /&gt;
      });&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    function scrollBottom() { msgsEl.scrollTop = msgsEl.scrollHeight; }&lt;br /&gt;
    function addBubble(cls, text) {&lt;br /&gt;
      var d = document.createElement(&#039;div&#039;);&lt;br /&gt;
      d.className = &#039;xr-ai-msg &#039; + cls;&lt;br /&gt;
      d.textContent = text;&lt;br /&gt;
      msgsEl.appendChild(d);&lt;br /&gt;
      scrollBottom();&lt;br /&gt;
      return d;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function callAI(msgs, m, onChunk) {&lt;br /&gt;
      return fetch(API, {&lt;br /&gt;
        method: &#039;POST&#039;,&lt;br /&gt;
        headers: { &#039;Content-Type&#039;: &#039;application/json&#039; },&lt;br /&gt;
        body: JSON.stringify({ mode: m, messages: msgs, company: honey.value })&lt;br /&gt;
      }).then(function (res) {&lt;br /&gt;
        if (!res.ok) throw new Error(&#039;HTTP &#039; + res.status);&lt;br /&gt;
        var reader = res.body.getReader();&lt;br /&gt;
        var decoder = new TextDecoder();&lt;br /&gt;
        var buf = &#039;&#039;;&lt;br /&gt;
        function pump() {&lt;br /&gt;
          return reader.read().then(function (result) {&lt;br /&gt;
            if (result.done) return;&lt;br /&gt;
            buf += decoder.decode(result.value, { stream: true });&lt;br /&gt;
            var idx;&lt;br /&gt;
            while ((idx = buf.indexOf(&#039;\n&#039;)) &amp;gt;= 0) {&lt;br /&gt;
              var line = buf.slice(0, idx).trim();&lt;br /&gt;
              buf = buf.slice(idx + 1);&lt;br /&gt;
              if (!line) continue;&lt;br /&gt;
              try {&lt;br /&gt;
                var obj = JSON.parse(line);&lt;br /&gt;
                if (obj.content) onChunk(obj.content);&lt;br /&gt;
                if (obj.error) onChunk(&#039;（&#039; + obj.error + &#039;）&#039;);&lt;br /&gt;
              } catch (e) {}&lt;br /&gt;
            }&lt;br /&gt;
            return pump();&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
        return pump();&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function send() {&lt;br /&gt;
      var text = inputEl.value.trim();&lt;br /&gt;
      if (!text || busy) return;&lt;br /&gt;
      busy = true; sendEl.disabled = true;&lt;br /&gt;
      addBubble(&#039;xr-user&#039;, text);&lt;br /&gt;
      history.push({ role: &#039;user&#039;, content: text });&lt;br /&gt;
      inputEl.value = &#039;&#039;;&lt;br /&gt;
      var aiBubble = addBubble(&#039;xr-ai&#039;, &#039;…&#039;);&lt;br /&gt;
      var acc = &#039;&#039;;&lt;br /&gt;
      callAI(history.slice(-12), mode, function (chunk) {&lt;br /&gt;
        acc += chunk;&lt;br /&gt;
        aiBubble.textContent = acc + &#039;▌&#039;;&lt;br /&gt;
        scrollBottom();&lt;br /&gt;
      }).then(function () {&lt;br /&gt;
        aiBubble.textContent = acc || &#039;（暂无回复）&#039;;&lt;br /&gt;
        history.push({ role: &#039;assistant&#039;, content: acc });&lt;br /&gt;
        busy = false; sendEl.disabled = false; scrollBottom();&lt;br /&gt;
      }).catch(function (e) {&lt;br /&gt;
        aiBubble.textContent = &#039;出错了：&#039; + (e &amp;amp;&amp;amp; e.message ? e.message : e);&lt;br /&gt;
        busy = false; sendEl.disabled = false;&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sendEl.addEventListener(&#039;click&#039;, send);&lt;br /&gt;
    inputEl.addEventListener(&#039;keydown&#039;, function (e) {&lt;br /&gt;
      if (e.key === &#039;Enter&#039; &amp;amp;&amp;amp; !e.shiftKey) { e.preventDefault(); send(); }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    addBubble(&#039;xr-ai&#039;, &#039;你好，我是虾仁AI，可以陪你闲聊，也能帮你查「虾仁宇宙」的资料。选个模式开始吧～&#039;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
    document.addEventListener(&#039;DOMContentLoaded&#039;, init);&lt;br /&gt;
  } else {&lt;br /&gt;
    init();&lt;br /&gt;
  }&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=MediaWiki:Common.js&amp;diff=222</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=MediaWiki:Common.js&amp;diff=222"/>
		<updated>2026-07-31T08:36:13Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​资源页更新&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* 虾仁维基 - 自定义侧边栏导航 v3.0 */&lt;br /&gt;
/* 优化：古风主题统一、健壮初始化、精致样式、移动端(Minerva)适配 */&lt;br /&gt;
/* 最后更新: 2026-07-30 */&lt;br /&gt;
&lt;br /&gt;
(function ($, mw) {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
    var COLLAPSE_KEY = &#039;xiarenwiki-nav-v2&#039;;&lt;br /&gt;
    var WORKS = [&#039;我在大明那些年&#039;, &#039;彼岸轮回&#039;, &#039;一品布衣&#039;];&lt;br /&gt;
    var WORK_DIRECT = [&#039;宇宙层&#039;, &#039;人物&#039;, &#039;世界观&#039;, &#039;设定&#039;];&lt;br /&gt;
&lt;br /&gt;
    function init() {&lt;br /&gt;
        var wgIsArticle = mw.config.get(&#039;wgIsArticle&#039;);&lt;br /&gt;
        var wgCanonicalSpecialPageName = mw.config.get(&#039;wgCanonicalSpecialPageName&#039;);&lt;br /&gt;
        if (!wgIsArticle &amp;amp;&amp;amp; wgCanonicalSpecialPageName) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        var skin = mw.config.get(&#039;skin&#039;);&lt;br /&gt;
        var isMobile = (skin === &#039;minerva&#039; || skin === &#039;minerva-vec&#039;);&lt;br /&gt;
        mw.loader.using(&#039;mediawiki.api&#039;).then(function () {&lt;br /&gt;
            if (isMobile) {&lt;br /&gt;
                waitForMobileDrawer(function ($host) {&lt;br /&gt;
                    buildNav($host, true);&lt;br /&gt;
                });&lt;br /&gt;
            } else {&lt;br /&gt;
                waitForPanel(function ($panel) {&lt;br /&gt;
                    buildNav($panel, false);&lt;br /&gt;
                });&lt;br /&gt;
            }&lt;br /&gt;
        }).catch(function (e) {&lt;br /&gt;
            console.error(&#039;[虾仁导航] 依赖加载失败，降级构建&#039;, e);&lt;br /&gt;
            if (isMobile) {&lt;br /&gt;
                waitForMobileDrawer(function ($host) {&lt;br /&gt;
                    buildNav($host, true);&lt;br /&gt;
                });&lt;br /&gt;
            } else {&lt;br /&gt;
                waitForPanel(function ($panel) {&lt;br /&gt;
                    buildNav($panel, false);&lt;br /&gt;
                });&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function waitForPanel(cb) {&lt;br /&gt;
        var $panel = $(&#039;#mw-panel&#039;);&lt;br /&gt;
        if ($panel.length) return cb($panel);&lt;br /&gt;
        var tries = 0;&lt;br /&gt;
        var timer = setInterval(function () {&lt;br /&gt;
            $panel = $(&#039;#mw-panel&#039;);&lt;br /&gt;
            if ($panel.length || ++tries &amp;gt; 50) {&lt;br /&gt;
                clearInterval(timer);&lt;br /&gt;
                if ($panel.length) cb($panel);&lt;br /&gt;
            }&lt;br /&gt;
        }, 100);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function waitForMobileDrawer(cb) {&lt;br /&gt;
        var tries = 0;&lt;br /&gt;
        function tryFind() {&lt;br /&gt;
            var $host = $(&#039;#mw-mf-page-left .navigation-drawer&#039;);&lt;br /&gt;
            if (!$host.length) $host = $(&#039;.navigation-drawer&#039;);&lt;br /&gt;
            if (!$host.length) $host = $(&#039;#mw-mf-page-left&#039;);&lt;br /&gt;
            if ($host.length) return cb($host);&lt;br /&gt;
            if (++tries &amp;gt; 60) return;&lt;br /&gt;
            setTimeout(tryFind, 100);&lt;br /&gt;
        }&lt;br /&gt;
        tryFind();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function buildNav($panel, isMobile) {&lt;br /&gt;
        var html = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-search&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;form action=&amp;quot;&#039; + mw.util.getUrl(&#039;Special:Search&#039;) + &#039;&amp;quot; method=&amp;quot;get&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;search&amp;quot; class=&amp;quot;xn-search-input&amp;quot; placeholder=&amp;quot;检索典籍…&amp;quot; /&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;/form&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += section(&#039;Wiki&#039;, [&lt;br /&gt;
            [&#039;首页&#039;, &#039;首页&#039;],&lt;br /&gt;
            [&#039;Wiki简介&#039;, &#039;Wiki简介&#039;],&lt;br /&gt;
            [&#039;管理员告示&#039;, &#039;管理员告示&#039;],&lt;br /&gt;
            [&#039;随机页面&#039;, &#039;Special:Random&#039;],&lt;br /&gt;
            [&#039;快速搜索&#039;, &#039;Special:Search&#039;],&lt;br /&gt;
            [&#039;相关平台&#039;, &#039;相关平台&#039;],&lt;br /&gt;
            [&#039;Wiki源站点&#039;, &#039;Wiki源站点&#039;]&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
        html += section(&#039;虾仁简介&#039;, [&lt;br /&gt;
            [&#039;虾仁？&#039;, &#039;虾仁？&#039;],&lt;br /&gt;
            [&#039;虾仁共创收录规则&#039;, &#039;虾仁共创收录规则&#039;],&lt;br /&gt;
            [&#039;虾仁宇宙结构介绍&#039;, &#039;虾仁宇宙结构介绍&#039;]&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-section&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;universe&amp;quot;&amp;gt;虾仁宇宙&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-universe&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;xn-loading&amp;quot;&amp;gt;卷帙加载中…&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-section&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;literature&amp;quot;&amp;gt;虾仁文学&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-literature&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += link(&#039;创始宣言&#039;, &#039;创始宣言&#039;);&lt;br /&gt;
        html += link(&#039;虾仁六章&#039;, &#039;虾仁六章&#039;);&lt;br /&gt;
        html += link(&#039;虾仁异志&#039;, &#039;虾仁异志&#039;);&lt;br /&gt;
        html += link(&#039;虾仁诗作&#039;, &#039;虾仁诗作&#039;);&lt;br /&gt;
        html += link(&#039;虾仁音乐&#039;, &#039;虾仁音乐&#039;);&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-subsection&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-subheader xn-expandable&amp;quot; data-sid=&amp;quot;papers&amp;quot;&amp;gt;虾仁论文 &#039; + plus(&#039;虾仁论文&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-subbody&amp;quot; id=&amp;quot;xn-papers&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += link(&#039;去中心化创作模式的研究&#039;, &#039;去中心化创作模式的研究&#039;);&lt;br /&gt;
        html += link(&#039;数字时代的孙悟空&#039;, &#039;数字时代的孙悟空&#039;);&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += section(&#039;虾仁历史&#039;, [&lt;br /&gt;
            [&#039;起源&#039;, &#039;虾仁历史/起源&#039;],&lt;br /&gt;
            [&#039;传播&#039;, &#039;虾仁历史/传播&#039;],&lt;br /&gt;
            [&#039;转折&#039;, &#039;虾仁历史/转折&#039;],&lt;br /&gt;
            [&#039;爆发&#039;, &#039;虾仁历史/爆发&#039;],&lt;br /&gt;
            [&#039;危机&#039;, &#039;虾仁历史/危机&#039;],&lt;br /&gt;
            [&#039;转型&#039;, &#039;虾仁历史/转型&#039;]&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-single&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&#039; + url(&#039;共创入口&#039;) + &#039;&amp;quot;&amp;gt;共创入口&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        if (isMobile) {&lt;br /&gt;
            var $box = $(&#039;&amp;lt;section class=&amp;quot;xn-mobile&amp;quot;&amp;gt;&amp;lt;/section&amp;gt;&#039;);&lt;br /&gt;
            $box.html(html);&lt;br /&gt;
            $panel.prepend($box);&lt;br /&gt;
        } else {&lt;br /&gt;
            $panel.html(html);&lt;br /&gt;
        }&lt;br /&gt;
        restoreCollapse();&lt;br /&gt;
        bindEvents();&lt;br /&gt;
        highlightCurrent();&lt;br /&gt;
        loadUniverse();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function section(title, items) {&lt;br /&gt;
        var sid = title.replace(/[^a-z0-9\u4e00-\u9fff]/gi, &#039;&#039;).toLowerCase();&lt;br /&gt;
        var h = &#039;&amp;lt;div class=&amp;quot;xn-section&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        h += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + sid + &#039;&amp;quot;&amp;gt;&#039; + title + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        h += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-&#039; + sid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        for (var i = 0; i &amp;lt; items.length; i++) {&lt;br /&gt;
            h += link(items[i][0], items[i][1]);&lt;br /&gt;
        }&lt;br /&gt;
        h += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return h;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function link(label, page, cls) {&lt;br /&gt;
        return &#039;&amp;lt;div class=&amp;quot;xn-link&#039; + (cls ? &#039; &#039; + cls : &#039;&#039;) + &#039;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&#039; + url(page) + &#039;&amp;quot;&amp;gt;&#039; + label + &#039;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function url(page) { return mw.util.getUrl(page); }&lt;br /&gt;
&lt;br /&gt;
    function plus(page) {&lt;br /&gt;
        return &#039;&amp;lt;a class=&amp;quot;xn-plus&amp;quot; href=&amp;quot;&#039; + url(page) + &#039;?action=edit&amp;quot; title=&amp;quot;编辑/新增&amp;quot;&amp;gt;＋&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    async function loadUniverse() {&lt;br /&gt;
        var $body = $(&#039;#xn-universe&#039;);&lt;br /&gt;
        if (!$body.length) return;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            var api = new mw.Api();&lt;br /&gt;
            var html = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; WORKS.length; i++) {&lt;br /&gt;
                var work = WORKS[i];&lt;br /&gt;
                var workSid = &#039;work&#039; + i;&lt;br /&gt;
&lt;br /&gt;
                var subpages = [];&lt;br /&gt;
                try {&lt;br /&gt;
                    var result = await api.get({&lt;br /&gt;
                        action: &#039;query&#039;,&lt;br /&gt;
                        list: &#039;allpages&#039;,&lt;br /&gt;
                        apprefix: work + &#039;/&#039;,&lt;br /&gt;
                        aplimit: 100&lt;br /&gt;
                    });&lt;br /&gt;
                    subpages = result.query.allpages || [];&lt;br /&gt;
                } catch (e) {&lt;br /&gt;
                    console.error(&#039;[虾仁导航] API error for &#039; + work, e);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-work&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-work-title xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + workSid + &#039;&amp;quot;&amp;gt;&#039; + work + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-&#039; + workSid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
                var directSet = {};&lt;br /&gt;
                for (var j = 0; j &amp;lt; subpages.length; j++) {&lt;br /&gt;
                    var rel = subpages[j].title.substring(work.length + 1);&lt;br /&gt;
                    if (rel.indexOf(&#039;/&#039;) === -1) directSet[rel] = true;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                for (var k = 0; k &amp;lt; WORK_DIRECT.length; k++) {&lt;br /&gt;
                    var item = WORK_DIRECT[k];&lt;br /&gt;
                    var exists = directSet[item];&lt;br /&gt;
                    html += link(item, work + &#039;/&#039; + item, exists ? &#039;&#039; : &#039;xn-missing&#039;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                var plotSegs = [];&lt;br /&gt;
                for (j = 0; j &amp;lt; subpages.length; j++) {&lt;br /&gt;
                    rel = subpages[j].title.substring(work.length + 1);&lt;br /&gt;
                    var parts = rel.split(&#039;/&#039;);&lt;br /&gt;
                    if (parts.length === 2 &amp;amp;&amp;amp; parts[0] === &#039;剧情层&#039;) {&lt;br /&gt;
                        plotSegs.push(parts[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                var plotSid = workSid + &#039;plot&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-subsection&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-subheader xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + plotSid + &#039;&amp;quot;&amp;gt;剧情层 &#039; + plus(work + &#039;/剧情层&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-subbody&amp;quot; id=&amp;quot;xn-&#039; + plotSid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
                for (k = 0; k &amp;lt; plotSegs.length; k++) {&lt;br /&gt;
                    var seg = plotSegs[k];&lt;br /&gt;
                    var segSid = workSid + &#039;seg&#039; + k;&lt;br /&gt;
                    var segPage = work + &#039;/剧情层/&#039; + seg;&lt;br /&gt;
&lt;br /&gt;
                    var jinji = [];&lt;br /&gt;
                    try {&lt;br /&gt;
                        var segResult = await api.get({&lt;br /&gt;
                            action: &#039;query&#039;,&lt;br /&gt;
                            list: &#039;allpages&#039;,&lt;br /&gt;
                            apprefix: segPage + &#039;/&#039;,&lt;br /&gt;
                            aplimit: 50&lt;br /&gt;
                        });&lt;br /&gt;
                        var segPages = segResult.query.allpages || [];&lt;br /&gt;
                        for (var m = 0; m &amp;lt; segPages.length; m++) {&lt;br /&gt;
                            jinji.push(segPages[m].title.substring(segPage.length + 1));&lt;br /&gt;
                        }&lt;br /&gt;
                    } catch (e2) {}&lt;br /&gt;
&lt;br /&gt;
                    html += &#039;&amp;lt;div class=&amp;quot;xn-subsubsection&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
                    html += &#039;&amp;lt;div class=&amp;quot;xn-subsubheader xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + segSid + &#039;&amp;quot;&amp;gt;&#039; + seg + &#039; &#039; + plus(segPage) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                    html += &#039;&amp;lt;div class=&amp;quot;xn-subsubbody&amp;quot; id=&amp;quot;xn-&#039; + segSid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
                    for (m = 0; m &amp;lt; jinji.length; m++) {&lt;br /&gt;
                        html += link(jinji[m], segPage + &#039;/&#039; + jinji[m]);&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;xn-link xn-add-work&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&#039; + url(&#039;Special:Search&#039;) + &#039;&amp;quot; title=&amp;quot;搜索已有作品&amp;quot;&amp;gt;＋ 发现更多作品&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
            $body.html(html);&lt;br /&gt;
            restoreCollapse();&lt;br /&gt;
            bindEvents();&lt;br /&gt;
            highlightCurrent();&lt;br /&gt;
&lt;br /&gt;
        } catch (e) {&lt;br /&gt;
            console.error(&#039;[虾仁导航] 虾仁宇宙加载失败&#039;, e);&lt;br /&gt;
            $body.html(&#039;&amp;lt;div class=&amp;quot;xn-link&amp;quot;&amp;gt;(加载失败，请刷新)&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function highlightCurrent() {&lt;br /&gt;
        var currentTitle = mw.config.get(&#039;wgPageName&#039;);&lt;br /&gt;
        $(&#039;.xn-link a&#039;).each(function () {&lt;br /&gt;
            var href = $(this).attr(&#039;href&#039;);&lt;br /&gt;
            if (!href) return;&lt;br /&gt;
            var match = false;&lt;br /&gt;
            if (href.indexOf(&#039;title=&#039;) &amp;gt; 0) {&lt;br /&gt;
                var m = href.match(/title=([^&amp;amp;]+)/);&lt;br /&gt;
                if (m) match = decodeURIComponent(m[1]) === currentTitle;&lt;br /&gt;
            } else {&lt;br /&gt;
                var parts = href.split(&#039;/&#039;);&lt;br /&gt;
                var last = parts[parts.length - 1];&lt;br /&gt;
                match = decodeURIComponent(last) === currentTitle;&lt;br /&gt;
            }&lt;br /&gt;
            if (match) {&lt;br /&gt;
                $(this).addClass(&#039;xn-active&#039;);&lt;br /&gt;
                $(this).closest(&#039;.xn-link&#039;).addClass(&#039;xn-active-link&#039;);&lt;br /&gt;
                $(this).parents(&#039;.xn-body, .xn-subbody, .xn-subsubbody&#039;).each(function () {&lt;br /&gt;
                    $(this).show();&lt;br /&gt;
                    var sid = $(this).attr(&#039;id&#039;);&lt;br /&gt;
                    if (sid &amp;amp;&amp;amp; sid.indexOf(&#039;xn-&#039;) === 0) {&lt;br /&gt;
                        sid = sid.substring(3);&lt;br /&gt;
                        $(&#039;[data-sid=&amp;quot;&#039; + sid + &#039;&amp;quot;]&#039;).removeClass(&#039;xn-collapsed&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function bindEvents() {&lt;br /&gt;
        $(document).off(&#039;click.xn&#039;).on(&#039;click.xn&#039;, &#039;.xn-expandable&#039;, function (e) {&lt;br /&gt;
            if ($(e.target).closest(&#039;.xn-plus&#039;).length) return;&lt;br /&gt;
            var sid = $(this).data(&#039;sid&#039;);&lt;br /&gt;
            var $body = $(&#039;#xn-&#039; + sid);&lt;br /&gt;
            if (!$body.length) $body = $(this).next(&#039;.xn-body,.xn-subbody,.xn-subsubbody&#039;);&lt;br /&gt;
            if (!$body.length) return;&lt;br /&gt;
&lt;br /&gt;
            $body.slideToggle(150);&lt;br /&gt;
            $(this).toggleClass(&#039;xn-collapsed&#039;, !$body.is(&#039;:visible&#039;));&lt;br /&gt;
&lt;br /&gt;
            var state = loadState();&lt;br /&gt;
            state[sid] = $body.is(&#039;:visible&#039;);&lt;br /&gt;
            saveState(state);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function restoreCollapse() {&lt;br /&gt;
        var state = loadState();&lt;br /&gt;
        var defaults = { &#039;universe&#039;: true };&lt;br /&gt;
        for (var key in defaults) {&lt;br /&gt;
            if (!(key in state)) state[key] = defaults[key];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        Object.keys(state).forEach(function (sid) {&lt;br /&gt;
            var $header = $(&#039;[data-sid=&amp;quot;&#039; + sid + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            var $body = $(&#039;#xn-&#039; + sid);&lt;br /&gt;
            if (!$body.length) $body = $header.next(&#039;.xn-body,.xn-subbody,.xn-subsubbody&#039;);&lt;br /&gt;
            if (!$body.length) return;&lt;br /&gt;
&lt;br /&gt;
            if (state[sid]) {&lt;br /&gt;
                $body.show();&lt;br /&gt;
                $header.removeClass(&#039;xn-collapsed&#039;);&lt;br /&gt;
            } else {&lt;br /&gt;
                $body.hide();&lt;br /&gt;
                $header.addClass(&#039;xn-collapsed&#039;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function loadState() {&lt;br /&gt;
        try { return JSON.parse(localStorage.getItem(COLLAPSE_KEY) || &#039;{}&#039;); }&lt;br /&gt;
        catch (e) { return {}; }&lt;br /&gt;
    }&lt;br /&gt;
    function saveState(s) {&lt;br /&gt;
        try { localStorage.setItem(COLLAPSE_KEY, JSON.stringify(s)); }&lt;br /&gt;
        catch (e) {}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    $(init);&lt;br /&gt;
&lt;br /&gt;
})(jQuery, mediaWiki);&lt;br /&gt;
&lt;br /&gt;
/* ===== 虾仁AI 浮窗助手（2026-07-30 v2） ===== */&lt;br /&gt;
(function () {&lt;br /&gt;
  if (window.__xrAiInited) return;&lt;br /&gt;
  window.__xrAiInited = true;&lt;br /&gt;
&lt;br /&gt;
  function xrAvatar(size) {&lt;br /&gt;
    return &#039;&amp;lt;svg viewBox=&amp;quot;0 0 48 48&amp;quot; width=&amp;quot;&#039; + size + &#039;&amp;quot; height=&amp;quot;&#039; + size + &#039;&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;ellipse cx=&amp;quot;24&amp;quot; cy=&amp;quot;14.5&amp;quot; rx=&amp;quot;18&amp;quot; ry=&amp;quot;5.5&amp;quot; fill=&amp;quot;#caa53d&amp;quot;/&amp;gt;&amp;lt;ellipse cx=&amp;quot;24&amp;quot; cy=&amp;quot;14.5&amp;quot; rx=&amp;quot;18&amp;quot; ry=&amp;quot;5.5&amp;quot; fill=&amp;quot;none&amp;quot; stroke=&amp;quot;#a8842a&amp;quot; stroke-width=&amp;quot;0.8&amp;quot;/&amp;gt;&amp;lt;path d=&amp;quot;M13 14.5 Q24 2.5 35 14.5 Z&amp;quot; fill=&amp;quot;#d9b84a&amp;quot;/&amp;gt;&amp;lt;path d=&amp;quot;M13 14.5 Q24 2.5 35 14.5 Z&amp;quot; fill=&amp;quot;none&amp;quot; stroke=&amp;quot;#a8842a&amp;quot; stroke-width=&amp;quot;0.8&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;12.5&amp;quot; cy=&amp;quot;25&amp;quot; r=&amp;quot;6.5&amp;quot; fill=&amp;quot;#2c2c2c&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;35.5&amp;quot; cy=&amp;quot;25&amp;quot; r=&amp;quot;6.5&amp;quot; fill=&amp;quot;#2c2c2c&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;24&amp;quot; cy=&amp;quot;29&amp;quot; r=&amp;quot;15&amp;quot; fill=&amp;quot;#fdfdfd&amp;quot; stroke=&amp;quot;#e9e2d2&amp;quot; stroke-width=&amp;quot;0.8&amp;quot;/&amp;gt;&amp;lt;ellipse cx=&amp;quot;18&amp;quot; cy=&amp;quot;28&amp;quot; rx=&amp;quot;4.5&amp;quot; ry=&amp;quot;5.6&amp;quot; fill=&amp;quot;#2c2c2c&amp;quot;/&amp;gt;&amp;lt;ellipse cx=&amp;quot;30&amp;quot; cy=&amp;quot;28&amp;quot; rx=&amp;quot;4.5&amp;quot; ry=&amp;quot;5.6&amp;quot; fill=&amp;quot;#2c2c2c&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;18&amp;quot; cy=&amp;quot;28&amp;quot; r=&amp;quot;1.9&amp;quot; fill=&amp;quot;#fff&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;30&amp;quot; cy=&amp;quot;28&amp;quot; r=&amp;quot;1.9&amp;quot; fill=&amp;quot;#fff&amp;quot;/&amp;gt;&amp;lt;ellipse cx=&amp;quot;24&amp;quot; cy=&amp;quot;33&amp;quot; rx=&amp;quot;2.1&amp;quot; ry=&amp;quot;1.5&amp;quot; fill=&amp;quot;#2c2c2c&amp;quot;/&amp;gt;&amp;lt;path d=&amp;quot;M20.5 36 Q24 38.5 27.5 36&amp;quot; stroke=&amp;quot;#2c2c2c&amp;quot; stroke-width=&amp;quot;1.3&amp;quot; fill=&amp;quot;none&amp;quot; stroke-linecap=&amp;quot;round&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;15&amp;quot; cy=&amp;quot;33&amp;quot; r=&amp;quot;2&amp;quot; fill=&amp;quot;#c41e3a&amp;quot; opacity=&amp;quot;0.18&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;33&amp;quot; cy=&amp;quot;33&amp;quot; r=&amp;quot;2&amp;quot; fill=&amp;quot;#c41e3a&amp;quot; opacity=&amp;quot;0.18&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function init() {&lt;br /&gt;
    var API = &#039;/ai_proxy.php&#039;;&lt;br /&gt;
    var TITLE = &#039;虾仁AI&#039;;&lt;br /&gt;
    var AUDIT_TEMPLATE = &#039;作品名：\n1. 视觉识别（主角是否为草帽熊猫头或明显变体）：\n2. 听觉识别（是否使用虾仁系列标志性AI配音）：\n3. 主角身份（是否虾仁人格内核的投射，名字可不同）：\n4. 完整性（有无完整结局）：\n5. 深度（有无情感内核/名场面）：\n6. 原创性（虾仁原生或深度改编）：\n7. 自述与作品链接：\n&#039;;&lt;br /&gt;
&lt;br /&gt;
    var css = document.createElement(&#039;style&#039;);&lt;br /&gt;
    css.textContent = [&lt;br /&gt;
      &#039;#xr-ai-fab{position:fixed;right:22px;bottom:22px;z-index:99999;width:56px;height:56px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;background:linear-gradient(135deg,#c41e3a,#9b182d);color:#fff;font-size:26px;box-shadow:0 6px 20px rgba(155,24,45,.4);transition:transform .2s ease,box-shadow .2s ease;font-family:&amp;quot;Noto Serif SC&amp;quot;,&amp;quot;Songti SC&amp;quot;,serif}&#039;,&lt;br /&gt;
      &#039;#xr-ai-fab:hover{transform:scale(1.08);box-shadow:0 8px 26px rgba(155,24,45,.55)}&#039;,&lt;br /&gt;
      &#039;#xr-ai-panel{position:fixed;right:22px;bottom:90px;z-index:99999;width:360px;max-width:calc(100vw - 32px);height:520px;max-height:calc(100vh - 120px);display:none;flex-direction:column;overflow:hidden;background:#fbf6ec;border:1px solid #e7d8bf;border-radius:14px;box-shadow:0 12px 40px rgba(80,40,30,.25);font-family:&amp;quot;Noto Serif SC&amp;quot;,&amp;quot;Source Han Serif SC&amp;quot;,&amp;quot;Songti SC&amp;quot;,&amp;quot;STSong&amp;quot;,&amp;quot;SimSun&amp;quot;,serif;color:#3a2418}&#039;,&lt;br /&gt;
      &#039;#xr-ai-panel.xr-show{display:flex}&#039;,&lt;br /&gt;
      &#039;.xr-ai-head{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;background:linear-gradient(135deg,#c41e3a,#9b182d);color:#fff}&#039;,&lt;br /&gt;
      &#039;.xr-ai-title{font-weight:700;font-size:16px;letter-spacing:.05em;display:flex;align-items:center;gap:6px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-close{background:none;border:none;color:#fff;font-size:20px;cursor:pointer;line-height:1}&#039;,&lt;br /&gt;
      &#039;.xr-ai-tabs{display:flex;border-bottom:1px solid #ecdfc8;background:#f3e9d6}&#039;,&lt;br /&gt;
      &#039;.xr-ai-tab{flex:1;padding:9px 0;text-align:center;cursor:pointer;font-size:13px;color:#7a5a3a;border:none;background:none;transition:color .2s}&#039;,&lt;br /&gt;
      &#039;.xr-ai-tab.xr-active{color:#c41e3a;font-weight:700;box-shadow:inset 0 -2px 0 #c41e3a}&#039;,&lt;br /&gt;
      &#039;.xr-ai-hint{text-align:center;font-size:11px;color:#a98c6b;padding:0 0 6px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-msgs{flex:1;overflow-y:auto;padding:14px;display:flex;flex-direction:column;gap:10px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-msg{max-width:84%;padding:9px 12px;border-radius:12px;line-height:1.6;font-size:14px;white-space:pre-wrap;word-break:break-word}&#039;,&lt;br /&gt;
      &#039;.xr-ai-msg.xr-user{align-self:flex-end;background:#c41e3a;color:#fff;border-bottom-right-radius:3px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-msg.xr-ai{align-self:flex-start;background:#fff;color:#3a2418;border:1px solid #ecdfc8;border-left:3px solid #c41e3a;border-bottom-left-radius:3px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-inputbar{display:flex;gap:8px;padding:10px;border-top:1px solid #ecdfc8;background:#f6eddb}&#039;,&lt;br /&gt;
      &#039;.xr-ai-input{flex:1;resize:none;border:1px solid #e0cda8;border-radius:9px;padding:8px 10px;font-family:inherit;font-size:14px;background:#fff;outline:none;max-height:80px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-input:focus{border-color:#c41e3a}&#039;,&lt;br /&gt;
      &#039;.xr-ai-send{border:none;border-radius:9px;padding:0 16px;background:#9b182d;color:#fff;cursor:pointer;font-family:inherit;font-size:14px;transition:background .2s}&#039;,&lt;br /&gt;
      &#039;.xr-ai-send:hover{background:#c41e3a}&#039;,&lt;br /&gt;
      &#039;.xr-ai-send:disabled{opacity:.5;cursor:default}&#039;&lt;br /&gt;
    ].join(&#039;\n&#039;);&lt;br /&gt;
    document.head.appendChild(css);&lt;br /&gt;
&lt;br /&gt;
    var fab = document.createElement(&#039;button&#039;);&lt;br /&gt;
    fab.id = &#039;xr-ai-fab&#039;; fab.innerHTML = xrAvatar(38); fab.title = TITLE; fab.setAttribute(&#039;aria-label&#039;, TITLE);&lt;br /&gt;
&lt;br /&gt;
    var panel = document.createElement(&#039;div&#039;);&lt;br /&gt;
    panel.id = &#039;xr-ai-panel&#039;;&lt;br /&gt;
    panel.innerHTML =&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-head&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;xr-ai-title&amp;quot;&amp;gt;&#039; + xrAvatar(22) + &#039; &#039; + TITLE + &#039;&amp;lt;/span&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-close&amp;quot; title=&amp;quot;收起&amp;quot;&amp;gt;×&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-tabs&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-tab xr-active&amp;quot; data-mode=&amp;quot;general&amp;quot;&amp;gt;闲聊&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-tab&amp;quot; data-mode=&amp;quot;wiki&amp;quot;&amp;gt;问虾仁宇宙&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-tab&amp;quot; data-mode=&amp;quot;audit&amp;quot;&amp;gt;作品审核&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-hint&amp;quot;&amp;gt;内容由 AI 生成，仅供参考&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-msgs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-inputbar&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;textarea class=&amp;quot;xr-ai-input&amp;quot; rows=&amp;quot;1&amp;quot; placeholder=&amp;quot;和虾仁AI说点什么…&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-send&amp;quot;&amp;gt;发送&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;company&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; &#039; +&lt;br /&gt;
      &#039;style=&amp;quot;position:absolute;left:-9999px;width:1px;height:1px;opacity:0;&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
    document.body.appendChild(fab);&lt;br /&gt;
    document.body.appendChild(panel);&lt;br /&gt;
&lt;br /&gt;
    var msgsEl = panel.querySelector(&#039;.xr-ai-msgs&#039;);&lt;br /&gt;
    var inputEl = panel.querySelector(&#039;.xr-ai-input&#039;);&lt;br /&gt;
    var sendEl = panel.querySelector(&#039;.xr-ai-send&#039;);&lt;br /&gt;
    var closeEl = panel.querySelector(&#039;.xr-ai-close&#039;);&lt;br /&gt;
    var tabs = panel.querySelectorAll(&#039;.xr-ai-tab&#039;);&lt;br /&gt;
    var honey = panel.querySelector(&#039;input[name=company]&#039;);&lt;br /&gt;
&lt;br /&gt;
    var mode = &#039;general&#039;;&lt;br /&gt;
    var history = [];&lt;br /&gt;
    var busy = false;&lt;br /&gt;
&lt;br /&gt;
    fab.addEventListener(&#039;click&#039;, function () { panel.classList.toggle(&#039;xr-show&#039;); });&lt;br /&gt;
    closeEl.addEventListener(&#039;click&#039;, function () { panel.classList.remove(&#039;xr-show&#039;); });&lt;br /&gt;
    tabs.forEach(function (t) {&lt;br /&gt;
      t.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
        tabs.forEach(function (x) { x.classList.remove(&#039;xr-active&#039;); });&lt;br /&gt;
        t.classList.add(&#039;xr-active&#039;);&lt;br /&gt;
        mode = t.getAttribute(&#039;data-mode&#039;);&lt;br /&gt;
        if (mode === &#039;audit&#039; &amp;amp;&amp;amp; !inputEl.value.trim()) { inputEl.value = AUDIT_TEMPLATE; inputEl.focus(); }&lt;br /&gt;
      });&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    function scrollBottom() { msgsEl.scrollTop = msgsEl.scrollHeight; }&lt;br /&gt;
    function addBubble(cls, text) {&lt;br /&gt;
      var d = document.createElement(&#039;div&#039;);&lt;br /&gt;
      d.className = &#039;xr-ai-msg &#039; + cls;&lt;br /&gt;
      d.textContent = text;&lt;br /&gt;
      msgsEl.appendChild(d);&lt;br /&gt;
      scrollBottom();&lt;br /&gt;
      return d;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function callAI(msgs, m, onChunk) {&lt;br /&gt;
      return fetch(API, {&lt;br /&gt;
        method: &#039;POST&#039;,&lt;br /&gt;
        headers: { &#039;Content-Type&#039;: &#039;application/json&#039; },&lt;br /&gt;
        body: JSON.stringify({ mode: m, messages: msgs, company: honey.value })&lt;br /&gt;
      }).then(function (res) {&lt;br /&gt;
        if (!res.ok) throw new Error(&#039;HTTP &#039; + res.status);&lt;br /&gt;
        var reader = res.body.getReader();&lt;br /&gt;
        var decoder = new TextDecoder();&lt;br /&gt;
        var buf = &#039;&#039;;&lt;br /&gt;
        function pump() {&lt;br /&gt;
          return reader.read().then(function (result) {&lt;br /&gt;
            if (result.done) return;&lt;br /&gt;
            buf += decoder.decode(result.value, { stream: true });&lt;br /&gt;
            var idx;&lt;br /&gt;
            while ((idx = buf.indexOf(&#039;\n&#039;)) &amp;gt;= 0) {&lt;br /&gt;
              var line = buf.slice(0, idx).trim();&lt;br /&gt;
              buf = buf.slice(idx + 1);&lt;br /&gt;
              if (!line) continue;&lt;br /&gt;
              try {&lt;br /&gt;
                var obj = JSON.parse(line);&lt;br /&gt;
                if (obj.content) onChunk(obj.content);&lt;br /&gt;
                if (obj.error) onChunk(&#039;（&#039; + obj.error + &#039;）&#039;);&lt;br /&gt;
              } catch (e) {}&lt;br /&gt;
            }&lt;br /&gt;
            return pump();&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
        return pump();&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function send() {&lt;br /&gt;
      var text = inputEl.value.trim();&lt;br /&gt;
      if (!text || busy) return;&lt;br /&gt;
      busy = true; sendEl.disabled = true;&lt;br /&gt;
      addBubble(&#039;xr-user&#039;, text);&lt;br /&gt;
      history.push({ role: &#039;user&#039;, content: text });&lt;br /&gt;
      inputEl.value = &#039;&#039;;&lt;br /&gt;
      var aiBubble = addBubble(&#039;xr-ai&#039;, &#039;…&#039;);&lt;br /&gt;
      var acc = &#039;&#039;;&lt;br /&gt;
      callAI(history.slice(-12), mode, function (chunk) {&lt;br /&gt;
        acc += chunk;&lt;br /&gt;
        aiBubble.textContent = acc + &#039;▌&#039;;&lt;br /&gt;
        scrollBottom();&lt;br /&gt;
      }).then(function () {&lt;br /&gt;
        aiBubble.textContent = acc || &#039;（暂无回复）&#039;;&lt;br /&gt;
        history.push({ role: &#039;assistant&#039;, content: acc });&lt;br /&gt;
        busy = false; sendEl.disabled = false; scrollBottom();&lt;br /&gt;
      }).catch(function (e) {&lt;br /&gt;
        aiBubble.textContent = &#039;出错了：&#039; + (e &amp;amp;&amp;amp; e.message ? e.message : e);&lt;br /&gt;
        busy = false; sendEl.disabled = false;&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sendEl.addEventListener(&#039;click&#039;, send);&lt;br /&gt;
    inputEl.addEventListener(&#039;keydown&#039;, function (e) {&lt;br /&gt;
      if (e.key === &#039;Enter&#039; &amp;amp;&amp;amp; !e.shiftKey) { e.preventDefault(); send(); }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    addBubble(&#039;xr-ai&#039;, &#039;你好，我是虾仁AI，可以陪你闲聊，也能帮你查「虾仁宇宙」的资料。选个模式开始吧～&#039;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
    document.addEventListener(&#039;DOMContentLoaded&#039;, init);&lt;br /&gt;
  } else {&lt;br /&gt;
    init();&lt;br /&gt;
  }&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=MediaWiki:Common.css&amp;diff=221</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=MediaWiki:Common.css&amp;diff=221"/>
		<updated>2026-07-31T08:34:38Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​资源页更新&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:root {&lt;br /&gt;
  --xr-red: #C41E3A;&lt;br /&gt;
  --xr-red-dark: #9B182D;&lt;br /&gt;
  --xr-paper: #F5F0E8;&lt;br /&gt;
  --xr-paper-dark: #E8E1D5;&lt;br /&gt;
  --xr-ink: #333333;&lt;br /&gt;
  --xr-bamboo: #2E5A3B;&lt;br /&gt;
  --xr-link: #1A5276;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body.skin-vector-legacy {&lt;br /&gt;
  background-color: var(--xr-paper);&lt;br /&gt;
  background-image: linear-gradient(180deg, #F5F0E8 0%, #EDE6D8 100%);&lt;br /&gt;
  color: var(--xr-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-head-base {&lt;br /&gt;
  background: var(--xr-red);&lt;br /&gt;
  height: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-page-base {&lt;br /&gt;
  background: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body {&lt;br /&gt;
  background: #FFFFFF;&lt;br /&gt;
  border: 1px solid var(--xr-paper-dark);&lt;br /&gt;
  box-shadow: 0 2px 12px rgba(0,0,0,0.06);&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1, h2, h3, h4, h5, h6 {&lt;br /&gt;
  font-family: &amp;quot;KaiTi&amp;quot;, &amp;quot;STKaiti&amp;quot;, &amp;quot;BiauKai&amp;quot;, &amp;quot;SimSun&amp;quot;, serif;&lt;br /&gt;
  color: var(--xr-red-dark);&lt;br /&gt;
  border-bottom: 2px solid var(--xr-paper-dark);&lt;br /&gt;
  padding-bottom: 0.3em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a, .mw-parser-output a.external {&lt;br /&gt;
  color: var(--xr-link);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a:hover, a:focus {&lt;br /&gt;
  color: var(--xr-red);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-tabs .mw-list-item a {&lt;br /&gt;
  border-radius: 4px 4px 0 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-tabs .mw-list-item.selected a {&lt;br /&gt;
  background: #FFFFFF;&lt;br /&gt;
  color: var(--xr-red);&lt;br /&gt;
  border-top: 2px solid var(--xr-red);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-panel .vector-menu-heading {&lt;br /&gt;
  color: var(--xr-red-dark);&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  font-family: &amp;quot;KaiTi&amp;quot;, &amp;quot;STKaiti&amp;quot;, serif;&lt;br /&gt;
  border-bottom: 1px solid var(--xr-paper-dark);&lt;br /&gt;
  padding-bottom: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .toc,&lt;br /&gt;
#toc,&lt;br /&gt;
.toc {&lt;br /&gt;
  background: var(--xr-paper);&lt;br /&gt;
  border: 1px solid var(--xr-paper-dark);&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .toc .toctitle h2,&lt;br /&gt;
.toc .toctitle h2 {&lt;br /&gt;
  color: var(--xr-red-dark);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-logo a {&lt;br /&gt;
  background-size: contain;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-head {&lt;br /&gt;
  background: rgba(255,255,255,0.92);&lt;br /&gt;
  backdrop-filter: blur(4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-editsection a {&lt;br /&gt;
  color: var(--xr-bamboo);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#footer {&lt;br /&gt;
  border-top: 1px solid var(--xr-paper-dark);&lt;br /&gt;
  padding-top: 1em;&lt;br /&gt;
}&lt;br /&gt;
/* ===== 竖排导航栏美化 + 古风字体（audit 2026-07-30）===== */&lt;br /&gt;
/* 古卷新墨：侧栏与正文统一用典雅宋体，呼应以卷为载体的调性 */&lt;br /&gt;
#mw-panel,&lt;br /&gt;
.mw-body-content {&lt;br /&gt;
    font-family: &amp;quot;Noto Serif SC&amp;quot;, &amp;quot;Source Han Serif SC&amp;quot;, &amp;quot;Songti SC&amp;quot;, &amp;quot;STSong&amp;quot;, &amp;quot;SimSun&amp;quot;, serif;&lt;br /&gt;
}&lt;br /&gt;
/* 侧栏条目：朱砂微光悬浮，提升可读与质感 */&lt;br /&gt;
#mw-panel .mw-list-item a {&lt;br /&gt;
    padding: 4px 8px;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    transition: background-color .2s ease, color .2s ease;&lt;br /&gt;
}&lt;br /&gt;
#mw-panel .mw-list-item a:hover {&lt;br /&gt;
    color: #C41E3A;&lt;br /&gt;
    background: rgba(196, 30, 58, 0.06);&lt;br /&gt;
}&lt;br /&gt;
/* 侧栏分组标题（如「创作与治理」）加一抹朱砂，强化层级 */&lt;br /&gt;
#mw-panel .vector-menu-heading,&lt;br /&gt;
#mw-panel .mw-portlet h3,&lt;br /&gt;
#p-navigation h3 {&lt;br /&gt;
    color: #9B182D;&lt;br /&gt;
    letter-spacing: .08em;&lt;br /&gt;
}&lt;br /&gt;
/* ===== 左侧栏目录修复（2026-07-30）===== */&lt;br /&gt;
/* 避免文章目录被某些浏览器/扩展渲染到 #mw-panel，导致侧栏过长 */&lt;br /&gt;
#mw-panel .toc,&lt;br /&gt;
#mw-panel #toc,&lt;br /&gt;
.vector-legacy-sidebar .toc {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== 自定义侧栏导航 xn-* 古风样式（2026-07-30）===== */&lt;br /&gt;
#mw-panel {&lt;br /&gt;
    font-family: &amp;quot;Noto Serif SC&amp;quot;, &amp;quot;Source Han Serif SC&amp;quot;, &amp;quot;Songti SC&amp;quot;, &amp;quot;STSong&amp;quot;, &amp;quot;SimSun&amp;quot;, serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* 搜索框 */&lt;br /&gt;
.xn-search { padding: 0 12px 10px; }&lt;br /&gt;
.xn-search-input {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    box-sizing: border-box;&lt;br /&gt;
    padding: 6px 10px;&lt;br /&gt;
    background: #FBF7F0;&lt;br /&gt;
    border: 1px solid #E0D5C5;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-family: &amp;quot;Noto Serif SC&amp;quot;, &amp;quot;Songti SC&amp;quot;, &amp;quot;SimSun&amp;quot;, serif;&lt;br /&gt;
    font-size: 0.85em;&lt;br /&gt;
    color: #5a4a3a;&lt;br /&gt;
    transition: border-color .2s ease, box-shadow .2s ease;&lt;br /&gt;
}&lt;br /&gt;
.xn-search-input:focus {&lt;br /&gt;
    outline: none;&lt;br /&gt;
    border-color: #C41E3A;&lt;br /&gt;
    box-shadow: 0 0 0 2px rgba(196,30,58,0.12);&lt;br /&gt;
}&lt;br /&gt;
.xn-search-input::placeholder { color: #B0A090; }&lt;br /&gt;
&lt;br /&gt;
/* 分组容器 */&lt;br /&gt;
.xn-section { margin-bottom: 2px; }&lt;br /&gt;
&lt;br /&gt;
/* 分组标题 */&lt;br /&gt;
.xn-header {&lt;br /&gt;
    padding: 8px 12px 6px;&lt;br /&gt;
    font-size: 0.82em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    letter-spacing: .08em;&lt;br /&gt;
    color: #9B182D;&lt;br /&gt;
    border-bottom: 1px solid rgba(196,30,58,0.15);&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    user-select: none;&lt;br /&gt;
    transition: background-color .2s ease;&lt;br /&gt;
    position: relative;&lt;br /&gt;
}&lt;br /&gt;
.xn-header:hover { background: rgba(196,30,58,0.05); }&lt;br /&gt;
.xn-header::before {&lt;br /&gt;
    content: &#039;&#039;;&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    width: 3px;&lt;br /&gt;
    height: 0.9em;&lt;br /&gt;
    background: #C41E3A;&lt;br /&gt;
    margin-right: 7px;&lt;br /&gt;
    vertical-align: middle;&lt;br /&gt;
    border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
.xn-header::after {&lt;br /&gt;
    content: &#039;▾&#039;;&lt;br /&gt;
    float: right;&lt;br /&gt;
    color: #B0A090;&lt;br /&gt;
    font-size: 0.9em;&lt;br /&gt;
    transition: transform .2s ease;&lt;br /&gt;
}&lt;br /&gt;
.xn-header.xn-collapsed::after {&lt;br /&gt;
    transform: rotate(-90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* 子分组标题 */&lt;br /&gt;
.xn-subheader, .xn-subsubheader {&lt;br /&gt;
    padding: 5px 12px 4px 22px;&lt;br /&gt;
    font-size: 0.8em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #7a2a3a;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    user-select: none;&lt;br /&gt;
}&lt;br /&gt;
.xn-subheader::after, .xn-subsubheader::after {&lt;br /&gt;
    content: &#039;▾&#039;;&lt;br /&gt;
    float: right;&lt;br /&gt;
    color: #C0B0A0;&lt;br /&gt;
    font-size: 0.85em;&lt;br /&gt;
    transition: transform .2s ease;&lt;br /&gt;
}&lt;br /&gt;
.xn-subheader.xn-collapsed::after, .xn-subsubheader.xn-collapsed::after {&lt;br /&gt;
    transform: rotate(-90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* 链接条目 */&lt;br /&gt;
.xn-body, .xn-subbody, .xn-subsubbody { overflow: hidden; }&lt;br /&gt;
.xn-link { padding: 0; }&lt;br /&gt;
.xn-link a {&lt;br /&gt;
    display: block;&lt;br /&gt;
    padding: 4px 12px 4px 22px;&lt;br /&gt;
    color: #4a3a2a;&lt;br /&gt;
    font-size: 0.82em;&lt;br /&gt;
    line-height: 1.5;&lt;br /&gt;
    transition: background-color .15s ease, color .15s ease, padding-left .15s ease;&lt;br /&gt;
}&lt;br /&gt;
.xn-link a:hover {&lt;br /&gt;
    color: #C41E3A;&lt;br /&gt;
    background: rgba(196,30,58,0.06);&lt;br /&gt;
    padding-left: 26px;&lt;br /&gt;
}&lt;br /&gt;
.xn-subbody .xn-link a { padding-left: 34px; }&lt;br /&gt;
.xn-subbody .xn-link a:hover { padding-left: 38px; }&lt;br /&gt;
.xn-subsubbody .xn-link a { padding-left: 46px; }&lt;br /&gt;
.xn-subsubbody .xn-link a:hover { padding-left: 50px; }&lt;br /&gt;
&lt;br /&gt;
/* 缺失页面 */&lt;br /&gt;
.xn-missing a { color: #b07070; font-style: italic; }&lt;br /&gt;
.xn-missing a:hover { color: #C41E3A; }&lt;br /&gt;
&lt;br /&gt;
/* ＋ 新增按钮 */&lt;br /&gt;
.xn-plus {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    margin-left: 4px;&lt;br /&gt;
    color: #2E5A3B !important;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    font-size: 0.85em;&lt;br /&gt;
    opacity: 0.5;&lt;br /&gt;
    transition: opacity .2s ease;&lt;br /&gt;
}&lt;br /&gt;
.xn-plus:hover { opacity: 1; }&lt;br /&gt;
&lt;br /&gt;
/* 单独链接（共创入口）*/&lt;br /&gt;
.xn-single {&lt;br /&gt;
    margin: 6px 12px;&lt;br /&gt;
    padding: 8px 10px;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    background: rgba(196,30,58,0.06);&lt;br /&gt;
    border: 1px solid rgba(196,30,58,0.2);&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    transition: background-color .2s ease;&lt;br /&gt;
}&lt;br /&gt;
.xn-single a {&lt;br /&gt;
    color: #C41E3A;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    letter-spacing: .05em;&lt;br /&gt;
}&lt;br /&gt;
.xn-single:hover { background: rgba(196,30,58,0.12); }&lt;br /&gt;
&lt;br /&gt;
/* 当前页高亮 */&lt;br /&gt;
.xn-active {&lt;br /&gt;
    color: #C41E3A !important;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    background: rgba(196,30,58,0.1) !important;&lt;br /&gt;
    border-left: 3px solid #C41E3A;&lt;br /&gt;
    padding-left: 19px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* 加载状态 */&lt;br /&gt;
.xn-loading {&lt;br /&gt;
    padding: 8px 12px 8px 22px;&lt;br /&gt;
    color: #B0A090;&lt;br /&gt;
    font-size: 0.8em;&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* 发现更多作品 */&lt;br /&gt;
.xn-add-work a {&lt;br /&gt;
    color: #2E5A3B;&lt;br /&gt;
    font-size: 0.8em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
    padding: 6px 12px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== 作品层级样式（xn-work-title，2026-07-30）===== */&lt;br /&gt;
/* 作品标题：缩进一级，字号略小，颜色稍淡 */&lt;br /&gt;
.xn-work-title {&lt;br /&gt;
    padding: 5px 12px 4px 22px;&lt;br /&gt;
    font-size: 0.8em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #7a2a3a;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    user-select: none;&lt;br /&gt;
    transition: background-color .2s ease;&lt;br /&gt;
}&lt;br /&gt;
.xn-work-title:hover { background: rgba(196,30,58,0.04); }&lt;br /&gt;
.xn-work-title::after {&lt;br /&gt;
    content: &#039;\25BE&#039;;&lt;br /&gt;
    float: right;&lt;br /&gt;
    color: #C0B0A0;&lt;br /&gt;
    font-size: 0.85em;&lt;br /&gt;
    transition: transform .2s ease;&lt;br /&gt;
}&lt;br /&gt;
.xn-work-title.xn-collapsed::after {&lt;br /&gt;
    transform: rotate(-90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* 作品子项整体缩进：比作品标题再深一级 */&lt;br /&gt;
.xn-work .xn-body &amp;gt; .xn-link a { padding-left: 34px; }&lt;br /&gt;
.xn-work .xn-body &amp;gt; .xn-link a:hover { padding-left: 38px; }&lt;br /&gt;
&lt;br /&gt;
/* 剧情层标题跟作品子项对齐 */&lt;br /&gt;
.xn-work .xn-body &amp;gt; .xn-subsection &amp;gt; .xn-subheader { padding-left: 34px; }&lt;br /&gt;
&lt;br /&gt;
/* 剧情层下段落标题再深一级 */&lt;br /&gt;
.xn-work .xn-body &amp;gt; .xn-subsection &amp;gt; .xn-subbody &amp;gt; .xn-subsubsection &amp;gt; .xn-subsubheader { padding-left: 46px; }&lt;br /&gt;
&lt;br /&gt;
/* 段落详情条目最深 */&lt;br /&gt;
.xn-work .xn-body &amp;gt; .xn-subsection &amp;gt; .xn-subbody &amp;gt; .xn-subsubsection &amp;gt; .xn-subsubbody .xn-link a { padding-left: 58px; }&lt;br /&gt;
.xn-work .xn-body &amp;gt; .xn-subsection &amp;gt; .xn-subbody &amp;gt; .xn-subsubsection &amp;gt; .xn-subsubbody .xn-link a:hover { padding-left: 62px; }&lt;br /&gt;
/* ===== 移动端（Minerva 皮肤）自定义导航适配（2026-07-30 v3）===== */&lt;br /&gt;
.xn-mobile {&lt;br /&gt;
    padding: 10px 0;&lt;br /&gt;
    border-bottom: 1px solid rgba(196,30,58,0.15);&lt;br /&gt;
    margin-bottom: 10px;&lt;br /&gt;
    font-family: &amp;quot;Noto Serif SC&amp;quot;, &amp;quot;Source Han Serif SC&amp;quot;, &amp;quot;Songti SC&amp;quot;, &amp;quot;STSong&amp;quot;, &amp;quot;SimSun&amp;quot;, serif;&lt;br /&gt;
}&lt;br /&gt;
.xn-mobile .xn-search { padding: 4px 16px 12px; }&lt;br /&gt;
.xn-mobile .xn-search-input { font-size: 16px; padding: 11px 12px; }&lt;br /&gt;
.xn-mobile .xn-header { font-size: 1rem; padding: 14px 16px 12px; }&lt;br /&gt;
.xn-mobile .xn-header::before { width: 4px; height: 1em; margin-right: 8px; }&lt;br /&gt;
.xn-mobile .xn-link a { padding: 13px 16px 13px 28px; font-size: 1rem; line-height: 1.4; }&lt;br /&gt;
.xn-mobile .xn-link a:hover { padding-left: 32px; }&lt;br /&gt;
.xn-mobile .xn-subbody .xn-link a { padding-left: 40px; }&lt;br /&gt;
.xn-mobile .xn-subbody .xn-link a:hover { padding-left: 44px; }&lt;br /&gt;
.xn-mobile .xn-subsubbody .xn-link a { padding-left: 52px; }&lt;br /&gt;
.xn-mobile .xn-subsubbody .xn-link a:hover { padding-left: 56px; }&lt;br /&gt;
.xn-mobile .xn-work-title { font-size: 0.95rem; padding: 13px 16px 11px 28px; }&lt;br /&gt;
.xn-mobile .xn-subheader, .xn-mobile .xn-subsubheader { padding: 12px 16px 10px 32px; font-size: 0.92rem; }&lt;br /&gt;
.xn-mobile .xn-single { margin: 12px 16px; padding: 13px 10px; }&lt;br /&gt;
.xn-mobile .xn-active { padding-left: 25px !important; }&lt;br /&gt;
.xn-mobile .xn-loading { padding: 12px 16px 12px 28px; font-size: 0.9em; }&lt;br /&gt;
.xn-mobile .xn-add-work a { padding: 10px 16px; }&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=MediaWiki:Common.js&amp;diff=220</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=MediaWiki:Common.js&amp;diff=220"/>
		<updated>2026-07-29T19:30:46Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​Fix content model wikitext→javascript: ResourceLoader must package Common.js into site module (navigation was not loading)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* 虾仁维基 - 自定义侧边栏导航 v2.1 */&lt;br /&gt;
/* 优化：古风主题统一、健壮初始化、精致样式 */&lt;br /&gt;
/* 最后更新: 2026-07-30 */&lt;br /&gt;
&lt;br /&gt;
(function ($, mw) {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
    var COLLAPSE_KEY = &#039;xiarenwiki-nav-v2&#039;;&lt;br /&gt;
    var WORKS = [&#039;我在大明那些年&#039;, &#039;彼岸轮回&#039;, &#039;一品布衣&#039;];&lt;br /&gt;
    var WORK_DIRECT = [&#039;宇宙层&#039;, &#039;人物&#039;, &#039;世界观&#039;, &#039;设定&#039;];&lt;br /&gt;
&lt;br /&gt;
    function init() {&lt;br /&gt;
        var wgIsArticle = mw.config.get(&#039;wgIsArticle&#039;);&lt;br /&gt;
        var wgCanonicalSpecialPageName = mw.config.get(&#039;wgCanonicalSpecialPageName&#039;);&lt;br /&gt;
        if (!wgIsArticle &amp;amp;&amp;amp; wgCanonicalSpecialPageName) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        mw.loader.using(&#039;mediawiki.api&#039;).then(function () {&lt;br /&gt;
            waitForPanel(function ($panel) {&lt;br /&gt;
                buildNav($panel);&lt;br /&gt;
            });&lt;br /&gt;
        }).catch(function (e) {&lt;br /&gt;
            console.error(&#039;[虾仁导航] 依赖加载失败，降级构建&#039;, e);&lt;br /&gt;
            waitForPanel(function ($panel) {&lt;br /&gt;
                buildNav($panel);&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function waitForPanel(cb) {&lt;br /&gt;
        var $panel = $(&#039;#mw-panel&#039;);&lt;br /&gt;
        if ($panel.length) return cb($panel);&lt;br /&gt;
        var tries = 0;&lt;br /&gt;
        var timer = setInterval(function () {&lt;br /&gt;
            $panel = $(&#039;#mw-panel&#039;);&lt;br /&gt;
            if ($panel.length || ++tries &amp;gt; 50) {&lt;br /&gt;
                clearInterval(timer);&lt;br /&gt;
                if ($panel.length) cb($panel);&lt;br /&gt;
            }&lt;br /&gt;
        }, 100);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function buildNav($panel) {&lt;br /&gt;
        var html = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-search&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;form action=&amp;quot;&#039; + mw.util.getUrl(&#039;Special:Search&#039;) + &#039;&amp;quot; method=&amp;quot;get&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;search&amp;quot; class=&amp;quot;xn-search-input&amp;quot; placeholder=&amp;quot;检索典籍…&amp;quot; /&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;/form&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += section(&#039;Wiki&#039;, [&lt;br /&gt;
            [&#039;首页&#039;, &#039;首页&#039;],&lt;br /&gt;
            [&#039;Wiki简介&#039;, &#039;Wiki简介&#039;],&lt;br /&gt;
            [&#039;管理员告示&#039;, &#039;管理员告示&#039;],&lt;br /&gt;
            [&#039;随机页面&#039;, &#039;Special:Random&#039;],&lt;br /&gt;
            [&#039;快速搜索&#039;, &#039;Special:Search&#039;],&lt;br /&gt;
            [&#039;相关平台&#039;, &#039;相关平台&#039;],&lt;br /&gt;
            [&#039;Wiki源站点&#039;, &#039;Wiki源站点&#039;]&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
        html += section(&#039;虾仁简介&#039;, [&lt;br /&gt;
            [&#039;虾仁？&#039;, &#039;虾仁？&#039;],&lt;br /&gt;
            [&#039;虾仁共创收录规则&#039;, &#039;虾仁共创收录规则&#039;],&lt;br /&gt;
            [&#039;虾仁宇宙结构介绍&#039;, &#039;虾仁宇宙结构介绍&#039;]&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-section&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;universe&amp;quot;&amp;gt;虾仁宇宙&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-universe&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;xn-loading&amp;quot;&amp;gt;卷帙加载中…&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-section&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;literature&amp;quot;&amp;gt;虾仁文学&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-literature&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += link(&#039;创始宣言&#039;, &#039;创始宣言&#039;);&lt;br /&gt;
        html += link(&#039;虾仁六章&#039;, &#039;虾仁六章&#039;);&lt;br /&gt;
        html += link(&#039;虾仁异志&#039;, &#039;虾仁异志&#039;);&lt;br /&gt;
        html += link(&#039;虾仁诗作&#039;, &#039;虾仁诗作&#039;);&lt;br /&gt;
        html += link(&#039;虾仁音乐&#039;, &#039;虾仁音乐&#039;);&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-subsection&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-subheader xn-expandable&amp;quot; data-sid=&amp;quot;papers&amp;quot;&amp;gt;虾仁论文 &#039; + plus(&#039;虾仁论文&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-subbody&amp;quot; id=&amp;quot;xn-papers&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += link(&#039;去中心化创作模式的研究&#039;, &#039;去中心化创作模式的研究&#039;);&lt;br /&gt;
        html += link(&#039;数字时代的孙悟空&#039;, &#039;数字时代的孙悟空&#039;);&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += section(&#039;虾仁历史&#039;, [&lt;br /&gt;
            [&#039;起源&#039;, &#039;虾仁历史/起源&#039;],&lt;br /&gt;
            [&#039;传播&#039;, &#039;虾仁历史/传播&#039;],&lt;br /&gt;
            [&#039;转折&#039;, &#039;虾仁历史/转折&#039;],&lt;br /&gt;
            [&#039;爆发&#039;, &#039;虾仁历史/爆发&#039;],&lt;br /&gt;
            [&#039;危机&#039;, &#039;虾仁历史/危机&#039;],&lt;br /&gt;
            [&#039;转型&#039;, &#039;虾仁历史/转型&#039;]&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-single&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&#039; + url(&#039;共创入口&#039;) + &#039;&amp;quot;&amp;gt;共创入口&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        $panel.html(html);&lt;br /&gt;
        restoreCollapse();&lt;br /&gt;
        bindEvents();&lt;br /&gt;
        highlightCurrent();&lt;br /&gt;
        loadUniverse();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function section(title, items) {&lt;br /&gt;
        var sid = title.replace(/[^a-z0-9\u4e00-\u9fff]/gi, &#039;&#039;).toLowerCase();&lt;br /&gt;
        var h = &#039;&amp;lt;div class=&amp;quot;xn-section&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        h += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + sid + &#039;&amp;quot;&amp;gt;&#039; + title + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        h += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-&#039; + sid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        for (var i = 0; i &amp;lt; items.length; i++) {&lt;br /&gt;
            h += link(items[i][0], items[i][1]);&lt;br /&gt;
        }&lt;br /&gt;
        h += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return h;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function link(label, page, cls) {&lt;br /&gt;
        return &#039;&amp;lt;div class=&amp;quot;xn-link&#039; + (cls ? &#039; &#039; + cls : &#039;&#039;) + &#039;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&#039; + url(page) + &#039;&amp;quot;&amp;gt;&#039; + label + &#039;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function url(page) { return mw.util.getUrl(page); }&lt;br /&gt;
&lt;br /&gt;
    function plus(page) {&lt;br /&gt;
        return &#039;&amp;lt;a class=&amp;quot;xn-plus&amp;quot; href=&amp;quot;&#039; + url(page) + &#039;?action=edit&amp;quot; title=&amp;quot;编辑/新增&amp;quot;&amp;gt;＋&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    async function loadUniverse() {&lt;br /&gt;
        var $body = $(&#039;#xn-universe&#039;);&lt;br /&gt;
        if (!$body.length) return;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            var api = new mw.Api();&lt;br /&gt;
            var html = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; WORKS.length; i++) {&lt;br /&gt;
                var work = WORKS[i];&lt;br /&gt;
                var workSid = &#039;work&#039; + i;&lt;br /&gt;
&lt;br /&gt;
                var subpages = [];&lt;br /&gt;
                try {&lt;br /&gt;
                    var result = await api.get({&lt;br /&gt;
                        action: &#039;query&#039;,&lt;br /&gt;
                        list: &#039;allpages&#039;,&lt;br /&gt;
                        apprefix: work + &#039;/&#039;,&lt;br /&gt;
                        aplimit: 100&lt;br /&gt;
                    });&lt;br /&gt;
                    subpages = result.query.allpages || [];&lt;br /&gt;
                } catch (e) {&lt;br /&gt;
                    console.error(&#039;[虾仁导航] API error for &#039; + work, e);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-work&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-work-title xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + workSid + &#039;&amp;quot;&amp;gt;&#039; + work + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-&#039; + workSid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
                var directSet = {};&lt;br /&gt;
                for (var j = 0; j &amp;lt; subpages.length; j++) {&lt;br /&gt;
                    var rel = subpages[j].title.substring(work.length + 1);&lt;br /&gt;
                    if (rel.indexOf(&#039;/&#039;) === -1) directSet[rel] = true;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                for (var k = 0; k &amp;lt; WORK_DIRECT.length; k++) {&lt;br /&gt;
                    var item = WORK_DIRECT[k];&lt;br /&gt;
                    var exists = directSet[item];&lt;br /&gt;
                    html += link(item, work + &#039;/&#039; + item, exists ? &#039;&#039; : &#039;xn-missing&#039;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                var plotSegs = [];&lt;br /&gt;
                for (j = 0; j &amp;lt; subpages.length; j++) {&lt;br /&gt;
                    rel = subpages[j].title.substring(work.length + 1);&lt;br /&gt;
                    var parts = rel.split(&#039;/&#039;);&lt;br /&gt;
                    if (parts.length === 2 &amp;amp;&amp;amp; parts[0] === &#039;剧情层&#039;) {&lt;br /&gt;
                        plotSegs.push(parts[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                var plotSid = workSid + &#039;plot&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-subsection&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-subheader xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + plotSid + &#039;&amp;quot;&amp;gt;剧情层 &#039; + plus(work + &#039;/剧情层&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-subbody&amp;quot; id=&amp;quot;xn-&#039; + plotSid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
                for (k = 0; k &amp;lt; plotSegs.length; k++) {&lt;br /&gt;
                    var seg = plotSegs[k];&lt;br /&gt;
                    var segSid = workSid + &#039;seg&#039; + k;&lt;br /&gt;
                    var segPage = work + &#039;/剧情层/&#039; + seg;&lt;br /&gt;
&lt;br /&gt;
                    var jinji = [];&lt;br /&gt;
                    try {&lt;br /&gt;
                        var segResult = await api.get({&lt;br /&gt;
                            action: &#039;query&#039;,&lt;br /&gt;
                            list: &#039;allpages&#039;,&lt;br /&gt;
                            apprefix: segPage + &#039;/&#039;,&lt;br /&gt;
                            aplimit: 50&lt;br /&gt;
                        });&lt;br /&gt;
                        var segPages = segResult.query.allpages || [];&lt;br /&gt;
                        for (var m = 0; m &amp;lt; segPages.length; m++) {&lt;br /&gt;
                            jinji.push(segPages[m].title.substring(segPage.length + 1));&lt;br /&gt;
                        }&lt;br /&gt;
                    } catch (e2) {}&lt;br /&gt;
&lt;br /&gt;
                    html += &#039;&amp;lt;div class=&amp;quot;xn-subsubsection&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
                    html += &#039;&amp;lt;div class=&amp;quot;xn-subsubheader xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + segSid + &#039;&amp;quot;&amp;gt;&#039; + seg + &#039; &#039; + plus(segPage) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                    html += &#039;&amp;lt;div class=&amp;quot;xn-subsubbody&amp;quot; id=&amp;quot;xn-&#039; + segSid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
                    for (m = 0; m &amp;lt; jinji.length; m++) {&lt;br /&gt;
                        html += link(jinji[m], segPage + &#039;/&#039; + jinji[m]);&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;xn-link xn-add-work&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&#039; + url(&#039;Special:Search&#039;) + &#039;&amp;quot; title=&amp;quot;搜索已有作品&amp;quot;&amp;gt;＋ 发现更多作品&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
            $body.html(html);&lt;br /&gt;
            restoreCollapse();&lt;br /&gt;
            bindEvents();&lt;br /&gt;
            highlightCurrent();&lt;br /&gt;
&lt;br /&gt;
        } catch (e) {&lt;br /&gt;
            console.error(&#039;[虾仁导航] 虾仁宇宙加载失败&#039;, e);&lt;br /&gt;
            $body.html(&#039;&amp;lt;div class=&amp;quot;xn-link&amp;quot;&amp;gt;(加载失败，请刷新)&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function highlightCurrent() {&lt;br /&gt;
        var currentTitle = mw.config.get(&#039;wgPageName&#039;);&lt;br /&gt;
        $(&#039;#mw-panel .xn-link a&#039;).each(function () {&lt;br /&gt;
            var href = $(this).attr(&#039;href&#039;);&lt;br /&gt;
            if (!href) return;&lt;br /&gt;
            var match = false;&lt;br /&gt;
            if (href.indexOf(&#039;title=&#039;) &amp;gt; 0) {&lt;br /&gt;
                var m = href.match(/title=([^&amp;amp;]+)/);&lt;br /&gt;
                if (m) match = decodeURIComponent(m[1]) === currentTitle;&lt;br /&gt;
            } else {&lt;br /&gt;
                var parts = href.split(&#039;/&#039;);&lt;br /&gt;
                var last = parts[parts.length - 1];&lt;br /&gt;
                match = decodeURIComponent(last) === currentTitle;&lt;br /&gt;
            }&lt;br /&gt;
            if (match) {&lt;br /&gt;
                $(this).addClass(&#039;xn-active&#039;);&lt;br /&gt;
                $(this).closest(&#039;.xn-link&#039;).addClass(&#039;xn-active-link&#039;);&lt;br /&gt;
                $(this).parents(&#039;.xn-body, .xn-subbody, .xn-subsubbody&#039;).each(function () {&lt;br /&gt;
                    $(this).show();&lt;br /&gt;
                    var sid = $(this).attr(&#039;id&#039;);&lt;br /&gt;
                    if (sid &amp;amp;&amp;amp; sid.indexOf(&#039;xn-&#039;) === 0) {&lt;br /&gt;
                        sid = sid.substring(3);&lt;br /&gt;
                        $(&#039;[data-sid=&amp;quot;&#039; + sid + &#039;&amp;quot;]&#039;).removeClass(&#039;xn-collapsed&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function bindEvents() {&lt;br /&gt;
        $(document).off(&#039;click.xn&#039;).on(&#039;click.xn&#039;, &#039;.xn-expandable&#039;, function (e) {&lt;br /&gt;
            if ($(e.target).closest(&#039;.xn-plus&#039;).length) return;&lt;br /&gt;
            var sid = $(this).data(&#039;sid&#039;);&lt;br /&gt;
            var $body = $(&#039;#xn-&#039; + sid);&lt;br /&gt;
            if (!$body.length) $body = $(this).next(&#039;.xn-body,.xn-subbody,.xn-subsubbody&#039;);&lt;br /&gt;
            if (!$body.length) return;&lt;br /&gt;
&lt;br /&gt;
            $body.slideToggle(150);&lt;br /&gt;
            $(this).toggleClass(&#039;xn-collapsed&#039;, !$body.is(&#039;:visible&#039;));&lt;br /&gt;
&lt;br /&gt;
            var state = loadState();&lt;br /&gt;
            state[sid] = $body.is(&#039;:visible&#039;);&lt;br /&gt;
            saveState(state);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function restoreCollapse() {&lt;br /&gt;
        var state = loadState();&lt;br /&gt;
        var defaults = { &#039;universe&#039;: true };&lt;br /&gt;
        for (var key in defaults) {&lt;br /&gt;
            if (!(key in state)) state[key] = defaults[key];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        Object.keys(state).forEach(function (sid) {&lt;br /&gt;
            var $header = $(&#039;[data-sid=&amp;quot;&#039; + sid + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            var $body = $(&#039;#xn-&#039; + sid);&lt;br /&gt;
            if (!$body.length) $body = $header.next(&#039;.xn-body,.xn-subbody,.xn-subsubbody&#039;);&lt;br /&gt;
            if (!$body.length) return;&lt;br /&gt;
&lt;br /&gt;
            if (state[sid]) {&lt;br /&gt;
                $body.show();&lt;br /&gt;
                $header.removeClass(&#039;xn-collapsed&#039;);&lt;br /&gt;
            } else {&lt;br /&gt;
                $body.hide();&lt;br /&gt;
                $header.addClass(&#039;xn-collapsed&#039;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function loadState() {&lt;br /&gt;
        try { return JSON.parse(localStorage.getItem(COLLAPSE_KEY) || &#039;{}&#039;); }&lt;br /&gt;
        catch (e) { return {}; }&lt;br /&gt;
    }&lt;br /&gt;
    function saveState(s) {&lt;br /&gt;
        try { localStorage.setItem(COLLAPSE_KEY, JSON.stringify(s)); }&lt;br /&gt;
        catch (e) {}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    $(init);&lt;br /&gt;
&lt;br /&gt;
})(jQuery, mediaWiki);&lt;br /&gt;
&lt;br /&gt;
/* ===== 虾仁AI 浮窗助手（2026-07-30 v2） ===== */&lt;br /&gt;
(function () {&lt;br /&gt;
  if (window.__xrAiInited) return;&lt;br /&gt;
  window.__xrAiInited = true;&lt;br /&gt;
&lt;br /&gt;
  function xrAvatar(size) {&lt;br /&gt;
    return &#039;&amp;lt;svg viewBox=&amp;quot;0 0 48 48&amp;quot; width=&amp;quot;&#039; + size + &#039;&amp;quot; height=&amp;quot;&#039; + size + &#039;&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;ellipse cx=&amp;quot;24&amp;quot; cy=&amp;quot;14.5&amp;quot; rx=&amp;quot;18&amp;quot; ry=&amp;quot;5.5&amp;quot; fill=&amp;quot;#caa53d&amp;quot;/&amp;gt;&amp;lt;ellipse cx=&amp;quot;24&amp;quot; cy=&amp;quot;14.5&amp;quot; rx=&amp;quot;18&amp;quot; ry=&amp;quot;5.5&amp;quot; fill=&amp;quot;none&amp;quot; stroke=&amp;quot;#a8842a&amp;quot; stroke-width=&amp;quot;0.8&amp;quot;/&amp;gt;&amp;lt;path d=&amp;quot;M13 14.5 Q24 2.5 35 14.5 Z&amp;quot; fill=&amp;quot;#d9b84a&amp;quot;/&amp;gt;&amp;lt;path d=&amp;quot;M13 14.5 Q24 2.5 35 14.5 Z&amp;quot; fill=&amp;quot;none&amp;quot; stroke=&amp;quot;#a8842a&amp;quot; stroke-width=&amp;quot;0.8&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;12.5&amp;quot; cy=&amp;quot;25&amp;quot; r=&amp;quot;6.5&amp;quot; fill=&amp;quot;#2c2c2c&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;35.5&amp;quot; cy=&amp;quot;25&amp;quot; r=&amp;quot;6.5&amp;quot; fill=&amp;quot;#2c2c2c&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;24&amp;quot; cy=&amp;quot;29&amp;quot; r=&amp;quot;15&amp;quot; fill=&amp;quot;#fdfdfd&amp;quot; stroke=&amp;quot;#e9e2d2&amp;quot; stroke-width=&amp;quot;0.8&amp;quot;/&amp;gt;&amp;lt;ellipse cx=&amp;quot;18&amp;quot; cy=&amp;quot;28&amp;quot; rx=&amp;quot;4.5&amp;quot; ry=&amp;quot;5.6&amp;quot; fill=&amp;quot;#2c2c2c&amp;quot;/&amp;gt;&amp;lt;ellipse cx=&amp;quot;30&amp;quot; cy=&amp;quot;28&amp;quot; rx=&amp;quot;4.5&amp;quot; ry=&amp;quot;5.6&amp;quot; fill=&amp;quot;#2c2c2c&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;18&amp;quot; cy=&amp;quot;28&amp;quot; r=&amp;quot;1.9&amp;quot; fill=&amp;quot;#fff&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;30&amp;quot; cy=&amp;quot;28&amp;quot; r=&amp;quot;1.9&amp;quot; fill=&amp;quot;#fff&amp;quot;/&amp;gt;&amp;lt;ellipse cx=&amp;quot;24&amp;quot; cy=&amp;quot;33&amp;quot; rx=&amp;quot;2.1&amp;quot; ry=&amp;quot;1.5&amp;quot; fill=&amp;quot;#2c2c2c&amp;quot;/&amp;gt;&amp;lt;path d=&amp;quot;M20.5 36 Q24 38.5 27.5 36&amp;quot; stroke=&amp;quot;#2c2c2c&amp;quot; stroke-width=&amp;quot;1.3&amp;quot; fill=&amp;quot;none&amp;quot; stroke-linecap=&amp;quot;round&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;15&amp;quot; cy=&amp;quot;33&amp;quot; r=&amp;quot;2&amp;quot; fill=&amp;quot;#c41e3a&amp;quot; opacity=&amp;quot;0.18&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;33&amp;quot; cy=&amp;quot;33&amp;quot; r=&amp;quot;2&amp;quot; fill=&amp;quot;#c41e3a&amp;quot; opacity=&amp;quot;0.18&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function init() {&lt;br /&gt;
    var API = &#039;/ai_proxy.php&#039;;&lt;br /&gt;
    var TITLE = &#039;虾仁AI&#039;;&lt;br /&gt;
    var AUDIT_TEMPLATE = &#039;作品名：\n1. 视觉识别（主角是否为草帽熊猫头或明显变体）：\n2. 听觉识别（是否使用虾仁系列标志性AI配音）：\n3. 主角身份（是否虾仁人格内核的投射，名字可不同）：\n4. 完整性（有无完整结局）：\n5. 深度（有无情感内核/名场面）：\n6. 原创性（虾仁原生或深度改编）：\n7. 自述与作品链接：\n&#039;;&lt;br /&gt;
&lt;br /&gt;
    var css = document.createElement(&#039;style&#039;);&lt;br /&gt;
    css.textContent = [&lt;br /&gt;
      &#039;#xr-ai-fab{position:fixed;right:22px;bottom:22px;z-index:99999;width:56px;height:56px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;background:linear-gradient(135deg,#c41e3a,#9b182d);color:#fff;font-size:26px;box-shadow:0 6px 20px rgba(155,24,45,.4);transition:transform .2s ease,box-shadow .2s ease;font-family:&amp;quot;Noto Serif SC&amp;quot;,&amp;quot;Songti SC&amp;quot;,serif}&#039;,&lt;br /&gt;
      &#039;#xr-ai-fab:hover{transform:scale(1.08);box-shadow:0 8px 26px rgba(155,24,45,.55)}&#039;,&lt;br /&gt;
      &#039;#xr-ai-panel{position:fixed;right:22px;bottom:90px;z-index:99999;width:360px;max-width:calc(100vw - 32px);height:520px;max-height:calc(100vh - 120px);display:none;flex-direction:column;overflow:hidden;background:#fbf6ec;border:1px solid #e7d8bf;border-radius:14px;box-shadow:0 12px 40px rgba(80,40,30,.25);font-family:&amp;quot;Noto Serif SC&amp;quot;,&amp;quot;Source Han Serif SC&amp;quot;,&amp;quot;Songti SC&amp;quot;,&amp;quot;STSong&amp;quot;,&amp;quot;SimSun&amp;quot;,serif;color:#3a2418}&#039;,&lt;br /&gt;
      &#039;#xr-ai-panel.xr-show{display:flex}&#039;,&lt;br /&gt;
      &#039;.xr-ai-head{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;background:linear-gradient(135deg,#c41e3a,#9b182d);color:#fff}&#039;,&lt;br /&gt;
      &#039;.xr-ai-title{font-weight:700;font-size:16px;letter-spacing:.05em;display:flex;align-items:center;gap:6px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-close{background:none;border:none;color:#fff;font-size:20px;cursor:pointer;line-height:1}&#039;,&lt;br /&gt;
      &#039;.xr-ai-tabs{display:flex;border-bottom:1px solid #ecdfc8;background:#f3e9d6}&#039;,&lt;br /&gt;
      &#039;.xr-ai-tab{flex:1;padding:9px 0;text-align:center;cursor:pointer;font-size:13px;color:#7a5a3a;border:none;background:none;transition:color .2s}&#039;,&lt;br /&gt;
      &#039;.xr-ai-tab.xr-active{color:#c41e3a;font-weight:700;box-shadow:inset 0 -2px 0 #c41e3a}&#039;,&lt;br /&gt;
      &#039;.xr-ai-hint{text-align:center;font-size:11px;color:#a98c6b;padding:0 0 6px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-msgs{flex:1;overflow-y:auto;padding:14px;display:flex;flex-direction:column;gap:10px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-msg{max-width:84%;padding:9px 12px;border-radius:12px;line-height:1.6;font-size:14px;white-space:pre-wrap;word-break:break-word}&#039;,&lt;br /&gt;
      &#039;.xr-ai-msg.xr-user{align-self:flex-end;background:#c41e3a;color:#fff;border-bottom-right-radius:3px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-msg.xr-ai{align-self:flex-start;background:#fff;color:#3a2418;border:1px solid #ecdfc8;border-left:3px solid #c41e3a;border-bottom-left-radius:3px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-inputbar{display:flex;gap:8px;padding:10px;border-top:1px solid #ecdfc8;background:#f6eddb}&#039;,&lt;br /&gt;
      &#039;.xr-ai-input{flex:1;resize:none;border:1px solid #e0cda8;border-radius:9px;padding:8px 10px;font-family:inherit;font-size:14px;background:#fff;outline:none;max-height:80px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-input:focus{border-color:#c41e3a}&#039;,&lt;br /&gt;
      &#039;.xr-ai-send{border:none;border-radius:9px;padding:0 16px;background:#9b182d;color:#fff;cursor:pointer;font-family:inherit;font-size:14px;transition:background .2s}&#039;,&lt;br /&gt;
      &#039;.xr-ai-send:hover{background:#c41e3a}&#039;,&lt;br /&gt;
      &#039;.xr-ai-send:disabled{opacity:.5;cursor:default}&#039;&lt;br /&gt;
    ].join(&#039;\n&#039;);&lt;br /&gt;
    document.head.appendChild(css);&lt;br /&gt;
&lt;br /&gt;
    var fab = document.createElement(&#039;button&#039;);&lt;br /&gt;
    fab.id = &#039;xr-ai-fab&#039;; fab.innerHTML = xrAvatar(38); fab.title = TITLE; fab.setAttribute(&#039;aria-label&#039;, TITLE);&lt;br /&gt;
&lt;br /&gt;
    var panel = document.createElement(&#039;div&#039;);&lt;br /&gt;
    panel.id = &#039;xr-ai-panel&#039;;&lt;br /&gt;
    panel.innerHTML =&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-head&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;xr-ai-title&amp;quot;&amp;gt;&#039; + xrAvatar(22) + &#039; &#039; + TITLE + &#039;&amp;lt;/span&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-close&amp;quot; title=&amp;quot;收起&amp;quot;&amp;gt;×&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-tabs&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-tab xr-active&amp;quot; data-mode=&amp;quot;general&amp;quot;&amp;gt;闲聊&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-tab&amp;quot; data-mode=&amp;quot;wiki&amp;quot;&amp;gt;问虾仁宇宙&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-tab&amp;quot; data-mode=&amp;quot;audit&amp;quot;&amp;gt;作品审核&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-hint&amp;quot;&amp;gt;内容由 AI 生成，仅供参考&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-msgs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-inputbar&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;textarea class=&amp;quot;xr-ai-input&amp;quot; rows=&amp;quot;1&amp;quot; placeholder=&amp;quot;和虾仁AI说点什么…&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-send&amp;quot;&amp;gt;发送&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;company&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; &#039; +&lt;br /&gt;
      &#039;style=&amp;quot;position:absolute;left:-9999px;width:1px;height:1px;opacity:0;&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
    document.body.appendChild(fab);&lt;br /&gt;
    document.body.appendChild(panel);&lt;br /&gt;
&lt;br /&gt;
    var msgsEl = panel.querySelector(&#039;.xr-ai-msgs&#039;);&lt;br /&gt;
    var inputEl = panel.querySelector(&#039;.xr-ai-input&#039;);&lt;br /&gt;
    var sendEl = panel.querySelector(&#039;.xr-ai-send&#039;);&lt;br /&gt;
    var closeEl = panel.querySelector(&#039;.xr-ai-close&#039;);&lt;br /&gt;
    var tabs = panel.querySelectorAll(&#039;.xr-ai-tab&#039;);&lt;br /&gt;
    var honey = panel.querySelector(&#039;input[name=company]&#039;);&lt;br /&gt;
&lt;br /&gt;
    var mode = &#039;general&#039;;&lt;br /&gt;
    var history = [];&lt;br /&gt;
    var busy = false;&lt;br /&gt;
&lt;br /&gt;
    fab.addEventListener(&#039;click&#039;, function () { panel.classList.toggle(&#039;xr-show&#039;); });&lt;br /&gt;
    closeEl.addEventListener(&#039;click&#039;, function () { panel.classList.remove(&#039;xr-show&#039;); });&lt;br /&gt;
    tabs.forEach(function (t) {&lt;br /&gt;
      t.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
        tabs.forEach(function (x) { x.classList.remove(&#039;xr-active&#039;); });&lt;br /&gt;
        t.classList.add(&#039;xr-active&#039;);&lt;br /&gt;
        mode = t.getAttribute(&#039;data-mode&#039;);&lt;br /&gt;
        if (mode === &#039;audit&#039; &amp;amp;&amp;amp; !inputEl.value.trim()) { inputEl.value = AUDIT_TEMPLATE; inputEl.focus(); }&lt;br /&gt;
      });&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    function scrollBottom() { msgsEl.scrollTop = msgsEl.scrollHeight; }&lt;br /&gt;
    function addBubble(cls, text) {&lt;br /&gt;
      var d = document.createElement(&#039;div&#039;);&lt;br /&gt;
      d.className = &#039;xr-ai-msg &#039; + cls;&lt;br /&gt;
      d.textContent = text;&lt;br /&gt;
      msgsEl.appendChild(d);&lt;br /&gt;
      scrollBottom();&lt;br /&gt;
      return d;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function callAI(msgs, m, onChunk) {&lt;br /&gt;
      return fetch(API, {&lt;br /&gt;
        method: &#039;POST&#039;,&lt;br /&gt;
        headers: { &#039;Content-Type&#039;: &#039;application/json&#039; },&lt;br /&gt;
        body: JSON.stringify({ mode: m, messages: msgs, company: honey.value })&lt;br /&gt;
      }).then(function (res) {&lt;br /&gt;
        if (!res.ok) throw new Error(&#039;HTTP &#039; + res.status);&lt;br /&gt;
        var reader = res.body.getReader();&lt;br /&gt;
        var decoder = new TextDecoder();&lt;br /&gt;
        var buf = &#039;&#039;;&lt;br /&gt;
        function pump() {&lt;br /&gt;
          return reader.read().then(function (result) {&lt;br /&gt;
            if (result.done) return;&lt;br /&gt;
            buf += decoder.decode(result.value, { stream: true });&lt;br /&gt;
            var idx;&lt;br /&gt;
            while ((idx = buf.indexOf(&#039;\n&#039;)) &amp;gt;= 0) {&lt;br /&gt;
              var line = buf.slice(0, idx).trim();&lt;br /&gt;
              buf = buf.slice(idx + 1);&lt;br /&gt;
              if (!line) continue;&lt;br /&gt;
              try {&lt;br /&gt;
                var obj = JSON.parse(line);&lt;br /&gt;
                if (obj.content) onChunk(obj.content);&lt;br /&gt;
                if (obj.error) onChunk(&#039;（&#039; + obj.error + &#039;）&#039;);&lt;br /&gt;
              } catch (e) {}&lt;br /&gt;
            }&lt;br /&gt;
            return pump();&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
        return pump();&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function send() {&lt;br /&gt;
      var text = inputEl.value.trim();&lt;br /&gt;
      if (!text || busy) return;&lt;br /&gt;
      busy = true; sendEl.disabled = true;&lt;br /&gt;
      addBubble(&#039;xr-user&#039;, text);&lt;br /&gt;
      history.push({ role: &#039;user&#039;, content: text });&lt;br /&gt;
      inputEl.value = &#039;&#039;;&lt;br /&gt;
      var aiBubble = addBubble(&#039;xr-ai&#039;, &#039;…&#039;);&lt;br /&gt;
      var acc = &#039;&#039;;&lt;br /&gt;
      callAI(history.slice(-12), mode, function (chunk) {&lt;br /&gt;
        acc += chunk;&lt;br /&gt;
        aiBubble.textContent = acc + &#039;▌&#039;;&lt;br /&gt;
        scrollBottom();&lt;br /&gt;
      }).then(function () {&lt;br /&gt;
        aiBubble.textContent = acc || &#039;（暂无回复）&#039;;&lt;br /&gt;
        history.push({ role: &#039;assistant&#039;, content: acc });&lt;br /&gt;
        busy = false; sendEl.disabled = false; scrollBottom();&lt;br /&gt;
      }).catch(function (e) {&lt;br /&gt;
        aiBubble.textContent = &#039;出错了：&#039; + (e &amp;amp;&amp;amp; e.message ? e.message : e);&lt;br /&gt;
        busy = false; sendEl.disabled = false;&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sendEl.addEventListener(&#039;click&#039;, send);&lt;br /&gt;
    inputEl.addEventListener(&#039;keydown&#039;, function (e) {&lt;br /&gt;
      if (e.key === &#039;Enter&#039; &amp;amp;&amp;amp; !e.shiftKey) { e.preventDefault(); send(); }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    addBubble(&#039;xr-ai&#039;, &#039;你好，我是虾仁AI，可以陪你闲聊，也能帮你查「虾仁宇宙」的资料。选个模式开始吧～&#039;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
    document.addEventListener(&#039;DOMContentLoaded&#039;, init);&lt;br /&gt;
  } else {&lt;br /&gt;
    init();&lt;br /&gt;
  }&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8F%91%E5%B1%95%E5%8F%B2&amp;diff=213</id>
		<title>虾仁发展史</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8F%91%E5%B1%95%E5%8F%B2&amp;diff=213"/>
		<updated>2026-07-29T17:47:58Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​填充虾仁历史节点/重定向孤页&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[虾仁历史]]&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2&amp;diff=212</id>
		<title>虾仁历史</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2&amp;diff=212"/>
		<updated>2026-07-29T17:47:57Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​填充虾仁历史节点/重定向孤页&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{作品导航|虾仁历史|}}&lt;br /&gt;
&lt;br /&gt;
虾仁宇宙的发展历史。&lt;br /&gt;
&lt;br /&gt;
== 历史阶段 ==&lt;br /&gt;
* [[虾仁历史/起源|起源]]&lt;br /&gt;
* [[虾仁历史/传播|传播]]&lt;br /&gt;
* [[虾仁历史/转折|转折]]&lt;br /&gt;
* [[虾仁历史/爆发|爆发]]&lt;br /&gt;
* [[虾仁历史/危机|危机]]&lt;br /&gt;
* [[虾仁历史/转型|转型]]&lt;br /&gt;
&lt;br /&gt;
{{虾仁历史导航}}&lt;br /&gt;
&lt;br /&gt;
== 大事年表 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 时间 !! 事件&lt;br /&gt;
|-&lt;br /&gt;
| 2010年 || 埃及“熊猫奶酪”广告播出，熊猫头形象诞生&lt;br /&gt;
|-&lt;br /&gt;
| 2019年 || 熊猫头沙雕动画在B站兴起&lt;br /&gt;
|-&lt;br /&gt;
| 2020年 || 校园题材熊猫头动画快手三个月吸粉140万&lt;br /&gt;
|-&lt;br /&gt;
| 2020年前后 || 小说广告商用熊猫头推广网文，“虾仁”名字诞生&lt;br /&gt;
|-&lt;br /&gt;
| 2023年 || “虾仁饭”《大梦千年》系列让虾仁迎来第二春&lt;br /&gt;
|-&lt;br /&gt;
| 2024年1月 || “三国虾”《一品布衣》上线，虾仁破圈元年&lt;br /&gt;
|-&lt;br /&gt;
| 2024年 || 多部虾仁作品播放量破10亿，#虾仁动画达428亿播放&lt;br /&gt;
|-&lt;br /&gt;
| 2025年9月 || “三国虾”账号被封、掉粉，监管收紧&lt;br /&gt;
|-&lt;br /&gt;
| 2026年 || 《虾仁六章》+虾仁维基建立，虾仁完成文化定型&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 关键创作者 ==&lt;br /&gt;
* &#039;&#039;&#039;虾仁饭&#039;&#039;&#039;：虾仁宇宙核心开创者，粉丝近200万，MCN矩阵的发起人。&lt;br /&gt;
* &#039;&#039;&#039;三国虾&#039;&#039;&#039;：《一品布衣》创作者，全网涨粉超229万。&lt;br /&gt;
* &#039;&#039;&#039;布墨迹_&#039;&#039;&#039;：《我在大明那些年》创作者。&lt;br /&gt;
* &#039;&#039;&#039;奇遇原始人&#039;&#039;&#039;：《玄武四象》创作者，19亿播放。&lt;br /&gt;
* &#039;&#039;&#039;苦十八&#039;&#039;&#039;：《我的致富之路》创作者。&lt;br /&gt;
* &#039;&#039;&#039;君君动画（虾仁）&#039;&#039;&#039;：粉丝约170万。&lt;br /&gt;
&lt;br /&gt;
[[Category:虾仁宇宙层]]&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E8%BD%AC%E5%9E%8B&amp;diff=211</id>
		<title>虾仁历史/转型</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E8%BD%AC%E5%9E%8B&amp;diff=211"/>
		<updated>2026-07-29T17:47:57Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​填充虾仁历史节点/重定向孤页&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;转型&#039;&#039;&#039;是虾仁文化发展历程中的重要阶段。&lt;br /&gt;
&lt;br /&gt;
== 概述 ==&lt;br /&gt;
流量见顶、监管收紧、版权扯皮，三重压力下，虾仁站在一个岔口：再不转型，就只是又一个被消耗的流量现象。&lt;br /&gt;
&lt;br /&gt;
2026年，《虾仁六章》加《外传二篇》写完，六首七律加两篇外传，给虾仁立起第一部文学正典。虾仁维基（xiarenwiki.com）上线，三级内容架构、创作协议、CC BY-SA版权协议一并就位。虾仁头一回有了不依附任何平台的文本落脚处。“生时立传”——它还活着的时候，就有人替它把文化定型这件事做完了。&lt;br /&gt;
&lt;br /&gt;
== 关键事件 ==&lt;br /&gt;
* 2026年：《虾仁六章》+《外传二篇》完成，立起第一部文学正典。&lt;br /&gt;
* 2026年：虾仁维基（xiarenwiki.com）上线，三级内容架构、创作协议、CC BY-SA版权协议就位。&lt;br /&gt;
&lt;br /&gt;
== 影响与意义 ==&lt;br /&gt;
虾仁从流量现象迈向文化现象，拥有了独立的、不依赖任何平台的文本归宿，完成文化定型。&lt;br /&gt;
&lt;br /&gt;
{{虾仁历史导航}}&lt;br /&gt;
&lt;br /&gt;
[[Category:虾仁宇宙层]]&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E5%8D%B1%E6%9C%BA&amp;diff=210</id>
		<title>虾仁历史/危机</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E5%8D%B1%E6%9C%BA&amp;diff=210"/>
		<updated>2026-07-29T17:47:57Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​填充虾仁历史节点/重定向孤页&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;危机&#039;&#039;&#039;是虾仁文化发展历程中的重要阶段。&lt;br /&gt;
&lt;br /&gt;
== 概述 ==&lt;br /&gt;
2025年9月，风向变了。广电总局网络视听司于9月8日发布《管理提示（动画微短剧管理）》，把动画微短剧正式纳入分类分层审核、先审后播的框架，还点名了擦边、低俗词汇、校园霸凌等问题——虾仁这类“萌系画风+成人梗”的内容首当其冲。到了11月，专项治理进一步铺开，漫画类、表情包类动画全被收进审核体系，一直持续到2026年3月。&lt;br /&gt;
&lt;br /&gt;
同一时间，沙雕漫大号“三国虾”抖音账号被禁言，粉丝从一百六十多万一路掉到六万上下；“虾仁小宝”“嘻嘻动画”等也被禁止关注。虾仁宇宙对外解释：停更主因是大量非法账号搬运原创视频，甚至有不良公司盗内容投到短剧平台获利。监管的刀，已经架在虾仁脖子上了。&lt;br /&gt;
&lt;br /&gt;
== 关键事件 ==&lt;br /&gt;
* 2025年9月8日：广电总局发布《管理提示（动画微短剧管理）》。&lt;br /&gt;
* 2025年11月：动画微短剧专项治理铺开，持续至2026年3月。&lt;br /&gt;
* “三国虾”抖音账号被禁言，粉丝从一百六十多万跌至六万上下；“虾仁小宝”“嘻嘻动画”等被禁止关注。&lt;br /&gt;
&lt;br /&gt;
== 影响与意义 ==&lt;br /&gt;
监管收紧与头部账号停更，让虾仁流量见顶，靠“野蛮生长”走通的路走到头了，逼着它从流量现象转向文化现象。&lt;br /&gt;
&lt;br /&gt;
{{虾仁历史导航}}&lt;br /&gt;
&lt;br /&gt;
[[Category:虾仁宇宙层]]&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E7%88%86%E5%8F%91&amp;diff=209</id>
		<title>虾仁历史/爆发</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E7%88%86%E5%8F%91&amp;diff=209"/>
		<updated>2026-07-29T17:47:57Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​填充虾仁历史节点/重定向孤页&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;爆发&#039;&#039;&#039;是虾仁文化发展历程中的重要阶段。&lt;br /&gt;
&lt;br /&gt;
== 概述 ==&lt;br /&gt;
2024年，虾仁彻底出圈。&lt;br /&gt;
&lt;br /&gt;
1月31日，“三国虾”在各大平台上传沙雕短剧版《一品布衣》第一集。到账号异常前，这部剧免费更到接近200集，抖音播放冲过10亿，带动账号涨粉165万、全网涨粉超229万。男主被改名“虾仁”，配上高燃台词和沙雕熊猫头，反差感拉满。&lt;br /&gt;
&lt;br /&gt;
同一年，“奇遇原始人”的《玄武四象》以19亿播放登顶，“苦十八”《我的致富之路》、布墨迹_《我在大明那些年》等接连破10亿。抖音话题#虾仁动画累计播放428亿，#沙雕动画累计2681.6亿。虾仁从一个小众动画，成了平台上的流量怪物。&lt;br /&gt;
&lt;br /&gt;
== 关键事件 ==&lt;br /&gt;
* 2024年1月31日：“三国虾”《一品布衣》沙雕短剧首集上线，抖音播放超10亿，涨粉165万、全网涨粉超229万。&lt;br /&gt;
* “奇遇原始人”《玄武四象》19亿播放登顶。&lt;br /&gt;
* “苦十八”《我的致富之路》、布墨迹_《我在大明那些年》等接连破10亿。&lt;br /&gt;
* #虾仁动画累计428亿播放，#沙雕动画累计2681.6亿播放。&lt;br /&gt;
&lt;br /&gt;
== 影响与意义 ==&lt;br /&gt;
虾仁从小众沙雕动画跃升为平台的流量怪物，正式破圈，进入大众视野。&lt;br /&gt;
&lt;br /&gt;
{{虾仁历史导航}}&lt;br /&gt;
&lt;br /&gt;
[[Category:虾仁宇宙层]]&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E8%BD%AC%E6%8A%98&amp;diff=208</id>
		<title>虾仁历史/转折</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E8%BD%AC%E6%8A%98&amp;diff=208"/>
		<updated>2026-07-29T17:47:57Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​填充虾仁历史节点/重定向孤页&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;转折&#039;&#039;&#039;是虾仁文化发展历程中的重要阶段。&lt;br /&gt;
&lt;br /&gt;
== 概述 ==&lt;br /&gt;
这阶段虾仁动画跑出了几个主流男主IP：虾仁（历史穿越）、十三（都市系统，对应“江苏十三太保”一脉）、布青（大明穿越）、原始人（玄幻修仙），其中“虾仁宇宙”覆盖面最广。虾仁饭靠收徒授课、素材授权，攒出含“三国虾”“虾仁不眨眼”等至少21个50万粉以上账号的MCN矩阵。&lt;br /&gt;
&lt;br /&gt;
受众也清晰了：九成以上是成年男性，正好填上真人短剧以女性、银发为主的空白。虾仁的内容钩子，是替观众补历史里的意难平——穿越秦、三国、大明，去改写扶苏早逝、岳飞含冤、明朝衰亡那些遗憾。听觉上，《此去半生》（外号“大明不妙曲”）成了虾仁的“国歌”。&lt;br /&gt;
&lt;br /&gt;
== 关键事件 ==&lt;br /&gt;
* 四大主流男主IP成型：虾仁、十三、布青、原始人。&lt;br /&gt;
* 虾仁饭MCN矩阵扩张至至少21个50万粉以上账号。&lt;br /&gt;
* 受众定位清晰：九成以上成年男性。&lt;br /&gt;
* 《此去半生》（大明不妙曲）成为虾仁“国歌”。&lt;br /&gt;
&lt;br /&gt;
== 影响与意义 ==&lt;br /&gt;
虾仁从零散的爆款作品，聚成了有IP、有矩阵、有固定受众的“宇宙”，文化形态初步定型，也为后来的危机与转型埋下伏笔。&lt;br /&gt;
&lt;br /&gt;
{{虾仁历史导航}}&lt;br /&gt;
&lt;br /&gt;
[[Category:虾仁宇宙层]]&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E4%BC%A0%E6%92%AD&amp;diff=207</id>
		<title>虾仁历史/传播</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E4%BC%A0%E6%92%AD&amp;diff=207"/>
		<updated>2026-07-29T17:47:57Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​填充虾仁历史节点/重定向孤页&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;传播&#039;&#039;&#039;是虾仁文化发展历程中的重要阶段。&lt;br /&gt;
&lt;br /&gt;
== 概述 ==&lt;br /&gt;
“虾仁”这名字，是小说广告投流商顺手起的。2020年前后，一批推网文的人把熊猫头做成2D动态漫画，配机械感的AI配音和土嗨BGM，直接讲爽文情节。主角换来换去，名字却被随手统一叫“虾仁”——一来好记，二来这名字自带一股抽象、无厘头的劲儿，也暗合草根小人物的底色。&lt;br /&gt;
&lt;br /&gt;
这时候的虾仁还是广告工具，不是内容本身。&lt;br /&gt;
&lt;br /&gt;
转机在2023年。创作者“虾仁饭”的《大梦千年》系列把熊猫头带火了第二波，其中《老夫，秦国白起》单条视频点赞5.4万。虾仁开始从“广告物料”里挣脱出来，变成能独立存在的角色。虾仁饭也成了虾仁宇宙的核心开拓者：收徒授课、授权素材，一点点把MCN矩阵搭了起来。&lt;br /&gt;
&lt;br /&gt;
== 关键事件 ==&lt;br /&gt;
* 2020年前后：“虾仁”名字随着小说广告投流诞生。&lt;br /&gt;
* 2023年：“虾仁饭”《大梦千年》系列让熊猫头迎来第二春，《老夫，秦国白起》单条点赞5.4万。&lt;br /&gt;
* 2023年及之后：虾仁饭收徒授课、授权素材，构建虾仁宇宙MCN矩阵雏形。&lt;br /&gt;
&lt;br /&gt;
== 影响与意义 ==&lt;br /&gt;
虾仁从纯粹的投流广告物料，长成了一个有名字、有角色、有创作者的独立内容形态，“虾仁宇宙”的雏形开始浮现。&lt;br /&gt;
&lt;br /&gt;
{{虾仁历史导航}}&lt;br /&gt;
&lt;br /&gt;
[[Category:虾仁宇宙层]]&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E8%B5%B7%E6%BA%90&amp;diff=206</id>
		<title>虾仁历史/起源</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E8%B5%B7%E6%BA%90&amp;diff=206"/>
		<updated>2026-07-29T17:47:56Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​填充虾仁历史节点/重定向孤页&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;起源&#039;&#039;&#039;是虾仁文化发展历程中的重要阶段。&lt;br /&gt;
&lt;br /&gt;
== 概述 ==&lt;br /&gt;
虾仁的视觉老底，得从一只熊猫头说起。2010年，一支埃及熊猫奶酪品牌的魔性广告《Neversay NO to panda》在网上炸开——那只圆头圆脑、永远在砸东西的熊猫，成了表情包的种子。后来贴吧网友拿来二次创作，配上金馆长那类恶搞表情，慢慢长成了全网都在用的“熊猫头”。&lt;br /&gt;
&lt;br /&gt;
这时期还没有“虾仁”三个字，但草帽熊猫头的视觉基因已经种下了，只是谁也没想到它日后能跑这么远。&lt;br /&gt;
&lt;br /&gt;
== 关键事件 ==&lt;br /&gt;
* 2010年：埃及“熊猫奶酪”广告《Neversay NO to panda》播出，熊猫头形象诞生。&lt;br /&gt;
* 2019年前后：熊猫头沙雕动画在B站兴起，@阿幕降临用《杜鹃圆舞曲》配熊猫人，一两分钟短剧专戳职场、婚恋痛点，“妙啊”成了年度弹幕。&lt;br /&gt;
* 2020年前后：@YY的奇妙冒险靠校园题材熊猫头动画在快手三个月吸粉140万，熊猫头第一次显出“能吸粉”的苗头。&lt;br /&gt;
&lt;br /&gt;
== 影响与意义 ==&lt;br /&gt;
熊猫头从表情包长成了独立的动画形式，但还停留在段子阶段，离“虾仁”这个名字和它日后的文化体量，还差着十万八千里。&lt;br /&gt;
&lt;br /&gt;
{{虾仁历史导航}}&lt;br /&gt;
&lt;br /&gt;
[[Category:虾仁宇宙层]]&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8F%91%E5%B1%95%E5%8F%B2&amp;diff=205</id>
		<title>虾仁发展史</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8F%91%E5%B1%95%E5%8F%B2&amp;diff=205"/>
		<updated>2026-07-29T17:42:55Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​创建/更新：虾仁发展史&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;本文梳理虾仁从一只表情包，到百亿播放的流量现象，再到立起文学正典、完成文化定型的过程。&lt;br /&gt;
&lt;br /&gt;
== 史前史·表情包时代（2010—2018） ==&lt;br /&gt;
&lt;br /&gt;
虾仁的视觉老底，得从一只熊猫头说起。2010年，一支埃及熊猫奶酪品牌的魔性广告《Neversay NO to panda》在网上炸开——那只圆头圆脑、永远在砸东西的熊猫，成了表情包的种子。后来贴吧网友拿来二次创作，配上金馆长那类恶搞表情，慢慢长成了全网都在用的“熊猫头”。&lt;br /&gt;
&lt;br /&gt;
这时期还没有“虾仁”三个字，但草帽熊猫头的视觉基因已经种下了，只是谁也没想到它日后能跑这么远。&lt;br /&gt;
&lt;br /&gt;
2019年前后，有人开始把熊猫头做成沙雕动画。B站上@阿幕降临用《杜鹃圆舞曲》配熊猫人，一两分钟的短剧专戳职场、婚恋这些痛点，“妙啊”都成了年度弹幕。差不多同时，@YY的奇妙冒险靠校园题材的熊猫头动画在快手三个月吸粉140万。熊猫头第一次显出“能吸粉”的苗头，但还停留在段子阶段。&lt;br /&gt;
&lt;br /&gt;
== 诞生期·“虾仁”这个名字怎么来的（2020—2023） ==&lt;br /&gt;
&lt;br /&gt;
“虾仁”这名字，是小说广告投流商顺手起的。2020年前后，一批推网文的人把熊猫头做成2D动态漫画，配机械感的AI配音和土嗨BGM，直接讲爽文情节。主角换来换去，名字却被随手统一叫“虾仁”——一来好记，二来这名字自带一股抽象、无厘头的劲儿，也暗合草根小人物的底色。&lt;br /&gt;
&lt;br /&gt;
这时候的虾仁还是广告工具，不是内容本身。&lt;br /&gt;
&lt;br /&gt;
转机在2023年。创作者“虾仁饭”的《大梦千年》系列把熊猫头带火了第二波，其中《老夫，秦国白起》单条视频点赞5.4万。虾仁开始从“广告物料”里挣脱出来，变成能独立存在的角色。虾仁饭也成了虾仁宇宙的核心开拓者：收徒授课、授权素材，一点点把MCN矩阵搭了起来。&lt;br /&gt;
&lt;br /&gt;
== 爆发期·破圈元年（2024） ==&lt;br /&gt;
&lt;br /&gt;
2024年，虾仁彻底出圈。&lt;br /&gt;
&lt;br /&gt;
1月31日，“三国虾”在各大平台上传沙雕短剧版《一品布衣》第一集。到账号异常前，这部剧免费更到接近200集，抖音播放冲过10亿，带动账号涨粉165万、全网涨粉超229万。男主被改名“虾仁”，配上高燃台词和沙雕熊猫头，反差感拉满。&lt;br /&gt;
&lt;br /&gt;
同一年，“奇遇原始人”的《玄武四象》以19亿播放登顶，“苦十八”《我的致富之路》、“布墨迹_”《我在大明那些年》等接连破10亿。抖音话题#虾仁动画累计播放428亿，#沙雕动画累计2681.6亿。虾仁从一个小众动画，成了平台上的流量怪物。&lt;br /&gt;
&lt;br /&gt;
== 扩张期·虾仁宇宙成型（2024—2025） ==&lt;br /&gt;
&lt;br /&gt;
这阶段虾仁动画跑出了几个主流男主IP：虾仁（历史穿越）、十三（都市系统，对应“江苏十三太保”一脉）、布青（大明穿越）、原始人（玄幻修仙），其中“虾仁宇宙”覆盖面最广。虾仁饭靠收徒授课、素材授权，攒出含“三国虾”“虾仁不眨眼”等至少21个50万粉以上账号的MCN矩阵。&lt;br /&gt;
&lt;br /&gt;
受众也清晰了：九成以上是成年男性，正好填上真人短剧以女性、银发为主的空白。虾仁的内容钩子，是替观众补历史里的意难平——穿越秦、三国、大明，去改写扶苏早逝、岳飞含冤、明朝衰亡那些遗憾。听觉上，《此去半生》（外号“大明不妙曲”）成了虾仁的“国歌”。&lt;br /&gt;
&lt;br /&gt;
== 危机期·监管与停更（2025） ==&lt;br /&gt;
&lt;br /&gt;
2025年9月，风向变了。广电总局网络视听司于9月8日发布《管理提示（动画微短剧管理）》，把动画微短剧正式纳入分类分层审核、先审后播的框架，还点名了擦边、低俗词汇、校园霸凌等问题——虾仁这类“萌系画风+成人梗”的内容首当其冲。到了11月，专项治理进一步铺开，漫画类、表情包类动画全被收进审核体系，一直持续到2026年3月。&lt;br /&gt;
&lt;br /&gt;
同一时间，沙雕漫大号“三国虾”抖音账号被禁言，粉丝从一百六十多万一路掉到六万上下；“虾仁小宝”“嘻嘻动画”等也被禁止关注。虾仁宇宙对外解释：停更主因是大量非法账号搬运原创视频，甚至有不良公司盗内容投到短剧平台获利。监管的刀，已经架在虾仁脖子上了。&lt;br /&gt;
&lt;br /&gt;
== 转型期·从流量现象到文化现象（2025—2026） ==&lt;br /&gt;
&lt;br /&gt;
流量见顶、监管收紧、版权扯皮，三重压力下，虾仁站在一个岔口：再不转型，就只是又一个被消耗的流量现象。&lt;br /&gt;
&lt;br /&gt;
2026年，《虾仁六章》加《外传二篇》写完，六首七律加两篇外传，给虾仁立起第一部文学正典。虾仁维基（xiarenwiki.com）上线，三级内容架构、创作协议、CC BY-SA版权协议一并就位。虾仁头一回有了不依附任何平台的文本落脚处。“生时立传”——它还活着的时候，就有人替它把文化定型这件事做完了。&lt;br /&gt;
&lt;br /&gt;
== 附录一：大事年表 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 时间 !! 事件&lt;br /&gt;
|-&lt;br /&gt;
| 2010年 || 埃及“熊猫奶酪”广告播出，熊猫头形象诞生&lt;br /&gt;
|-&lt;br /&gt;
| 2019年 || 熊猫头沙雕动画在B站兴起&lt;br /&gt;
|-&lt;br /&gt;
| 2020年 || 校园题材熊猫头动画快手三个月吸粉140万&lt;br /&gt;
|-&lt;br /&gt;
| 2020年前后 || 小说广告商用熊猫头推广网文，“虾仁”名字诞生&lt;br /&gt;
|-&lt;br /&gt;
| 2023年 || “虾仁饭”《大梦千年》系列让虾仁迎来第二春&lt;br /&gt;
|-&lt;br /&gt;
| 2024年1月 || “三国虾”《一品布衣》上线，虾仁破圈元年&lt;br /&gt;
|-&lt;br /&gt;
| 2024年 || 多部虾仁作品播放量破10亿，#虾仁动画达428亿播放&lt;br /&gt;
|-&lt;br /&gt;
| 2025年9月 || “三国虾”账号被封、掉粉，监管收紧&lt;br /&gt;
|-&lt;br /&gt;
| 2026年 || 《虾仁六章》+虾仁维基建立，虾仁完成文化定型&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 附录二：关键创作者 ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;虾仁饭&#039;&#039;&#039;：虾仁宇宙核心开创者，粉丝近200万，MCN矩阵的发起人。&lt;br /&gt;
* &#039;&#039;&#039;三国虾&#039;&#039;&#039;：《一品布衣》创作者，全网涨粉超229万。&lt;br /&gt;
* &#039;&#039;&#039;布墨迹_&#039;&#039;&#039;：《我在大明那些年》创作者。&lt;br /&gt;
* &#039;&#039;&#039;奇遇原始人&#039;&#039;&#039;：《玄武四象》创作者，19亿播放。&lt;br /&gt;
* &#039;&#039;&#039;苦十八&#039;&#039;&#039;：《我的致富之路》创作者。&lt;br /&gt;
* &#039;&#039;&#039;君君动画（虾仁）&#039;&#039;&#039;：粉丝约170万。&lt;br /&gt;
&lt;br /&gt;
[[分类:虾仁宇宙]]&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=MediaWiki:Common.js&amp;diff=203</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=MediaWiki:Common.js&amp;diff=203"/>
		<updated>2026-07-29T17:05:29Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​添加虾仁AI浮窗助手组件&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* 虾仁维基 - 自定义侧边栏导航 v2.1 */&lt;br /&gt;
/* 优化：古风主题统一、健壮初始化、精致样式 */&lt;br /&gt;
/* 最后更新: 2026-07-30 */&lt;br /&gt;
&lt;br /&gt;
(function ($, mw) {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
    var COLLAPSE_KEY = &#039;xiarenwiki-nav-v2&#039;;&lt;br /&gt;
    var WORKS = [&#039;我在大明那些年&#039;, &#039;彼岸轮回&#039;, &#039;一品布衣&#039;];&lt;br /&gt;
    var WORK_DIRECT = [&#039;宇宙层&#039;, &#039;人物&#039;, &#039;世界观&#039;, &#039;设定&#039;];&lt;br /&gt;
&lt;br /&gt;
    function init() {&lt;br /&gt;
        var wgIsArticle = mw.config.get(&#039;wgIsArticle&#039;);&lt;br /&gt;
        var wgCanonicalSpecialPageName = mw.config.get(&#039;wgCanonicalSpecialPageName&#039;);&lt;br /&gt;
        if (!wgIsArticle &amp;amp;&amp;amp; wgCanonicalSpecialPageName) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        mw.loader.using(&#039;mediawiki.api&#039;).then(function () {&lt;br /&gt;
            waitForPanel(function ($panel) {&lt;br /&gt;
                buildNav($panel);&lt;br /&gt;
            });&lt;br /&gt;
        }).catch(function (e) {&lt;br /&gt;
            console.error(&#039;[虾仁导航] 依赖加载失败，降级构建&#039;, e);&lt;br /&gt;
            waitForPanel(function ($panel) {&lt;br /&gt;
                buildNav($panel);&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function waitForPanel(cb) {&lt;br /&gt;
        var $panel = $(&#039;#mw-panel&#039;);&lt;br /&gt;
        if ($panel.length) return cb($panel);&lt;br /&gt;
        var tries = 0;&lt;br /&gt;
        var timer = setInterval(function () {&lt;br /&gt;
            $panel = $(&#039;#mw-panel&#039;);&lt;br /&gt;
            if ($panel.length || ++tries &amp;gt; 50) {&lt;br /&gt;
                clearInterval(timer);&lt;br /&gt;
                if ($panel.length) cb($panel);&lt;br /&gt;
            }&lt;br /&gt;
        }, 100);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function buildNav($panel) {&lt;br /&gt;
        var html = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-search&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;form action=&amp;quot;&#039; + mw.util.getUrl(&#039;Special:Search&#039;) + &#039;&amp;quot; method=&amp;quot;get&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;search&amp;quot; class=&amp;quot;xn-search-input&amp;quot; placeholder=&amp;quot;检索典籍…&amp;quot; /&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;/form&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += section(&#039;Wiki&#039;, [&lt;br /&gt;
            [&#039;首页&#039;, &#039;首页&#039;],&lt;br /&gt;
            [&#039;Wiki简介&#039;, &#039;Wiki简介&#039;],&lt;br /&gt;
            [&#039;管理员告示&#039;, &#039;管理员告示&#039;],&lt;br /&gt;
            [&#039;随机页面&#039;, &#039;Special:Random&#039;],&lt;br /&gt;
            [&#039;快速搜索&#039;, &#039;Special:Search&#039;],&lt;br /&gt;
            [&#039;相关平台&#039;, &#039;相关平台&#039;],&lt;br /&gt;
            [&#039;Wiki源站点&#039;, &#039;Wiki源站点&#039;]&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
        html += section(&#039;虾仁简介&#039;, [&lt;br /&gt;
            [&#039;虾仁？&#039;, &#039;虾仁？&#039;],&lt;br /&gt;
            [&#039;虾仁共创收录规则&#039;, &#039;虾仁共创收录规则&#039;],&lt;br /&gt;
            [&#039;虾仁宇宙结构介绍&#039;, &#039;虾仁宇宙结构介绍&#039;]&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-section&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;universe&amp;quot;&amp;gt;虾仁宇宙&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-universe&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;xn-loading&amp;quot;&amp;gt;卷帙加载中…&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-section&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;literature&amp;quot;&amp;gt;虾仁文学&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-literature&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += link(&#039;创始宣言&#039;, &#039;创始宣言&#039;);&lt;br /&gt;
        html += link(&#039;虾仁六章&#039;, &#039;虾仁六章&#039;);&lt;br /&gt;
        html += link(&#039;虾仁异志&#039;, &#039;虾仁异志&#039;);&lt;br /&gt;
        html += link(&#039;虾仁诗作&#039;, &#039;虾仁诗作&#039;);&lt;br /&gt;
        html += link(&#039;虾仁音乐&#039;, &#039;虾仁音乐&#039;);&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-subsection&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-subheader xn-expandable&amp;quot; data-sid=&amp;quot;papers&amp;quot;&amp;gt;虾仁论文 &#039; + plus(&#039;虾仁论文&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-subbody&amp;quot; id=&amp;quot;xn-papers&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += link(&#039;去中心化创作模式的研究&#039;, &#039;去中心化创作模式的研究&#039;);&lt;br /&gt;
        html += link(&#039;数字时代的孙悟空&#039;, &#039;数字时代的孙悟空&#039;);&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += section(&#039;虾仁历史&#039;, [&lt;br /&gt;
            [&#039;起源&#039;, &#039;虾仁历史/起源&#039;],&lt;br /&gt;
            [&#039;传播&#039;, &#039;虾仁历史/传播&#039;],&lt;br /&gt;
            [&#039;转折&#039;, &#039;虾仁历史/转折&#039;],&lt;br /&gt;
            [&#039;爆发&#039;, &#039;虾仁历史/爆发&#039;],&lt;br /&gt;
            [&#039;危机&#039;, &#039;虾仁历史/危机&#039;],&lt;br /&gt;
            [&#039;转型&#039;, &#039;虾仁历史/转型&#039;]&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-single&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&#039; + url(&#039;共创入口&#039;) + &#039;&amp;quot;&amp;gt;共创入口&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        $panel.html(html);&lt;br /&gt;
        restoreCollapse();&lt;br /&gt;
        bindEvents();&lt;br /&gt;
        highlightCurrent();&lt;br /&gt;
        loadUniverse();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function section(title, items) {&lt;br /&gt;
        var sid = title.replace(/[^a-z0-9\u4e00-\u9fff]/gi, &#039;&#039;).toLowerCase();&lt;br /&gt;
        var h = &#039;&amp;lt;div class=&amp;quot;xn-section&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        h += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + sid + &#039;&amp;quot;&amp;gt;&#039; + title + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        h += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-&#039; + sid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        for (var i = 0; i &amp;lt; items.length; i++) {&lt;br /&gt;
            h += link(items[i][0], items[i][1]);&lt;br /&gt;
        }&lt;br /&gt;
        h += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return h;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function link(label, page, cls) {&lt;br /&gt;
        return &#039;&amp;lt;div class=&amp;quot;xn-link&#039; + (cls ? &#039; &#039; + cls : &#039;&#039;) + &#039;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&#039; + url(page) + &#039;&amp;quot;&amp;gt;&#039; + label + &#039;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function url(page) { return mw.util.getUrl(page); }&lt;br /&gt;
&lt;br /&gt;
    function plus(page) {&lt;br /&gt;
        return &#039;&amp;lt;a class=&amp;quot;xn-plus&amp;quot; href=&amp;quot;&#039; + url(page) + &#039;?action=edit&amp;quot; title=&amp;quot;编辑/新增&amp;quot;&amp;gt;＋&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    async function loadUniverse() {&lt;br /&gt;
        var $body = $(&#039;#xn-universe&#039;);&lt;br /&gt;
        if (!$body.length) return;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            var api = new mw.Api();&lt;br /&gt;
            var html = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; WORKS.length; i++) {&lt;br /&gt;
                var work = WORKS[i];&lt;br /&gt;
                var workSid = &#039;work&#039; + i;&lt;br /&gt;
&lt;br /&gt;
                var subpages = [];&lt;br /&gt;
                try {&lt;br /&gt;
                    var result = await api.get({&lt;br /&gt;
                        action: &#039;query&#039;,&lt;br /&gt;
                        list: &#039;allpages&#039;,&lt;br /&gt;
                        apprefix: work + &#039;/&#039;,&lt;br /&gt;
                        aplimit: 100&lt;br /&gt;
                    });&lt;br /&gt;
                    subpages = result.query.allpages || [];&lt;br /&gt;
                } catch (e) {&lt;br /&gt;
                    console.error(&#039;[虾仁导航] API error for &#039; + work, e);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-work&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-work-title xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + workSid + &#039;&amp;quot;&amp;gt;&#039; + work + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-&#039; + workSid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
                var directSet = {};&lt;br /&gt;
                for (var j = 0; j &amp;lt; subpages.length; j++) {&lt;br /&gt;
                    var rel = subpages[j].title.substring(work.length + 1);&lt;br /&gt;
                    if (rel.indexOf(&#039;/&#039;) === -1) directSet[rel] = true;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                for (var k = 0; k &amp;lt; WORK_DIRECT.length; k++) {&lt;br /&gt;
                    var item = WORK_DIRECT[k];&lt;br /&gt;
                    var exists = directSet[item];&lt;br /&gt;
                    html += link(item, work + &#039;/&#039; + item, exists ? &#039;&#039; : &#039;xn-missing&#039;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                var plotSegs = [];&lt;br /&gt;
                for (j = 0; j &amp;lt; subpages.length; j++) {&lt;br /&gt;
                    rel = subpages[j].title.substring(work.length + 1);&lt;br /&gt;
                    var parts = rel.split(&#039;/&#039;);&lt;br /&gt;
                    if (parts.length === 2 &amp;amp;&amp;amp; parts[0] === &#039;剧情层&#039;) {&lt;br /&gt;
                        plotSegs.push(parts[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                var plotSid = workSid + &#039;plot&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-subsection&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-subheader xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + plotSid + &#039;&amp;quot;&amp;gt;剧情层 &#039; + plus(work + &#039;/剧情层&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-subbody&amp;quot; id=&amp;quot;xn-&#039; + plotSid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
                for (k = 0; k &amp;lt; plotSegs.length; k++) {&lt;br /&gt;
                    var seg = plotSegs[k];&lt;br /&gt;
                    var segSid = workSid + &#039;seg&#039; + k;&lt;br /&gt;
                    var segPage = work + &#039;/剧情层/&#039; + seg;&lt;br /&gt;
&lt;br /&gt;
                    var jinji = [];&lt;br /&gt;
                    try {&lt;br /&gt;
                        var segResult = await api.get({&lt;br /&gt;
                            action: &#039;query&#039;,&lt;br /&gt;
                            list: &#039;allpages&#039;,&lt;br /&gt;
                            apprefix: segPage + &#039;/&#039;,&lt;br /&gt;
                            aplimit: 50&lt;br /&gt;
                        });&lt;br /&gt;
                        var segPages = segResult.query.allpages || [];&lt;br /&gt;
                        for (var m = 0; m &amp;lt; segPages.length; m++) {&lt;br /&gt;
                            jinji.push(segPages[m].title.substring(segPage.length + 1));&lt;br /&gt;
                        }&lt;br /&gt;
                    } catch (e2) {}&lt;br /&gt;
&lt;br /&gt;
                    html += &#039;&amp;lt;div class=&amp;quot;xn-subsubsection&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
                    html += &#039;&amp;lt;div class=&amp;quot;xn-subsubheader xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + segSid + &#039;&amp;quot;&amp;gt;&#039; + seg + &#039; &#039; + plus(segPage) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                    html += &#039;&amp;lt;div class=&amp;quot;xn-subsubbody&amp;quot; id=&amp;quot;xn-&#039; + segSid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
                    for (m = 0; m &amp;lt; jinji.length; m++) {&lt;br /&gt;
                        html += link(jinji[m], segPage + &#039;/&#039; + jinji[m]);&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;xn-link xn-add-work&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&#039; + url(&#039;Special:Search&#039;) + &#039;&amp;quot; title=&amp;quot;搜索已有作品&amp;quot;&amp;gt;＋ 发现更多作品&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
            $body.html(html);&lt;br /&gt;
            restoreCollapse();&lt;br /&gt;
            bindEvents();&lt;br /&gt;
            highlightCurrent();&lt;br /&gt;
&lt;br /&gt;
        } catch (e) {&lt;br /&gt;
            console.error(&#039;[虾仁导航] 虾仁宇宙加载失败&#039;, e);&lt;br /&gt;
            $body.html(&#039;&amp;lt;div class=&amp;quot;xn-link&amp;quot;&amp;gt;(加载失败，请刷新)&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function highlightCurrent() {&lt;br /&gt;
        var currentTitle = mw.config.get(&#039;wgPageName&#039;);&lt;br /&gt;
        $(&#039;#mw-panel .xn-link a&#039;).each(function () {&lt;br /&gt;
            var href = $(this).attr(&#039;href&#039;);&lt;br /&gt;
            if (!href) return;&lt;br /&gt;
            var match = false;&lt;br /&gt;
            if (href.indexOf(&#039;title=&#039;) &amp;gt; 0) {&lt;br /&gt;
                var m = href.match(/title=([^&amp;amp;]+)/);&lt;br /&gt;
                if (m) match = decodeURIComponent(m[1]) === currentTitle;&lt;br /&gt;
            } else {&lt;br /&gt;
                var parts = href.split(&#039;/&#039;);&lt;br /&gt;
                var last = parts[parts.length - 1];&lt;br /&gt;
                match = decodeURIComponent(last) === currentTitle;&lt;br /&gt;
            }&lt;br /&gt;
            if (match) {&lt;br /&gt;
                $(this).addClass(&#039;xn-active&#039;);&lt;br /&gt;
                $(this).closest(&#039;.xn-link&#039;).addClass(&#039;xn-active-link&#039;);&lt;br /&gt;
                $(this).parents(&#039;.xn-body, .xn-subbody, .xn-subsubbody&#039;).each(function () {&lt;br /&gt;
                    $(this).show();&lt;br /&gt;
                    var sid = $(this).attr(&#039;id&#039;);&lt;br /&gt;
                    if (sid &amp;amp;&amp;amp; sid.indexOf(&#039;xn-&#039;) === 0) {&lt;br /&gt;
                        sid = sid.substring(3);&lt;br /&gt;
                        $(&#039;[data-sid=&amp;quot;&#039; + sid + &#039;&amp;quot;]&#039;).removeClass(&#039;xn-collapsed&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function bindEvents() {&lt;br /&gt;
        $(document).off(&#039;click.xn&#039;).on(&#039;click.xn&#039;, &#039;.xn-expandable&#039;, function (e) {&lt;br /&gt;
            if ($(e.target).closest(&#039;.xn-plus&#039;).length) return;&lt;br /&gt;
            var sid = $(this).data(&#039;sid&#039;);&lt;br /&gt;
            var $body = $(&#039;#xn-&#039; + sid);&lt;br /&gt;
            if (!$body.length) $body = $(this).next(&#039;.xn-body,.xn-subbody,.xn-subsubbody&#039;);&lt;br /&gt;
            if (!$body.length) return;&lt;br /&gt;
&lt;br /&gt;
            $body.slideToggle(150);&lt;br /&gt;
            $(this).toggleClass(&#039;xn-collapsed&#039;, !$body.is(&#039;:visible&#039;));&lt;br /&gt;
&lt;br /&gt;
            var state = loadState();&lt;br /&gt;
            state[sid] = $body.is(&#039;:visible&#039;);&lt;br /&gt;
            saveState(state);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function restoreCollapse() {&lt;br /&gt;
        var state = loadState();&lt;br /&gt;
        var defaults = { &#039;universe&#039;: true };&lt;br /&gt;
        for (var key in defaults) {&lt;br /&gt;
            if (!(key in state)) state[key] = defaults[key];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        Object.keys(state).forEach(function (sid) {&lt;br /&gt;
            var $header = $(&#039;[data-sid=&amp;quot;&#039; + sid + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            var $body = $(&#039;#xn-&#039; + sid);&lt;br /&gt;
            if (!$body.length) $body = $header.next(&#039;.xn-body,.xn-subbody,.xn-subsubbody&#039;);&lt;br /&gt;
            if (!$body.length) return;&lt;br /&gt;
&lt;br /&gt;
            if (state[sid]) {&lt;br /&gt;
                $body.show();&lt;br /&gt;
                $header.removeClass(&#039;xn-collapsed&#039;);&lt;br /&gt;
            } else {&lt;br /&gt;
                $body.hide();&lt;br /&gt;
                $header.addClass(&#039;xn-collapsed&#039;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function loadState() {&lt;br /&gt;
        try { return JSON.parse(localStorage.getItem(COLLAPSE_KEY) || &#039;{}&#039;); }&lt;br /&gt;
        catch (e) { return {}; }&lt;br /&gt;
    }&lt;br /&gt;
    function saveState(s) {&lt;br /&gt;
        try { localStorage.setItem(COLLAPSE_KEY, JSON.stringify(s)); }&lt;br /&gt;
        catch (e) {}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    $(init);&lt;br /&gt;
&lt;br /&gt;
})(jQuery, mediaWiki);&lt;br /&gt;
&lt;br /&gt;
/* ===== 虾仁AI 浮窗助手（2026-07-30 v2） ===== */&lt;br /&gt;
(function () {&lt;br /&gt;
  if (window.__xrAiInited) return;&lt;br /&gt;
  window.__xrAiInited = true;&lt;br /&gt;
&lt;br /&gt;
  function xrAvatar(size) {&lt;br /&gt;
    return &#039;&amp;lt;svg viewBox=&amp;quot;0 0 48 48&amp;quot; width=&amp;quot;&#039; + size + &#039;&amp;quot; height=&amp;quot;&#039; + size + &#039;&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;ellipse cx=&amp;quot;24&amp;quot; cy=&amp;quot;14.5&amp;quot; rx=&amp;quot;18&amp;quot; ry=&amp;quot;5.5&amp;quot; fill=&amp;quot;#caa53d&amp;quot;/&amp;gt;&amp;lt;ellipse cx=&amp;quot;24&amp;quot; cy=&amp;quot;14.5&amp;quot; rx=&amp;quot;18&amp;quot; ry=&amp;quot;5.5&amp;quot; fill=&amp;quot;none&amp;quot; stroke=&amp;quot;#a8842a&amp;quot; stroke-width=&amp;quot;0.8&amp;quot;/&amp;gt;&amp;lt;path d=&amp;quot;M13 14.5 Q24 2.5 35 14.5 Z&amp;quot; fill=&amp;quot;#d9b84a&amp;quot;/&amp;gt;&amp;lt;path d=&amp;quot;M13 14.5 Q24 2.5 35 14.5 Z&amp;quot; fill=&amp;quot;none&amp;quot; stroke=&amp;quot;#a8842a&amp;quot; stroke-width=&amp;quot;0.8&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;12.5&amp;quot; cy=&amp;quot;25&amp;quot; r=&amp;quot;6.5&amp;quot; fill=&amp;quot;#2c2c2c&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;35.5&amp;quot; cy=&amp;quot;25&amp;quot; r=&amp;quot;6.5&amp;quot; fill=&amp;quot;#2c2c2c&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;24&amp;quot; cy=&amp;quot;29&amp;quot; r=&amp;quot;15&amp;quot; fill=&amp;quot;#fdfdfd&amp;quot; stroke=&amp;quot;#e9e2d2&amp;quot; stroke-width=&amp;quot;0.8&amp;quot;/&amp;gt;&amp;lt;ellipse cx=&amp;quot;18&amp;quot; cy=&amp;quot;28&amp;quot; rx=&amp;quot;4.5&amp;quot; ry=&amp;quot;5.6&amp;quot; fill=&amp;quot;#2c2c2c&amp;quot;/&amp;gt;&amp;lt;ellipse cx=&amp;quot;30&amp;quot; cy=&amp;quot;28&amp;quot; rx=&amp;quot;4.5&amp;quot; ry=&amp;quot;5.6&amp;quot; fill=&amp;quot;#2c2c2c&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;18&amp;quot; cy=&amp;quot;28&amp;quot; r=&amp;quot;1.9&amp;quot; fill=&amp;quot;#fff&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;30&amp;quot; cy=&amp;quot;28&amp;quot; r=&amp;quot;1.9&amp;quot; fill=&amp;quot;#fff&amp;quot;/&amp;gt;&amp;lt;ellipse cx=&amp;quot;24&amp;quot; cy=&amp;quot;33&amp;quot; rx=&amp;quot;2.1&amp;quot; ry=&amp;quot;1.5&amp;quot; fill=&amp;quot;#2c2c2c&amp;quot;/&amp;gt;&amp;lt;path d=&amp;quot;M20.5 36 Q24 38.5 27.5 36&amp;quot; stroke=&amp;quot;#2c2c2c&amp;quot; stroke-width=&amp;quot;1.3&amp;quot; fill=&amp;quot;none&amp;quot; stroke-linecap=&amp;quot;round&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;15&amp;quot; cy=&amp;quot;33&amp;quot; r=&amp;quot;2&amp;quot; fill=&amp;quot;#c41e3a&amp;quot; opacity=&amp;quot;0.18&amp;quot;/&amp;gt;&amp;lt;circle cx=&amp;quot;33&amp;quot; cy=&amp;quot;33&amp;quot; r=&amp;quot;2&amp;quot; fill=&amp;quot;#c41e3a&amp;quot; opacity=&amp;quot;0.18&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function init() {&lt;br /&gt;
    var API = &#039;/ai_proxy.php&#039;;&lt;br /&gt;
    var TITLE = &#039;虾仁AI&#039;;&lt;br /&gt;
&lt;br /&gt;
    var css = document.createElement(&#039;style&#039;);&lt;br /&gt;
    css.textContent = [&lt;br /&gt;
      &#039;#xr-ai-fab{position:fixed;right:22px;bottom:22px;z-index:99999;width:56px;height:56px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;background:linear-gradient(135deg,#c41e3a,#9b182d);color:#fff;font-size:26px;box-shadow:0 6px 20px rgba(155,24,45,.4);transition:transform .2s ease,box-shadow .2s ease;font-family:&amp;quot;Noto Serif SC&amp;quot;,&amp;quot;Songti SC&amp;quot;,serif}&#039;,&lt;br /&gt;
      &#039;#xr-ai-fab:hover{transform:scale(1.08);box-shadow:0 8px 26px rgba(155,24,45,.55)}&#039;,&lt;br /&gt;
      &#039;#xr-ai-panel{position:fixed;right:22px;bottom:90px;z-index:99999;width:360px;max-width:calc(100vw - 32px);height:520px;max-height:calc(100vh - 120px);display:none;flex-direction:column;overflow:hidden;background:#fbf6ec;border:1px solid #e7d8bf;border-radius:14px;box-shadow:0 12px 40px rgba(80,40,30,.25);font-family:&amp;quot;Noto Serif SC&amp;quot;,&amp;quot;Source Han Serif SC&amp;quot;,&amp;quot;Songti SC&amp;quot;,&amp;quot;STSong&amp;quot;,&amp;quot;SimSun&amp;quot;,serif;color:#3a2418}&#039;,&lt;br /&gt;
      &#039;#xr-ai-panel.xr-show{display:flex}&#039;,&lt;br /&gt;
      &#039;.xr-ai-head{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;background:linear-gradient(135deg,#c41e3a,#9b182d);color:#fff}&#039;,&lt;br /&gt;
      &#039;.xr-ai-title{font-weight:700;font-size:16px;letter-spacing:.05em;display:flex;align-items:center;gap:6px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-close{background:none;border:none;color:#fff;font-size:20px;cursor:pointer;line-height:1}&#039;,&lt;br /&gt;
      &#039;.xr-ai-tabs{display:flex;border-bottom:1px solid #ecdfc8;background:#f3e9d6}&#039;,&lt;br /&gt;
      &#039;.xr-ai-tab{flex:1;padding:9px 0;text-align:center;cursor:pointer;font-size:13px;color:#7a5a3a;border:none;background:none;transition:color .2s}&#039;,&lt;br /&gt;
      &#039;.xr-ai-tab.xr-active{color:#c41e3a;font-weight:700;box-shadow:inset 0 -2px 0 #c41e3a}&#039;,&lt;br /&gt;
      &#039;.xr-ai-hint{text-align:center;font-size:11px;color:#a98c6b;padding:0 0 6px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-msgs{flex:1;overflow-y:auto;padding:14px;display:flex;flex-direction:column;gap:10px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-msg{max-width:84%;padding:9px 12px;border-radius:12px;line-height:1.6;font-size:14px;white-space:pre-wrap;word-break:break-word}&#039;,&lt;br /&gt;
      &#039;.xr-ai-msg.xr-user{align-self:flex-end;background:#c41e3a;color:#fff;border-bottom-right-radius:3px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-msg.xr-ai{align-self:flex-start;background:#fff;color:#3a2418;border:1px solid #ecdfc8;border-left:3px solid #c41e3a;border-bottom-left-radius:3px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-inputbar{display:flex;gap:8px;padding:10px;border-top:1px solid #ecdfc8;background:#f6eddb}&#039;,&lt;br /&gt;
      &#039;.xr-ai-input{flex:1;resize:none;border:1px solid #e0cda8;border-radius:9px;padding:8px 10px;font-family:inherit;font-size:14px;background:#fff;outline:none;max-height:80px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-input:focus{border-color:#c41e3a}&#039;,&lt;br /&gt;
      &#039;.xr-ai-send{border:none;border-radius:9px;padding:0 16px;background:#9b182d;color:#fff;cursor:pointer;font-family:inherit;font-size:14px;transition:background .2s}&#039;,&lt;br /&gt;
      &#039;.xr-ai-send:hover{background:#c41e3a}&#039;,&lt;br /&gt;
      &#039;.xr-ai-send:disabled{opacity:.5;cursor:default}&#039;&lt;br /&gt;
    ].join(&#039;\n&#039;);&lt;br /&gt;
    document.head.appendChild(css);&lt;br /&gt;
&lt;br /&gt;
    var fab = document.createElement(&#039;button&#039;);&lt;br /&gt;
    fab.id = &#039;xr-ai-fab&#039;; fab.innerHTML = xrAvatar(38); fab.title = TITLE; fab.setAttribute(&#039;aria-label&#039;, TITLE);&lt;br /&gt;
&lt;br /&gt;
    var panel = document.createElement(&#039;div&#039;);&lt;br /&gt;
    panel.id = &#039;xr-ai-panel&#039;;&lt;br /&gt;
    panel.innerHTML =&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-head&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;xr-ai-title&amp;quot;&amp;gt;&#039; + xrAvatar(22) + &#039; &#039; + TITLE + &#039;&amp;lt;/span&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-close&amp;quot; title=&amp;quot;收起&amp;quot;&amp;gt;×&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-tabs&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-tab xr-active&amp;quot; data-mode=&amp;quot;general&amp;quot;&amp;gt;闲聊&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-tab&amp;quot; data-mode=&amp;quot;wiki&amp;quot;&amp;gt;问虾仁宇宙&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-hint&amp;quot;&amp;gt;内容由 AI 生成，仅供参考&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-msgs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-inputbar&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;textarea class=&amp;quot;xr-ai-input&amp;quot; rows=&amp;quot;1&amp;quot; placeholder=&amp;quot;和虾仁AI说点什么…&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-send&amp;quot;&amp;gt;发送&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;company&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; &#039; +&lt;br /&gt;
      &#039;style=&amp;quot;position:absolute;left:-9999px;width:1px;height:1px;opacity:0;&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
    document.body.appendChild(fab);&lt;br /&gt;
    document.body.appendChild(panel);&lt;br /&gt;
&lt;br /&gt;
    var msgsEl = panel.querySelector(&#039;.xr-ai-msgs&#039;);&lt;br /&gt;
    var inputEl = panel.querySelector(&#039;.xr-ai-input&#039;);&lt;br /&gt;
    var sendEl = panel.querySelector(&#039;.xr-ai-send&#039;);&lt;br /&gt;
    var closeEl = panel.querySelector(&#039;.xr-ai-close&#039;);&lt;br /&gt;
    var tabs = panel.querySelectorAll(&#039;.xr-ai-tab&#039;);&lt;br /&gt;
    var honey = panel.querySelector(&#039;input[name=company]&#039;);&lt;br /&gt;
&lt;br /&gt;
    var mode = &#039;general&#039;;&lt;br /&gt;
    var history = [];&lt;br /&gt;
    var busy = false;&lt;br /&gt;
&lt;br /&gt;
    fab.addEventListener(&#039;click&#039;, function () { panel.classList.toggle(&#039;xr-show&#039;); });&lt;br /&gt;
    closeEl.addEventListener(&#039;click&#039;, function () { panel.classList.remove(&#039;xr-show&#039;); });&lt;br /&gt;
    tabs.forEach(function (t) {&lt;br /&gt;
      t.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
        tabs.forEach(function (x) { x.classList.remove(&#039;xr-active&#039;); });&lt;br /&gt;
        t.classList.add(&#039;xr-active&#039;);&lt;br /&gt;
        mode = t.getAttribute(&#039;data-mode&#039;);&lt;br /&gt;
      });&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    function scrollBottom() { msgsEl.scrollTop = msgsEl.scrollHeight; }&lt;br /&gt;
    function addBubble(cls, text) {&lt;br /&gt;
      var d = document.createElement(&#039;div&#039;);&lt;br /&gt;
      d.className = &#039;xr-ai-msg &#039; + cls;&lt;br /&gt;
      d.textContent = text;&lt;br /&gt;
      msgsEl.appendChild(d);&lt;br /&gt;
      scrollBottom();&lt;br /&gt;
      return d;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function callAI(msgs, m, onChunk) {&lt;br /&gt;
      return fetch(API, {&lt;br /&gt;
        method: &#039;POST&#039;,&lt;br /&gt;
        headers: { &#039;Content-Type&#039;: &#039;application/json&#039; },&lt;br /&gt;
        body: JSON.stringify({ mode: m, messages: msgs, company: honey.value })&lt;br /&gt;
      }).then(function (res) {&lt;br /&gt;
        if (!res.ok) throw new Error(&#039;HTTP &#039; + res.status);&lt;br /&gt;
        var reader = res.body.getReader();&lt;br /&gt;
        var decoder = new TextDecoder();&lt;br /&gt;
        var buf = &#039;&#039;;&lt;br /&gt;
        function pump() {&lt;br /&gt;
          return reader.read().then(function (result) {&lt;br /&gt;
            if (result.done) return;&lt;br /&gt;
            buf += decoder.decode(result.value, { stream: true });&lt;br /&gt;
            var idx;&lt;br /&gt;
            while ((idx = buf.indexOf(&#039;\n&#039;)) &amp;gt;= 0) {&lt;br /&gt;
              var line = buf.slice(0, idx).trim();&lt;br /&gt;
              buf = buf.slice(idx + 1);&lt;br /&gt;
              if (!line) continue;&lt;br /&gt;
              try {&lt;br /&gt;
                var obj = JSON.parse(line);&lt;br /&gt;
                if (obj.content) onChunk(obj.content);&lt;br /&gt;
                if (obj.error) onChunk(&#039;（&#039; + obj.error + &#039;）&#039;);&lt;br /&gt;
              } catch (e) {}&lt;br /&gt;
            }&lt;br /&gt;
            return pump();&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
        return pump();&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function send() {&lt;br /&gt;
      var text = inputEl.value.trim();&lt;br /&gt;
      if (!text || busy) return;&lt;br /&gt;
      busy = true; sendEl.disabled = true;&lt;br /&gt;
      addBubble(&#039;xr-user&#039;, text);&lt;br /&gt;
      history.push({ role: &#039;user&#039;, content: text });&lt;br /&gt;
      inputEl.value = &#039;&#039;;&lt;br /&gt;
      var aiBubble = addBubble(&#039;xr-ai&#039;, &#039;…&#039;);&lt;br /&gt;
      var acc = &#039;&#039;;&lt;br /&gt;
      callAI(history.slice(-12), mode, function (chunk) {&lt;br /&gt;
        acc += chunk;&lt;br /&gt;
        aiBubble.textContent = acc + &#039;▌&#039;;&lt;br /&gt;
        scrollBottom();&lt;br /&gt;
      }).then(function () {&lt;br /&gt;
        aiBubble.textContent = acc || &#039;（暂无回复）&#039;;&lt;br /&gt;
        history.push({ role: &#039;assistant&#039;, content: acc });&lt;br /&gt;
        busy = false; sendEl.disabled = false; scrollBottom();&lt;br /&gt;
      }).catch(function (e) {&lt;br /&gt;
        aiBubble.textContent = &#039;出错了：&#039; + (e &amp;amp;&amp;amp; e.message ? e.message : e);&lt;br /&gt;
        busy = false; sendEl.disabled = false;&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sendEl.addEventListener(&#039;click&#039;, send);&lt;br /&gt;
    inputEl.addEventListener(&#039;keydown&#039;, function (e) {&lt;br /&gt;
      if (e.key === &#039;Enter&#039; &amp;amp;&amp;amp; !e.shiftKey) { e.preventDefault(); send(); }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    addBubble(&#039;xr-ai&#039;, &#039;你好，我是虾仁AI，可以陪你闲聊，也能帮你查「虾仁宇宙」的资料。选个模式开始吧～&#039;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
    document.addEventListener(&#039;DOMContentLoaded&#039;, init);&lt;br /&gt;
  } else {&lt;br /&gt;
    init();&lt;br /&gt;
  }&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=MediaWiki:Common.js&amp;diff=202</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=MediaWiki:Common.js&amp;diff=202"/>
		<updated>2026-07-29T16:50:59Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​添加虾仁AI浮窗助手组件&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* 虾仁维基 - 自定义侧边栏导航 v2.1 */&lt;br /&gt;
/* 优化：古风主题统一、健壮初始化、精致样式 */&lt;br /&gt;
/* 最后更新: 2026-07-30 */&lt;br /&gt;
&lt;br /&gt;
(function ($, mw) {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
    var COLLAPSE_KEY = &#039;xiarenwiki-nav-v2&#039;;&lt;br /&gt;
    var WORKS = [&#039;我在大明那些年&#039;, &#039;彼岸轮回&#039;, &#039;一品布衣&#039;];&lt;br /&gt;
    var WORK_DIRECT = [&#039;宇宙层&#039;, &#039;人物&#039;, &#039;世界观&#039;, &#039;设定&#039;];&lt;br /&gt;
&lt;br /&gt;
    function init() {&lt;br /&gt;
        var wgIsArticle = mw.config.get(&#039;wgIsArticle&#039;);&lt;br /&gt;
        var wgCanonicalSpecialPageName = mw.config.get(&#039;wgCanonicalSpecialPageName&#039;);&lt;br /&gt;
        if (!wgIsArticle &amp;amp;&amp;amp; wgCanonicalSpecialPageName) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        mw.loader.using(&#039;mediawiki.api&#039;).then(function () {&lt;br /&gt;
            waitForPanel(function ($panel) {&lt;br /&gt;
                buildNav($panel);&lt;br /&gt;
            });&lt;br /&gt;
        }).catch(function (e) {&lt;br /&gt;
            console.error(&#039;[虾仁导航] 依赖加载失败，降级构建&#039;, e);&lt;br /&gt;
            waitForPanel(function ($panel) {&lt;br /&gt;
                buildNav($panel);&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function waitForPanel(cb) {&lt;br /&gt;
        var $panel = $(&#039;#mw-panel&#039;);&lt;br /&gt;
        if ($panel.length) return cb($panel);&lt;br /&gt;
        var tries = 0;&lt;br /&gt;
        var timer = setInterval(function () {&lt;br /&gt;
            $panel = $(&#039;#mw-panel&#039;);&lt;br /&gt;
            if ($panel.length || ++tries &amp;gt; 50) {&lt;br /&gt;
                clearInterval(timer);&lt;br /&gt;
                if ($panel.length) cb($panel);&lt;br /&gt;
            }&lt;br /&gt;
        }, 100);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function buildNav($panel) {&lt;br /&gt;
        var html = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-search&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;form action=&amp;quot;&#039; + mw.util.getUrl(&#039;Special:Search&#039;) + &#039;&amp;quot; method=&amp;quot;get&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;search&amp;quot; class=&amp;quot;xn-search-input&amp;quot; placeholder=&amp;quot;检索典籍…&amp;quot; /&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;/form&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += section(&#039;Wiki&#039;, [&lt;br /&gt;
            [&#039;首页&#039;, &#039;首页&#039;],&lt;br /&gt;
            [&#039;Wiki简介&#039;, &#039;Wiki简介&#039;],&lt;br /&gt;
            [&#039;管理员告示&#039;, &#039;管理员告示&#039;],&lt;br /&gt;
            [&#039;随机页面&#039;, &#039;Special:Random&#039;],&lt;br /&gt;
            [&#039;快速搜索&#039;, &#039;Special:Search&#039;],&lt;br /&gt;
            [&#039;相关平台&#039;, &#039;相关平台&#039;],&lt;br /&gt;
            [&#039;Wiki源站点&#039;, &#039;Wiki源站点&#039;]&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
        html += section(&#039;虾仁简介&#039;, [&lt;br /&gt;
            [&#039;虾仁？&#039;, &#039;虾仁？&#039;],&lt;br /&gt;
            [&#039;虾仁共创收录规则&#039;, &#039;虾仁共创收录规则&#039;],&lt;br /&gt;
            [&#039;虾仁宇宙结构介绍&#039;, &#039;虾仁宇宙结构介绍&#039;]&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-section&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;universe&amp;quot;&amp;gt;虾仁宇宙&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-universe&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;xn-loading&amp;quot;&amp;gt;卷帙加载中…&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-section&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;literature&amp;quot;&amp;gt;虾仁文学&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-literature&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += link(&#039;创始宣言&#039;, &#039;创始宣言&#039;);&lt;br /&gt;
        html += link(&#039;虾仁六章&#039;, &#039;虾仁六章&#039;);&lt;br /&gt;
        html += link(&#039;虾仁异志&#039;, &#039;虾仁异志&#039;);&lt;br /&gt;
        html += link(&#039;虾仁诗作&#039;, &#039;虾仁诗作&#039;);&lt;br /&gt;
        html += link(&#039;虾仁音乐&#039;, &#039;虾仁音乐&#039;);&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-subsection&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-subheader xn-expandable&amp;quot; data-sid=&amp;quot;papers&amp;quot;&amp;gt;虾仁论文 &#039; + plus(&#039;虾仁论文&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-subbody&amp;quot; id=&amp;quot;xn-papers&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += link(&#039;去中心化创作模式的研究&#039;, &#039;去中心化创作模式的研究&#039;);&lt;br /&gt;
        html += link(&#039;数字时代的孙悟空&#039;, &#039;数字时代的孙悟空&#039;);&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += section(&#039;虾仁历史&#039;, [&lt;br /&gt;
            [&#039;起源&#039;, &#039;虾仁历史/起源&#039;],&lt;br /&gt;
            [&#039;传播&#039;, &#039;虾仁历史/传播&#039;],&lt;br /&gt;
            [&#039;转折&#039;, &#039;虾仁历史/转折&#039;],&lt;br /&gt;
            [&#039;爆发&#039;, &#039;虾仁历史/爆发&#039;],&lt;br /&gt;
            [&#039;危机&#039;, &#039;虾仁历史/危机&#039;],&lt;br /&gt;
            [&#039;转型&#039;, &#039;虾仁历史/转型&#039;]&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-single&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&#039; + url(&#039;共创入口&#039;) + &#039;&amp;quot;&amp;gt;共创入口&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        $panel.html(html);&lt;br /&gt;
        restoreCollapse();&lt;br /&gt;
        bindEvents();&lt;br /&gt;
        highlightCurrent();&lt;br /&gt;
        loadUniverse();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function section(title, items) {&lt;br /&gt;
        var sid = title.replace(/[^a-z0-9\u4e00-\u9fff]/gi, &#039;&#039;).toLowerCase();&lt;br /&gt;
        var h = &#039;&amp;lt;div class=&amp;quot;xn-section&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        h += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + sid + &#039;&amp;quot;&amp;gt;&#039; + title + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        h += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-&#039; + sid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        for (var i = 0; i &amp;lt; items.length; i++) {&lt;br /&gt;
            h += link(items[i][0], items[i][1]);&lt;br /&gt;
        }&lt;br /&gt;
        h += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return h;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function link(label, page, cls) {&lt;br /&gt;
        return &#039;&amp;lt;div class=&amp;quot;xn-link&#039; + (cls ? &#039; &#039; + cls : &#039;&#039;) + &#039;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&#039; + url(page) + &#039;&amp;quot;&amp;gt;&#039; + label + &#039;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function url(page) { return mw.util.getUrl(page); }&lt;br /&gt;
&lt;br /&gt;
    function plus(page) {&lt;br /&gt;
        return &#039;&amp;lt;a class=&amp;quot;xn-plus&amp;quot; href=&amp;quot;&#039; + url(page) + &#039;?action=edit&amp;quot; title=&amp;quot;编辑/新增&amp;quot;&amp;gt;＋&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    async function loadUniverse() {&lt;br /&gt;
        var $body = $(&#039;#xn-universe&#039;);&lt;br /&gt;
        if (!$body.length) return;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            var api = new mw.Api();&lt;br /&gt;
            var html = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; WORKS.length; i++) {&lt;br /&gt;
                var work = WORKS[i];&lt;br /&gt;
                var workSid = &#039;work&#039; + i;&lt;br /&gt;
&lt;br /&gt;
                var subpages = [];&lt;br /&gt;
                try {&lt;br /&gt;
                    var result = await api.get({&lt;br /&gt;
                        action: &#039;query&#039;,&lt;br /&gt;
                        list: &#039;allpages&#039;,&lt;br /&gt;
                        apprefix: work + &#039;/&#039;,&lt;br /&gt;
                        aplimit: 100&lt;br /&gt;
                    });&lt;br /&gt;
                    subpages = result.query.allpages || [];&lt;br /&gt;
                } catch (e) {&lt;br /&gt;
                    console.error(&#039;[虾仁导航] API error for &#039; + work, e);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-work&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-work-title xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + workSid + &#039;&amp;quot;&amp;gt;&#039; + work + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-&#039; + workSid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
                var directSet = {};&lt;br /&gt;
                for (var j = 0; j &amp;lt; subpages.length; j++) {&lt;br /&gt;
                    var rel = subpages[j].title.substring(work.length + 1);&lt;br /&gt;
                    if (rel.indexOf(&#039;/&#039;) === -1) directSet[rel] = true;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                for (var k = 0; k &amp;lt; WORK_DIRECT.length; k++) {&lt;br /&gt;
                    var item = WORK_DIRECT[k];&lt;br /&gt;
                    var exists = directSet[item];&lt;br /&gt;
                    html += link(item, work + &#039;/&#039; + item, exists ? &#039;&#039; : &#039;xn-missing&#039;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                var plotSegs = [];&lt;br /&gt;
                for (j = 0; j &amp;lt; subpages.length; j++) {&lt;br /&gt;
                    rel = subpages[j].title.substring(work.length + 1);&lt;br /&gt;
                    var parts = rel.split(&#039;/&#039;);&lt;br /&gt;
                    if (parts.length === 2 &amp;amp;&amp;amp; parts[0] === &#039;剧情层&#039;) {&lt;br /&gt;
                        plotSegs.push(parts[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                var plotSid = workSid + &#039;plot&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-subsection&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-subheader xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + plotSid + &#039;&amp;quot;&amp;gt;剧情层 &#039; + plus(work + &#039;/剧情层&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-subbody&amp;quot; id=&amp;quot;xn-&#039; + plotSid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
                for (k = 0; k &amp;lt; plotSegs.length; k++) {&lt;br /&gt;
                    var seg = plotSegs[k];&lt;br /&gt;
                    var segSid = workSid + &#039;seg&#039; + k;&lt;br /&gt;
                    var segPage = work + &#039;/剧情层/&#039; + seg;&lt;br /&gt;
&lt;br /&gt;
                    var jinji = [];&lt;br /&gt;
                    try {&lt;br /&gt;
                        var segResult = await api.get({&lt;br /&gt;
                            action: &#039;query&#039;,&lt;br /&gt;
                            list: &#039;allpages&#039;,&lt;br /&gt;
                            apprefix: segPage + &#039;/&#039;,&lt;br /&gt;
                            aplimit: 50&lt;br /&gt;
                        });&lt;br /&gt;
                        var segPages = segResult.query.allpages || [];&lt;br /&gt;
                        for (var m = 0; m &amp;lt; segPages.length; m++) {&lt;br /&gt;
                            jinji.push(segPages[m].title.substring(segPage.length + 1));&lt;br /&gt;
                        }&lt;br /&gt;
                    } catch (e2) {}&lt;br /&gt;
&lt;br /&gt;
                    html += &#039;&amp;lt;div class=&amp;quot;xn-subsubsection&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
                    html += &#039;&amp;lt;div class=&amp;quot;xn-subsubheader xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + segSid + &#039;&amp;quot;&amp;gt;&#039; + seg + &#039; &#039; + plus(segPage) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                    html += &#039;&amp;lt;div class=&amp;quot;xn-subsubbody&amp;quot; id=&amp;quot;xn-&#039; + segSid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
                    for (m = 0; m &amp;lt; jinji.length; m++) {&lt;br /&gt;
                        html += link(jinji[m], segPage + &#039;/&#039; + jinji[m]);&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;xn-link xn-add-work&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&#039; + url(&#039;Special:Search&#039;) + &#039;&amp;quot; title=&amp;quot;搜索已有作品&amp;quot;&amp;gt;＋ 发现更多作品&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
            $body.html(html);&lt;br /&gt;
            restoreCollapse();&lt;br /&gt;
            bindEvents();&lt;br /&gt;
            highlightCurrent();&lt;br /&gt;
&lt;br /&gt;
        } catch (e) {&lt;br /&gt;
            console.error(&#039;[虾仁导航] 虾仁宇宙加载失败&#039;, e);&lt;br /&gt;
            $body.html(&#039;&amp;lt;div class=&amp;quot;xn-link&amp;quot;&amp;gt;(加载失败，请刷新)&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function highlightCurrent() {&lt;br /&gt;
        var currentTitle = mw.config.get(&#039;wgPageName&#039;);&lt;br /&gt;
        $(&#039;#mw-panel .xn-link a&#039;).each(function () {&lt;br /&gt;
            var href = $(this).attr(&#039;href&#039;);&lt;br /&gt;
            if (!href) return;&lt;br /&gt;
            var match = false;&lt;br /&gt;
            if (href.indexOf(&#039;title=&#039;) &amp;gt; 0) {&lt;br /&gt;
                var m = href.match(/title=([^&amp;amp;]+)/);&lt;br /&gt;
                if (m) match = decodeURIComponent(m[1]) === currentTitle;&lt;br /&gt;
            } else {&lt;br /&gt;
                var parts = href.split(&#039;/&#039;);&lt;br /&gt;
                var last = parts[parts.length - 1];&lt;br /&gt;
                match = decodeURIComponent(last) === currentTitle;&lt;br /&gt;
            }&lt;br /&gt;
            if (match) {&lt;br /&gt;
                $(this).addClass(&#039;xn-active&#039;);&lt;br /&gt;
                $(this).closest(&#039;.xn-link&#039;).addClass(&#039;xn-active-link&#039;);&lt;br /&gt;
                $(this).parents(&#039;.xn-body, .xn-subbody, .xn-subsubbody&#039;).each(function () {&lt;br /&gt;
                    $(this).show();&lt;br /&gt;
                    var sid = $(this).attr(&#039;id&#039;);&lt;br /&gt;
                    if (sid &amp;amp;&amp;amp; sid.indexOf(&#039;xn-&#039;) === 0) {&lt;br /&gt;
                        sid = sid.substring(3);&lt;br /&gt;
                        $(&#039;[data-sid=&amp;quot;&#039; + sid + &#039;&amp;quot;]&#039;).removeClass(&#039;xn-collapsed&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function bindEvents() {&lt;br /&gt;
        $(document).off(&#039;click.xn&#039;).on(&#039;click.xn&#039;, &#039;.xn-expandable&#039;, function (e) {&lt;br /&gt;
            if ($(e.target).closest(&#039;.xn-plus&#039;).length) return;&lt;br /&gt;
            var sid = $(this).data(&#039;sid&#039;);&lt;br /&gt;
            var $body = $(&#039;#xn-&#039; + sid);&lt;br /&gt;
            if (!$body.length) $body = $(this).next(&#039;.xn-body,.xn-subbody,.xn-subsubbody&#039;);&lt;br /&gt;
            if (!$body.length) return;&lt;br /&gt;
&lt;br /&gt;
            $body.slideToggle(150);&lt;br /&gt;
            $(this).toggleClass(&#039;xn-collapsed&#039;, !$body.is(&#039;:visible&#039;));&lt;br /&gt;
&lt;br /&gt;
            var state = loadState();&lt;br /&gt;
            state[sid] = $body.is(&#039;:visible&#039;);&lt;br /&gt;
            saveState(state);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function restoreCollapse() {&lt;br /&gt;
        var state = loadState();&lt;br /&gt;
        var defaults = { &#039;universe&#039;: true };&lt;br /&gt;
        for (var key in defaults) {&lt;br /&gt;
            if (!(key in state)) state[key] = defaults[key];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        Object.keys(state).forEach(function (sid) {&lt;br /&gt;
            var $header = $(&#039;[data-sid=&amp;quot;&#039; + sid + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            var $body = $(&#039;#xn-&#039; + sid);&lt;br /&gt;
            if (!$body.length) $body = $header.next(&#039;.xn-body,.xn-subbody,.xn-subsubbody&#039;);&lt;br /&gt;
            if (!$body.length) return;&lt;br /&gt;
&lt;br /&gt;
            if (state[sid]) {&lt;br /&gt;
                $body.show();&lt;br /&gt;
                $header.removeClass(&#039;xn-collapsed&#039;);&lt;br /&gt;
            } else {&lt;br /&gt;
                $body.hide();&lt;br /&gt;
                $header.addClass(&#039;xn-collapsed&#039;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function loadState() {&lt;br /&gt;
        try { return JSON.parse(localStorage.getItem(COLLAPSE_KEY) || &#039;{}&#039;); }&lt;br /&gt;
        catch (e) { return {}; }&lt;br /&gt;
    }&lt;br /&gt;
    function saveState(s) {&lt;br /&gt;
        try { localStorage.setItem(COLLAPSE_KEY, JSON.stringify(s)); }&lt;br /&gt;
        catch (e) {}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    $(init);&lt;br /&gt;
&lt;br /&gt;
})(jQuery, mediaWiki);&lt;br /&gt;
&lt;br /&gt;
/* ===== 虾仁AI 浮窗助手（2026-07-30） ===== */&lt;br /&gt;
(function () {&lt;br /&gt;
  if (window.__xrAiInited) return;&lt;br /&gt;
  window.__xrAiInited = true;&lt;br /&gt;
&lt;br /&gt;
  function init() {&lt;br /&gt;
    var API = &#039;/ai_proxy.php&#039;;&lt;br /&gt;
    var TITLE = &#039;虾仁AI&#039;;&lt;br /&gt;
&lt;br /&gt;
    var css = document.createElement(&#039;style&#039;);&lt;br /&gt;
    css.textContent = [&lt;br /&gt;
      &#039;#xr-ai-fab{position:fixed;right:22px;bottom:22px;z-index:99999;width:56px;height:56px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#c41e3a,#9b182d);color:#fff;font-size:26px;box-shadow:0 6px 20px rgba(155,24,45,.4);transition:transform .2s ease,box-shadow .2s ease;font-family:&amp;quot;Noto Serif SC&amp;quot;,&amp;quot;Songti SC&amp;quot;,serif}&#039;,&lt;br /&gt;
      &#039;#xr-ai-fab:hover{transform:scale(1.08);box-shadow:0 8px 26px rgba(155,24,45,.55)}&#039;,&lt;br /&gt;
      &#039;#xr-ai-panel{position:fixed;right:22px;bottom:90px;z-index:99999;width:360px;max-width:calc(100vw - 32px);height:520px;max-height:calc(100vh - 120px);display:none;flex-direction:column;overflow:hidden;background:#fbf6ec;border:1px solid #e7d8bf;border-radius:14px;box-shadow:0 12px 40px rgba(80,40,30,.25);font-family:&amp;quot;Noto Serif SC&amp;quot;,&amp;quot;Source Han Serif SC&amp;quot;,&amp;quot;Songti SC&amp;quot;,&amp;quot;STSong&amp;quot;,&amp;quot;SimSun&amp;quot;,serif;color:#3a2418}&#039;,&lt;br /&gt;
      &#039;#xr-ai-panel.xr-show{display:flex}&#039;,&lt;br /&gt;
      &#039;.xr-ai-head{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;background:linear-gradient(135deg,#c41e3a,#9b182d);color:#fff}&#039;,&lt;br /&gt;
      &#039;.xr-ai-title{font-weight:700;font-size:16px;letter-spacing:.05em}&#039;,&lt;br /&gt;
      &#039;.xr-ai-close{background:none;border:none;color:#fff;font-size:20px;cursor:pointer;line-height:1}&#039;,&lt;br /&gt;
      &#039;.xr-ai-tabs{display:flex;border-bottom:1px solid #ecdfc8;background:#f3e9d6}&#039;,&lt;br /&gt;
      &#039;.xr-ai-tab{flex:1;padding:9px 0;text-align:center;cursor:pointer;font-size:13px;color:#7a5a3a;border:none;background:none;transition:color .2s}&#039;,&lt;br /&gt;
      &#039;.xr-ai-tab.xr-active{color:#c41e3a;font-weight:700;box-shadow:inset 0 -2px 0 #c41e3a}&#039;,&lt;br /&gt;
      &#039;.xr-ai-hint{text-align:center;font-size:11px;color:#a98c6b;padding:0 0 6px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-msgs{flex:1;overflow-y:auto;padding:14px;display:flex;flex-direction:column;gap:10px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-msg{max-width:84%;padding:9px 12px;border-radius:12px;line-height:1.6;font-size:14px;white-space:pre-wrap;word-break:break-word}&#039;,&lt;br /&gt;
      &#039;.xr-ai-msg.xr-user{align-self:flex-end;background:#c41e3a;color:#fff;border-bottom-right-radius:3px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-msg.xr-ai{align-self:flex-start;background:#fff;color:#3a2418;border:1px solid #ecdfc8;border-left:3px solid #c41e3a;border-bottom-left-radius:3px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-inputbar{display:flex;gap:8px;padding:10px;border-top:1px solid #ecdfc8;background:#f6eddb}&#039;,&lt;br /&gt;
      &#039;.xr-ai-input{flex:1;resize:none;border:1px solid #e0cda8;border-radius:9px;padding:8px 10px;font-family:inherit;font-size:14px;background:#fff;outline:none;max-height:80px}&#039;,&lt;br /&gt;
      &#039;.xr-ai-input:focus{border-color:#c41e3a}&#039;,&lt;br /&gt;
      &#039;.xr-ai-send{border:none;border-radius:9px;padding:0 16px;background:#9b182d;color:#fff;cursor:pointer;font-family:inherit;font-size:14px;transition:background .2s}&#039;,&lt;br /&gt;
      &#039;.xr-ai-send:hover{background:#c41e3a}&#039;,&lt;br /&gt;
      &#039;.xr-ai-send:disabled{opacity:.5;cursor:default}&#039;&lt;br /&gt;
    ].join(&#039;\n&#039;);&lt;br /&gt;
    document.head.appendChild(css);&lt;br /&gt;
&lt;br /&gt;
    var fab = document.createElement(&#039;button&#039;);&lt;br /&gt;
    fab.id = &#039;xr-ai-fab&#039;; fab.innerHTML = &#039;虾&#039;; fab.title = TITLE; fab.setAttribute(&#039;aria-label&#039;, TITLE);&lt;br /&gt;
&lt;br /&gt;
    var panel = document.createElement(&#039;div&#039;);&lt;br /&gt;
    panel.id = &#039;xr-ai-panel&#039;;&lt;br /&gt;
    panel.innerHTML =&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-head&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;xr-ai-title&amp;quot;&amp;gt;🦐 &#039; + TITLE + &#039;&amp;lt;/span&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-close&amp;quot; title=&amp;quot;收起&amp;quot;&amp;gt;×&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-tabs&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-tab xr-active&amp;quot; data-mode=&amp;quot;general&amp;quot;&amp;gt;闲聊&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-tab&amp;quot; data-mode=&amp;quot;wiki&amp;quot;&amp;gt;问虾仁宇宙&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-hint&amp;quot;&amp;gt;内容由 AI 生成，仅供参考&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-msgs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;xr-ai-inputbar&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;textarea class=&amp;quot;xr-ai-input&amp;quot; rows=&amp;quot;1&amp;quot; placeholder=&amp;quot;和虾仁AI说点什么…&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;button class=&amp;quot;xr-ai-send&amp;quot;&amp;gt;发送&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;company&amp;quot; tabindex=&amp;quot;-1&amp;quot; autocomplete=&amp;quot;off&amp;quot; &#039; +&lt;br /&gt;
      &#039;style=&amp;quot;position:absolute;left:-9999px;width:1px;height:1px;opacity:0;&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
    document.body.appendChild(fab);&lt;br /&gt;
    document.body.appendChild(panel);&lt;br /&gt;
&lt;br /&gt;
    var msgsEl = panel.querySelector(&#039;.xr-ai-msgs&#039;);&lt;br /&gt;
    var inputEl = panel.querySelector(&#039;.xr-ai-input&#039;);&lt;br /&gt;
    var sendEl = panel.querySelector(&#039;.xr-ai-send&#039;);&lt;br /&gt;
    var closeEl = panel.querySelector(&#039;.xr-ai-close&#039;);&lt;br /&gt;
    var tabs = panel.querySelectorAll(&#039;.xr-ai-tab&#039;);&lt;br /&gt;
    var honey = panel.querySelector(&#039;input[name=company]&#039;);&lt;br /&gt;
&lt;br /&gt;
    var mode = &#039;general&#039;;&lt;br /&gt;
    var history = [];&lt;br /&gt;
    var busy = false;&lt;br /&gt;
&lt;br /&gt;
    fab.addEventListener(&#039;click&#039;, function () { panel.classList.toggle(&#039;xr-show&#039;); });&lt;br /&gt;
    closeEl.addEventListener(&#039;click&#039;, function () { panel.classList.remove(&#039;xr-show&#039;); });&lt;br /&gt;
    tabs.forEach(function (t) {&lt;br /&gt;
      t.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
        tabs.forEach(function (x) { x.classList.remove(&#039;xr-active&#039;); });&lt;br /&gt;
        t.classList.add(&#039;xr-active&#039;);&lt;br /&gt;
        mode = t.getAttribute(&#039;data-mode&#039;);&lt;br /&gt;
      });&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    function scrollBottom() { msgsEl.scrollTop = msgsEl.scrollHeight; }&lt;br /&gt;
    function addBubble(cls, text) {&lt;br /&gt;
      var d = document.createElement(&#039;div&#039;);&lt;br /&gt;
      d.className = &#039;xr-ai-msg &#039; + cls;&lt;br /&gt;
      d.textContent = text;&lt;br /&gt;
      msgsEl.appendChild(d);&lt;br /&gt;
      scrollBottom();&lt;br /&gt;
      return d;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function callAI(msgs, m, onChunk) {&lt;br /&gt;
      return fetch(API, {&lt;br /&gt;
        method: &#039;POST&#039;,&lt;br /&gt;
        headers: { &#039;Content-Type&#039;: &#039;application/json&#039; },&lt;br /&gt;
        body: JSON.stringify({ mode: m, messages: msgs, company: honey.value })&lt;br /&gt;
      }).then(function (res) {&lt;br /&gt;
        if (!res.ok) throw new Error(&#039;HTTP &#039; + res.status);&lt;br /&gt;
        var reader = res.body.getReader();&lt;br /&gt;
        var decoder = new TextDecoder();&lt;br /&gt;
        var buf = &#039;&#039;;&lt;br /&gt;
        function pump() {&lt;br /&gt;
          return reader.read().then(function (result) {&lt;br /&gt;
            if (result.done) return;&lt;br /&gt;
            buf += decoder.decode(result.value, { stream: true });&lt;br /&gt;
            var idx;&lt;br /&gt;
            while ((idx = buf.indexOf(&#039;\n&#039;)) &amp;gt;= 0) {&lt;br /&gt;
              var line = buf.slice(0, idx).trim();&lt;br /&gt;
              buf = buf.slice(idx + 1);&lt;br /&gt;
              if (!line) continue;&lt;br /&gt;
              try {&lt;br /&gt;
                var obj = JSON.parse(line);&lt;br /&gt;
                if (obj.content) onChunk(obj.content);&lt;br /&gt;
                if (obj.error) onChunk(&#039;（&#039; + obj.error + &#039;）&#039;);&lt;br /&gt;
              } catch (e) {}&lt;br /&gt;
            }&lt;br /&gt;
            return pump();&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
        return pump();&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function send() {&lt;br /&gt;
      var text = inputEl.value.trim();&lt;br /&gt;
      if (!text || busy) return;&lt;br /&gt;
      busy = true; sendEl.disabled = true;&lt;br /&gt;
      addBubble(&#039;xr-user&#039;, text);&lt;br /&gt;
      history.push({ role: &#039;user&#039;, content: text });&lt;br /&gt;
      inputEl.value = &#039;&#039;;&lt;br /&gt;
      var aiBubble = addBubble(&#039;xr-ai&#039;, &#039;…&#039;);&lt;br /&gt;
      var acc = &#039;&#039;;&lt;br /&gt;
      callAI(history.slice(-12), mode, function (chunk) {&lt;br /&gt;
        acc += chunk;&lt;br /&gt;
        aiBubble.textContent = acc + &#039;▌&#039;;&lt;br /&gt;
        scrollBottom();&lt;br /&gt;
      }).then(function () {&lt;br /&gt;
        aiBubble.textContent = acc || &#039;（暂无回复）&#039;;&lt;br /&gt;
        history.push({ role: &#039;assistant&#039;, content: acc });&lt;br /&gt;
        busy = false; sendEl.disabled = false; scrollBottom();&lt;br /&gt;
      }).catch(function (e) {&lt;br /&gt;
        aiBubble.textContent = &#039;出错了：&#039; + (e &amp;amp;&amp;amp; e.message ? e.message : e);&lt;br /&gt;
        busy = false; sendEl.disabled = false;&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sendEl.addEventListener(&#039;click&#039;, send);&lt;br /&gt;
    inputEl.addEventListener(&#039;keydown&#039;, function (e) {&lt;br /&gt;
      if (e.key === &#039;Enter&#039; &amp;amp;&amp;amp; !e.shiftKey) { e.preventDefault(); send(); }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    addBubble(&#039;xr-ai&#039;, &#039;你好，我是虾仁AI 🦐 可以陪你闲聊，也能帮你查「虾仁宇宙」的资料。选个模式开始吧～&#039;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
    document.addEventListener(&#039;DOMContentLoaded&#039;, init);&lt;br /&gt;
  } else {&lt;br /&gt;
    init();&lt;br /&gt;
  }&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E9%9F%B3%E4%B9%90&amp;diff=124</id>
		<title>虾仁音乐</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E9%9F%B3%E4%B9%90&amp;diff=124"/>
		<updated>2026-07-26T15:17:18Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​添加QQ音乐、汽水音乐试听入口&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;「虾仁音乐」收录虾仁系列沙雕动画中出现频率较高、在粉丝群体中形成强烈记忆点的背景音乐（BGM）。这些曲目大多并非虾仁原创，但因反复出现在动画名场面中，旋律一响便令粉丝联想到虾仁。&lt;br /&gt;
&lt;br /&gt;
本页面按曲风/场景分类整理，标注了粉丝俗称及经典出场场景。&lt;br /&gt;
&lt;br /&gt;
---- &lt;br /&gt;
&lt;br /&gt;
== 悲情·大气 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! 曲名 !! 原唱/作者 !! 虾仁俗称 !! 经典场景 !! 试听&lt;br /&gt;
|-&lt;br /&gt;
| 此去半生 || 吴昊 / 九寸 || 大明不妙曲、大明葬送曲 || 大明悲情时刻，老朱家亲人离世，王朝衰败 || [https://music.163.com/#/search/m/?s=此去半生+吴昊 网易云] · [https://y.qq.com/n/ryqq/search?w=此去半生+吴昊 QQ音乐] · [https://www.douyin.com/search/此去半生+吴昊?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| 英雄的黎明 || 横山菁儿 || — || 史诗感场景，大战前夕 || [https://music.163.com/#/search/m/?s=英雄的黎明 网易云] · [https://y.qq.com/n/ryqq/search?w=英雄的黎明 QQ音乐] · [https://www.douyin.com/search/英雄的黎明?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| 佛光初现（唢呐版） || — || — || 高燃战斗、角色觉醒 || [https://music.163.com/#/search/m/?s=佛光初现+唢呐 网易云] · [https://y.qq.com/n/ryqq/search?w=佛光初现+唢呐 QQ音乐] · [https://www.douyin.com/search/佛光初现+唢呐?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| 痴情冢（洞箫版） || — || — || 离别/牺牲场景 || [https://music.163.com/#/search/m/?s=痴情冢+洞箫 网易云] · [https://y.qq.com/n/ryqq/search?w=痴情冢+洞箫 QQ音乐] · [https://www.douyin.com/search/痴情冢+洞箫?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| Nijamena || — || — || 宿命感、宏大叙事 || [https://music.163.com/#/search/m/?s=Nijamena 网易云] · [https://y.qq.com/n/ryqq/search?w=Nijamena QQ音乐] · [https://www.douyin.com/search/Nijamena?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| 铸剑山庄 || — || — || 武侠/江湖氛围 || [https://music.163.com/#/search/m/?s=铸剑山庄 网易云] · [https://y.qq.com/n/ryqq/search?w=铸剑山庄 QQ音乐] · [https://www.douyin.com/search/铸剑山庄?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| 山河 || — || — || 家国情怀、壮烈场景 || [https://music.163.com/#/search/m/?s=山河 网易云] · [https://y.qq.com/n/ryqq/search?w=山河 QQ音乐] · [https://www.douyin.com/search/山河?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| 落花 || — || — || 凄美、伤感 || [https://music.163.com/#/search/m/?s=落花 网易云] · [https://y.qq.com/n/ryqq/search?w=落花 QQ音乐] · [https://www.douyin.com/search/落花?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| 我曾经爱过一个人 || — || — || 回忆/虐心 || [https://music.163.com/#/search/m/?s=我曾经爱过一个人 网易云] · [https://y.qq.com/n/ryqq/search?w=我曾经爱过一个人 QQ音乐] · [https://www.douyin.com/search/我曾经爱过一个人?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| children of the dark || — || — || 黑暗/高燃/战斗 || [https://music.163.com/#/search/m/?s=children+of+the+dark 网易云] · [https://y.qq.com/n/ryqq/search?w=children+of+the+dark QQ音乐] · [https://www.douyin.com/search/children+of+the+dark?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| 如履薄冰 || Void || — || 紧张、危机 || [https://music.163.com/#/search/m/?s=如履薄冰+Void 网易云] · [https://y.qq.com/n/ryqq/search?w=如履薄冰+Void QQ音乐] · [https://www.douyin.com/search/如履薄冰+Void?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| 笛子曲《锦绣未央》 || — || — || 古风、宫廷 || [https://music.163.com/#/search/m/?s=锦绣未央+笛子 网易云] · [https://y.qq.com/n/ryqq/search?w=锦绣未央+笛子 QQ音乐] · [https://www.douyin.com/search/锦绣未央+笛子?type=music 汽水]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 欢快·轻松 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! 曲名 !! 原唱/作者 !! 虾仁俗称 !! 经典场景 !! 试听&lt;br /&gt;
|-&lt;br /&gt;
| 欢沁 || 林海 || — || 轻松搞笑日常 || [https://music.163.com/#/search/m/?s=欢沁+林海 网易云] · [https://y.qq.com/n/ryqq/search?w=欢沁+林海 QQ音乐] · [https://www.douyin.com/search/欢沁+林海?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| 欢乐斗地主 || — || — || 搞笑名场面、耍宝 || [https://music.163.com/#/search/m/?s=欢乐斗地主 网易云] · [https://y.qq.com/n/ryqq/search?w=欢乐斗地主 QQ音乐] · [https://www.douyin.com/search/欢乐斗地主?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| 胡伟立 - 嬉戏 || 胡伟立 || — || 俏皮/逗趣 || [https://music.163.com/#/search/m/?s=嬉戏+胡伟立 网易云] · [https://y.qq.com/n/ryqq/search?w=嬉戏+胡伟立 QQ音乐] · [https://www.douyin.com/search/嬉戏+胡伟立?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| 小神仙 || — || — || 轻松逗乐、小人物逆袭 || [https://music.163.com/#/search/m/?s=小神仙 网易云] · [https://y.qq.com/n/ryqq/search?w=小神仙 QQ音乐] · [https://www.douyin.com/search/小神仙?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| 众月捧星-快乐主题音乐 || — || — || 欢乐大团圆 || [https://music.163.com/#/search/m/?s=众月捧星 网易云] · [https://y.qq.com/n/ryqq/search?w=众月捧星 QQ音乐] · [https://www.douyin.com/search/众月捧星?type=music 汽水]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 古风·悠扬 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! 曲名 !! 原唱/作者 !! 虾仁俗称 !! 经典场景 !! 试听&lt;br /&gt;
|-&lt;br /&gt;
| 难却 || — || — || 深情/不舍 || [https://music.163.com/#/search/m/?s=难却 网易云] · [https://y.qq.com/n/ryqq/search?w=难却 QQ音乐] · [https://www.douyin.com/search/难却?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| 枉游 || 陆深 || — || 游历、江湖感 || [https://music.163.com/#/search/m/?s=枉游+陆深 网易云] · [https://y.qq.com/n/ryqq/search?w=枉游+陆深 QQ音乐] · [https://www.douyin.com/search/枉游+陆深?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| 江上清风游 || — || — || 宁静/侠客独行 || [https://music.163.com/#/search/m/?s=江上清风游 网易云] · [https://y.qq.com/n/ryqq/search?w=江上清风游 QQ音乐] · [https://www.douyin.com/search/江上清风游?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| 公子 || 董冬冬 || — || 儒雅/文人 || [https://music.163.com/#/search/m/?s=公子+董冬冬 网易云] · [https://y.qq.com/n/ryqq/search?w=公子+董冬冬 QQ音乐] · [https://www.douyin.com/search/公子+董冬冬?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| 金陵遗梦 || — || — || 怀古、感伤 || [https://music.163.com/#/search/m/?s=金陵遗梦 网易云] · [https://y.qq.com/n/ryqq/search?w=金陵遗梦 QQ音乐] · [https://www.douyin.com/search/金陵遗梦?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| 思念的弦 || 贾晓龙 || — || 思念/离愁 || [https://music.163.com/#/search/m/?s=思念的弦+贾晓龙 网易云] · [https://y.qq.com/n/ryqq/search?w=思念的弦+贾晓龙 QQ音乐] · [https://www.douyin.com/search/思念的弦+贾晓龙?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| 画中的你 || — || — || 唯美/抒情 || [https://music.163.com/#/search/m/?s=画中的你 网易云] · [https://y.qq.com/n/ryqq/search?w=画中的你 QQ音乐] · [https://www.douyin.com/search/画中的你?type=music 汽水]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 燃向·动作 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! 曲名 !! 原唱/作者 !! 虾仁俗称 !! 经典场景 !! 试听&lt;br /&gt;
|-&lt;br /&gt;
| 《侠》第六乐章「初心」|| — || — || 侠义精神/高燃 || [https://music.163.com/#/search/m/?s=侠+第六乐章+初心 网易云] · [https://y.qq.com/n/ryqq/search?w=侠+第六乐章+初心 QQ音乐] · [https://www.douyin.com/search/侠+第六乐章+初心?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| 翼 古风变装舞 || — || — || 变身/升级 || [https://music.163.com/#/search/m/?s=翼+古风变装 网易云] · [https://y.qq.com/n/ryqq/search?w=翼+古风变装 QQ音乐] · [https://www.douyin.com/search/翼+古风变装?type=music 汽水]&lt;br /&gt;
|-&lt;br /&gt;
| 赐我 + 一笑江湖改编 || — || — || 爽文名场面 || [https://music.163.com/#/search/m/?s=赐我+一笑江湖 网易云] · [https://y.qq.com/n/ryqq/search?w=赐我+一笑江湖 QQ音乐] · [https://www.douyin.com/search/赐我+一笑江湖?type=music 汽水]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 说明 ==&lt;br /&gt;
&lt;br /&gt;
* 以上曲目均为虾仁动画中使用过的配乐，版权归原唱/原作者所有&lt;br /&gt;
* 「虾仁俗称」为粉丝群体自发命名的昵称，并非官方名称&lt;br /&gt;
* 试听列提供&amp;lt;b&amp;gt;网易云音乐&amp;lt;/b&amp;gt;、&amp;lt;b&amp;gt;QQ音乐&amp;lt;/b&amp;gt;、&amp;lt;b&amp;gt;汽水音乐&amp;lt;/b&amp;gt;三平台搜索入口，点击可跳转对应平台试听&lt;br /&gt;
* 本页面持续更新中，欢迎补充遗漏曲目及场景信息&lt;br /&gt;
&lt;br /&gt;
[[Category:虾仁文学]]&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=MediaWiki:Common.js&amp;diff=123</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=MediaWiki:Common.js&amp;diff=123"/>
		<updated>2026-07-26T15:13:25Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​导航栏新增虾仁音乐入口&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* 虾仁维基 - 自定义侧边栏导航 */&lt;br /&gt;
/* 作者: 虾仁维基团队 */&lt;br /&gt;
/* 最后更新: 2026-07-26 */&lt;br /&gt;
&lt;br /&gt;
(function($, mw) {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
    var COLLAPSE_KEY = &#039;xiarenwiki-nav-v2&#039;;&lt;br /&gt;
    var WORKS = [&#039;我在大明那些年&#039;, &#039;彼岸轮回&#039;, &#039;一品布衣&#039;];&lt;br /&gt;
    var WORK_DIRECT = [&#039;宇宙层&#039;, &#039;人物&#039;, &#039;世界观&#039;, &#039;设定&#039;];&lt;br /&gt;
&lt;br /&gt;
    function init() {&lt;br /&gt;
        if (!mw.config.get(&#039;wgIsArticle&#039;) &amp;amp;&amp;amp; mw.config.get(&#039;wgCanonicalSpecialPageName&#039;)) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        waitForPanel(function($panel) {&lt;br /&gt;
            buildNav($panel);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function waitForPanel(cb) {&lt;br /&gt;
        var $panel = $(&#039;#mw-panel&#039;);&lt;br /&gt;
        if ($panel.length) return cb($panel);&lt;br /&gt;
        var tries = 0;&lt;br /&gt;
        var timer = setInterval(function() {&lt;br /&gt;
            $panel = $(&#039;#mw-panel&#039;);&lt;br /&gt;
            if ($panel.length || ++tries &amp;gt; 50) {&lt;br /&gt;
                clearInterval(timer);&lt;br /&gt;
                if ($panel.length) cb($panel);&lt;br /&gt;
            }&lt;br /&gt;
        }, 100);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ========== BUILD ========== */&lt;br /&gt;
&lt;br /&gt;
    function buildNav($panel) {&lt;br /&gt;
        var html = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
                // 搜索框&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-search&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;form action=&amp;quot;&#039; + mw.util.getUrl(&#039;Special:Search&#039;) + &#039;&amp;quot; method=&amp;quot;get&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;search&amp;quot; class=&amp;quot;xn-search-input&amp;quot; placeholder=&amp;quot;搜索虾仁维基...&amp;quot; /&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;/form&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += section(&#039;Wiki&#039;, [&lt;br /&gt;
            [&#039;首页&#039;, &#039;首页&#039;],&lt;br /&gt;
            [&#039;Wiki简介&#039;, &#039;Wiki简介&#039;],&lt;br /&gt;
            [&#039;管理员告示&#039;, &#039;管理员告示&#039;],&lt;br /&gt;
            [&#039;随机页面&#039;, &#039;Special:Random&#039;],&lt;br /&gt;
            [&#039;快速搜索&#039;, &#039;Special:Search&#039;],&lt;br /&gt;
            [&#039;相关平台&#039;, &#039;相关平台&#039;],&lt;br /&gt;
            [&#039;Wiki源站点&#039;, &#039;Wiki源站点&#039;]&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
        html += section(&#039;虾仁简介&#039;, [&lt;br /&gt;
            [&#039;虾仁？&#039;, &#039;虾仁？&#039;],&lt;br /&gt;
            [&#039;虾仁共创收录规则&#039;, &#039;虾仁共创收录规则&#039;],&lt;br /&gt;
            [&#039;虾仁宇宙结构介绍&#039;, &#039;虾仁宇宙结构介绍&#039;]&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-section&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;universe&amp;quot;&amp;gt;虾仁宇宙&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-universe&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;xn-loading&amp;quot;&amp;gt;加载中...&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-section&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;literature&amp;quot;&amp;gt;虾仁文学&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-literature&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += link(&#039;创始宣言&#039;, &#039;创始宣言&#039;);&lt;br /&gt;
        html += link(&#039;虾仁六章&#039;, &#039;虾仁六章&#039;);&lt;br /&gt;
        html += link(&#039;虾仁异志&#039;, &#039;虾仁异志&#039;);&lt;br /&gt;
        html += link(&#039;虾仁诗作&#039;, &#039;虾仁诗作&#039;);&lt;br /&gt;
        html += link(&#039;虾仁音乐&#039;, &#039;虾仁音乐&#039;);&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-subsection&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-subheader xn-expandable&amp;quot; data-sid=&amp;quot;papers&amp;quot;&amp;gt;虾仁论文 &#039; + plus(&#039;虾仁论文&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-subbody&amp;quot; id=&amp;quot;xn-papers&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += link(&#039;去中心化创作模式的研究&#039;, &#039;去中心化创作模式的研究&#039;);&lt;br /&gt;
        html += link(&#039;数字时代的孙悟空&#039;, &#039;数字时代的孙悟空&#039;);&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += section(&#039;虾仁历史&#039;, [&lt;br /&gt;
            [&#039;起源&#039;, &#039;虾仁历史/起源&#039;],&lt;br /&gt;
            [&#039;传播&#039;, &#039;虾仁历史/传播&#039;],&lt;br /&gt;
            [&#039;转折&#039;, &#039;虾仁历史/转折&#039;],&lt;br /&gt;
            [&#039;爆发&#039;, &#039;虾仁历史/爆发&#039;],&lt;br /&gt;
            [&#039;危机&#039;, &#039;虾仁历史/危机&#039;],&lt;br /&gt;
            [&#039;转型&#039;, &#039;虾仁历史/转型&#039;]&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-single&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&#039; + url(&#039;共创入口&#039;) + &#039;&amp;quot;&amp;gt;共创入口&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        $panel.html(html);&lt;br /&gt;
        restoreCollapse();&lt;br /&gt;
        bindEvents();&lt;br /&gt;
        highlightCurrent();&lt;br /&gt;
        loadUniverse();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ========== HTML HELPERS ========== */&lt;br /&gt;
&lt;br /&gt;
    function section(title, items) {&lt;br /&gt;
        var sid = title.replace(/[^a-z0-9\u4e00-\u9fff]/gi, &#039;&#039;).toLowerCase();&lt;br /&gt;
        var h = &#039;&amp;lt;div class=&amp;quot;xn-section&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        h += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + sid + &#039;&amp;quot;&amp;gt;&#039; + title + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        h += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-&#039; + sid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        for (var i = 0; i &amp;lt; items.length; i++) {&lt;br /&gt;
            h += link(items[i][0], items[i][1]);&lt;br /&gt;
        }&lt;br /&gt;
        h += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return h;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function link(label, page, cls) {&lt;br /&gt;
        return &#039;&amp;lt;div class=&amp;quot;xn-link&#039; + (cls ? &#039; &#039; + cls : &#039;&#039;) + &#039;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&#039; + url(page) + &#039;&amp;quot;&amp;gt;&#039; + label + &#039;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function url(page) { return mw.util.getUrl(page); }&lt;br /&gt;
&lt;br /&gt;
    function plus(page) {&lt;br /&gt;
        return &#039;&amp;lt;a class=&amp;quot;xn-plus&amp;quot; href=&amp;quot;&#039; + url(page) + &#039;?action=edit&amp;quot; title=&amp;quot;编辑/新增&amp;quot;&amp;gt;＋&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ========== UNIVERSE DYNAMIC LOAD ========== */&lt;br /&gt;
&lt;br /&gt;
    async function loadUniverse() {&lt;br /&gt;
        var $body = $(&#039;#xn-universe&#039;);&lt;br /&gt;
        if (!$body.length) return;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            var api = new mw.Api();&lt;br /&gt;
            var html = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; WORKS.length; i++) {&lt;br /&gt;
                var work = WORKS[i];&lt;br /&gt;
                var workSid = &#039;work&#039; + i;&lt;br /&gt;
&lt;br /&gt;
                var subpages = [];&lt;br /&gt;
                try {&lt;br /&gt;
                    var result = await api.get({&lt;br /&gt;
                        action: &#039;query&#039;,&lt;br /&gt;
                        list: &#039;allpages&#039;,&lt;br /&gt;
                        apprefix: work + &#039;/&#039;,&lt;br /&gt;
                        aplimit: 100&lt;br /&gt;
                    });&lt;br /&gt;
                    subpages = result.query.allpages || [];&lt;br /&gt;
                } catch(e) {&lt;br /&gt;
                    console.error(&#039;API error for &#039; + work, e);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-work&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + workSid + &#039;&amp;quot;&amp;gt;&#039; + work + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-&#039; + workSid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
                // Direct subpages under work&lt;br /&gt;
                var directSet = {};&lt;br /&gt;
                for (var j = 0; j &amp;lt; subpages.length; j++) {&lt;br /&gt;
                    var rel = subpages[j].title.substring(work.length + 1);&lt;br /&gt;
                    if (rel.indexOf(&#039;/&#039;) === -1) directSet[rel] = true;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                for (var k = 0; k &amp;lt; WORK_DIRECT.length; k++) {&lt;br /&gt;
                    var item = WORK_DIRECT[k];&lt;br /&gt;
                    var exists = directSet[item];&lt;br /&gt;
                    html += link(item, work + &#039;/&#039; + item, exists ? &#039;&#039; : &#039;xn-missing&#039;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // 剧情层&lt;br /&gt;
                var plotSegs = [];&lt;br /&gt;
                for (j = 0; j &amp;lt; subpages.length; j++) {&lt;br /&gt;
                    rel = subpages[j].title.substring(work.length + 1);&lt;br /&gt;
                    var parts = rel.split(&#039;/&#039;);&lt;br /&gt;
                    if (parts.length === 2 &amp;amp;&amp;amp; parts[0] === &#039;剧情层&#039;) {&lt;br /&gt;
                        plotSegs.push(parts[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                var plotSid = workSid + &#039;plot&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-subsection&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-subheader xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + plotSid + &#039;&amp;quot;&amp;gt;剧情层 &#039; + plus(work + &#039;/剧情层&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-subbody&amp;quot; id=&amp;quot;xn-&#039; + plotSid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
                for (k = 0; k &amp;lt; plotSegs.length; k++) {&lt;br /&gt;
                    var seg = plotSegs[k];&lt;br /&gt;
                    var segSid = workSid + &#039;seg&#039; + k;&lt;br /&gt;
                    var segPage = work + &#039;/剧情层/&#039; + seg;&lt;br /&gt;
&lt;br /&gt;
                    // Fetch 金集 for this segment&lt;br /&gt;
                    var jinji = [];&lt;br /&gt;
                    try {&lt;br /&gt;
                        var segResult = await api.get({&lt;br /&gt;
                            action: &#039;query&#039;,&lt;br /&gt;
                            list: &#039;allpages&#039;,&lt;br /&gt;
                            apprefix: segPage + &#039;/&#039;,&lt;br /&gt;
                            aplimit: 50&lt;br /&gt;
                        });&lt;br /&gt;
                        var segPages = segResult.query.allpages || [];&lt;br /&gt;
                        for (var m = 0; m &amp;lt; segPages.length; m++) {&lt;br /&gt;
                            jinji.push(segPages[m].title.substring(segPage.length + 1));&lt;br /&gt;
                        }&lt;br /&gt;
                    } catch(e2) {}&lt;br /&gt;
&lt;br /&gt;
                    html += &#039;&amp;lt;div class=&amp;quot;xn-subsubsection&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
                    html += &#039;&amp;lt;div class=&amp;quot;xn-subsubheader xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + segSid + &#039;&amp;quot;&amp;gt;&#039; + seg + &#039; &#039; + plus(segPage) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                    html += &#039;&amp;lt;div class=&amp;quot;xn-subsubbody&amp;quot; id=&amp;quot;xn-&#039; + segSid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
                    for (m = 0; m &amp;lt; jinji.length; m++) {&lt;br /&gt;
                        html += link(jinji[m], segPage + &#039;/&#039; + jinji[m]);&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;; // close 剧情层&lt;br /&gt;
                html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;; // close work&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // Add new work link&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;xn-link xn-add-work&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&#039; + url(&#039;Special:Search&#039;) + &#039;&amp;quot; title=&amp;quot;搜索已有作品&amp;quot;&amp;gt;＋ 发现更多作品&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
            $body.html(html);&lt;br /&gt;
            restoreCollapse();&lt;br /&gt;
            bindEvents();&lt;br /&gt;
            highlightCurrent();&lt;br /&gt;
&lt;br /&gt;
        } catch(e) {&lt;br /&gt;
            console.error(&#039;Failed to load universe nav&#039;, e);&lt;br /&gt;
            $body.html(&#039;&amp;lt;div class=&amp;quot;xn-link&amp;quot;&amp;gt;(加载失败，请刷新)&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ========== CURRENT PAGE HIGHLIGHT ========== */&lt;br /&gt;
    function highlightCurrent() {&lt;br /&gt;
        var currentTitle = mw.config.get(&#039;wgPageName&#039;);&lt;br /&gt;
        $(&#039;#mw-panel .xn-link a&#039;).each(function() {&lt;br /&gt;
            var href = $(this).attr(&#039;href&#039;);&lt;br /&gt;
            if (!href) return;&lt;br /&gt;
            var match = false;&lt;br /&gt;
            if (href.indexOf(&#039;title=&#039;) &amp;gt; 0) {&lt;br /&gt;
                var m = href.match(/title=([^&amp;amp;]+)/);&lt;br /&gt;
                if (m) match = decodeURIComponent(m[1]) === currentTitle;&lt;br /&gt;
            } else {&lt;br /&gt;
                var parts = href.split(&#039;/&#039;);&lt;br /&gt;
                var last = parts[parts.length - 1];&lt;br /&gt;
                match = decodeURIComponent(last) === currentTitle;&lt;br /&gt;
            }&lt;br /&gt;
            if (match) {&lt;br /&gt;
                $(this).addClass(&#039;xn-active&#039;);&lt;br /&gt;
                $(this).closest(&#039;.xn-link&#039;).addClass(&#039;xn-active-link&#039;);&lt;br /&gt;
                $(this).parents(&#039;.xn-body, .xn-subbody, .xn-subsubbody&#039;).each(function() {&lt;br /&gt;
                    $(this).show();&lt;br /&gt;
                    var sid = $(this).attr(&#039;id&#039;);&lt;br /&gt;
                    if (sid &amp;amp;&amp;amp; sid.indexOf(&#039;xn-&#039;) === 0) {&lt;br /&gt;
                        sid = sid.substring(3);&lt;br /&gt;
                        $(&#039;[data-sid=&amp;quot;&#039; + sid + &#039;&amp;quot;]&#039;).removeClass(&#039;xn-collapsed&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    /* ========== EVENTS &amp;amp; STATE ========== */&lt;br /&gt;
&lt;br /&gt;
    function bindEvents() {&lt;br /&gt;
        $(document).off(&#039;click.xn&#039;).on(&#039;click.xn&#039;, &#039;.xn-expandable&#039;, function(e) {&lt;br /&gt;
            if ($(e.target).closest(&#039;.xn-plus&#039;).length) return; // don&#039;t toggle when clicking [+]&lt;br /&gt;
            var sid = $(this).data(&#039;sid&#039;);&lt;br /&gt;
            var $body = $(&#039;#xn-&#039; + sid);&lt;br /&gt;
            if (!$body.length) $body = $(this).next(&#039;.xn-body,.xn-subbody,.xn-subsubbody&#039;);&lt;br /&gt;
            if (!$body.length) return;&lt;br /&gt;
&lt;br /&gt;
            $body.slideToggle(150);&lt;br /&gt;
            $(this).toggleClass(&#039;xn-collapsed&#039;, !$body.is(&#039;:visible&#039;));&lt;br /&gt;
&lt;br /&gt;
            var state = loadState();&lt;br /&gt;
            state[sid] = $body.is(&#039;:visible&#039;);&lt;br /&gt;
            saveState(state);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function restoreCollapse() {&lt;br /&gt;
        var state = loadState();&lt;br /&gt;
        var defaults = { &#039;universe&#039;: true };&lt;br /&gt;
        for (var key in defaults) {&lt;br /&gt;
            if (!(key in state)) state[key] = defaults[key];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        Object.keys(state).forEach(function(sid) {&lt;br /&gt;
            var $header = $(&#039;[data-sid=&amp;quot;&#039; + sid + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            var $body = $(&#039;#xn-&#039; + sid);&lt;br /&gt;
            if (!$body.length) $body = $header.next(&#039;.xn-body,.xn-subbody,.xn-subsubbody&#039;);&lt;br /&gt;
            if (!$body.length) return;&lt;br /&gt;
&lt;br /&gt;
            if (state[sid]) {&lt;br /&gt;
                $body.show();&lt;br /&gt;
                $header.removeClass(&#039;xn-collapsed&#039;);&lt;br /&gt;
            } else {&lt;br /&gt;
                $body.hide();&lt;br /&gt;
                $header.addClass(&#039;xn-collapsed&#039;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function loadState() {&lt;br /&gt;
        try { return JSON.parse(localStorage.getItem(COLLAPSE_KEY) || &#039;{}&#039;); }&lt;br /&gt;
        catch(e) { return {}; }&lt;br /&gt;
    }&lt;br /&gt;
    function saveState(s) {&lt;br /&gt;
        try { localStorage.setItem(COLLAPSE_KEY, JSON.stringify(s)); }&lt;br /&gt;
        catch(e) {}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ========== START ========== */&lt;br /&gt;
&lt;br /&gt;
    mw.loader.using(&#039;mediawiki.api&#039;).then(function() {&lt;br /&gt;
        $(init);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
})(jQuery, mediaWiki);&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E9%9F%B3%E4%B9%90&amp;diff=122</id>
		<title>虾仁音乐</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E9%9F%B3%E4%B9%90&amp;diff=122"/>
		<updated>2026-07-26T15:13:08Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​创建虾仁音乐页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;「虾仁音乐」收录虾仁系列沙雕动画中出现频率较高、在粉丝群体中形成强烈记忆点的背景音乐（BGM）。这些曲目大多并非虾仁原创，但因反复出现在动画名场面中，旋律一响便令粉丝联想到虾仁。&lt;br /&gt;
&lt;br /&gt;
本页面按曲风/场景分类整理，标注了粉丝俗称及经典出场场景。&lt;br /&gt;
&lt;br /&gt;
---- &lt;br /&gt;
&lt;br /&gt;
== 悲情·大气 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! 曲名 !! 原唱/作者 !! 虾仁俗称 !! 经典场景 !! 试听&lt;br /&gt;
|-&lt;br /&gt;
| 此去半生 || 吴昊 / 九寸 || 大明不妙曲、大明葬送曲 || 大明悲情时刻，老朱家亲人离世，王朝衰败 || [https://music.163.com/#/search/m/?s=此去半生+吴昊 ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| 英雄的黎明 || 横山菁儿 || — || 史诗感场景，大战前夕 || [https://music.163.com/#/search/m/?s=英雄的黎明 ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| 佛光初现（唢呐版） || — || — || 高燃战斗、角色觉醒 || [https://music.163.com/#/search/m/?s=佛光初现+唢呐 ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| 痴情冢（洞箫版） || — || — || 离别/牺牲场景 || [https://music.163.com/#/search/m/?s=痴情冢+洞箫 ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| Nijamena || — || — || 宿命感、宏大叙事 || [https://music.163.com/#/search/m/?s=Nijamena ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| 铸剑山庄 || — || — || 武侠/江湖氛围 || [https://music.163.com/#/search/m/?s=铸剑山庄 ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| 山河 || — || — || 家国情怀、壮烈场景 || [https://music.163.com/#/search/m/?s=山河 ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| 落花 || — || — || 凄美、伤感 || [https://music.163.com/#/search/m/?s=落花 ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| 我曾经爱过一个人 || — || — || 回忆/虐心 || [https://music.163.com/#/search/m/?s=我曾经爱过一个人 ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| children of the dark || — || — || 黑暗/高燃/战斗 || [https://music.163.com/#/search/m/?s=children+of+the+dark ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| 如履薄冰 || Void || — || 紧张、危机 || [https://music.163.com/#/search/m/?s=如履薄冰+Void ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| 笛子曲《锦绣未央》 || — || — || 古风、宫廷 || [https://music.163.com/#/search/m/?s=锦绣未央+笛子 ▶ 网易云]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 欢快·轻松 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! 曲名 !! 原唱/作者 !! 虾仁俗称 !! 经典场景 !! 试听&lt;br /&gt;
|-&lt;br /&gt;
| 欢沁 || 林海 || — || 轻松搞笑日常 || [https://music.163.com/#/search/m/?s=欢沁+林海 ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| 欢乐斗地主 || — || — || 搞笑名场面、耍宝 || [https://music.163.com/#/search/m/?s=欢乐斗地主 ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| 胡伟立 - 嬉戏 || 胡伟立 || — || 俏皮/逗趣 || [https://music.163.com/#/search/m/?s=嬉戏+胡伟立 ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| 小神仙 || — || — || 轻松逗乐、小人物逆袭 || [https://music.163.com/#/search/m/?s=小神仙 ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| 众月捧星-快乐主题音乐 || — || — || 欢乐大团圆 || [https://music.163.com/#/search/m/?s=众月捧星 ▶ 网易云]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 古风·悠扬 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! 曲名 !! 原唱/作者 !! 虾仁俗称 !! 经典场景 !! 试听&lt;br /&gt;
|-&lt;br /&gt;
| 难却 || — || — || 深情/不舍 || [https://music.163.com/#/search/m/?s=难却 ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| 枉游 || 陆深 || — || 游历、江湖感 || [https://music.163.com/#/search/m/?s=枉游+陆深 ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| 江上清风游 || — || — || 宁静/侠客独行 || [https://music.163.com/#/search/m/?s=江上清风游 ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| 公子 || 董冬冬 || — || 儒雅/文人 || [https://music.163.com/#/search/m/?s=公子+董冬冬 ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| 金陵遗梦 || — || — || 怀古、感伤 || [https://music.163.com/#/search/m/?s=金陵遗梦 ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| 思念的弦 || 贾晓龙 || — || 思念/离愁 || [https://music.163.com/#/search/m/?s=思念的弦+贾晓龙 ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| 画中的你 || — || — || 唯美/抒情 || [https://music.163.com/#/search/m/?s=画中的你 ▶ 网易云]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 燃向·动作 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! 曲名 !! 原唱/作者 !! 虾仁俗称 !! 经典场景 !! 试听&lt;br /&gt;
|-&lt;br /&gt;
| 《侠》第六乐章「初心」|| — || — || 侠义精神/高燃 || [https://music.163.com/#/search/m/?s=侠+第六乐章+初心 ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| 翼 古风变装舞 || — || — || 变身/升级 || [https://music.163.com/#/search/m/?s=翼+古风变装 ▶ 网易云]&lt;br /&gt;
|-&lt;br /&gt;
| 赐我 + 一笑江湖改编 || — || — || 爽文名场面 || [https://music.163.com/#/search/m/?s=赐我+一笑江湖 ▶ 网易云]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 说明 ==&lt;br /&gt;
&lt;br /&gt;
* 以上曲目均为虾仁动画中使用过的配乐，版权归原唱/原作者所有&lt;br /&gt;
* 「虾仁俗称」为粉丝群体自发命名的昵称，并非官方名称&lt;br /&gt;
* 本页面持续更新中，欢迎补充遗漏曲目及场景信息&lt;br /&gt;
&lt;br /&gt;
[[Category:虾仁文学]]&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=121</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=121"/>
		<updated>2026-07-26T14:53:19Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​重写首页，对齐6大导航分类&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;text-align:center; margin:10px 0 30px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;font-size:0.8em; color:#999; letter-spacing:0.2em;&amp;quot;&amp;gt;XIAREN WIKI&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;font-family:&#039;KaiTi&#039;,&#039;STKaiti&#039;,serif; border:none; margin-bottom:5px;&amp;quot;&amp;gt;虾仁维基&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;color:#888;&amp;quot;&amp;gt;为数字原生神话建立文献系统&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
欢迎来到虾仁维基。这里收录虾仁系列作品的文献档案，每部作品按照&#039;&#039;&#039;三级内容架构&#039;&#039;&#039;组织：&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;宇宙层&#039;&#039;&#039;（大纲·人物集·设定集）&lt;br /&gt;
:: &#039;&#039;&#039;剧情层&#039;&#039;&#039;（各大段剧情）&lt;br /&gt;
::: &#039;&#039;&#039;金集层&#039;&#039;&#039;（经典时刻·名场面）&lt;br /&gt;
&lt;br /&gt;
== 探索入口 ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%; border-spacing:12px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:33%; background:#f8f5f0; border:1px solid #e0d5c5; border-radius:12px; padding:18px; vertical-align:top;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:1.1em; font-weight:bold; color:#8a6d3b;&amp;quot;&amp;gt;[[Wiki简介|关于本Wiki]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;color:#777; font-size:0.85em; margin:6px 0 0;&amp;quot;&amp;gt;了解虾仁维基的缘起与共建规则&amp;lt;/p&amp;gt;&lt;br /&gt;
| style=&amp;quot;width:33%; background:#f5f8f0; border:1px solid #d5e0c5; border-radius:12px; padding:18px; vertical-align:top;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:1.1em; font-weight:bold; color:#5a8a3b;&amp;quot;&amp;gt;[[虾仁？|什么是虾仁]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;color:#777; font-size:0.85em; margin:6px 0 0;&amp;quot;&amp;gt;虾仁IP的核心理念与共创精神&amp;lt;/p&amp;gt;&lt;br /&gt;
| style=&amp;quot;width:33%; background:#f0f4f8; border:1px solid #c5d5e0; border-radius:12px; padding:18px; vertical-align:top;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:1.1em; font-weight:bold; color:#3b6a8a;&amp;quot;&amp;gt;[[作品总录]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;color:#777; font-size:0.85em; margin:6px 0 0;&amp;quot;&amp;gt;浏览所有作品，各有三级架构&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#faf5f0; border:1px solid #e0d0c0; border-radius:12px; padding:18px; vertical-align:top;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:1.1em; font-weight:bold; color:#b86a2b;&amp;quot;&amp;gt;[[虾仁文学]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;color:#777; font-size:0.85em; margin:6px 0 0;&amp;quot;&amp;gt;创始宣言 · 虾仁六章 · 异志 · 诗作 · 论文&amp;lt;/p&amp;gt;&lt;br /&gt;
| style=&amp;quot;background:#f5f0f8; border:1px solid #d5c5e0; border-radius:12px; padding:18px; vertical-align:top;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:1.1em; font-weight:bold; color:#6a3b8a;&amp;quot;&amp;gt;[[虾仁历史]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;color:#777; font-size:0.85em; margin:6px 0 0;&amp;quot;&amp;gt;起源 · 传播 · 转折 · 爆发 · 危机 · 转型&amp;lt;/p&amp;gt;&lt;br /&gt;
| style=&amp;quot;background:#fdf0f0; border:1px solid #e8c0c0; border-radius:12px; padding:18px; vertical-align:top;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:1.1em; font-weight:bold; color:#c42020;&amp;quot;&amp;gt;[[共创入口]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;color:#777; font-size:0.85em; margin:6px 0 0;&amp;quot;&amp;gt;提交你的编辑作品，参与文献共建&amp;lt;/p&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 奠基作品 ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%; border-spacing:12px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:33%; background:#f8fcf8; border:1px solid #c5dcc5; border-radius:12px; padding:20px; vertical-align:top;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:1.15em; font-weight:bold; color:#2a5a2a;&amp;quot;&amp;gt;[[我在大明那些年]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;color:#777; font-size:0.85em; margin:6px 0;&amp;quot;&amp;gt;历史穿越 · 长生见证大明十六帝&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;font-size:0.8em; margin:10px 0 0;&amp;quot;&amp;gt;&lt;br /&gt;
[[我在大明那些年/宇宙层|宇宙层]] ·&lt;br /&gt;
[[我在大明那些年/剧情层|剧情层]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
| style=&amp;quot;width:33%; background:#f8f4fc; border:1px solid #c5bcdc; border-radius:12px; padding:20px; vertical-align:top;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:1.15em; font-weight:bold; color:#4a2a7a;&amp;quot;&amp;gt;[[彼岸轮回]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;color:#777; font-size:0.85em; margin:6px 0;&amp;quot;&amp;gt;玄幻修仙 · 千世轮回逆天而行&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;font-size:0.8em; margin:10px 0 0;&amp;quot;&amp;gt;&lt;br /&gt;
[[彼岸轮回/宇宙层|宇宙层]] ·&lt;br /&gt;
[[彼岸轮回/剧情层|剧情层]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
| style=&amp;quot;width:33%; background:#f8faf4; border:1px solid #d8dcb8; border-radius:12px; padding:20px; vertical-align:top;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:1.15em; font-weight:bold; color:#6a6a1a;&amp;quot;&amp;gt;[[一品布衣]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;color:#777; font-size:0.85em; margin:6px 0;&amp;quot;&amp;gt;乱世逆袭 · 无系统草根登顶&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;font-size:0.8em; margin:10px 0 0;&amp;quot;&amp;gt;&lt;br /&gt;
[[一品布衣/宇宙层|宇宙层]] ·&lt;br /&gt;
[[一品布衣/剧情层|剧情层]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 虾仁文学一览 ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%; border-spacing:10px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:33%; background:#fef9f5; border:1px solid #e8d5c0; border-radius:10px; padding:14px; vertical-align:top;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:1em; font-weight:bold;&amp;quot;&amp;gt;[[创始宣言]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;color:#888; font-size:0.82em; margin:4px 0 0;&amp;quot;&amp;gt;虾仁IP的立身之本&amp;lt;/p&amp;gt;&lt;br /&gt;
| style=&amp;quot;width:33%; background:#fef5f5; border:1px solid #e8c0c0; border-radius:10px; padding:14px; vertical-align:top;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:1em; font-weight:bold; color:#c41e3a;&amp;quot;&amp;gt;[[虾仁六章]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;color:#888; font-size:0.82em; margin:4px 0 0;&amp;quot;&amp;gt;宪法级文本&amp;lt;/p&amp;gt;&lt;br /&gt;
| style=&amp;quot;width:33%; background:#f5f8f5; border:1px solid #c5d8c5; border-radius:10px; padding:14px; vertical-align:top;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:1em; font-weight:bold;&amp;quot;&amp;gt;[[虾仁异志]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;color:#888; font-size:0.82em; margin:4px 0 0;&amp;quot;&amp;gt;文言散记&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#f5f5fe; border:1px solid #c5c5e8; border-radius:10px; padding:14px; vertical-align:top;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:1em; font-weight:bold;&amp;quot;&amp;gt;[[虾仁诗作]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;color:#888; font-size:0.82em; margin:4px 0 0;&amp;quot;&amp;gt;诗词集锦&amp;lt;/p&amp;gt;&lt;br /&gt;
| style=&amp;quot;background:#f0f5f5; border:1px solid #bcd0d5; border-radius:10px; padding:14px; vertical-align:top;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:1em; font-weight:bold;&amp;quot;&amp;gt;[[去中心化创作模式的研究]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;color:#888; font-size:0.82em; margin:4px 0 0;&amp;quot;&amp;gt;虾仁论文&amp;lt;/p&amp;gt;&lt;br /&gt;
| style=&amp;quot;background:#f5f0f0; border:1px solid #d5c0bc; border-radius:10px; padding:14px; vertical-align:top;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:1em; font-weight:bold;&amp;quot;&amp;gt;[[数字时代的孙悟空]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;color:#888; font-size:0.82em; margin:4px 0 0;&amp;quot;&amp;gt;虾仁论文&amp;lt;/p&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 虾仁历史掠影 ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%; border-spacing:6px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:16%; background:#f0f8f0; border:1px solid #b8d8b8; border-radius:8px; padding:12px; text-align:center; font-size:0.85em;&amp;quot; | [[虾仁历史/起源|起源]]&lt;br /&gt;
| style=&amp;quot;width:16%; background:#eef8f0; border:1px solid #a8d0b0; border-radius:8px; padding:12px; text-align:center; font-size:0.85em;&amp;quot; | [[虾仁历史/传播|传播]]&lt;br /&gt;
| style=&amp;quot;width:16%; background:#e8f4ee; border:1px solid #98c8a8; border-radius:8px; padding:12px; text-align:center; font-size:0.85em;&amp;quot; | [[虾仁历史/转折|转折]]&lt;br /&gt;
| style=&amp;quot;width:16%; background:#fef0e0; border:1px solid #e8c888; border-radius:8px; padding:12px; text-align:center; font-size:0.85em;&amp;quot; | [[虾仁历史/爆发|爆发]]&lt;br /&gt;
| style=&amp;quot;width:16%; background:#fef0f0; border:1px solid #e8a0a0; border-radius:8px; padding:12px; text-align:center; font-size:0.85em;&amp;quot; | [[虾仁历史/危机|危机]]&lt;br /&gt;
| style=&amp;quot;width:16%; background:#f0f0fe; border:1px solid #b8b8e8; border-radius:8px; padding:12px; text-align:center; font-size:0.85em;&amp;quot; | [[虾仁历史/转型|转型]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 三级架构说明 ==&lt;br /&gt;
&lt;br /&gt;
每部虾仁作品都是一个独立宇宙，按照三级嵌套结构组织文献：&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;宇宙层&#039;&#039;&#039; — 介绍这部作品的大纲、人物集、设定集&lt;br /&gt;
** &#039;&#039;&#039;剧情层&#039;&#039;&#039; — 宇宙层之子集，记录各大段剧情&lt;br /&gt;
*** &#039;&#039;&#039;金集层&#039;&#039;&#039; — 剧情层之子集，定格经典时刻&lt;br /&gt;
&lt;br /&gt;
→ [[虾仁宇宙结构介绍|如何参与填充三级架构？]]&lt;br /&gt;
&lt;br /&gt;
== Wiki 工具箱 ==&lt;br /&gt;
&lt;br /&gt;
* [[管理员告示|管理员告示]] — 提交建议与反馈&lt;br /&gt;
* [[Wiki源站点|Wiki源站点]] — 虾仁相关的外部平台与链接&lt;br /&gt;
* [[相关平台|相关平台]] — 虾仁社区与创作平台&lt;br /&gt;
* [[Special:Random|随机页面]] — 发现未知的虾仁页面&lt;br /&gt;
&lt;br /&gt;
[[Category:虾仁维基]]&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2&amp;diff=120</id>
		<title>虾仁历史</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2&amp;diff=120"/>
		<updated>2026-07-26T14:29:57Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​create&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{作品导航|虾仁历史|}}&lt;br /&gt;
&lt;br /&gt;
虾仁宇宙的发展历史。&lt;br /&gt;
&lt;br /&gt;
== 历史阶段 ==&lt;br /&gt;
* [[虾仁历史/起源|起源]]&lt;br /&gt;
* [[虾仁历史/传播|传播]]&lt;br /&gt;
* [[虾仁历史/转折|转折]]&lt;br /&gt;
* [[虾仁历史/爆发|爆发]]&lt;br /&gt;
* [[虾仁历史/危机|危机]]&lt;br /&gt;
* [[虾仁历史/转型|转型]]&lt;br /&gt;
&lt;br /&gt;
{{虾仁历史导航}}&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%EF%BC%9F&amp;diff=119</id>
		<title>虾仁？</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%EF%BC%9F&amp;diff=119"/>
		<updated>2026-07-26T14:29:56Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​create&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;虾仁是一个共创文化IP。&lt;br /&gt;
&lt;br /&gt;
== 相关链接 ==&lt;br /&gt;
* [[虾仁共创收录规则]]&lt;br /&gt;
* [[虾仁宇宙结构介绍]]&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E6%95%B0%E5%AD%97%E6%97%B6%E4%BB%A3%E7%9A%84%E5%AD%99%E6%82%9F%E7%A9%BA&amp;diff=118</id>
		<title>数字时代的孙悟空</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E6%95%B0%E5%AD%97%E6%97%B6%E4%BB%A3%E7%9A%84%E5%AD%99%E6%82%9F%E7%A9%BA&amp;diff=118"/>
		<updated>2026-07-26T14:28:17Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​充实页面内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{作品导航|数字时代的孙悟空|}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;数字时代的孙悟空&#039;&#039;&#039;是虾仁论文系列之一。&lt;br /&gt;
&lt;br /&gt;
== 摘要 ==&lt;br /&gt;
本文将虾仁与孙悟空进行符号学比较，探讨数字原生IP与传统文化符号的共鸣与差异。&lt;br /&gt;
&lt;br /&gt;
== 正文 ==&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 参考 ==&lt;br /&gt;
* [[去中心化创作模式的研究]]&lt;br /&gt;
* [[虾仁六章]]&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E5%8E%BB%E4%B8%AD%E5%BF%83%E5%8C%96%E5%88%9B%E4%BD%9C%E6%A8%A1%E5%BC%8F%E7%9A%84%E7%A0%94%E7%A9%B6&amp;diff=117</id>
		<title>去中心化创作模式的研究</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E5%8E%BB%E4%B8%AD%E5%BF%83%E5%8C%96%E5%88%9B%E4%BD%9C%E6%A8%A1%E5%BC%8F%E7%9A%84%E7%A0%94%E7%A9%B6&amp;diff=117"/>
		<updated>2026-07-26T14:28:16Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​充实页面内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{作品导航|去中心化创作模式的研究|}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;去中心化创作模式的研究&#039;&#039;&#039;是虾仁论文系列之一。&lt;br /&gt;
&lt;br /&gt;
== 摘要 ==&lt;br /&gt;
本文探讨以虾仁为代表的新兴去中心化创作模式，分析其与传统创作模式的区别、优势与挑战。&lt;br /&gt;
&lt;br /&gt;
== 正文 ==&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 参考 ==&lt;br /&gt;
* [[数字时代的孙悟空]]&lt;br /&gt;
* [[虾仁宇宙结构介绍]]&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%BC%82%E5%BF%97&amp;diff=116</id>
		<title>虾仁异志</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%BC%82%E5%BF%97&amp;diff=116"/>
		<updated>2026-07-26T14:28:15Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​充实页面内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{作品导航|虾仁异志|}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;虾仁异志&#039;&#039;&#039;收录虾仁宇宙中以文言文、散文等文体创作的作品。&lt;br /&gt;
&lt;br /&gt;
== 异志列表 ==&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 创作规范 ==&lt;br /&gt;
* 文体不限（文言文、散文体、书信体等）&lt;br /&gt;
* 需与虾仁宇宙相关&lt;br /&gt;
* 原创内容受保护，他人不得修改&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E5%88%9B%E5%A7%8B%E5%AE%A3%E8%A8%80&amp;diff=115</id>
		<title>创始宣言</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E5%88%9B%E5%A7%8B%E5%AE%A3%E8%A8%80&amp;diff=115"/>
		<updated>2026-07-26T14:28:14Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​充实页面内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{作品导航|创始宣言|}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;虾仁维基创始宣言&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 缘起 ==&lt;br /&gt;
虾仁，一个自数字社区中诞生的文化符号，其生命力不在于单一创作者，而在于无数人的参与、续写与再创造。&lt;br /&gt;
&lt;br /&gt;
== 我们的信念 ==&lt;br /&gt;
* 虾仁属于所有创作者&lt;br /&gt;
* 文献应当开放、准确、可追溯&lt;br /&gt;
* 共创是虾仁文化的核心 DNA&lt;br /&gt;
&lt;br /&gt;
== 我们的目标 ==&lt;br /&gt;
建立一个永续的、社区驱动的数字文献系统，为虾仁宇宙提供文本肉身。&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=Wiki%E6%BA%90%E7%AB%99%E7%82%B9&amp;diff=114</id>
		<title>Wiki源站点</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=Wiki%E6%BA%90%E7%AB%99%E7%82%B9&amp;diff=114"/>
		<updated>2026-07-26T14:28:13Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​充实页面内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{作品导航|Wiki源站点|}}&lt;br /&gt;
&lt;br /&gt;
虾仁维基的&#039;&#039;&#039;数据来源与参考站点&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
== 内容来源 ==&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 参考资料 ==&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E7%9B%B8%E5%85%B3%E5%B9%B3%E5%8F%B0&amp;diff=113</id>
		<title>相关平台</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E7%9B%B8%E5%85%B3%E5%B9%B3%E5%8F%B0&amp;diff=113"/>
		<updated>2026-07-26T14:28:13Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​充实页面内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{作品导航|相关平台|}}&lt;br /&gt;
&lt;br /&gt;
虾仁IP相关的外部平台与社区。&lt;br /&gt;
&lt;br /&gt;
== 官方平台 ==&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 社区平台 ==&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 创作者平台 ==&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E7%AE%A1%E7%90%86%E5%91%98%E5%91%8A%E7%A4%BA&amp;diff=112</id>
		<title>管理员告示</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E7%AE%A1%E7%90%86%E5%91%98%E5%91%8A%E7%A4%BA&amp;diff=112"/>
		<updated>2026-07-26T14:28:12Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​充实页面内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{作品导航|管理员告示|}}&lt;br /&gt;
&lt;br /&gt;
这里是虾仁维基管理员的&#039;&#039;&#039;公告板&#039;&#039;&#039;，发布站点维护、规则更新等通知。&lt;br /&gt;
&lt;br /&gt;
== 最新公告 ==&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 联系方式 ==&lt;br /&gt;
如需联系管理员，请在任意页面使用&amp;quot;讨论&amp;quot;功能，或直接在相关页面留言。&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=MediaWiki:Common.css&amp;diff=111</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=MediaWiki:Common.css&amp;diff=111"/>
		<updated>2026-07-26T14:26:01Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​添加搜索框和当前页高亮样式&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* 虾仁维基 - 自定义侧边栏导航样式 */&lt;br /&gt;
/* 配合 Common.js 使用 */&lt;br /&gt;
&lt;br /&gt;
/* --- 隐藏原生侧边栏 --- */&lt;br /&gt;
#mw-panel .portal { display: none !important; }&lt;br /&gt;
&lt;br /&gt;
/* --- 自定义侧边栏容器 --- */&lt;br /&gt;
#mw-panel {&lt;br /&gt;
    padding: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* --- 搜索框 --- */&lt;br /&gt;
.xn-search {&lt;br /&gt;
    padding: 8px 10px;&lt;br /&gt;
    border-bottom: 1px solid #e0e0e0;&lt;br /&gt;
}&lt;br /&gt;
.xn-search-input {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    padding: 6px 8px;&lt;br /&gt;
    border: 1px solid #c8ccd1;&lt;br /&gt;
    border-radius: 3px;&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    outline: none;&lt;br /&gt;
    box-sizing: border-box;&lt;br /&gt;
    transition: border-color 0.15s;&lt;br /&gt;
}&lt;br /&gt;
.xn-search-input:focus {&lt;br /&gt;
    border-color: #36c;&lt;br /&gt;
    box-shadow: 0 0 0 1px #36c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* --- 当前页面高亮 --- */&lt;br /&gt;
.xn-link.xn-active-link {&lt;br /&gt;
    background: #eaf3ff;&lt;br /&gt;
}&lt;br /&gt;
.xn-link .xn-active {&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    color: #000 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* --- Section --- */&lt;br /&gt;
.xn-section {&lt;br /&gt;
    border-bottom: 1px solid #e0e0e0;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
.xn-section:last-child { border-bottom: none; }&lt;br /&gt;
&lt;br /&gt;
/* --- Header (Section title) --- */&lt;br /&gt;
.xn-header {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    padding: 8px 10px;&lt;br /&gt;
    font-size: 13px;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    color: #333;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    user-select: none;&lt;br /&gt;
    transition: background 0.15s;&lt;br /&gt;
    line-height: 1.4;&lt;br /&gt;
}&lt;br /&gt;
.xn-header:hover { background: #f5f5f5; }&lt;br /&gt;
&lt;br /&gt;
/* Chevron indicator */&lt;br /&gt;
.xn-expandable::before {&lt;br /&gt;
    content: &#039;&#039;;&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    width: 0;&lt;br /&gt;
    height: 0;&lt;br /&gt;
    border-left: 4px solid transparent;&lt;br /&gt;
    border-right: 4px solid transparent;&lt;br /&gt;
    border-top: 5px solid #888;&lt;br /&gt;
    margin-right: 6px;&lt;br /&gt;
    vertical-align: middle;&lt;br /&gt;
    transition: transform 0.15s;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    top: -1px;&lt;br /&gt;
}&lt;br /&gt;
.xn-expandable.xn-collapsed::before {&lt;br /&gt;
    transform: rotate(-90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* --- Body (collapsible content) --- */&lt;br /&gt;
.xn-body {&lt;br /&gt;
    padding: 0 0 4px 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* --- Links --- */&lt;br /&gt;
.xn-link {&lt;br /&gt;
    padding: 3px 10px 3px 20px;&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
}&lt;br /&gt;
.xn-link a {&lt;br /&gt;
    color: #0645ad;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    display: block;&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    text-overflow: ellipsis;&lt;br /&gt;
    padding: 1px 0;&lt;br /&gt;
}&lt;br /&gt;
.xn-link a:hover {&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
    color: #0645ad;&lt;br /&gt;
}&lt;br /&gt;
.xn-link a:visited {&lt;br /&gt;
    color: #0b0080;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Missing page indicator */&lt;br /&gt;
.xn-link.xn-missing a {&lt;br /&gt;
    color: #ba0000;&lt;br /&gt;
}&lt;br /&gt;
.xn-link.xn-missing a:hover {&lt;br /&gt;
    color: #ba0000;&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active page highlight */&lt;br /&gt;
.xn-link a[href*=&amp;quot;index.php&amp;quot;] {&lt;br /&gt;
    /* MediaWiki will handle active page styling */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* --- Sub-section (剧情层, 虾仁论文) --- */&lt;br /&gt;
.xn-subsection {&lt;br /&gt;
    padding-left: 8px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.xn-subheader {&lt;br /&gt;
    padding: 4px 8px 4px 12px;&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    font-weight: 500;&lt;br /&gt;
    color: #555;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    user-select: none;&lt;br /&gt;
    transition: background 0.15s;&lt;br /&gt;
    position: relative;&lt;br /&gt;
}&lt;br /&gt;
.xn-subheader:hover { background: #f0f0f0; }&lt;br /&gt;
&lt;br /&gt;
.xn-subheader.xn-expandable::before {&lt;br /&gt;
    content: &#039;&#039;;&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    width: 0;&lt;br /&gt;
    height: 0;&lt;br /&gt;
    border-left: 3px solid transparent;&lt;br /&gt;
    border-right: 3px solid transparent;&lt;br /&gt;
    border-top: 4px solid #999;&lt;br /&gt;
    margin-right: 4px;&lt;br /&gt;
    vertical-align: middle;&lt;br /&gt;
    transition: transform 0.15s;&lt;br /&gt;
}&lt;br /&gt;
.xn-subheader.xn-expandable.xn-collapsed::before {&lt;br /&gt;
    transform: rotate(-90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.xn-subbody {&lt;br /&gt;
    padding-left: 8px;&lt;br /&gt;
}&lt;br /&gt;
.xn-subbody .xn-link {&lt;br /&gt;
    padding-left: 28px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* --- Sub-sub-section (金集 within 剧情段) --- */&lt;br /&gt;
.xn-subsubsection {&lt;br /&gt;
    padding-left: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.xn-subsubheader {&lt;br /&gt;
    padding: 2px 6px 2px 16px;&lt;br /&gt;
    font-size: 11px;&lt;br /&gt;
    font-weight: 400;&lt;br /&gt;
    color: #666;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    user-select: none;&lt;br /&gt;
    transition: background 0.15s;&lt;br /&gt;
    position: relative;&lt;br /&gt;
}&lt;br /&gt;
.xn-subsubheader:hover { background: #eee; }&lt;br /&gt;
&lt;br /&gt;
.xn-subsubheader.xn-expandable::before {&lt;br /&gt;
    content: &#039;&#039;;&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    width: 0;&lt;br /&gt;
    height: 0;&lt;br /&gt;
    border-left: 3px solid transparent;&lt;br /&gt;
    border-right: 3px solid transparent;&lt;br /&gt;
    border-top: 4px solid #bbb;&lt;br /&gt;
    margin-right: 4px;&lt;br /&gt;
    vertical-align: middle;&lt;br /&gt;
    transition: transform 0.15s;&lt;br /&gt;
}&lt;br /&gt;
.xn-subsubheader.xn-expandable.xn-collapsed::before {&lt;br /&gt;
    transform: rotate(-90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.xn-subsubbody {&lt;br /&gt;
    padding-left: 10px;&lt;br /&gt;
}&lt;br /&gt;
.xn-subsubbody .xn-link {&lt;br /&gt;
    padding-left: 36px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* --- Single item (共创入口) --- */&lt;br /&gt;
.xn-single {&lt;br /&gt;
    padding: 8px 10px;&lt;br /&gt;
    border-bottom: 1px solid #e0e0e0;&lt;br /&gt;
}&lt;br /&gt;
.xn-single a {&lt;br /&gt;
    color: #333;&lt;br /&gt;
    font-size: 13px;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
.xn-single a:hover {&lt;br /&gt;
    color: #0645ad;&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* --- Plus button --- */&lt;br /&gt;
.xn-plus {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    width: 18px;&lt;br /&gt;
    height: 18px;&lt;br /&gt;
    line-height: 18px;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    color: #999;&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
    border-radius: 3px;&lt;br /&gt;
    margin-left: 2px;&lt;br /&gt;
    vertical-align: middle;&lt;br /&gt;
    transition: all 0.15s;&lt;br /&gt;
    float: right;&lt;br /&gt;
    margin-top: 1px;&lt;br /&gt;
}&lt;br /&gt;
.xn-plus:hover {&lt;br /&gt;
    color: #0645ad !important;&lt;br /&gt;
    background: #e8f0fe;&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* --- Work section --- */&lt;br /&gt;
.xn-work {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* --- Add work link --- */&lt;br /&gt;
.xn-add-work {&lt;br /&gt;
    padding: 6px 10px 6px 20px;&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    border-top: 1px dashed #e0e0e0;&lt;br /&gt;
    margin-top: 2px;&lt;br /&gt;
}&lt;br /&gt;
.xn-add-work a {&lt;br /&gt;
    color: #888;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
.xn-add-work a:hover {&lt;br /&gt;
    color: #0645ad;&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* --- Loading state --- */&lt;br /&gt;
.xn-loading {&lt;br /&gt;
    padding: 8px 10px 8px 20px;&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    color: #999;&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* --- Special pages: show minimal sidebar --- */&lt;br /&gt;
body.ns-special .xn-section,&lt;br /&gt;
body.ns-special .xn-work,&lt;br /&gt;
body.ns-special .xn-single {&lt;br /&gt;
    /* Keep sidebar visible on special pages for navigation */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* --- Responsive / narrow sidebar tweaks --- */&lt;br /&gt;
@media (max-width: 600px) {&lt;br /&gt;
    #mw-panel {&lt;br /&gt;
        width: 100% !important;&lt;br /&gt;
    }&lt;br /&gt;
    .xn-header {&lt;br /&gt;
        font-size: 14px;&lt;br /&gt;
        padding: 10px;&lt;br /&gt;
    }&lt;br /&gt;
    .xn-link {&lt;br /&gt;
        font-size: 13px;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* --- Transition for smooth toggle --- */&lt;br /&gt;
.xn-body, .xn-subbody, .xn-subsubbody {&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=MediaWiki:Common.js&amp;diff=110</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=MediaWiki:Common.js&amp;diff=110"/>
		<updated>2026-07-26T14:25:40Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​修复链接+搜索框+当前页高亮&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* 虾仁维基 - 自定义侧边栏导航 */&lt;br /&gt;
/* 作者: 虾仁维基团队 */&lt;br /&gt;
/* 最后更新: 2026-07-26 */&lt;br /&gt;
&lt;br /&gt;
(function($, mw) {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
    var COLLAPSE_KEY = &#039;xiarenwiki-nav-v2&#039;;&lt;br /&gt;
    var WORKS = [&#039;我在大明那些年&#039;, &#039;彼岸轮回&#039;, &#039;一品布衣&#039;];&lt;br /&gt;
    var WORK_DIRECT = [&#039;宇宙层&#039;, &#039;人物&#039;, &#039;世界观&#039;, &#039;设定&#039;];&lt;br /&gt;
&lt;br /&gt;
    function init() {&lt;br /&gt;
        if (!mw.config.get(&#039;wgIsArticle&#039;) &amp;amp;&amp;amp; mw.config.get(&#039;wgCanonicalSpecialPageName&#039;)) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        waitForPanel(function($panel) {&lt;br /&gt;
            buildNav($panel);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function waitForPanel(cb) {&lt;br /&gt;
        var $panel = $(&#039;#mw-panel&#039;);&lt;br /&gt;
        if ($panel.length) return cb($panel);&lt;br /&gt;
        var tries = 0;&lt;br /&gt;
        var timer = setInterval(function() {&lt;br /&gt;
            $panel = $(&#039;#mw-panel&#039;);&lt;br /&gt;
            if ($panel.length || ++tries &amp;gt; 50) {&lt;br /&gt;
                clearInterval(timer);&lt;br /&gt;
                if ($panel.length) cb($panel);&lt;br /&gt;
            }&lt;br /&gt;
        }, 100);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ========== BUILD ========== */&lt;br /&gt;
&lt;br /&gt;
    function buildNav($panel) {&lt;br /&gt;
        var html = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
                // 搜索框&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-search&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;form action=&amp;quot;&#039; + mw.util.getUrl(&#039;Special:Search&#039;) + &#039;&amp;quot; method=&amp;quot;get&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;search&amp;quot; class=&amp;quot;xn-search-input&amp;quot; placeholder=&amp;quot;搜索虾仁维基...&amp;quot; /&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;/form&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += section(&#039;Wiki&#039;, [&lt;br /&gt;
            [&#039;首页&#039;, &#039;首页&#039;],&lt;br /&gt;
            [&#039;Wiki简介&#039;, &#039;Wiki简介&#039;],&lt;br /&gt;
            [&#039;管理员告示&#039;, &#039;管理员告示&#039;],&lt;br /&gt;
            [&#039;随机页面&#039;, &#039;Special:Random&#039;],&lt;br /&gt;
            [&#039;快速搜索&#039;, &#039;Special:Search&#039;],&lt;br /&gt;
            [&#039;相关平台&#039;, &#039;相关平台&#039;],&lt;br /&gt;
            [&#039;Wiki源站点&#039;, &#039;Wiki源站点&#039;]&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
        html += section(&#039;虾仁简介&#039;, [&lt;br /&gt;
            [&#039;虾仁？&#039;, &#039;虾仁？&#039;],&lt;br /&gt;
            [&#039;虾仁共创收录规则&#039;, &#039;虾仁共创收录规则&#039;],&lt;br /&gt;
            [&#039;虾仁宇宙结构介绍&#039;, &#039;虾仁宇宙结构介绍&#039;]&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-section&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;universe&amp;quot;&amp;gt;虾仁宇宙&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-universe&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;xn-loading&amp;quot;&amp;gt;加载中...&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-section&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;literature&amp;quot;&amp;gt;虾仁文学&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-literature&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += link(&#039;创始宣言&#039;, &#039;创始宣言&#039;);&lt;br /&gt;
        html += link(&#039;虾仁六章&#039;, &#039;虾仁六章&#039;);&lt;br /&gt;
        html += link(&#039;虾仁异志&#039;, &#039;虾仁异志&#039;);&lt;br /&gt;
        html += link(&#039;虾仁诗作&#039;, &#039;虾仁诗作&#039;);&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-subsection&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-subheader xn-expandable&amp;quot; data-sid=&amp;quot;papers&amp;quot;&amp;gt;虾仁论文 &#039; + plus(&#039;虾仁论文&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-subbody&amp;quot; id=&amp;quot;xn-papers&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += link(&#039;去中心化创作模式的研究&#039;, &#039;去中心化创作模式的研究&#039;);&lt;br /&gt;
        html += link(&#039;数字时代的孙悟空&#039;, &#039;数字时代的孙悟空&#039;);&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        html += section(&#039;虾仁历史&#039;, [&lt;br /&gt;
            [&#039;起源&#039;, &#039;虾仁历史/起源&#039;],&lt;br /&gt;
            [&#039;传播&#039;, &#039;虾仁历史/传播&#039;],&lt;br /&gt;
            [&#039;转折&#039;, &#039;虾仁历史/转折&#039;],&lt;br /&gt;
            [&#039;爆发&#039;, &#039;虾仁历史/爆发&#039;],&lt;br /&gt;
            [&#039;危机&#039;, &#039;虾仁历史/危机&#039;],&lt;br /&gt;
            [&#039;转型&#039;, &#039;虾仁历史/转型&#039;]&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;div class=&amp;quot;xn-single&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&#039; + url(&#039;共创入口&#039;) + &#039;&amp;quot;&amp;gt;共创入口&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        $panel.html(html);&lt;br /&gt;
        restoreCollapse();&lt;br /&gt;
        bindEvents();&lt;br /&gt;
        highlightCurrent();&lt;br /&gt;
        loadUniverse();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ========== HTML HELPERS ========== */&lt;br /&gt;
&lt;br /&gt;
    function section(title, items) {&lt;br /&gt;
        var sid = title.replace(/[^a-z0-9\u4e00-\u9fff]/gi, &#039;&#039;).toLowerCase();&lt;br /&gt;
        var h = &#039;&amp;lt;div class=&amp;quot;xn-section&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        h += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + sid + &#039;&amp;quot;&amp;gt;&#039; + title + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        h += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-&#039; + sid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        for (var i = 0; i &amp;lt; items.length; i++) {&lt;br /&gt;
            h += link(items[i][0], items[i][1]);&lt;br /&gt;
        }&lt;br /&gt;
        h += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return h;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function link(label, page, cls) {&lt;br /&gt;
        return &#039;&amp;lt;div class=&amp;quot;xn-link&#039; + (cls ? &#039; &#039; + cls : &#039;&#039;) + &#039;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&#039; + url(page) + &#039;&amp;quot;&amp;gt;&#039; + label + &#039;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function url(page) { return mw.util.getUrl(page); }&lt;br /&gt;
&lt;br /&gt;
    function plus(page) {&lt;br /&gt;
        return &#039;&amp;lt;a class=&amp;quot;xn-plus&amp;quot; href=&amp;quot;&#039; + url(page) + &#039;?action=edit&amp;quot; title=&amp;quot;编辑/新增&amp;quot;&amp;gt;＋&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ========== UNIVERSE DYNAMIC LOAD ========== */&lt;br /&gt;
&lt;br /&gt;
    async function loadUniverse() {&lt;br /&gt;
        var $body = $(&#039;#xn-universe&#039;);&lt;br /&gt;
        if (!$body.length) return;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            var api = new mw.Api();&lt;br /&gt;
            var html = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; WORKS.length; i++) {&lt;br /&gt;
                var work = WORKS[i];&lt;br /&gt;
                var workSid = &#039;work&#039; + i;&lt;br /&gt;
&lt;br /&gt;
                var subpages = [];&lt;br /&gt;
                try {&lt;br /&gt;
                    var result = await api.get({&lt;br /&gt;
                        action: &#039;query&#039;,&lt;br /&gt;
                        list: &#039;allpages&#039;,&lt;br /&gt;
                        apprefix: work + &#039;/&#039;,&lt;br /&gt;
                        aplimit: 100&lt;br /&gt;
                    });&lt;br /&gt;
                    subpages = result.query.allpages || [];&lt;br /&gt;
                } catch(e) {&lt;br /&gt;
                    console.error(&#039;API error for &#039; + work, e);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-work&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-header xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + workSid + &#039;&amp;quot;&amp;gt;&#039; + work + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-body&amp;quot; id=&amp;quot;xn-&#039; + workSid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
                // Direct subpages under work&lt;br /&gt;
                var directSet = {};&lt;br /&gt;
                for (var j = 0; j &amp;lt; subpages.length; j++) {&lt;br /&gt;
                    var rel = subpages[j].title.substring(work.length + 1);&lt;br /&gt;
                    if (rel.indexOf(&#039;/&#039;) === -1) directSet[rel] = true;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                for (var k = 0; k &amp;lt; WORK_DIRECT.length; k++) {&lt;br /&gt;
                    var item = WORK_DIRECT[k];&lt;br /&gt;
                    var exists = directSet[item];&lt;br /&gt;
                    html += link(item, work + &#039;/&#039; + item, exists ? &#039;&#039; : &#039;xn-missing&#039;);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // 剧情层&lt;br /&gt;
                var plotSegs = [];&lt;br /&gt;
                for (j = 0; j &amp;lt; subpages.length; j++) {&lt;br /&gt;
                    rel = subpages[j].title.substring(work.length + 1);&lt;br /&gt;
                    var parts = rel.split(&#039;/&#039;);&lt;br /&gt;
                    if (parts.length === 2 &amp;amp;&amp;amp; parts[0] === &#039;剧情层&#039;) {&lt;br /&gt;
                        plotSegs.push(parts[1]);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                var plotSid = workSid + &#039;plot&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-subsection&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-subheader xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + plotSid + &#039;&amp;quot;&amp;gt;剧情层 &#039; + plus(work + &#039;/剧情层&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                html += &#039;&amp;lt;div class=&amp;quot;xn-subbody&amp;quot; id=&amp;quot;xn-&#039; + plotSid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
                for (k = 0; k &amp;lt; plotSegs.length; k++) {&lt;br /&gt;
                    var seg = plotSegs[k];&lt;br /&gt;
                    var segSid = workSid + &#039;seg&#039; + k;&lt;br /&gt;
                    var segPage = work + &#039;/剧情层/&#039; + seg;&lt;br /&gt;
&lt;br /&gt;
                    // Fetch 金集 for this segment&lt;br /&gt;
                    var jinji = [];&lt;br /&gt;
                    try {&lt;br /&gt;
                        var segResult = await api.get({&lt;br /&gt;
                            action: &#039;query&#039;,&lt;br /&gt;
                            list: &#039;allpages&#039;,&lt;br /&gt;
                            apprefix: segPage + &#039;/&#039;,&lt;br /&gt;
                            aplimit: 50&lt;br /&gt;
                        });&lt;br /&gt;
                        var segPages = segResult.query.allpages || [];&lt;br /&gt;
                        for (var m = 0; m &amp;lt; segPages.length; m++) {&lt;br /&gt;
                            jinji.push(segPages[m].title.substring(segPage.length + 1));&lt;br /&gt;
                        }&lt;br /&gt;
                    } catch(e2) {}&lt;br /&gt;
&lt;br /&gt;
                    html += &#039;&amp;lt;div class=&amp;quot;xn-subsubsection&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
                    html += &#039;&amp;lt;div class=&amp;quot;xn-subsubheader xn-expandable&amp;quot; data-sid=&amp;quot;&#039; + segSid + &#039;&amp;quot;&amp;gt;&#039; + seg + &#039; &#039; + plus(segPage) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                    html += &#039;&amp;lt;div class=&amp;quot;xn-subsubbody&amp;quot; id=&amp;quot;xn-&#039; + segSid + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
                    for (m = 0; m &amp;lt; jinji.length; m++) {&lt;br /&gt;
                        html += link(jinji[m], segPage + &#039;/&#039; + jinji[m]);&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;; // close 剧情层&lt;br /&gt;
                html += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;; // close work&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // Add new work link&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;xn-link xn-add-work&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&#039; + url(&#039;Special:Search&#039;) + &#039;&amp;quot; title=&amp;quot;搜索已有作品&amp;quot;&amp;gt;＋ 发现更多作品&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
            $body.html(html);&lt;br /&gt;
            restoreCollapse();&lt;br /&gt;
            bindEvents();&lt;br /&gt;
            highlightCurrent();&lt;br /&gt;
&lt;br /&gt;
        } catch(e) {&lt;br /&gt;
            console.error(&#039;Failed to load universe nav&#039;, e);&lt;br /&gt;
            $body.html(&#039;&amp;lt;div class=&amp;quot;xn-link&amp;quot;&amp;gt;(加载失败，请刷新)&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ========== CURRENT PAGE HIGHLIGHT ========== */&lt;br /&gt;
    function highlightCurrent() {&lt;br /&gt;
        var currentTitle = mw.config.get(&#039;wgPageName&#039;);&lt;br /&gt;
        $(&#039;#mw-panel .xn-link a&#039;).each(function() {&lt;br /&gt;
            var href = $(this).attr(&#039;href&#039;);&lt;br /&gt;
            if (!href) return;&lt;br /&gt;
            var match = false;&lt;br /&gt;
            if (href.indexOf(&#039;title=&#039;) &amp;gt; 0) {&lt;br /&gt;
                var m = href.match(/title=([^&amp;amp;]+)/);&lt;br /&gt;
                if (m) match = decodeURIComponent(m[1]) === currentTitle;&lt;br /&gt;
            } else {&lt;br /&gt;
                var parts = href.split(&#039;/&#039;);&lt;br /&gt;
                var last = parts[parts.length - 1];&lt;br /&gt;
                match = decodeURIComponent(last) === currentTitle;&lt;br /&gt;
            }&lt;br /&gt;
            if (match) {&lt;br /&gt;
                $(this).addClass(&#039;xn-active&#039;);&lt;br /&gt;
                $(this).closest(&#039;.xn-link&#039;).addClass(&#039;xn-active-link&#039;);&lt;br /&gt;
                $(this).parents(&#039;.xn-body, .xn-subbody, .xn-subsubbody&#039;).each(function() {&lt;br /&gt;
                    $(this).show();&lt;br /&gt;
                    var sid = $(this).attr(&#039;id&#039;);&lt;br /&gt;
                    if (sid &amp;amp;&amp;amp; sid.indexOf(&#039;xn-&#039;) === 0) {&lt;br /&gt;
                        sid = sid.substring(3);&lt;br /&gt;
                        $(&#039;[data-sid=&amp;quot;&#039; + sid + &#039;&amp;quot;]&#039;).removeClass(&#039;xn-collapsed&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    /* ========== EVENTS &amp;amp; STATE ========== */&lt;br /&gt;
&lt;br /&gt;
    function bindEvents() {&lt;br /&gt;
        $(document).off(&#039;click.xn&#039;).on(&#039;click.xn&#039;, &#039;.xn-expandable&#039;, function(e) {&lt;br /&gt;
            if ($(e.target).closest(&#039;.xn-plus&#039;).length) return; // don&#039;t toggle when clicking [+]&lt;br /&gt;
            var sid = $(this).data(&#039;sid&#039;);&lt;br /&gt;
            var $body = $(&#039;#xn-&#039; + sid);&lt;br /&gt;
            if (!$body.length) $body = $(this).next(&#039;.xn-body,.xn-subbody,.xn-subsubbody&#039;);&lt;br /&gt;
            if (!$body.length) return;&lt;br /&gt;
&lt;br /&gt;
            $body.slideToggle(150);&lt;br /&gt;
            $(this).toggleClass(&#039;xn-collapsed&#039;, !$body.is(&#039;:visible&#039;));&lt;br /&gt;
&lt;br /&gt;
            var state = loadState();&lt;br /&gt;
            state[sid] = $body.is(&#039;:visible&#039;);&lt;br /&gt;
            saveState(state);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function restoreCollapse() {&lt;br /&gt;
        var state = loadState();&lt;br /&gt;
        var defaults = { &#039;universe&#039;: true };&lt;br /&gt;
        for (var key in defaults) {&lt;br /&gt;
            if (!(key in state)) state[key] = defaults[key];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        Object.keys(state).forEach(function(sid) {&lt;br /&gt;
            var $header = $(&#039;[data-sid=&amp;quot;&#039; + sid + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            var $body = $(&#039;#xn-&#039; + sid);&lt;br /&gt;
            if (!$body.length) $body = $header.next(&#039;.xn-body,.xn-subbody,.xn-subsubbody&#039;);&lt;br /&gt;
            if (!$body.length) return;&lt;br /&gt;
&lt;br /&gt;
            if (state[sid]) {&lt;br /&gt;
                $body.show();&lt;br /&gt;
                $header.removeClass(&#039;xn-collapsed&#039;);&lt;br /&gt;
            } else {&lt;br /&gt;
                $body.hide();&lt;br /&gt;
                $header.addClass(&#039;xn-collapsed&#039;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function loadState() {&lt;br /&gt;
        try { return JSON.parse(localStorage.getItem(COLLAPSE_KEY) || &#039;{}&#039;); }&lt;br /&gt;
        catch(e) { return {}; }&lt;br /&gt;
    }&lt;br /&gt;
    function saveState(s) {&lt;br /&gt;
        try { localStorage.setItem(COLLAPSE_KEY, JSON.stringify(s)); }&lt;br /&gt;
        catch(e) {}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ========== START ========== */&lt;br /&gt;
&lt;br /&gt;
    mw.loader.using(&#039;mediawiki.api&#039;).then(function() {&lt;br /&gt;
        $(init);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
})(jQuery, mediaWiki);&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=MediaWiki:Sidebar&amp;diff=109</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=MediaWiki:Sidebar&amp;diff=109"/>
		<updated>2026-07-26T14:10:57Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​精简侧边栏为兜底版本&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* 虾仁维基&lt;br /&gt;
** mainpage|首页&lt;br /&gt;
** 作品总录|作品总录&lt;br /&gt;
** 共创入口|共创入口&lt;br /&gt;
* 导航&lt;br /&gt;
** Special:AllPages|所有页面&lt;br /&gt;
** Special:RecentChanges|最近更改&lt;br /&gt;
** Special:Random|随机页面&lt;br /&gt;
** Special:Search|搜索&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E6%A8%A1%E6%9D%BF:%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2%E5%AF%BC%E8%88%AA&amp;diff=108</id>
		<title>模板:虾仁历史导航</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E6%A8%A1%E6%9D%BF:%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2%E5%AF%BC%E8%88%AA&amp;diff=108"/>
		<updated>2026-07-26T14:10:40Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​创建虾仁历史导航模板&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border:1px solid #ccc;background:#f9f9f9;padding:10px;margin:10px 0;font-size:13px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;虾仁历史导航&#039;&#039;&#039; | &lt;br /&gt;
[[虾仁历史/起源|起源]] &amp;amp;rarr; &lt;br /&gt;
[[虾仁历史/传播|传播]] &amp;amp;rarr; &lt;br /&gt;
[[虾仁历史/转折|转折]] &amp;amp;rarr; &lt;br /&gt;
[[虾仁历史/爆发|爆发]] &amp;amp;rarr; &lt;br /&gt;
[[虾仁历史/危机|危机]] &amp;amp;rarr; &lt;br /&gt;
[[虾仁历史/转型|转型]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:导航模板]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E8%BD%AC%E5%9E%8B&amp;diff=107</id>
		<title>虾仁历史/转型</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E8%BD%AC%E5%9E%8B&amp;diff=107"/>
		<updated>2026-07-26T14:10:39Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​创建虾仁历史-转型页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;转型&#039;&#039;&#039;是虾仁文化��展历程中的重要阶段。&lt;br /&gt;
&lt;br /&gt;
== 概述 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 关键事件 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 影响与意义 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
{{虾仁历史导航}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E5%8D%B1%E6%9C%BA&amp;diff=106</id>
		<title>虾仁历史/危机</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E5%8D%B1%E6%9C%BA&amp;diff=106"/>
		<updated>2026-07-26T14:10:39Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​创建虾仁历史-危机页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;危机&#039;&#039;&#039;是虾仁文化��展历程中的重要阶段。&lt;br /&gt;
&lt;br /&gt;
== 概述 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 关键事件 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 影响与意义 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
{{虾仁历史导航}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E7%88%86%E5%8F%91&amp;diff=105</id>
		<title>虾仁历史/爆发</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E7%88%86%E5%8F%91&amp;diff=105"/>
		<updated>2026-07-26T14:10:38Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​创建虾仁历史-爆发页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;爆发&#039;&#039;&#039;是虾仁文化��展历程中的重要阶段。&lt;br /&gt;
&lt;br /&gt;
== 概述 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 关键事件 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 影响与意义 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
{{虾仁历史导航}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E8%BD%AC%E6%8A%98&amp;diff=104</id>
		<title>虾仁历史/转折</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E8%BD%AC%E6%8A%98&amp;diff=104"/>
		<updated>2026-07-26T14:10:37Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​创建虾仁历史-转折页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;转折&#039;&#039;&#039;是虾仁文化��展历程中的重要阶段。&lt;br /&gt;
&lt;br /&gt;
== 概述 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 关键事件 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 影响与意义 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
{{虾仁历史导航}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E4%BC%A0%E6%92%AD&amp;diff=103</id>
		<title>虾仁历史/传播</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E4%BC%A0%E6%92%AD&amp;diff=103"/>
		<updated>2026-07-26T14:10:37Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​创建虾仁历史-传播页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;传播&#039;&#039;&#039;是虾仁文化��展历程中的重要阶段。&lt;br /&gt;
&lt;br /&gt;
== 概述 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 关键事件 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 影响与意义 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
{{虾仁历史导航}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E8%B5%B7%E6%BA%90&amp;diff=102</id>
		<title>虾仁历史/起源</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%8E%86%E5%8F%B2/%E8%B5%B7%E6%BA%90&amp;diff=102"/>
		<updated>2026-07-26T14:10:36Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​创建虾仁历史-起源页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;起源&#039;&#039;&#039;是虾仁文化��展历程中的重要阶段。&lt;br /&gt;
&lt;br /&gt;
== 概述 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 关键事件 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 影响与意义 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
{{虾仁历史导航}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E5%85%B1%E5%88%9B%E5%85%A5%E5%8F%A3&amp;diff=101</id>
		<title>共创入口</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E5%85%B1%E5%88%9B%E5%85%A5%E5%8F%A3&amp;diff=101"/>
		<updated>2026-07-26T14:10:35Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​创建共创入口页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;欢迎来到虾仁维基的共创中心！无论你是资深创作者还是初次接触虾仁文化的新朋友，这里都是你开始贡献的起点。&lt;br /&gt;
&lt;br /&gt;
== 快速开始 ==&lt;br /&gt;
&lt;br /&gt;
# 阅读 [[虾仁共创收录规则]]，了解收录标准&lt;br /&gt;
# 浏览 [[虾仁宇宙结构介绍]]，理解三级架构&lt;br /&gt;
# 选择想要贡献的作品或领域&lt;br /&gt;
# 开始创作！&lt;br /&gt;
&lt;br /&gt;
== 需要帮助？ ==&lt;br /&gt;
&lt;br /&gt;
* 不确定从哪开始？试试补充各作品[[作品总录|宇宙层]]的基础设定&lt;br /&gt;
* 熟悉某部作品的剧情？帮助完善[[作品总录|剧情层]]和金集&lt;br /&gt;
* 有学术见解？提交你的虾仁论文&lt;br /&gt;
&lt;br /&gt;
== 当前需要的贡献 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 贡献者荣誉 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E6%95%B0%E5%AD%97%E6%97%B6%E4%BB%A3%E7%9A%84%E5%AD%99%E6%82%9F%E7%A9%BA&amp;diff=100</id>
		<title>数字时代的孙悟空</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E6%95%B0%E5%AD%97%E6%97%B6%E4%BB%A3%E7%9A%84%E5%AD%99%E6%82%9F%E7%A9%BA&amp;diff=100"/>
		<updated>2026-07-26T14:10:35Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​创建论文页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 摘要 ==&lt;br /&gt;
&lt;br /&gt;
本文从数字时代视角重新审视孙悟空这一经典文学形象，探讨其在当代文化语境中的意义嬗变与再创造。&lt;br /&gt;
&lt;br /&gt;
== 正文 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 结论 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E5%8E%BB%E4%B8%AD%E5%BF%83%E5%8C%96%E5%88%9B%E4%BD%9C%E6%A8%A1%E5%BC%8F%E7%9A%84%E7%A0%94%E7%A9%B6&amp;diff=99</id>
		<title>去中心化创作模式的研究</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E5%8E%BB%E4%B8%AD%E5%BF%83%E5%8C%96%E5%88%9B%E4%BD%9C%E6%A8%A1%E5%BC%8F%E7%9A%84%E7%A0%94%E7%A9%B6&amp;diff=99"/>
		<updated>2026-07-26T14:10:34Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​创建论文页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 摘要 ==&lt;br /&gt;
&lt;br /&gt;
本文探讨数字化时代去中心化创作模式的理论基础与实践路径，以虾仁文化共创社区为案例进行分析。&lt;br /&gt;
&lt;br /&gt;
== 正文 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 结论 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E8%AF%97%E4%BD%9C&amp;diff=98</id>
		<title>虾仁诗作</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E8%AF%97%E4%BD%9C&amp;diff=98"/>
		<updated>2026-07-26T14:10:33Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​创建虾仁诗作页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;虾仁诗作是虾仁宇宙中以诗歌形式呈现的文学创作。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;background:#fff3cd;border:1px solid #ffc107;padding:10px 15px;border-radius:4px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;保护声明&#039;&#039;&#039;：本页面收录的诗文作品为原作者原创内容，任何人不得擅自修改原文。如需补充注解或评论，请在「注释」或「赏析」区域进行。&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 诗作列表 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 注释与赏析 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%BC%82%E5%BF%97&amp;diff=97</id>
		<title>虾仁异志</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%BC%82%E5%BF%97&amp;diff=97"/>
		<updated>2026-07-26T14:10:33Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​创建虾仁异志页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;虾仁异志收录虾仁宇宙中的各类文学体裁作品，包括文言文等形式的创作。&lt;br /&gt;
&lt;br /&gt;
== 收录范围 ==&lt;br /&gt;
&lt;br /&gt;
本类别涵盖除诗歌、论文外的其他文学形式：&lt;br /&gt;
* 文言体&lt;br /&gt;
* 赋体&lt;br /&gt;
* 传体&lt;br /&gt;
* 记体&lt;br /&gt;
* 笔记体&lt;br /&gt;
&lt;br /&gt;
== 作品列表 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E5%88%9B%E5%A7%8B%E5%AE%A3%E8%A8%80&amp;diff=96</id>
		<title>创始宣言</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E5%88%9B%E5%A7%8B%E5%AE%A3%E8%A8%80&amp;diff=96"/>
		<updated>2026-07-26T14:10:32Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​创建创始宣言页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{待填充}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;（此处将收录虾仁文化的创始宣言原文）&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%AE%87%E5%AE%99%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D&amp;diff=95</id>
		<title>虾仁宇宙结构介绍</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%AE%87%E5%AE%99%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D&amp;diff=95"/>
		<updated>2026-07-26T14:10:32Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​创建宇宙结构介绍页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;虾仁宇宙采用三级内容架构，每一部作品内部都包含完整的宇宙层→剧情层→金集结构。&lt;br /&gt;
&lt;br /&gt;
== 三级架构 ==&lt;br /&gt;
&lt;br /&gt;
=== 宇宙层 ===&lt;br /&gt;
作品的顶层框架，包含：&lt;br /&gt;
* &#039;&#039;&#039;大纲&#039;&#039;&#039;：作品的整体故事脉络&lt;br /&gt;
* &#039;&#039;&#039;人物集&#039;&#039;&#039;：登场人物的详细介绍&lt;br /&gt;
* &#039;&#039;&#039;设定集&#039;&#039;&#039;：世界观、地理、势力、力量体系等基础设定&lt;br /&gt;
&lt;br /&gt;
=== 剧情层 ===&lt;br /&gt;
作品各大段剧情的展开，是宇宙层的子集。每个剧情段对应作品中的一个重要篇章。&lt;br /&gt;
&lt;br /&gt;
=== 金集 ===&lt;br /&gt;
剧情段下的经典详细时刻。不是简单的金句摘录，而是完整记录重要场景、关键转折和经典时刻。&lt;br /&gt;
&lt;br /&gt;
== 示例 ==&lt;br /&gt;
&lt;br /&gt;
以「[[我在大明那些年]]」为例：&lt;br /&gt;
* [[我在大明那些年/宇宙层|宇宙层]] → 大明时期的整体设定、人物群像&lt;br /&gt;
* [[我在大明那些年/剧情层|剧情层]] → 各阶段剧情的展开&lt;br /&gt;
* [[我在大明那些年/剧情层/洪武风云|洪武风云]] → 该剧情段下的金集&lt;br /&gt;
&lt;br /&gt;
== 三合一模式 ==&lt;br /&gt;
&lt;br /&gt;
从宇宙到剧情再到金集，三点合一的梳理模式，确保每一部作品都能被完整、系统地收录和呈现。&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%85%B1%E5%88%9B%E6%94%B6%E5%BD%95%E8%A7%84%E5%88%99&amp;diff=94</id>
		<title>虾仁共创收录规则</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81%E5%85%B1%E5%88%9B%E6%94%B6%E5%BD%95%E8%A7%84%E5%88%99&amp;diff=94"/>
		<updated>2026-07-26T14:10:31Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​创建收录规则页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;本页面规定了虾仁维基的内容收录标准和编辑规范。参与共创前请务必阅读。&lt;br /&gt;
&lt;br /&gt;
== 收录标准 ==&lt;br /&gt;
&lt;br /&gt;
=== 作品收录 ===&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
=== 设定收录 ===&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
=== 金集收录 ===&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 编辑规范 ==&lt;br /&gt;
&lt;br /&gt;
=== 命名规则 ===&lt;br /&gt;
* 作品页面：直接使用作品名称&lt;br /&gt;
* 宇宙层：&amp;lt;code&amp;gt;作品名/宇宙层&amp;lt;/code&amp;gt;&lt;br /&gt;
* 剧情层：&amp;lt;code&amp;gt;作品名/剧情层&amp;lt;/code&amp;gt;&lt;br /&gt;
* 剧情段：&amp;lt;code&amp;gt;作品名/剧情层/段名&amp;lt;/code&amp;gt;&lt;br /&gt;
* 金集：&amp;lt;code&amp;gt;作品名/剧情层/段名/金集名&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 内容规范 ===&lt;br /&gt;
* 保持客观描述，避免主观评价&lt;br /&gt;
* 引用原文需注明出处&lt;br /&gt;
* 尊重原作者版权，二次创作需获授权&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81&amp;diff=93</id>
		<title>虾仁</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E8%99%BE%E4%BB%81&amp;diff=93"/>
		<updated>2026-07-26T14:10:30Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​创建虾仁介绍页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;「虾仁」是一个融合了古典美学与现代叙事的共创文化IP。&lt;br /&gt;
&lt;br /&gt;
== 虾仁是什么？ ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 核心精神 ==&lt;br /&gt;
&lt;br /&gt;
虾仁文化强调&#039;&#039;&#039;共创&#039;&#039;&#039;、&#039;&#039;&#039;共享&#039;&#039;&#039;、&#039;&#039;&#039;共生&#039;&#039;&#039;。每一位创作者都可以在虾仁宇宙中书写属于自己的篇章，同时遵循宇宙的基础设定框架。&lt;br /&gt;
&lt;br /&gt;
== 入门指南 ==&lt;br /&gt;
&lt;br /&gt;
* [[虾仁宇宙结构介绍]] — 了解虾仁宇宙的层级架构&lt;br /&gt;
* [[虾仁共创收录规则]] — 了解如何参与共创&lt;br /&gt;
* [[作品总录]] — 浏览全部作品&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=Wiki%E6%BA%90%E7%AB%99%E7%82%B9&amp;diff=92</id>
		<title>Wiki源站点</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=Wiki%E6%BA%90%E7%AB%99%E7%82%B9&amp;diff=92"/>
		<updated>2026-07-26T14:10:30Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​创建Wiki源站点页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;本页面列出虾仁维基所引用的主要源站点和参考资料。&lt;br /&gt;
&lt;br /&gt;
== 一级源站点 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 参考资料 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
	<entry>
		<id>https://xiarenwiki.com/index.php?title=%E7%9B%B8%E5%85%B3%E5%B9%B3%E5%8F%B0&amp;diff=91</id>
		<title>相关平台</title>
		<link rel="alternate" type="text/html" href="https://xiarenwiki.com/index.php?title=%E7%9B%B8%E5%85%B3%E5%B9%B3%E5%8F%B0&amp;diff=91"/>
		<updated>2026-07-26T14:10:29Z</updated>

		<summary type="html">&lt;p&gt;虾仁：​创建相关平台页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;虾仁文化在多个平台均有布局，以下是各平台的入口汇总。&lt;br /&gt;
&lt;br /&gt;
== 官方平台 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 创作者平台 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;br /&gt;
&lt;br /&gt;
== 社交平台 ==&lt;br /&gt;
&lt;br /&gt;
{{待填充}}&lt;/div&gt;</summary>
		<author><name>虾仁</name></author>
	</entry>
</feed>