<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://ron.saltedkiss.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ACardData.js</id>
	<title>MediaWiki:CardData.js - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://ron.saltedkiss.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ACardData.js"/>
	<link rel="alternate" type="text/html" href="https://ron.saltedkiss.org/index.php?title=MediaWiki:CardData.js&amp;action=history"/>
	<updated>2026-04-17T17:25:40Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://ron.saltedkiss.org/index.php?title=MediaWiki:CardData.js&amp;diff=316&amp;oldid=prev</id>
		<title>Rin：​更新：完整的卡片数据获取与渲染逻辑 (via update-page on MediaWiki MCP Server)</title>
		<link rel="alternate" type="text/html" href="https://ron.saltedkiss.org/index.php?title=MediaWiki:CardData.js&amp;diff=316&amp;oldid=prev"/>
		<updated>2026-03-10T15:11:03Z</updated>

		<summary type="html">&lt;p&gt;更新：完整的卡片数据获取与渲染逻辑 (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh-Hans-CN&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2026年3月10日 (二) 23:11的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l84&quot;&gt;第84行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第84行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         html += &amp;#039;&amp;lt;div class=&amp;quot;ron-skill-desc&amp;quot;&amp;gt;&amp;#039; + safe( skill.description ) + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         html += &amp;#039;&amp;lt;div class=&amp;quot;ron-skill-desc&amp;quot;&amp;gt;&amp;#039; + safe( skill.description ) + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         // &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;升级数值&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         // &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;升级数值表格&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         if ( skill.levels &amp;amp;&amp;amp; skill.levels.length &amp;gt; 0 ) {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         if ( skill.levels &amp;amp;&amp;amp; skill.levels.length &amp;gt; 0 ) {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             skill.levels.forEach( function ( lv ) {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             skill.levels.forEach( function ( lv ) {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l196&quot;&gt;第196行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第196行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     // ==============================&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     // ==============================&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     // &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;入口：页面加载完成后执行&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     // &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;入口：页面内容加载完成后执行&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     // ==============================&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     // ==============================&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Rin</name></author>
	</entry>
	<entry>
		<id>https://ron.saltedkiss.org/index.php?title=MediaWiki:CardData.js&amp;diff=314&amp;oldid=prev</id>
		<title>Rin：​新建：卡片数据 JS，从 Directus API 获取数据并渲染到 .ron-card 骨架 (via create-page on MediaWiki MCP Server)</title>
		<link rel="alternate" type="text/html" href="https://ron.saltedkiss.org/index.php?title=MediaWiki:CardData.js&amp;diff=314&amp;oldid=prev"/>
		<updated>2026-03-10T15:09:01Z</updated>

		<summary type="html">&lt;p&gt;新建：卡片数据 JS，从 Directus API 获取数据并渲染到 .ron-card 骨架 (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/**&lt;br /&gt;
 * CardData.js&lt;br /&gt;
 * 找到页面上所有 .ron-card[data-cardname] 元素&lt;br /&gt;
 * 从 Directus API 获取卡片数据，渲染成 HTML 填充进去&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
( function () {&lt;br /&gt;
    &amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    // ==============================&lt;br /&gt;
    // 配置&lt;br /&gt;
    // ==============================&lt;br /&gt;
&lt;br /&gt;
    var API_BASE = &amp;#039;https://data.saltedkiss.org/items/cards&amp;#039;;&lt;br /&gt;
    var FIELDS = [&lt;br /&gt;
        &amp;#039;stylename&amp;#039;,&lt;br /&gt;
        &amp;#039;rarity&amp;#039;,&lt;br /&gt;
        &amp;#039;character.name&amp;#039;,&lt;br /&gt;
        &amp;#039;profession.name&amp;#039;,&lt;br /&gt;
        &amp;#039;desire.name&amp;#039;,&lt;br /&gt;
        &amp;#039;skill_normal_attack.name&amp;#039;,&lt;br /&gt;
        &amp;#039;skill_normal_attack.type&amp;#039;,&lt;br /&gt;
        &amp;#039;skill_normal_attack.weapon&amp;#039;,&lt;br /&gt;
        &amp;#039;skill_normal_attack.description&amp;#039;,&lt;br /&gt;
        &amp;#039;skill_normal_attack.levels.*&amp;#039;,&lt;br /&gt;
        &amp;#039;skill_passive.name&amp;#039;,&lt;br /&gt;
        &amp;#039;skill_passive.type&amp;#039;,&lt;br /&gt;
        &amp;#039;skill_passive.trigger_type&amp;#039;,&lt;br /&gt;
        &amp;#039;skill_passive.trigger_value&amp;#039;,&lt;br /&gt;
        &amp;#039;skill_passive.description&amp;#039;,&lt;br /&gt;
        &amp;#039;skill_passive.levels.*&amp;#039;,&lt;br /&gt;
        &amp;#039;skill_ultimate.name&amp;#039;,&lt;br /&gt;
        &amp;#039;skill_ultimate.type&amp;#039;,&lt;br /&gt;
        &amp;#039;skill_ultimate.desire_cost&amp;#039;,&lt;br /&gt;
        &amp;#039;skill_ultimate.description&amp;#039;,&lt;br /&gt;
        &amp;#039;skill_ultimate.levels.*&amp;#039;,&lt;br /&gt;
        &amp;#039;feats.stages&amp;#039;&lt;br /&gt;
    ].join( &amp;#039;,&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
    // ==============================&lt;br /&gt;
    // 工具函数&lt;br /&gt;
    // ==============================&lt;br /&gt;
&lt;br /&gt;
    /** 安全取值，null/undefined 返回 fallback */&lt;br /&gt;
    function safe( val, fallback ) {&lt;br /&gt;
        return ( val !== null &amp;amp;&amp;amp; val !== undefined &amp;amp;&amp;amp; val !== &amp;#039;&amp;#039; )&lt;br /&gt;
            ? String( val )&lt;br /&gt;
            : ( fallback || &amp;#039;—&amp;#039; );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /** 生成稀有度星星 */&lt;br /&gt;
    function renderRarity( n ) {&lt;br /&gt;
        return &amp;#039;&amp;lt;span class=&amp;quot;ron-card-rarity&amp;quot;&amp;gt;&amp;#039; + &amp;#039;★&amp;#039;.repeat( Number( n ) || 0 ) + &amp;#039;&amp;lt;/span&amp;gt;&amp;#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;
    function renderSkill( skill ) {&lt;br /&gt;
        if ( !skill ) return &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        var html = &amp;#039;&amp;lt;div class=&amp;quot;ron-skill&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
        html += &amp;#039;&amp;lt;div class=&amp;quot;ron-skill-name&amp;quot;&amp;gt;&amp;#039; + safe( skill.name ) + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
        html += &amp;#039;&amp;lt;div class=&amp;quot;ron-skill-type&amp;quot;&amp;gt;&amp;#039; + safe( skill.type ) + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        // 普通攻击：武器&lt;br /&gt;
        if ( skill.weapon ) {&lt;br /&gt;
            html += &amp;#039;&amp;lt;div class=&amp;quot;ron-skill-meta&amp;quot;&amp;gt;武器：&amp;#039; + safe( skill.weapon ) + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // 被动：触发条件&lt;br /&gt;
        if ( skill.trigger_type ) {&lt;br /&gt;
            html += &amp;#039;&amp;lt;div class=&amp;quot;ron-skill-meta&amp;quot;&amp;gt;触发：普通攻击 × &amp;#039;&lt;br /&gt;
                + safe( skill.trigger_value ) + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // 终结技：欲望消耗&lt;br /&gt;
        if ( skill.desire_cost !== null &amp;amp;&amp;amp; skill.desire_cost !== undefined ) {&lt;br /&gt;
            html += &amp;#039;&amp;lt;div class=&amp;quot;ron-skill-meta&amp;quot;&amp;gt;欲望消耗：&amp;#039; + safe( skill.desire_cost ) + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        html += &amp;#039;&amp;lt;div class=&amp;quot;ron-skill-desc&amp;quot;&amp;gt;&amp;#039; + safe( skill.description ) + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        // 升级数值&lt;br /&gt;
        if ( skill.levels &amp;amp;&amp;amp; skill.levels.length &amp;gt; 0 ) {&lt;br /&gt;
            skill.levels.forEach( function ( lv ) {&lt;br /&gt;
                html += &amp;#039;&amp;lt;div class=&amp;quot;ron-skill-levels&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
                html += &amp;#039;&amp;lt;span class=&amp;quot;ron-skill-level-name&amp;quot;&amp;gt;&amp;#039; + safe( lv.name ) + &amp;#039;：&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
                html += safe( lv.levels ? lv.levels.join( &amp;#039; / &amp;#039; ) : null );&lt;br /&gt;
                html += &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
            } );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        html += &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
        return html;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /** 渲染觉醒区块 */&lt;br /&gt;
    function renderFeats( feats ) {&lt;br /&gt;
        if ( !feats || feats.length === 0 ) return &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        var html = &amp;#039;&amp;lt;div class=&amp;quot;ron-feats&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;ron-feats-title&amp;quot;&amp;gt;觉醒&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        feats.forEach( function ( feat ) {&lt;br /&gt;
            if ( !feat.stages ) return;&lt;br /&gt;
            feat.stages.forEach( function ( stage ) {&lt;br /&gt;
                var stageName = stage.extra_name || ( &amp;#039;觉醒 &amp;#039; + stage.stage );&lt;br /&gt;
                html += &amp;#039;&amp;lt;div class=&amp;quot;ron-feat-stage&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
                html += &amp;#039;&amp;lt;div class=&amp;quot;ron-feat-stage-name&amp;quot;&amp;gt;&amp;#039; + stageName + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
                // 属性加成&lt;br /&gt;
                if ( stage.stat_boosts ) {&lt;br /&gt;
                    stage.stat_boosts.forEach( function ( boost ) {&lt;br /&gt;
                        html += &amp;#039;&amp;lt;div class=&amp;quot;ron-feat-boost&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
                            + safe( boost.type ) + &amp;#039; +&amp;#039;&lt;br /&gt;
                            + safe( boost.value ) + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
                    } );&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // 技能效果描述&lt;br /&gt;
                if ( stage.value ) {&lt;br /&gt;
                    stage.value.forEach( function ( v ) {&lt;br /&gt;
                        html += &amp;#039;&amp;lt;div class=&amp;quot;ron-feat-desc&amp;quot;&amp;gt;&amp;#039; + safe( v.description ) + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
                    } );&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                html += &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
            } );&lt;br /&gt;
        } );&lt;br /&gt;
&lt;br /&gt;
        html += &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
        return html;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /** 把完整卡片数据渲染成 HTML */&lt;br /&gt;
    function renderCard( card ) {&lt;br /&gt;
        var html = &amp;#039;&amp;lt;div class=&amp;quot;ron-card-inner&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        // 标题行&lt;br /&gt;
        html += &amp;#039;&amp;lt;div class=&amp;quot;ron-card-header&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
        html += &amp;#039;&amp;lt;span class=&amp;quot;ron-card-name&amp;quot;&amp;gt;&amp;#039; + safe( card.stylename ) + &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
        html += renderRarity( card.rarity );&lt;br /&gt;
        html += &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        // 基本信息&lt;br /&gt;
        html += &amp;#039;&amp;lt;div class=&amp;quot;ron-card-info&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
        html += &amp;#039;&amp;lt;span class=&amp;quot;ron-card-meta&amp;quot;&amp;gt;角色：&amp;#039; + safe( card.character &amp;amp;&amp;amp; card.character.name ) + &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
        html += &amp;#039;&amp;lt;span class=&amp;quot;ron-card-meta&amp;quot;&amp;gt;职业：&amp;#039; + safe( card.profession &amp;amp;&amp;amp; card.profession.name ) + &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
        html += &amp;#039;&amp;lt;span class=&amp;quot;ron-card-meta&amp;quot;&amp;gt;欲望：&amp;#039; + safe( card.desire &amp;amp;&amp;amp; card.desire.name ) + &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
        html += &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        // 技能&lt;br /&gt;
        html += &amp;#039;&amp;lt;div class=&amp;quot;ron-card-skills&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
        html += renderSkill( card.skill_normal_attack );&lt;br /&gt;
        html += renderSkill( card.skill_passive );&lt;br /&gt;
        html += renderSkill( card.skill_ultimate );&lt;br /&gt;
        html += &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        // 觉醒&lt;br /&gt;
        html += renderFeats( card.feats );&lt;br /&gt;
&lt;br /&gt;
        html += &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
        return html;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // ==============================&lt;br /&gt;
    // 主流程：fetch 并填充&lt;br /&gt;
    // ==============================&lt;br /&gt;
&lt;br /&gt;
    function loadCard( el ) {&lt;br /&gt;
        var name = el.getAttribute( &amp;#039;data-cardname&amp;#039; );&lt;br /&gt;
        if ( !name ) return;&lt;br /&gt;
&lt;br /&gt;
        var url = API_BASE&lt;br /&gt;
            + &amp;#039;?fields=&amp;#039; + encodeURIComponent( FIELDS )&lt;br /&gt;
            + &amp;#039;&amp;amp;filter[stylename][_eq]=&amp;#039; + encodeURIComponent( name );&lt;br /&gt;
&lt;br /&gt;
        fetch( url )&lt;br /&gt;
            .then( function ( res ) {&lt;br /&gt;
                if ( !res.ok ) throw new Error( &amp;#039;HTTP &amp;#039; + res.status );&lt;br /&gt;
                return res.json();&lt;br /&gt;
            } )&lt;br /&gt;
            .then( function ( json ) {&lt;br /&gt;
                if ( !json.data || json.data.length === 0 ) {&lt;br /&gt;
                    el.innerHTML = &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;找不到卡片：&amp;#039; + name + &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
                el.innerHTML = renderCard( json.data[ 0 ] );&lt;br /&gt;
            } )&lt;br /&gt;
            .catch( function ( err ) {&lt;br /&gt;
                el.innerHTML = &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;加载失败：&amp;#039; + err.message + &amp;#039;&amp;lt;/span&amp;gt;&amp;#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;
    mw.hook( &amp;#039;wikipage.content&amp;#039; ).add( function () {&lt;br /&gt;
        document.querySelectorAll( &amp;#039;.ron-card[data-cardname]&amp;#039; ).forEach( loadCard );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Rin</name></author>
	</entry>
</feed>